.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Februar 2012

Download: Windows 8 Consumer Preview

29.02.2012 17:42:00 | Kay Giza

Heute hat Microsoft auf dem Mobile World Congress in Barcelona vor wenigen Augenblicken die Windows 8 Consumer Preview - also eine Vorschauversion des nächsten Microsoft Betriebssystems - vorgestellt. Microsoft hat seit der Developer Preview Version von Windows 8 über 100.000 Verbesserungen und Codeänderungen vorgenommen. Ab sofort kann man also die Windows 8 Consumer Preview unter... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

CeBIT 2012 - Microsoft Cloud Computing in Halle 4

28.02.2012 09:42:08 | Kay Giza

Vom 06. bis 10. März 2012 findet wieder das weltweit wichtigste und internationalste Ereignis der digitalen Industrie statt, die CeBIT. Auch dieses Jahr bin ich wieder vor Ort und würde mich über Ihren Besuch am Microsoft Stand in Halle 4, Stand A26 sehr freuen. Ich werde dort mit zahlreichen Kolleginnen und Kollegen vor Ort zum Thema Cloud Computing von Microsoft vor Ort sein. In Halle 4 kann man sich bei den Ständen M41 bis M48 über das Thema Cloud Computing informieren. Durch... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

ASP.NET Web API Round-Up Slides

27.02.2012 20:10:00 | Alexander Zeitler

Die Slides zu meinem ASP.NET Web API Round-Up bei der Online-Usergroup finden sich hier:

Slides

Samples finden sich hier.

Die Aufzeichnung ist ebenfalls online:

ASP.NET Web API Round Up from .NET Online User Group on Vimeo.

MVP Global Summit 2012 (Bellevue und Redmond, Washington, USA)

27.02.2012 12:05:27 | Kay Giza

Vom 28. Februar 2012 bis zum 02. März 2012 findet wieder in Seattle (Washington, USA) das MVP Global Summit statt! Als ehemaliger MVP ist es mir eine Freude über dieses Event zu berichten, denn die Empfänger des MVP Awards werden jedes Jahr zur Teilnahme am MVP Global Summit eingeladen, einer der größten, mehrere Tage dauernden Veranstaltungen für Microsoft MVPs weltweit. Auf dem MVP Summit erhalten MVPs Zugang zu exklusiven... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

NEU: Skype App fuer Windows Phone

27.02.2012 10:52:20 | Kay Giza

Skype für Windows Phone: Ab heute gibt es Skype jetzt auf so gut wie allen gewünschten Smartphones. Für Windows Phone ist seit heute Nacht auch eine Beta-Version von Skype verfügbar - natürlich kostenlos bzw. kostenfrei. Als Windows Phone 7-Nutzer kann man sich die Beta-Version auf zwei verschiedene Wege installieren... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

Bandbreitenrechner fuer Exchange Server und Exchange Online

27.02.2012 10:22:09 | Kay Giza

An IT-Administratoren richtet sich der neue Exchange Client-Bandbreitenrechner, mit dessen Hilfe Fallstricke bei der Bandbreitenplanung für ein von Exchange Server oder Microsoft Exchange Online bedientes Netzwerk aus dem Weg geräumt werden. Nach dem Bandbreitenrechner für Microsoft Lync steht damit ein weiteres Werkzeug zur faktenbasierenden Netzwerkplanung für Microsoft Server- und Microsoft Online Services-Produkte bereit. Die Kalkulationsgrundlagen... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

InvalidOperationException in WebBrowserTask.Show

24.02.2012 23:19:00 | Martin Hey

In Windows Phone 7 hat man mit Hilfe der Launcher und Chooser die Möglichkeit, auf im System integrierte Funktionen zuzugreifen - sei es nun die Kamera, der Emailclient oder wie in meinem Fall der Browser. Meine Anwendung hat mehrere Buttons über die zu unterschiedlichen Webseiten weiternavigiert werden kann - hauptsächlich als weiterführende Information im Impressum.

Dafür hab ich abstrakt gesehen folgende zentrale Methode:

public static void OpenInWebBrowser(string url)
{
    var openBrowserTask = new WebBrowserTask { Uri = new Uri(url) };
    openBrowserTask.Show();
}

Diese Methode wird direkt in dem Command aufgerufen, das an dem Button hängt - alles kein Hexenwerk. Was mich nun wunderte: Gelegentlich bekam ich Error-Reports mit diesem Inhalt:

Navigation is not allowed when the task is not in the foreground. Error: -2147220990

Da stellte sich mir folgende Frage: Wie kann jemand den Button klicken, wenn die Anwendung nicht im Vordergrund ist?

Die Lösung ist ganz einfach: Der Benutzer hat kurz nacheinander auf den Button geklickt - sei es nun weil er so aufgeregt war, eine schöne Webseite zu sehen oder weil er gerade unterwegs auf einer holprigen Straße war - die Möglichkeiten sind da ja sehr vielfältig. Das ist möglich, weil der Launcher eine Weile braucht, um den Browser in den Vordergrund zu holen. Der Nutzer kann also dafür sorgen, dass der Click-Event zweimal ausgelöst wird - der zweite Event wird aber erst dann verarbeitet, wenn der erste WebBrowserTask den Browser geöffnet hat und damit die eigentliche Anwendung nicht mehr im Vordergrund ist. Und dann kommt es zu dieser Exception.

Wie geht man nun damit um? Es gibt mehrere Ansätze. Zum einen kann man natürlich mit Try-Catch-Blöcken arbeiten und genau diesen Exception-Typ abfangen. Da diese Exception bei dieser Methode bisher in der MSDN nicht dokumentiert ist, ist es etwas schwierig hier von allein auf die Idee zu kommen, diesen speziellen Typ abzufangen, aber nachher weiß man es immer besser. Zusätzlich könnte man noch den Click-Handler abhängen bzw. den Button oder das Command deaktivieren. 

Ich bin nicht der einzige, dem dieses Problem untergekommen ist - und Niko hat einen sehr ausführlichen Blogpost zum Thema geschrieben, der auch alle hier genannten Lösungsmöglichkeiten aufführt.

SharePoint 2010–101 Code Samples

23.02.2012 15:10:03 | Thorsten Hans

Microsoft-SharePoint-2010Wir mit der Entwicklung von SharePoint 2010 Lösugen beginnen möchte, oder einfach ein gutes Nachschlagewerk für die alltäglichen Aufgaben im Leben eines SharePoint Entwicklers braucht, der kann sich unter http://code.msdn.microsoft.com/SharePoint-2010-101-Code-da251182 die 101 CodeSamples für SharePoint 2010 anschauen.

Alternativ könnt ihr euch hier auch das gesamte Package direkt downloaden.

Viel Spaß damit

 

DotNetKicks-DE Image

Dateien blockweise im Windows Azure Blob Storage speichern

23.02.2012 14:53:00 | Sascha Dittmann

Lastenträger (Nepal)In letzter Zeit stehe ich regelmäßig vor der Herausforderung größere Dateien, über eine langsame und teilweise instabile Verbindung, in den Windows Azure Blog Storage übertragen zu müssen.
Hierbei kommt es zwangsläufig zu Timeouts, sowie diversen Fehlermeldungen.
Eine Möglichkeit, mit dieser Herausforderung umzugehen, ist es die Dateien blockweise zu übertragen.

Dateien in einem Stück übertragen

Um eine Datei im Windows Azure Blob Storage zu speichern, würde man normalerweise wie folgt vorgehen:

  • Blob Client Objekt erzeugen.
  • Blob Referenz erzeugen und ggf. Meta-Daten angeben, wie z.B. den Content Type.
  • Blob mit der UploadFile Methode speichern.
var storageAccount = CloudStorageAccount
  .FromConfigurationSetting("AzureStorageConnectionString");
var blobClient = storageAccount.CreateCloudBlobClient();

var blob = blobClient.GetBlobReference("container/datei.bin");
blob.Properties.ContentType = "application/octet-stream";

blob.UploadFile(@"C:\datei.bin");

 

Dateien Block für Block übertragen

Was mache ich aber, wenn die Datei größer als 64 MB ist,
oder ich nur eine langsame, instabile Verbindung nutzen kann?

Die Lösung heißt Block Blob's

Hier bieten sich die Eigenschaften eines Block Blob's an, da dieser aus einer Sequenz von Blöcken besteht.

Windows Azure Storage - Block Blob

Genauer gesagt:

  • Diese Blöcke können einzeln übertragen werden und unterschiedlich groß sein (Max. 4MB).
  • Mehrere Blöcke können gleichzeitig hochgeladen werden.
  • Einzelne Blöcke können auch mehrfach übertragen werden, wie z.B. bei fehlerhaften Übertragen.
  • Sobald alle Blöcke übertragen wurden, kann der Vorgang durch einen Commit abgeschlossen werden.
  • Dieser Übertragungsvorgang kann jederzeit unterbrochen, und zu einem späteren Zeitpunkt fortgeführt, werden.
    Nach einer Woche werden unbestätigte Blöcke automatisch verworfen.
  • Ein Block Blob kann aus maximal 50.000 bestätigten Blöcken bzw. 100.000 unbestätigten Blöcken bestehen.
  • Jeder dieser Blöcke wird über eine eindeutige, 64 Byte große, Block ID identifiziert.

Bei Dateien, die größer als 200MB und kleiner als 1TB sind, bieten sich Page Blobs an.

 

Datei aufteilen und übertragen

Um eine Datei in Blöcke zu zerteilen und diese einzeln zu übertragen, kann man wie folgt vorgehen:

using (var fileStream = new FileStream(fileName, 
  FileMode.Open, FileAccess.Read))
{
  var blockIdList = new List<string>();
  var blockId = 0;

  while(fileStream.Position < fileStream.Length)
  {
    // Buffergröße anhand der gewünschten Blockgröße (in KB)
    // bzw. anhand der restlichen Datenmenge bestimmen.
    var bufferSize = 
      blockSize * 1024 < fileStream.Length - fileStream.Position
      ? blockSize * 1024
      : fileStream.Length - fileStream.Position;
    var buffer = new byte[bufferSize];

    // Daten in das Bufferarray einlesen
    fileStream.Read(buffer, 0, buffer.Length);

    // Block zum Windows Azure Blob Storage übertragen
    using (var stream = new MemoryStream(buffer))
    {
      // Block ID konvertieren.
      var blockIdBase64 =
        Convert.ToBase64String(
          Encoding.UTF8.GetBytes(
            blockId.ToString(CultureInfo.InvariantCulture)
            .PadLeft(64, '0')));

      // Optional kann bei der PutBlock Methode ein
      // MD5 Hash zur Validierung angegeben werden.
      blob.PutBlock(blockIdBase64, stream, null);
      blockList.Add(blockIdBase64);
      blockId++;
    }
  }
}

 

Blöcke wieder zusammenführen

Nach der erfolgreichen Übertragung aller Blöcke, müssen diese beim Windows Azure Blob Storage als "vollständig" bestätigt werden:

// Hierbei ist die richtige Reihenfolge der Block-ID's entscheidend!
blob.PutBlockList(blockList);

 

Erst jetzt steht der Blob, wie gewohnt, zum Download zur Verfügung.

 

Beispielprojekt

Um das Ganze auch mal Live erleben zu können, habe ich diesem Blog Post ein Beispielprojekt angehängt.

Beispielprojekt - Block Blob Storage Demo 1

Je nach Installationsverzeichnis des Windows Azure SDK, muss der Pfad zum Windows Azure Storage Emulator, in der UploadBlockBlobStorageForm.cs, angepasst werden:

#region Private Felder

private const string WindowsAzureEmulator = 
  @"C:\Program Files\Windows Azure Emulator\emulator\csrun.exe";

#endregion

 


Download Download der Beispielanwendung:
WABlockBlobStorageDemo1.zip (107,29 kb)

Weitere Informationen

Verwendete Bildquellen:
© Dieter Schütz / PIXELIO

User Group Tour 2012 zum Thema User Interfaces

22.02.2012 20:39:00 | Roland Weigelt

Meine kleine User Group Tour im letzten Sommer unter dem Motto “UI/UX für Entwickler und andere Nicht-Designer” hat mir viel Spaß gemacht – so viel Spaß, dass auch auch dieses Jahr wieder unterwegs sein werde.

Die Planung dazu ist noch im Gange, die folgenden Termine stehen für meinen neuen Vortrag “UI Patterns - Kochrezepte für die Gestaltung von GUIs” bereits fest:

[Update 1.6.] Ab sofort sind meine Vortragstermine stets aktuell auf ux4devs.de zu finden.


Ich mache auch gerne noch in anderen User Groups Halt (ggf. gerne mit einem “Medley” beider Vorträge) – bei Interesse mich einfach kontaktieren.
 

Hier der offizielle Ankündigungtext:

UI Patterns - Kochrezepte für die Gestaltung von GUIs

Bei "UI" und "Patterns" mag mancher an MVC (Model View Controller) oder MVVM (Model View Viewmodel) denken, doch nicht nur in der technischen Umsetzung, sondern auch bei der Gestaltung von User Interfaces gibt es - im wahrsten Sinne des Wortes - Design Patterns. Quellen dafür gibt es einige, doch wie beim Kochen garantiert die bloße Kenntnis eines Rezepts nicht automatisch auch das Gelingen.

Dieser Vortrag bietet Entwicklern und anderen Nicht-Designern einen Einstieg in die Welt der User Interface Patterns und hilft dabei, das passende Pattern aus den richtigen Gründen zu wählen. Die Live-Demos verwenden Silverlight, der Vortrag ist jedoch in weiten Teilen unabhängig von konkreten GUI-Technologien.

Entwickeln fuer Windows 8 - erste offizielle deutsche Veranstaltungen auf der CeBIT 2012

21.02.2012 18:49:01 | Kay Giza

Am Mittwoch, dem 29. Februar, wird Microsoft im Rahmen der Mobilfunkmesse Mobile World Congress in Barcelona erstmals die Windows 8 Consumer Preview präsentieren. Nur eine Woche später, auf der CeBIT 2012, kann man als Entwickler & Interessierte das Potential des nächsten Windows Betriebssystems aus dem Hause Microsoft dann auch persönlich näher kennenlernen: Bei den ersten offiziellen Windows 8 Developer Events von MSDN Deutschland. Bei insgesamt 9 kostenlosen Kompakt-Seminaren tauchen die Microsoft Technologieberater... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

(Evil Twins)² – Kommunikation mit CoffeeScript/JavaScript und jQuery/Rx

21.02.2012 00:47:08 | Rainer Schuster

Wer mich kennt, weiß das ich ein kleiner “Software Language Geek” bin. Ich sehe mir gerne andere, oder neue Programmiersprachen an, ohne dafür einen konkreten Grund haben zu müssen. Einfach weil mich die Konzepte interessieren und es mir Spaß macht. Ich habe mich lange Zeit gegen JavaScript gewehrt, weil mir die Syntax nicht gefallen hat. Gut, das kleine bisschen an Fähigkeiten, was ich bisher gebraucht habe ist nicht der Rede wert. Das sollte jeder Software Entwickler/Ingenieur nach 14 Jahren hinbekommen. Was mich allerdings schon immer an JavaScript interessiert hat waren die Eigenschaften aus der Funktionalen Programmierung. Spätestens seit dem ich mich mit F# (also seit ca. 3 Jahren) angefreundet habe sieht es da um die Zuneigung zu JavaScript besser aus.

Motivation

Über die Weihnachtsferien habe ich mich dann hingesetzt und mir CoffeeScript nochmal genauer angeschaut. Ich hatte mir vor Urzeiten ohne fundiertes Wissen ein Vorurteil über JavaScript gebildet. Damit wollte ich schon lange aufräumen. Ich bin ja offen für andere Gedanken und auch Dankbar für neue Perspektiven.

Ich arbeite beruflich die meiste Zeit mit Python, seit neuestem ein bischen PHP Backend (die 2,5 Jahre vor diesem Sommer auch oft einmal kleine Tools/Skripte mit F# oder C#). Da ich ich in Python und Web-Entwicklung etwas mehr Zeit investieren wollte um schnelle Protottypen zu entwickeln habe ich nach einer guten Architektur zum Kommunizieren gesucht. Dar Hauptfokus lag hier bei Desktop Prototypen die bei Bedarf ins Web skalieren können.

Anforderungen

  1. Klein (wenig Code)
  2. Schnell
    1. Entwicklungszeit
    2. Antwortzeit der Architektur
  3. Günstig
    1. keine teure Technologie
    2. einfach zu verteilen
    3. am besten Open Source
  4. Skalierbar und Kommunikationsfreudig
    1. im Sinne der Verteilbarkeit, nicht der Nutzerlast

Entwurf

Da ich mit Python die letzten Jahre sehr gute Erfahrungen gemacht habe was die ersten 3 Punkte angeht, wollte ich auch erst einmal dabei bleiben. Für die Kommunikation sollten es WebSockets werden. Alter Hut (Stichwort Comet), lange durchgekaut und noch immer nicht ganz fertig.So ein bischen erinnert mich HTML5 ja an C++0x. Trotzdem auf dem besten Weg. Vor allem ging es mir dabei um Bidirektionale Kommunikation ohne Hacks a la Long Polling. Zuerst wollte ich ja node.js nehmen, bin dann aber doch bei Python für den Server geblieben, da ich da einen enormen Mehrwert für meine Arbeit sehe. Mit WebSockets setzte ich auf eine bidirektionale Kommunikation und damit auf die Push Fähigkeiten des Servers. Für den Client wollte ich deshalb meine Lieblingstechnologie aus .NET mit an Board haben: Rx

Für die Server Seite habe ich da schon etwas länger gesucht. Ich hätte ja gerne eine Extension für flask gehabt, weil sich damit REST Services schnell und einfach implementieren lassen, meine Versuche unter Windows sind aber im Sand verlaufen. Socket.IO oder …schlussendlich bin ich bei websockify (websock.js) für den Client gelandet. Warum? Weil es schon binäre Streams unterstützt, indem es auf der Client-Seite in JavaScript eine base64 Codierung vornimmt und am Server einen TCP Raw SocketProxy beinhaltet der den Datenverkehr weiterleiten kann (funktioniert nur unter linux, bzw. Python 3.0, da fromfd in früheren Versionen von Python nicht unterstütz wird). Alles in allem gute Vorraussetzungen um in einer Umgebung mit EmbeddedDevices und Industrie-Automation eingesetzt werden zu können – spricht genau mein Arbeitsumfeld. Hier also nochmal zusammengefasst der komplette Software-Stack:

    • wegen der Arbeit
    • weil es Spaß macht
    • weil es mindestens … wenn nicht noch mehr Open Source Module gibt
    • weil produktiver
    • weil lesbarer
    • und angenehmer als JavaScript
    • wer doch lieber JavaScript ließt: copy/paste nach http://js2coffee.org
  • websockify  (LINUX)
    • für den Server
    • weil es alle Protokollversionen von WebSocket unterstütz
    • Raw TCP Socket Forwarding
    • für den Server
    • Unterstützung für populäre Web-Frameworks
      • Tornado (Nonblocking)
      • CherryPy (minimalistisch)
        • unter Windows auch das einzige Framework das ich überreden konnte mit mir zu sprechen
        • da sitzt wohl der Fehler 50cm vor dem Bildschirm
      • greenlet (ähnlich node.js)
    • für den Client (Dokumentation)
    • Teil von websockify
    • nutzt web-socket-js (Fallback auf Flash … und ja ich habe mir auch socket.io angeschaut)
    • um WebSocket push noch mehr zu pushen
    • vor allem wegen Komposition und Filtern der Daten
    • zum schnellen und leichten entwickeln eigener Protokolle auf Basis von JSON

Schlussendlich könnt ihr dieses Beispiel auch mit einem anderen WebSocketServer durchführen. Ich werde zu einem späteren Zeitpunkt evlt. auch noch andere austesten.

Implementierung

Der WebSocket ist schnell programmiert. Wer lieber die native API nutzen, oder eine Einführung zu WebSockets haben will, findet über die ersten drei Treffer bei Google passenden Lesestoff.

Wir nehmen:

  1. WebSocket
  2. Rx.Subject

Damit kann ich die Daten leicht verarbeiten. Über den WebSocket lese ich mir die Daten als JSON aus. Eine spätere Entscheidung zu Gunsten eines binären Protokolls ist hier jederzeit möglich. Ein websock.js liefert ein Beispiel für telnet mit. Für den Anfang halte ich mich erst einmal an JSON-RPC. Zuerst hatte ich mit einer eigenen Struktur herumprobiert. Statt method nahm ich signal und für params stand data im Text. Also wie ich es drehe und wende, andere Namen gleicher Zweck. Über die id kann ich wie über AJAX gewohnt eine Response schicken. Zu einem JSON-RPC Server der auf JavaScript Seite läuft und durch den Client selbst initialisiert wird, fehlt hier auch nicht mehr viel. Die Erweiterung  zur Version 2.0 und  Validierung kann ich später über die Kombinatoren von Rx vornehmen. jQuery nutze ich zum parsen des JSON Strings. Später kommt noch das UI dazu. (Da mein GIST Plugin gerade de Geist aufgibt, gibts den GIST nur als Link).

https://gist.github.com/1871767

1 ws = new Websock 2 channel = new Rx.Subject() 3 4 log = (msg) -> console.log msg 5 6 ws.on 'message', () -> 7 log ">> WebSocket.onmessage" 8 packetSize = ws.rQlen() 9 packetData = ws.rQshiftStr packetSize 10 obj = $.parseJSON packetData 11 channel.onNext obj 12 13 ws.on 'open', (e) -> 14 log ">> WebSocket.onopen" 15 log "<< WebSocket.send_string" 16 ws.send_string '{"method":"scanned", "params": ["1"], "id":1}' 17 ws.send_string '{"method":"scanned", "params": ["2"], "id":2}' 18 ws.send_string '{"method":"shutter", "params": ["open"], "id":3}' 19 ws.send_string '{"method":"shutter", "params": ["close"], "id":4}' 20 ws.send_string '{"method":"scanned", "params": ["3"], "id":5}' 21 22 ws.on 'close', (e) -> 23 log ">> WebSocket.onclose" 24 channel.onCompleted '{"message":">> RX.onCompleted"}' 25 26 ws.on 'error', (e) -> 27 log ">> WebSocket.onerror" 28 channel.onError '{"error":">> RX.onError"}'

Der eigentliche Spaß kommt erst jetzt, wenn wir Rx mit einbinden. Ob ich hier noch Rx brauche, wird sich der ein oder andere fragen. Den Mehrwert sehe ich in der schlanken Syntax topic/subscribe. Zu einem späteren Zeitpunkt kann ich aus meinem Prototypen ein jQuery Plugin bauen, oder meine Daten nach belieben Transformieren und Filtern. Es sollte mir auch leicht fallen das Transportformat von JSON-RPC nach binär zu ändern, wenn ich es für nötig halte.

1 #/*select topic based on methodName*/ 2 topic = (methodName) -> 3 method = channel 4 .where((msg) -> msg.method == methodName) 5 .select((msg) -> {"params":msg.params, "id":msg.id}) 6 7 bind = (methodName, handler) -> 8 topic(methodName).subscribe(handler) 9 10 topic("shutter").subscribe (msg) -> log ("Shutter: " + msg.params[0]) 11 #/* and with jQuery like binding syntax*/ 12 bind 'scanned', (msg) -> log ("Barcode Scanned: " + msg.params[0])

 

Kommen wir zum Schluss auf den Server. Um einen einfachen Test zu erstellen wollte ich erst einmal einen Echo Endpunkt erstellen. Relativ einfach und ich denke keiner weiteren Erklärung würdig.

 

1 # -*- coding: utf-8 -*- 2 from multiprocessing import Process 3 4 def cherrypy_server(host="127.0.0.1", 5 port=54321): 6 7 import cherrypy 8 import ws4py.websocket as ws 9 import ws4py.server.cherrypyserver as server 10 11 config = {'server.socket_host': host, 12 'server.socket_port': port, 13 'log.screen': False 14 } 15 cherrypy.config.update(config) 16 server.WebSocketPlugin(cherrypy.engine).subscribe() 17 cherrypy.tools.websocket = server.WebSocketTool() 18 19 class Root(object): 20 @cherrypy.expose 21 def index(self): 22 pass 23 24 config = { 25 '/': { 26 'tools.websocket.on': True, 27 'tools.websocket.handler_cls': ws.EchoWebSocket 28 } 29 } 30 cherrypy.quickstart(Root(), '/', config) 31 32 if __name__ == '__main__': 33 p0 = Process(target=cherrypy_server) 34 p0.daemon = True 35 p0.start() 36 p0.join()

Auswertung

Kurz, knapp, ausbaufähig und kein Code für den Mülleimer. Nichts aufregendes, grundsolide. Nicht was ich mir nicht auch im Web zusammensuchen kann.Voller Technologie, die dem Entwickler die Arbeit leichter machen. Abschließend noch ein kurzer Screenshot der unspektakulären Konsolenausgabe:

rx_websocket_protokoll

Themenwahl und CfP für die See# Conference 2012 gestartet

20.02.2012 13:15:00 | Jürgen Gutsch

Letzte Wochen haben wir die .NET-Community aufgefordert Themenwünsche für die See# Conference 2012 einzureichen. Dafür habe ich eine Umfrage auf tricider.com gestartet:

https://tricider.com/de/brainstorming/G5ci

Hier könnt ihr eure Idee und Argumente veröffentlichen und für vorgeschlagene Themen abstimmen. Diese Umfrage läuft noch ein paar Woche. Ich fordere euch also hiermit auf weitere Ideen einzutragen :-)

Call for Papers

Falls Ihr Interesse habt an der See# Conference 2012 in Kreuzlingen einen Vortrag zu einem .NET-Spezifischen Thema zu halten, seid Ihr herzlich eingeladen uns Eure Vorschläge einzureichen.

Dazu benötigen wir folgende Daten von Euch:

  • Titel des Vortrags
  • Abstract/Kurzbeschreibung
  • Kurzbiographie und Foto
  • E-Mail Adresse (optional Handynummer für Notfälle)
  • optional: Website / Blog / Twitter / XING Profil

Alle Vorträge dauern 60 Minuten.

Die Anmeldung sollte per E-Mail mit dem Betreff "See# Conference: Vortragsvorschlag" an info@dotnetkk.de gesendet werden.

Euer Ansprechpartner für die Themen und die Agenda werde ich dieses Jahr selber sein. Ich werde dieses Jahr die Vortragsvorschläge anhand der Themenvorschläge aus der .NET-Community auswählen.

Weitere Informationen findet Ihr unter: http://www.seesharp-conference.net/de/Agenda/Call-for-papers/page38399.htm

ASP.NET MVC 4 Beta veröffentlicht

19.02.2012 17:05:00 | Patric Schouler

Letztes Jahr zur Build wurde die neue Version des ASP.NET MVC Frameworks in der Version 4 angekündigt und ein Developer Preview veröffentlicht. Jetzt steht die Beta-Version von  ASP.NET MVC 4 unter ASP.NET zum Download bereit. Gegenüber dem Developer Preview sind einige wichtigen Punkte hinzugenommen und insbesondere die Unterstützung der Entwicklung von mobilen Applikationen wurde ausgebaut.
Die wichtigsten Neuerungen gegenüber dem Developer Preview sind:

ASP.NET Web API

Mit der ASP.NET Web API steht ein Framework zur Verfügung, um mit den bekannten Paradigmen von ASP.NET MVC mit beliebigen Web Services auf einfache Art und Weise zu kommunizieren. Dazu bietet die ASP.NET Web API ein einfaches Programmiermodell, um HTTP Requests und Responses direkt zu manipulieren und gegen ein streng typisiertes Datenmodell (domains) zu binden. Des weiteren unterstützt die ASP.NET Web API Routing, wie man dies von ASP.NET MVC
gewohnt ist. Ein weiteres schönes Feature ist die Verwendbarkeit von IQueryable<T> als Return-Type, die es ermöglicht auf die Services mit normaler OData Syntax zuzugreifen.
 
Weitere Infos zur ASP.NET web API sind hier zu finden.

Verbesserungen für die Razor Engine

Die Razor Engine versteht jetzt die “~”-Syntax für Verlinkungen (Z.B. <script> src=”~/Scripts/Site.js” />) und unterstützt bedingtes Attribut Rendering. So wird z.B. die Angabe der Style Class im Ausdruck <div class=”@myClass”>Inhalt</div> bei myClass=null auch nicht mehr gerendert.
 

NuGet Integration in MVC-Projekte

Das ASP.NET MVC 4 Projekt-Template bietet jetzt die Verwendung des NuGet Package Restore Features. Aktiviert man diese Option in der Solution werden nicht mehr die Binaries der NuGet Packages in ein Source Control System übernommen, sondern im Build Prozess wird geprüft, ob alle Packages in der entsprechenden Version gemäß der packages.config vorhanden sind und dann ggf. heruntergeladen.
 

Templates für mobile Applikationen

Das neue Projekt-Template für mobile Applikationen basiert auf dem Open Source Framwork jQuery Mobile und enthält bereits die Referenzen auf die KnockOut und Modernizer JavaScript Bibliotheken, die durch NuGet Packages in der aktuellen Version zur Verfügung gestellt werden. Insgesamt merkt man, das viel in der aktuellen Beta-Version von ASP.NET MVC zur Unterstützung der Entwicklung von mobilen Applikationen getan wurde.
 
Mittels der neuen Display Modes können darüber hinaus gemischte Web-Seiten für konventionelle Webseiten und touch-basierte Applikationen entwickelt werden.Legt man beispielsweise in einem Shared View-Folder die Datei _MyPartial.cshtml und _MyPartial.mobile.cshtml ab, wird beim Aufruf über einen mobilen Browser automatisch die mobile Version aufgerufen. Über die DisplayModeProvider-Klasse können sogar noch eigene Display Modes in Abhängigkeit vom UserAgent z.B. für das iPad definiert werden.
 

Fazit

Insgesamt bietet die Beta-Version von ASP.NET MVC 4 wieder sehr viele Bereicherungen, die es uns noch leichter macht mittels des bewährten MVC Pattern unter Ausnutzung der einfachen Razor-Engine traditionelle aber auch touch-basierte Web-Applikationen für den Anwender bereitzustellen.

Weiterführende Links

 

Was ist neu in der VisualStudio 2011 Developers Preview für SharePoint 2010 Entwickler

17.02.2012 22:46:00 | Thorsten Hans

Die Developer Preview von Visual Studio 2011 ist bereits seit der Build Konferenz in Anaheim (September 2011) verfügbar. Natürlich zielt die Developer Preview hauptsächlich auf die Entwicklung von Anwendungen für Windows 8 auf Basis der neuen WinRT, allerdings sind auch bereits einige Änderungen für uns SharePoint Entwickler in der Developer Preview enthalten.

Wenn man in der Developer Preview ein neues Projekt für SharePoint 2010 erstellen möchte, sticht die erste Änderung direkt ins Auge. Die Anzahl der SharePoint 2010 Projektvorlagen wurde auf ein gesundes Minimum reduziert, wodurch gerade für neue SharePoint Entwickler der Einstieg etwas einfacher werden wird. Vergessen sind die Tage, an denen man in der Projekttemplate Liste scrollen musste :D

 

Nur noch die notwendigen Projektvorlagen für SharePoint Projekte

Der Augenmerk für die nächste Visual Studio Version schein wirklich auf der Produktivität zu liegen, denn es gibt nun endlich Templates für die am häufigsten genutzten Buildingblocks in SharePoint Projekten.

 

SiteColumns 

SiteColumns, Fields oder auch Webitespalten können nun bequem via ItemTemplate angelegt werden, durch das ItemTemplate werden die grundlegenden und benötigten Metadaten einer SiteColumn in ein neues Elements-File geschrieben. Für den Entwickler bedeutet dies, dass lediglich die individuellen Anpassungen vorgenommen werden müssen und nicht mehr das gesamte CAML geschrieben werden muss.


 

ItemTemplate für SiteColumns


ContentTypes 

ContentTypes oder Inhaltstypen, können in der reinen Entwicklung sehr gut mit Klassen verglichen werden. Sie beschreiben die Metadaten (SiteColumns) die ein Listelement ausmachen. Hier bietet Visual Studio 2011 endlich den langersehnten Wizard, welcher das Erstellen schnell und robust gestaltet. Eine Vielzahl an Fehlern und Problemen in SharePoint Projekten wird dadurch der Vergangenheit angehören – hoffentlich J.Der Entwickler kann im ContentType Designer sowohl die SiteColumns auswählen, als auch die Metadaten des ContentTypes in der grafischen Oberfläche definieren. Lediglich anspruchsvollere Themen wie CustomForms müssen dann noch manuell in den ContentTypes definiert werden.

 

ContentType Designer - Hier zu sehen, die Column View


Listen

Listen bilden für bekanntlich das Herzstück von SharePoint. Jeder SharePoint Trainer kennt den Satz „Alles kann man in Listen organiseren.“ Dieser triviale Satz zeigt wie wichtig und elementar Listen in SharePoint sind. Daher bietet auch dieser Erstellungsprozess enormes Sparpotential, hier kann in nahezu jedem SharePoint Projekt Zeit bei der Erstellung und Konfiguration der Listen Zeit eingespart werden. Der List Designer erlaubt es, sowohl die Metadaten der Liste, die dazugehörigen SiteColumns und ContentTypes zu konfigurieren, als auch die gesamte Konfiguration der Views (Sichten) vorzunehmen.

 

Zuordnung von ContentTypes im ListDesigner


Anpassungen der Views im ListDesigner


Remote Deployment

Analog zu Windows Azure, wird es nun auch für SharePoint einen grafischen Deployment Manager geben, mit dessen Hilfe man zumindest in der Visual Studio 2011 Version lediglich Sandboxed Solutions an einen Remote-SharePoint versenden oder publizieren kann.

 

SharePoint Solution - Deployment Manager


Performance Testing 

Visual Studion vNext Ultimate und Premium werden Performance Tests für SharePoint Lösungen anbieten. Die Grundlage für diese Performance Tests bieten, wie sollte es auch anders sein, die schon seit Urzeiten in Windows integrierten Performance Counter. Durch das gezielte Monitoring der für SharePoint relevanten Datenerhebungen, wird dem Entwickler ein entsprechend der vorhandenen Quellcodestruktur erstellter Bericht präsentiert. Die Ausgabeformate und –berichte werden einige Entwickler bereits aus anderen .NET Bereichen kennen, hier wurde konsequent auf erprobte, fundierte aber dennoch extrem mächtige Technologien gesetzt.

 

Verbesserungen

Neben diesen tollen und produktivitätssteigernden Maßnahmen hat Microsoft auch noch einige bereits vorhandene oder durch Extensions mögliche Dinge in Visual Studio 2011 eingebaut. Paul Stubbs hatte ja bereits für Visual Studio 2010 in seinem Blog eine Extension vorgestellt mit dessen Hilfe man einfach Silverlight WebParts in SharePoint 2010 Projekten erstellen konnte. Diese Funktionalität wurde nun direkt in Visual Studio vNext integriert und kann somit ohne weiteren Installationsbedarf verwendet werden.

Ebenfalls nur über eine Extension (CKS Developer Tools) möglich war es, Sandboxed Visual WebParts zu erstellen. Die Limitierung, dass Visual Web Parts nur in FullTrust Projekten eingesetzt werden können wurde entfernt.

Die vorhandene JavaScript Unterstützung wurde ausgebaut, so dass JavaScript nun direkt debuggt werden kann und der IntelliSense ohne manuelles eingreifen funktioniert.

Die Compiler-Warnungen für Sandbox Verletzungen wurden weiter ausgebaut, so dass diese besser lesbar und verständlicher sind, darüber hinaus wurde die Einschränkung des IntelliSense verbessert.

 

Mein Fazit

Mit der nächsten Version scheint die SharePoint Entwicklung noch ein gutes Stück mehr Mainstream zu werden. Realisierungen werden einfacher und dadurch natürlich auch robuster werden. Aus der Sicht des Kunden wird dies bedeuten, dass gleiche Anforderungen mit der neuen Visual Studio Version günstiger werden, dar die Produktivität der Entwickler durch ein gutes Tooling gesteigert wird.

Für den SharePoint Entwickler bedeutet Visual Studio 2011, dass man sich weniger um die Plattform, als um das Problem des Kunden kümmern muss. Viele wiederkehrende, Fehleranfällige und eintönige aufgaben werden nun zumindest teilweise automatisiert oder durch grafische Oberflächen unterstützt.

Unabhängig von den neuen Features für SharePoint Entwickler, scheint die vNext von Visual Studio eine bessere Performance zu bietet, gepaart mit einer dezentralisierten Versionskontrolle wie git oder mercurial – oder zumindest den local Workspaces von TFS vNext, verspricht die gesamte Entwicklung etwas weniger Wartezeiten für den Entwickler zu generieren.

 

Wann macht ein Wechsel auf Visual Studio vNext Sinn?

Nun grundsätzlich sollte natürlich eine entsprechende Reife der Version gegeben sein. Die aktuell verfügbare Version ist wirklich noch etwas „früh“. Für den Fall dass die RTM Version von Visual Studio vNext sowohl SharePoint 2010 und SharePoint vNext supported, sollte man schnell auf die neue Version gehen um den Performance-Boost im Daily Business zu nutzen.

ShareCamp 2012

17.02.2012 14:52:24 | Thorsten Hans

Aller guten Dinge sind ja bekanntlich drei. Getreu diesem Motto wird auch in 2012 wieder ein ShareCamp veranstaltet. Das ShareCamp, die größte Deutschsprachige Communitykonferenz, wird wie gewohnt in für euch kostenlos in traditioneller BarCamp-Manier ausgeführt.

Für die neuen Teilnehmer unter euch gibt es hier genügend Infos zum Thema BarCamp.

ShareCamp 2012

Wie bereits bei den ersten beiden Episoden werden sich auch diesmal wieder viele begeisterte SharePoint Anhänger(innen) in der Zentrale von Microsoft Deutschland in Unterschleißheim zusammenfinden und an einem Wochenende (20.04.2012 – 22.04.2012) ihre Begeisterung zu diesem Thema teilen.

 

ShareCamp Webseite

Unter http://www.ShareCamp.de und unter http://www.Born2Share.de könnt ihr euch kostenlos für das Event anmelden. Im Wiki findet ihr sehr viele Infos zur (Un)konferenz. In diesem Jahr könnt ihr auch Fahrgemeischaften direkt über die Webseite organisieren. Nach dem Ihr euch auf der Webseite angemeldet habt, ist es wichtig, dass Ihr euch bei den einzelnen Events eintragt, damit wir besser planen können. Wer gerne nochmal auf die Konferenzseite von 2011 schauen möchte kann dies unter http://2011.ShareCamp.de tun.

Die WelcomeParty findet wie bereits in 2010 und 2011 wieder im Culinari in Unterschleißheim statt. :)

 

 

Die Sponsoren

Ein großer Dank gilt auch an dieser Stelle all unseren Sponsoren, ohne die ein solches Event einfach unmöglich wäre. In diesem Sinne bedanken wir uns herzlich bei allen Sponsoren! Danke!!ShareCamp 2012 Sponsoren

Ich freue mich schon sehr darauf möglichst viele von euch in München zu treffen und gemeinsam (bei einigen SharePints) über SharePoint zu philosophieren. Also, noch heute anmelden, denn es gibt nur 200 Plätze!

 

 

DotNetKicks-DE Image

ASP.NET MVC 4 public beta including ASP.NET Web API

16.02.2012 13:52:00 | Alexander Zeitler

Today Microsoft presented and released ASP.NET MVC 4 Beta at  TechDays Belgium.

To me personally the most important improvement is the integration of the WCF Web API into the ASP.NET Stack.

One of the main reason for merging both has been the question “why two frameworks from Microsoft which allow us to create ReSTful APIs?”

Thus, the ASP.NET MVC developers now get the goodies from the WCF Web API.

Everything new?

Let’s take a look at how we do things now.

The most important change is the implementation of our own APIs themselfes:

Until now, we did it this way using WCF Web API::

Using ASP.NET Web API it looks like this:

As you can see, you’re implementing now a Controller also for APIs. But it does not derive from Controller as MVC Controllers do and there’s no common base class at all.

When looking at our code, you may ask: how does Web API know, which HTTP Methods should be mapped to which class methods?

ASP.NET Web API now uses Convention over Configuration already known from ASP.NET MVC, thus naming of the class method declares the HTTP method being used.

And by the way: Convention over Configuration also takes effect at the controllers: Controllers have to be inside the Controllers folder known from MVC.

Convention over Configuration…but

…there’s still a little piece of confiugration left. Let’s head over to the Global.asax.cs. That’s the place where ASP.NET Web API is (still) configured.

The only mandatory option that needs always to be configured, is the assignment of a route inside the route tables to our API controllers.

Here is another improvement: ASP.NET Web API now uses ASP.NET MVC Routing. But be careful: Route definitions don’t use MapRoute but MapHttpRoute instead:

The difference between default MVC route and the default Web API Route is that the action is not contained in our URIs (that’s were the convention comes in).

Thus, our API is available here:

http://localhost/api/customers

GET /customers/id, PUT, POST etc. work analogous.

If you want to implement more than one GET method on your web api class, you simply activate the action in you route definition:

Dependency Injection

Dependency Injection still works, of course - shown here using LightCore.

To give and receive...

Certainly, the improvements did not only come from WCF Web API to ASP.NET Web API, but also from ASP.NET MVC, e.g. Model Binding and Validation.

To use Validation you can use the already known Annotations like [Required] etc.:

To get it working, we need an ActionFilter:

The ActionFilter validates the incoming model (e..g. from POST) and creates a JSON object if there were  validation errors and sends them back to the client with a HTTP 400 (Bad request) status code.

At the client side we’re utilizing the response using jQuery AJAX POST:

Of course, on the client side it is necessary to include jQuery unobstrusive Validation Scripts and setting the HTML attributes:

ASP.NET Forms authentication now also is supported out of the box, but this will be part of another blog post.

Hosting

Besides the well known IIS Hosting it is now also possible to self host Web API inside your own process (which is not new for WCF but MVC):

In order to get self hosting working, System.Web.Http.SelfHost needs to be referenced.

That’s it for now to give you a short overview.

NEU : Zusätzlicher C++ Day 2012 in ULM am 26.3

16.02.2012 12:01:30 | Christian Binder

C++ Day 2012

Da der C++ Day 2012 an allen Lokationen ausgebucht ist, haben wir uns entschlossen, einen zusätzlichen Termin in ULM anzubieten.

Wo : ULM
Wann: 26.3.2012  14:00- 18:00

Hier geht’s zur ANMELDUNG

ASP.NET MVC 4 Beta inkl. ASP.NET Web API verfügbar

16.02.2012 10:49:00 | Alexander Zeitler

Microsoft hat heute auf den TechDays in Belgien die lang erwartete ASP.NET MVC 4 Beta vorgestellt und auch öffentlich zum Download bereitgestellt.

Die für mich wichtigste Neuerung ist die Integration der bisherigen WCF Web API in den ASP.NET Stack.

Einer der Hauptgründe für die Zusammenführung der beiden Projekte war die bisher berechtigte Frage nach der Koexistenz von zwei Frameworks von Microsoft, die beide das Erstellen von ReSTful Services erlauben - namentlich das bereits vorhandene ASP.NET MVC sowie die eben erwähnte und zum damaligen Zeitpunkt neu entwickelte WCF Web API.

Somit kommen den ASP.NET MVC Entwicklern nun die bereits implementierten Goodies der WCF Web API zugute.

Alles neu macht…der ApiController

Wie sieht das Ganze nun in der Praxis aus?

Die wichtigste Änderung ist die Implementierung einer API (oder auch Services, je nach Sprachgebrauch):

Bisher implentierte man eine API folgendermaßen:

Mit der ASP.NET Web API geschieht dies nun etwas anders:

Wie man sieht, wird nun für die APIs ebenfalls ein Controller implementiert, der jedoch nicht von Controller erbt, sondern von ApiController. Es gibt auch keine gemeinsame Basisklasse mit Controller.

Wenn man das Beispiel ansieht, taucht natürlich sofort eine weitere Frage auf: woher “weiß” die ASP.NET Web API, welches die Methoden für GET, POST, PUT etc. sind?

Hier greift nun das von ASP.NET MVC bekannte Prinzip “Convention over Configuration”, d.h. das Naming der Methode in der Klasse der API bestimmt auch deren HTTP Methode.

Übrigens gilt Conventention over Configuration auch bei den Controllern: Die API-Controller müssen ebenfalls im Controller-Ordner von ASP.NET MVC liegen.

Convention over Configuration…aber

…ein wenig Konfiguration gibt es doch noch - wechseln wir deshalb zur Global.asax.cs. Konfiguriert wird die ASP.NET Web API nach wie vor dort.

Die einzige Option, die grundlegend nötig ist, ist die Zuweisung einer Route in den Route Tables zu den ApiControllern.

Auch hier gibt es eine positive Neuerung: ASP.NET Web API nutzt nun das ASP.NET MVC Routing, allerdings erfolgt die Route-Definition nicht über MapRoute, sondern über MapHttpRoute:

Der Unterschied zur Default-Route von MVC ist der, dass die Action nicht explizit in der URI vorkommt (hier greift die genannte Konvention).

Somit ist unsere CustomersApi unter

http://localhost/api/customers

verfügbar - GET /customers/id, PUT, POST etc. funktionieren analog.

Möchte ich nun z.B. mehrere Get-Methoden implementieren, kann ich das über das Routing leicht ändern, indem ich einfach die Action einfach wieder mit in die Route aufnehme:

Dependency Injection

Natürlich funktioniert auch weiterhin Dependency Injection, hier wieder am Beispiel von LightCore.

Geben und nehmen...

Natürlich sind nicht nur Neuerungen der WCF Web API in die ASP.NET Web API eingeflossen, sondern Web API profitiert auch von ASP.NET MVC Features, z.B. dem Model Binding und der Validierung.

Für die Validierung können die gewohnten Annotations wie [Required] etc. verwendet werden:

Um die Validierung ans Arbeiten zu bekommen, ist nun noch ein ActionFilter nötig:

Der ActionFilter validiert das Model, welches z.B. per POST gesendet wurde und erzeugt im Fehlerfall ein JSON-Objekt, welches die Auflistung der Fehler enthält. Diese werden mit einem HTTP Status Code 400 (Bad Request) zurück an den Client geschickt.

Auf der Client-Seite werten wir das Ganze mit jQuery im POST-Request aus:

Voraussetzung ist natürlich das Einbinden der jQuery unobstrusive Validation Scripts und das Setzen der Entsprechenden Attribute im HTML-Code:

Ebenfalls unterstützt ist nun FormsAuthentication, dies wird allerdings Gegenstand eines eigenen Blog Posts sein.

Hosting

Neben dem bekannten Hosting in IIS (Express) ist es auch möglich, Web API in einem eigenen Prozess zu hosten:

Damit SelfHost funktioniert, muß System.Web.Http.SelfHost referenziert sein.

Das soll es als kurzer Überblick von meiner Seite zunächst gewesen sein.

Microsoft CalCheck hilft bei Problemen mit Exchange-Kalendern

14.02.2012 10:42:23 | Kay Giza

Eine kaum zu merkende Vielzahl an Terminen prägen die heutige Arbeitswelt, und gerade deswegen ist ein reibungslos funktionierender elektronischer Kalender eine der entscheidenden Hilfen, um den Anforderungen des Alltags bestmöglich gerecht werden zu können. Schnell werden die Anrufe beim IT-Administrator dringlicher, wenn mal nicht eine – mitunter vielleicht sogar willkommene – Zwangspause bei den E-Mails eintritt, sondern der Kalender seine entscheidende Mitarbeit verweigert. Mit CalCheck erhalten Administratoren jetzt ein kostenfreies Kommandozeilenwerkzeug, das als erste Hilfe beim Verdacht auf ein Problem im Inhalt des Kalenders selber dient. Dazu öffnet das in 32- und 64-Bit-Versionen vorliegende Tool ein Outlook-Profil auf einem Exchange Server...

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

Bandbreitenrechner fuer Microsoft Lync

14.02.2012 09:42:45 | Kay Giza

Mit Microsoft Lync, das Ihnen auch im Rahmen von Microsoft Office 365 bereitsteht, verfügen Sie über eine Kommunikations- und Kollaborationslösung, die Sprache, Instant Messaging sowie Audio-, Video- und Webkonferenzen zu einem umfassenden und einfachen Erlebnis vereint und nur wenige Grenzen kennt. Lync glänzt als hausinterne Lösung, bindet klassische Telefonie mit ein und ermöglicht vielschichtige Kommunikation und Präsenzinformation problemlos auch standort- oder konzernübergreifend. Für eine ideale Verbindungsqualität ist dabei natürlich die zur Verfügung stehende Bandbreite... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

Apache Hadoop für Windows Azure - MapReduce mit JavaScript

14.02.2012 06:56:00 | Sascha Dittmann

Azure Hadoop LogoMeine Reise mit der Developer Preview des neuen Cloud Speicherdienstes "Apache™ Hadoop™-based Services for Windows Azure" geht weiter:
Diesmal stehen die Interaktive Konsole und ein einfacher MapReduce-Algorithmus mit JavaScript auf dem Plan.

Im meinem letzten Blog Post "Apache Hadoop Dienste für Windows Azure (Developer Preview)" hatte ich von der Erstellung eines eigenen Hadoop Clusters berichtet.
Nachdem dieses dann einsatzbereit war, wollte ich mich auf den Weg zu ein wenig Quellcode machen.

Doch eine grundlegende Frage beschäftigte mich:

Was ist MapReduce?

Eine kurz Suche im Internet ergab, dass es sich um einen von Google entwickelten Algorithmus handelt, mit dessen Hilfe man verteile Berechnungen über große Datenmengen (im Petabyte-Bereich) durchführen kann.

Hierzu müssen eine Map- sowie eine Reduce-Funktion zur Verfügung gestellt werden.
Optional kann zusätzlich eine Combine-Funktion angegeben werden.

Die Map-Funktion

Die Map-Funktion berechnet dann, pro Knoten im Cluster, einen Teil des Gesamtergebnisses.
Die so entstehenden Zwischenergebnisse, werden in einer Liste von Schlüssel-Wert-Paaren (Key-Value-Pairs) zurückgegeben.

Die Combine-Funktion

Falls eine Combine-Funktion implementiert wurde, wird dieses auf dem gleichen Clusterknoten wie die Map-Funktion ausgeführt.

Ziel ist es hierbei die Menge der Zwischenergebnisse zu verkleinern, um die darauffolgende Netzwerkbelastung, die bei der Übertragung der Zwischenergebnisse entsteht,  zu minimieren.

Die Reduce-Funktion

Wurden alle Map- und Combine-Funktionen erfolgreich durchgeführt, beginnt die Reduce-Phase.

Hierbei berechnet die Reduce-Funktion aus den Zwischenergebnismengen die Gesamtergebnismenge.

 

Doch wie funktioniert dies in der Praxis?

Als einfaches Beispiel möchte ich das Wörterzählen in Textdateien aufgreifen.

Die Interaktive Konsole

Zu Beginn loggte ich mich also in mein Cluster der Apache™ Hadoop™-based Services for Windows Azure ein.

Im Dashboard wählte ich anschließend die Interaktive Konsole aus:

Azure Hadoop - Dashboard

Mit der Interaktiven Konsole kann, mittels JavaScript Funktionen bzw. UNIX-ähnlichen Befehlen, auf das verteilte Dateisystem zugegriffen werden. Außerdem stehen weitere Funktionalitäten, wie z.B. das Starten von Berechnungen oder die Anzeige von einfachen Graphen, zur Verfügung.

Azure Hadoop - Interaktive Konsole

Die Vorbereitungen

Um ein wenig Text zum analysieren zu haben, bediente ich mich einiger Passagen aus Goethes Faust I.
Diese speicherte ich absatzweise in einzelne Textdateien.

In der Konsole musste ich dann nur noch ein Verzeichnis für die Texte erstellen, ...

js> #mkdir texte

... sowie die einzelnen Dateien in das Hadoop Dateisystem (HDFS) hochladen.

js> fs.put()
File uploaded.

Azure Hadoop - File Upload Dialog

Dann noch eine kurze Kontrolle, ob alles erfolgreich in Hadoop gelandet ist ...

js> #ls
Found 2 items
drwxr-xr-x - MyUser supergroup    0 2012-02-12 /user/MyUser/.oink
drwxr-xr-x - MyUser supergroup    0 2012-02-12 /user/MyUser/texte

js> #ls texte
Found 17 items
-rw-r--r-- 3 MyUser supergroup  366 2012-02-12 /user/MyUser/texte/Faust_01.txt
-rw-r--r-- 3 MyUser supergroup  351 2012-02-12 /user/MyUser/texte/Faust_02.txt
-rw-r--r-- 3 MyUser supergroup  340 2012-02-12 /user/MyUser/texte/Faust_03.txt
-rw-r--r-- 3 MyUser supergroup  358 2012-02-12 /user/MyUser/texte/Faust_04.txt
-rw-r--r-- 3 MyUser supergroup 1071 2012-02-12 /user/MyUser/texte/Faust_05.txt
-rw-r--r-- 3 MyUser supergroup  335 2012-02-12 /user/MyUser/texte/Faust_06.txt
-rw-r--r-- 3 MyUser supergroup  351 2012-02-12 /user/MyUser/texte/Faust_07.txt
-rw-r--r-- 3 MyUser supergroup  581 2012-02-12 /user/MyUser/texte/Faust_08.txt
-rw-r--r-- 3 MyUser supergroup  657 2012-02-12 /user/MyUser/texte/Faust_09.txt
-rw-r--r-- 3 MyUser supergroup  168 2012-02-12 /user/MyUser/texte/Faust_10.txt
-rw-r--r-- 3 MyUser supergroup 1054 2012-02-12 /user/MyUser/texte/Faust_11.txt
-rw-r--r-- 3 MyUser supergroup  993 2012-02-12 /user/MyUser/texte/Faust_12.txt
-rw-r--r-- 3 MyUser supergroup 1126 2012-02-12 /user/MyUser/texte/Faust_13.txt
-rw-r--r-- 3 MyUser supergroup  487 2012-02-12 /user/MyUser/texte/Faust_14.txt
-rw-r--r-- 3 MyUser supergroup  609 2012-02-12 /user/MyUser/texte/Faust_15.txt
-rw-r--r-- 3 MyUser supergroup  611 2012-02-12 /user/MyUser/texte/Faust_16.txt
-rw-r--r-- 3 MyUser supergroup  444 2012-02-12 /user/MyUser/texte/Faust_17.txt

... und schon konnte ich zum eigentlich Coding übergehen.

 

MapReduce mit JavaScript

Die Map-Funktion

Die Map-Funktion generiert für jedes Wort in der Textdatei einen Eintrag (Key-Value-Pair) und fügt diesen der Zwischenergebnismenge hinzu.
Hierzu wird ein Regulärer Ausdruck, sowie eine Schleife, benutzt.

var map = function (key, value, context)
{
  var words = value.split(/[^a-zA-Z]/);
  for (var i = 0; i < words.length; i++) {
    if (words[i] !== "") {
      context.write(words[i].toLowerCase(), 1);
    }
  }
};

 

Die Combine-Funktion

Da für jedes Wort ein Key-Value-Pair mit der Anzahl 1 erstellt wird, können diese in der Combine-Funktion bereits vorsummiert werden.

Außerdem können unerwünschte Wörter herausgefiltert werden, wie z.B. "und", "der", "die", "das", etc., da auf Grund der unterschiedlichen Häufigkeit von Wörtern in der natürlichen Sprache, bei einem deutschen Text sehr oft eine Ausgabe in der Form ("und", 1) erzeugt werden würde.

var combine = function (key, values, context) {
  var sum = 0;
  if (key == 'und' 
     || key == 'der'
     || key == 'die' 
     || key == 'das') return;
  while (values.hasNext()) {
    sum += parseInt(values.next());
  }
  context.write(key, sum);
};

 

Die Reduce-Funktion

Identisch zur Combine-Funktion, werden bei der Reduce-Funktion die Zwischenergebnisse aufsummiert, um die Gesamtsummen aller Textdateien zu erhalten.

var reduce = function (key, values, context) {
  var sum = 0;
  while (values.hasNext()) {
    sum += parseInt(values.next());
  }
  context.write(key, sum);
};

 

JavaScript Funktionen ausführen

Die nun definierten Funktionen können auf unterschiedliche Arten ausgeführt werden:

Direkt

Die erste Möglichkeit, die ich hierbei vorstellen möchte, benötigt in der hochgeladenen JavaScript Datei eine Funktion, die als Hauptprogramm dient.

Dies könnte in unserem Beispiel wie folgt aussehen:

var main = function (factory) {
    var job = factory.createJob("woerterZaehlen", "map", "reduce");
    job.setCombiner("combine");
    job.waitForCompletion(true);
};

 

Anschließend kann man das Ganze, unter Angabe der JavaScript Datei, sowie einem Quell- und Zielverzeichnis, starten:

js> #ls
Found 3 items
drwxr-xr-x - MyUser supergroup   0 2012-02-13 13:40 /user/MyUser/.oink
-rw-r--r-- 3 MyUser supergroup 661 2012-02-13 16:52 /user/MyUser/WordCount.js
drwxr-xr-x - MyUser supergroup   0 2012-02-13 15:10 /user/MyUser/texte

js> runJs("WordCount.js", "texte", "woerter")
View Log

 

Mit Pig verfeinern

Eine weitere Möglichkeit stellt das Einbetten in Apache Pig dar.
Hierbei kann der Output-Stream des eingebetteten MapReduce-Algorithmus, mittels des Pig Latin Syntax, weiter verfeinert werden.

js> pig.from("texte").mapReduce("WordCount.js", "word, count:long")
    .orderBy("count DESC").take(15).to("Top15Woerter")
View Log

 

Im hier gezeigten Beispiel wird nach "count" sortiert und nur die ersten 15 Schlüssel/Wert-Paare im Output-Stream gespeichert.

Die Live-Ansicht des Protokolls, kann über den Link "View Log" angezeigt werden.

 

Ergebnisse Anzeigen

Nachdem der MapReduce-Job erfolgreich beendet wurde, kann die Ergebnismenge mit folgendem Befehl angezeigt werden (inkl. Objektreferent zur weiteren Verarbeitung):

js> ergebnisse = fs.read("Top15Woerter")
ihr	25
ein	23
sich	22
was	20
es	19
ich	17
nicht	16
zu	16
euch	16
ist	16
in	15
sie	14
man	14
so	14
mit	13

 

Diese Ergebnismenge kann anschließend, mit Hilfe der o.g. Objektreferenz, in ein JSON-Objekt umgewandelt, ...

js> daten = parse(ergebnisse.data,"Wörter, Anzahl:long")
[
    0: {
        Wörter: "ihr"
        Anzahl: 25
    }
    1: {
        Wörter: "ein"
        Anzahl: 23
    }
    2: {
        Wörter: "sich"
        Anzahl: 22
    }
    3: {
        Wörter: "was"
        Anzahl: 20
    }
    4: {
        Wörter: "es"
        Anzahl: 19
    }
    5: {
        Wörter: "ich"
        Anzahl: 17
    }
    6: {
        Wörter: "nicht"
        Anzahl: 16
    }
    7: {
        Wörter: "zu"
        Anzahl: 16
    }
    8: {
        Wörter: "euch"
        Anzahl: 16
    }
    9: {
        Wörter: "ist"
        Anzahl: 16
    }
    10: {
        Wörter: "in"
        Anzahl: 15
    }
    11: {
        Wörter: "sie"
        Anzahl: 14
    }
    12: {
        Wörter: "man"
        Anzahl: 14
    }
    13: {
        Wörter: "so"
        Anzahl: 14
    }
    14: {
        Wörter: "mit"
        Anzahl: 13
    }
]

sowie als Balkengrafik angezeigt werden.

js> metadaten = { title: "Top 15 Wörter", orientation: 30, x: "Wörter", y: "Anzahl" }
{
    title: "Top 15 Wörter"
    orientation: 30
    x: "Wörter"
    y: "Anzahl"
}

js> graph.bar(daten, metadaten)

Azure Hadoop - Balkengrafik der Ergebnismenge

Karlsruher Coding Dojo 2012.3

13.02.2012 22:47:00 | Alexander Zeitler

Legacy Code Kata

Nachdem wir in den vergangenen Dojos immer auf der grünen Wiese angefangen haben, werden wir es in diesem Dojo mit einer existierenden Code Basis zu tun haben.

Wie so oft in der Realität, wird es auch hier die Aufgabe sein fremden Code zu erweitern. Trotzdem soll natürlich sicher gestellt sein, dass bestehende Funktionen immer noch wie erwartet funktionieren.

Ziel ist auch dieses mal wieder die Vertiefung der Fertigkeiten in der Zusammenarbeit als Team, Anwendung von TDD, Erkennen von Refactoring Patterns durch Babysteps und natürlich der Erfahrungsaustausch mit anderen Entwicklern.
Ansonsten gelten die üblichen Rahmenbedingungen:

  • Lockere Atmosphäre
  • Spaß am Coden
  • Spaß mit gleichgesinnten Entwicklern haben
  • Offen sein für Neues
  • CleanCode
  • TDD
  • .NET oder auch jede andere Sprache (bitte Notebook mit entsprechender IDE mitbringen)


Das Mitbringen von Notebooks ist erwünscht, da wir uns in mehrere Teams aufteilen werden. Zumindest sollte eine Entwicklungsumgebung (Visual Studio, Eclipse, etc. ) installiert sein. Weitere Tools (NUnit, RhinoMocks, CodingDojoHelper, etc.) können wir dann gerne vor Ort verteilen.


Externe Tastaturen haben sich auch als sehr hilfreich erwiesen.

Anmeldung via XING.

Location:

DJK-Ost
Friedrichstaler Allee 52
76131 Karlsruhe

Beginn:
Di, 13.03.2012, 18:00

Beta Update : C++ Day 2012 Slides und Demos zum Download

09.02.2012 17:50:53 | Christian Binder

Die Slides und Demos von C++ Day 2012 gibt’s hier zum Download. Jetzt für VS 11 Beta:

image

Hinweis: Wer mit der VS11 Beta die C++ AMP Demos nutzen möchte, findet hier die Änderungen zwischen VS Developer Preview und VS 11 Beta: Changes in VS 11 Beta for C++ AMP  und hier zusätliche C++ AMP Demos C++ AMP sample projects for download

Apache Hadoop Dienste für Windows Azure (Developer Preview)

07.02.2012 06:26:00 | Sascha Dittmann

Azure Hadoop LogoEine weitere NoSQL Implementierung für die Windows Azure Plattform kündigt sich an:
Zum bisherigen Key-Value-Pair Speicher, dem Windows Azure Table Storage, wird in Zukunft ein weiterer Speicher für große Datenmengen (Big Data, Petabyte-Bereich) hinzukommen.
Dieser Speicherdienst baut auf dem Apache™ Hadoop™ Framework auf.

Diese Meldung erreichte mich Ende Letzten Jahres und erweckte mein Interesse.
Doch was ist eigentlich Hadoop?

 

Apache™ Hadoop™

Apache™ Hadoop™ ist ein freies, in Java geschriebenes Framework für skalierbare, verteilt arbeitende Software. Es basiert auf dem bekannten MapReduce-Algorithmus von Google Inc., sowie auf Vorschlägen des Google-Dateisystems. Hadoop wurde ursprünglich durch den Lucene-Erfinder Doug Cutting initiiert.
Am 23. Januar 2008 wurde es zum Top-Level-Projekt der Apache Software Foundation.
Quelle: http://de.wikipedia.org/wiki/Hadoop

 

Anmelden zur Developer Preview

Mitte Dezember war es dann soweit.
Die Apache™ Hadoop™-based Services for Windows Azure standen als Developer Preview zur Verfügung.

Um einen der begehrten Zugänge zu bekommen, musste man sich unter folgendem Link bewerben:
Microsoft Connect: Apache Hadoop for Azure & Windows Server

Gesagt - Getan!

Einige Tage später traf dann auch die Willkommens-Email ein.

 

Erstellen eines Hadoop Clusters

Um die Hadoop Dienste für Windows Azure dann auch testen zu können, muss man zuerst ein Cluster anfordern:

Apache Hadoop für Windows Azure - Neues Cluster anfordern

Hierzu müssen ein DNS Name, eine Cluster Größe und ein Benutzerkonto für das Cluster angegeben werden.

Anschließend dauert es einige Minuten bis die einzelnen Clusterknoten ...

Apache Hadoop für Windows Azure - Clusterknoten werden erzeugt

... und Netzwerkeinstellungen erstellt wurden.

Apache Hadoop für Windows Azure - DNS-Einstellungen für das Cluster werden erzeugt

Während dieses Erstellungsprozesses, kann der Browser zwischenzeitlich geschlossen werden.

Nachdem das Cluster erstellt wurde, kann dieses für 2 Tage genutzt werden, bevor es automatisch gelöscht wird:

Apache Hadoop für Windows Azure - Clusterverwaltung

 

Wie geht es weiter?

In den nächsten Wochen werde ich mich mit diesen neuen Diensten für Azure beschäftigen.
Besonders die MapReduce Implementierung und das verteilte Dateisystem (HDFS) stehen im Fokus.

Gibt es noch weitere Themen, die ich mir in diesem Zusammenhang ansehen sollte?
Wenn ja, können diese gerne als Kommentar, am Ende dieses Artikels, hinterlassen werden.

Request Validation an eigene Bedürfnisse anpassen

06.02.2012 21:36:00 | Martin Hey

Die Validierung der an die Webanwendung übertragenen Daten spielt eine zentrale Rolle, ist sie doch der Garant dafür, dass kein schadhafter Code eingeschleust werden kann und verhindert Cross Site Scripting (XSS). Und wer hat nicht schon einmal den YOSD gesehen, der erscheint, wenn ein Wert eingegeben wird, der auch nur im entferntesten wie HTML aussieht.

Was hier passiert ist klar. Die Request Validation von ASP.NET hat in den Eingabewerten einen Eintrag gefunden, den sie als potenziell unsicher erkannt hat und schützt nun die Anwendung indem eine HttpRequestValidationException geworfen wird. Was für Entwickler an der Request Validierung störend ist, ist, dass sie an einer Stelle vorgenommen wird, an der nicht so richtig gut eingegriffen werden kann - sie geschieht vor der BeginRequest-Phase des Http Requests. In meinem Post zum Attribut AllowHtml habe ich schon gezeigt, wie man mit Hilfe des AllowHtmlAttribute an Eigenschaften des Models die Request Validierung für einzelne Feldwerte deaktivieren kann. Aber ASP.NET bietet noch eine weitere Möglichkeit, in die Validierung einzugreifen: eine eigene Implementierung der Request Validation.

Um eine eigene Implementierung der Request Validierung vorzunehmen sind zwei wesentliche Schritte notwendig: Zum einen muss eine von RequestValidator abgeleitete Klasse erstellt und diese muss dann noch in der weg.config registriert werden.

 

Erstellen des RequestValidators

Ein eigener RequestValidator ist schnell erstellt: Hierzu leitet man einfach von der Klasse RequestValidator ab. RequestValidator selbst bringt die überschreibbare Methode IsValidRequestString mit und diese Methode wird für jeden im Request enthaltenen Wert aufgerufen - seien es nun Cookie-Werte oder im Formular-Post enthaltene Werte. Ist der Rückgabewert bei irgendeinem Wert false, so resultiert daraus die schon bekannte HttpRequestValidationException.

Im Beispiel möchte ich die Validierung so anpassen, dass beispielsweise einzelne eckige Klammern noch zugelassen werden (wie sie als Passwort-Sonderzeichen gern mal vorkommen), aber Werte die den Anschein von HTML erwecken (also zunächst öffnende und dann wieder schließende Klammern) weiterhin abgewiesen werden. Nun könnte ich selbst mit Hilfe von RegEx-Pattern die Eingabewerte prüfen und je nachdem ob es Matches gab oder nicht dann die Werte abweisen. In diesem Fall möchte ich mich aber lieber auf Komponentenhersteller verlassen, die sich schon einige Jahre mit Cross Site Scripting und der Verhinderung davon beschäftigen. Im Download-Center von Microsoft kann die Anti XSS Library heruntergeladen werden. Derzeit aktuell ist die Version 4.2.1. Darin enthalten sind im wesentlichen zwei Assemblies: die AntiXSSLibrary.dll und die HtmlSanitizationLibrary.dll. Für meine Zwecke verwende ich die letzte der beiden. Sie ist in der Lage, HTML zu bereinigen. Angewandt sieht mein CustomRequestValidator nun wie folgt aus:

namespace Sample
{
    public class CustomRequestValidator : RequestValidator
    {
        protected override bool IsValidRequestString(
            HttpContext context, 
            string value, 
            RequestValidationSource requestValidationSource, 
            string collectionKey, 
            out int validationFailureIndex)
        {
            validationFailureIndex = 0;

            if (requestValidationSource == RequestValidationSource.Form)
            {
                if (IsSafeHtmlString(value))
                {
                    return true;
                }
            }

            return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        }

        private static bool IsSafeHtmlString(string value)
        {
            // compare safe html with input
            var sanitizedValue = HttpUtility.HtmlDecode(Sanitizer.GetSafeHtmlFragment(value));
            if (sanitizedValue != value)
            {
                return false;
            }

            return true;
        }

    }
}

Herzstück ist die Methode IsSafeHtmlString. Ihre Funktionsweise: Ist der durch die Säuberung der AntiXSS-Library ggf. veränderte Eingabewert mit dem eigentlichen Eingabewert noch identisch, so hatte die AntiXSS-Library nichts am Eingabewert auszusetzen und er kann als sicher angesehen werden - anderenfalls wird auf die Standardimplementierung des ASP.NET-Frameworks zurückgegriffen.

 

Registrieren in der web.config

Um diesen Validator nun zu registrieren, muss nur noch die web.config so angepasst werden, dass die eigene Implementierung verwendet wird:

<system.web>
  <httpRuntime requestValidationType="Sample.CustomRequestValidator" />
  ...
</system.web>

Das war's schon. Da im False-Fall an die Standard-Implementierung des RequestValidators weitergeleitet wird, greifen natürlich auch Einstellungen am Model wie das AllowHtml-Attribut.

 

Zum Schluss möchte ich noch einmal darauf hinweisen, dass die Request Validation in ASP.NET - auch wenn sie sehr streng ist - ihre Daseinsberechtigung hat und es auch durchaus sinnvoll ist, dass sie so strenge Überprüfungen vornimmt. Mit jeder Änderung an der Request Validation - sei es nun sie mit Hilfe von AllowHtml für einzelne Eigenschaften zu deaktivieren, sie ganz auszuschalten oder sie wie eben gezeigt zu modifizieren, sollte man extrem vorsichtig sein, da die Applikation damit potenziell unsicher und anfällig für Angreifer wird.

Treffen der DNUG Braunschweig - Reporting auf Grundlage von XML-Definitionen

06.02.2012 04:20:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 14.02.2012 um 19:00 im Restaurant Zucker (Tagungsraum). Dieses Mal hält unser Mitglied Guido Birkenfeld einen Vortrag zum Thema Reports.

Abstract:
Reports sind in vielen Betrieben ein wichtiger Bestandteil der täglichen Arbeit
Es gibt bereits sehr viele gute und komplexe Tools auf dem Markt.
Guido zeigt einen Ansatz Reports mit den dazugehörigen Eingabeparametern mit Hilfe einer XML-Definition zu erstellen.
Diese werden dann in einer Datenbank gespeichert und können über ein Webinterface aufgerufen werden.
Der wesentliche Vorteil hierbei liegt darin, dass keine neue Software Version ausgeliefert werden muss.
Denn die Änderungen werden ausschließlich in der Datenbank gemacht.

Bio:
Guido Birkenfeld arbeitet als Softwareentwickler bei der Firma CEVA Logistics in Wolfsburg
Beruflich und auch privat beschäftigt er sich hauptsächlich mit dem Design und der Entwicklung von .NET  Anwendungen.

Wie immer ist die Veranstaltung kostenlos! Weitere Informationen zur DNUG Braunschweig können hier gefunden werden: http://www.dotnet-braunschweig.de

.NET Day Franken 2012 - Ich bin dabei!

05.02.2012 06:26:00 | Lars Keller

Am 28.04.12 findet wieder der .NET Day Franken in Nürnberg statt. Ich selber bin als Sprecher mit dem Thema “Kinect & MS Office? - Neue Wege der Benutzer Experience (UX)” dabei.
Die Agenda zeigt ein relativ breites Spektrum an interessanten Themen rund um .NET. SQL Server 2012, Silverlight 5, Scrum sowie Game Development!

Mein letzter Besuch bei der DNUG Franken ist schon eine Weile her, darum freue ich mich, besonders auf einen Besuch in der schönen Stadt Nürnberg!

Hash Bang Urls in Single Page Applications mit ASP.NET MVC

04.02.2012 12:37:00 | Alexander Zeitler

In Single Page Applications verwendet man häufig Hash-Bang Urls (was das ist, hat Robert hier beschrieben).

Setzt man nun anstelle des üblichen HomeControllers, der die Startseite (üblicherweise die Index View) rendert, eine statische default.htm Datei ein, will man natürlich die Hash-Bang Urls möglichst elegant und wie z.B. von twitter gewohnt in diesem Stil darstellen:

http://meineseite/#!/machwas

Durch die Verwendung der default.htm mit aktiviertem Default-Controller, müßte man das ganze allerdings so darstellen:

http://meineseite/default.htm#!/machwas

Leider funktioniert

http://meineseite/#!/machwas

zunächst nicht mehr (es erscheint die Index-Seite des HomeControllers oder ein 404, falls man den HomeController bereits gelöscht hat).

Der Grund liegt in den Route-Definitionen, die per Default in der Global.asax.cs definiert sind, genauer in der Definition eines Default-Controllers:

Entfernt man die Definition des Default Controllers

funktioniert der Aufruf von

http://meineseite/#!/machwas

wie gewünscht.

Natürlich kann man auch die Index-View des HomeControllers als Startseite für eine Single Page Application verwenden, was ich persönlich aber nicht (mehr) mache.

Welcher Browser unterstützt welche HTML5-Features

03.02.2012 07:07:00 | Sascha Dittmann

HTML5 LogoJe mehr ich mich in letzter Zeit mit den umfangreichen und spannenden Funktionen von HTML5 und CSS3 beschäftige, desto häufiger stelle ich mir die Frage:
Welcher Browser unterstützt eigentlich welche HTML5-Features?

Abhilfe schaffen u.a. zwei Suchmaschinen, die die HTML5- bzw. CSS3 Browserkompatibilität detailliert darstellen.

Eine rein technische Sicht der Dinge liefert hierbei die When can I use... Seite.
Über die Suchmaske kann nach HTML5-, CSS3- und SVG-Befehlen gesucht werden.

When can I use...

 

Wer noch zusätzlich ein paar Tipps & Tricks gezeigt haben möchte, findet bei dem Community Projekt HTML5 Please Rat:

HTML5 Please

Regeln | Impressum