Fehlersuche

by Bernhard Wurm 14. December 2011 07:42

Quizfrage: Was ist bei diesem Screenshot nicht stimmig Smile

clip_image002

Tags:
Categories: Dev-WTF>

Google Calender am Windows Phone 7 einrichten

by Bernhard Wurm 27. November 2011 14:27

Eine scheinbar einfache Aufgabe ist gar nicht so einfach wie man meint, wenn die Voraussetzungen, welche nicht unbedingt offensichtlich sind, nicht gegeben sind. Konkret heißt das, dass ich meinen Google Calender gerne am Windows Phone 7 sehen und somit synchronisiert haben möchte. Also einfach nur das Gmail-Konto in den Einstellungen hinzufügen und los gehts. – denkste Smile

Mango Update ist natürlich drauf und trotzdem gehts nicht. Die Frage ist warum?

Wie so oft im Leben bin ich nicht der erste mit der Fehlermeldung und so lieferte das MDSN Forum die Antwort: http://forums.create.msdn.com/forums/p/86127/555747.aspx

Ich habe zwar ein Google-Konto, aber kein Gmail Konto! Und das ist auch das Problem. Also mit dem Google-Konto auch Gmail aktivieren und dann mit der Gmail Adresse anmelden und es geht auch.

So richtig sexy ist das nicht aber hilft ja wieder mal nix.

Warum überhaupt neben dem Facebook-Kalender, dem Windows Live-Kalender,… auch noch Gmail hinzufügen?

Die IT ist im Wandel – tja wer hätte das gerade bei der IT gedacht Winking smileAber echt jetzt. Angelika und ich wollen einfach wissen was beim Anderen los ist und so heißt es einen Kalender verwenden, da ist man schnell mal auf der Suche nach einer online-Kalender-Lösung, die verschiedenste Konten miteinander verbinden kann. Mit etwas wehmut sind wir somit bei Google gelandet. Warum nicht Windows Live? Hm. gute Frage Winking smile

Categories: Mobile

Firefox 7 ist da

by Bernhard Wurm 28. September 2011 06:39

Der neue Firefox 7 ist da und wer diesen gleich haben will sollte diesen direkt von der Webseite herunterladen und installieren, denn mit dem automatischen Update wird dieser noch nicht ausgerollt:

image

Was ist eigentlich neu mit dem neuen Firefox? Primär handelt es sich um Änderungen unter der Haube – das heißt  aktuelle WebSocket drafts, und internas (hier eine Liste http://www.businessinsider.com/heres-whats-new-in-firefox-7-2011-9). In der Oberfläche hat sich kaum etwas verändert.

Tags:
Categories: Tools

IE10 bekommt Websockets!

by Bernhard Wurm 16. September 2011 03:49

In der //build/ Konferenz wurden so manche Neuerungen vorgestellt. Unter anderem, dass .NET 4.5, Windows 8 und Windows Server 8 die Unterstützung für Websockets bekommen.

Und ja, endlich auch Internet Explorer! Also Internet Explorer 10 wird Websockets unterstützen wie im IE Blog angekündigt.

Categories: Standards

JSON Validieren

by Bernhard Wurm 28. August 2011 05:01

Der große Vorteil von JSON als Nachrichtenformat gegenüber XML-basierten Nachritenformaten ist natürlich der geringe Overhead und somit geringeren Datenmenge.

Ein weiterer großer Vorteil bei der Verwendung von JSON in Verbindung mit Javascript ist, dass das Objekt einfach in Javascript verwendet werden kann.

Wer mit JSON arbeitet und dieses während der Entwicklung etwas schöner darstellen und gleichzeitig validieren möchte kommt über eine sehr nützliche Webseite kaum herum:

www.jsonlint.com

Diese formatiert einen String in eine lesbare struktur und validiert sehr zuverlässig und schnell. Sehr empfehlenswert!

Wer noch nach einer Lösung sucht, wie man einen übertragenen JSON-String als Javascript-Objekt verwenden kann – so gehts:

var obj  = JSON.parse(jsonString);
Categories: Tools | Tools

Review Windows Phone 7

by Bernhard Wurm 27. July 2011 02:00

Nachdem ich seit Mai in Genuss stand ein Windows Phone 7 (HTC Trophy) testen zu dürfen, wird es Zeit für einen kleinen Erfahrungsbericht. Voreingenommen bin ich durch mein altes Samsung Omnia II mit Windows Mobile 6.5. iPhone und Android kenne ich, habe ich aber noch nicht intensiv benutzt.

Gleich vorweg: Von der Geschwindigkeit, Benutzerfreundlichkeit etc. kann keine alte Version von Windows Mobile dem Windows Phone das Wasser reichen. Der Unterschied ist hier genau so groß wie zwischen DOS und Windows 95 (für alle die sich das noch vorstellen können Smile). Die Betriebssysteme haben nichts gemein!

Design

Windows Phone 7 überzeugt vor allem durch das sog. Metro Design, welches das Oberflächendesign beschreibt. Der Homescreen des Phones ist absolut genial und überzeugt! Im Gegensatz zum iPhone, welches sich durch eine Icon-Sammlung darstellt hat hier der Benutzer interaktive Elemente, die viel mehr Informationsgehalt haben und durch kleine Animationen den Screen interessant machen.

Das Pendant zu iTunes namens Zune ist ebenfalls gut Gelungen und integriert sogar YouTube Videos in die Historie!

Kontakte & Facebook

Die Integration von Social Media sucht seines Gleichen und ist perfekt gelöst. Die Kontakte des Smartphones, sowie die Kontakte von Facebook werden bei Überschneidungen automatisch zu einem einzigen Kontakt zusammengefasst und mit dem Facebook Profilbild abgespeichert, welches sich automatisch aktualisiert. Auch selbst kann man Kontakte zusammenfassen und seit ich das Windows Phone 7 benutze, benutze ich Facebook nicht mehr im Browser. Ich sehe meine Wall oder auch die Infos von Freunden sofort auf meinen Handy. Die FB-Wall der einzelnen Personen ist abrufbar und selbst die Facebook Bilder meiner Freunde kann ich mir über den Bilder-Hub ansehen. Mit dem WP7 ist es außerdem möglich, direkt auf die Facebook-Wall (auch der Freunde) zu schreiben.

Ebenfalls gut gelungen bei den Kontakten sind die zuletzt benutzten Kontakte (egal ob per Facebook, oder per Anruf!)

Ein mit der Kamera geschossenes Foto kann leider nur auf Live gespielt werden und nicht auf Facebook Sad smile

App-Store (Marketplace genannt)

Der Marketplace hat gegenüber dem iPhone einen riesen Vorteil: Ich muss nicht erst meine gesamten Daten an Microsoft übermitteln, bevor ich mir (kostenlose) Apps herunterladen kann. Die Auswahl von Apps und Spielen ist bereits super. Und wenn von Anwendungen einzelne Features wie z.B.: die Standord-Ortung benutzt werden warnt mich das Betriebssystem, was ich eine wirklich tolle Sache finde.

Was dem Windows Phone jedoch etwas an Sexyness nimmt ist die Tatsache, dass viele Anwendungen lediglich für iPhone und Android existieren (wobei ich auch hier beobachtet habe, dass oftmals die Android App kostenlos und die iPhone App zu bezahlen ist.) Um nur zwei Beispiele zu nennen bietet beispielsweise Loxone nur für iPhone, iPad und Andorid (neben einer HTML5 + WebSocket Variante) an wodurch diese mit einem Windows Phone nicht benutzt werden kann. Auch der Dienst DropBox hat die gleichen Beschränkungen.

1 Button vs 3 Buttons

Das iPhone besitzt bekannterweise genau einen Button, welcher immer wieder auf den Homescreen zurück führt. Windows Phone hält 3 Buttons für den Benutzer bereit. Dabei ist einer eine kontextsensitive Suche. Suchen im Web, innerhalb der Kontakte, E-Mails oder auch im Marketplace, je nach dem wo sich der Benutzer gerade befindet. Tolle Sache.

Außerdem einen Zurück-Button der immer einen Schritt zurück geht. Diesen lernte ich besonders zu schätzen, als ich einen Kontakt speichern wollte und ich einen Anruf bekam. Und ohne dass ich den Kontakt gespeichert hatte, war dieser vollständig da. Man kommt mit dieser Schaltfläche scheinbar unendlich weit in die Vergangenheit zurück. Winking smile

Natürlich gibt es auch den “Homescreen” Button.

Geschwindigkeit und Stabilität

Die Geschwindigkeit ist super! Auch die Stabilität ist ganz gut! Manchmal stürtzt eine APP ab, was jedoch das Verschulden des App-Entwicklers ist und nicht dem Gerät oder dem Windows Phone anzuhaften ist. Ein Absturz des Browsers, Mailclients oder des Betriebssystems an sich kam in meiner Testzeit sehr selten vor. Wenn eine Anwendung jedoch richtig bockte z.B.: der Marketplace half manchmal auch nur ein Reboot Sad smile

Natürlich hoffen wir alle auf das “Mango” Update Winking smile

Einen kleinen Bug habe ich auch entdeckt, wie in diesem Beitrag beschrieben: wenn ich eine E-Mail abrufe, gibt sich das Windows Phone als Windows XP aus Disappointed smile

Die Akku-Leistung ist typisch Smartphone – sicherheitshalber lieber jeden Tag aufladen Sad smile

Fazit

Windows Phone 7 ist ein tolles Betriebssystem auf tollen Geräten. Es ist sehr modern und kann mit alten Versionen nicht verglichen werden. Die Oberfläche ist sehr innovativ und (meiner Meinung nach) dem Apple iPhone und Android weit voraus!

Die Geräte sind inzwischen stark im Preis gefallen und gut erschwinglich. Leider verzichten viele Entwickler auf die Entwicklung von Apps aufgrund der noch geringen Verbreitung.

Natürlich lassen sich viele Wünsche äußern und wenn man wirklich will findet man auch Dinge die in anderen Betriebssystemen besser gelöst sind. Aber ehrlich hat man nichts zu meckern!

Die großen Stärken werden auch durch die perfekte Integration von Facebook & Co geschaffen. Verzichtet man auf diese Features verliert das Phone einen großen Teil seiner Sympatiepunkte, obwohl dies natürlich nicht das einzige ist.

Ein Gutes Betriebssystem das durch Updates hoffentlich noch viel Besser wird!

Categories: Mobile

E-Mail-Client Detection am Windows Phone

by Bernhard Wurm 30. May 2011 13:00

Der sog. Useragent ermöglicht das Erkennen des Browsers im Web. Durch diesen Useragent wird beispielsweise erkannt, dass es sich beim Gerät mit dem Sie gerade im Internet surfen es sich um ein iPhone, iPad, um einen PC mit Internet Explorer 9 oder ähnliches handelt.

Auch Windows Phone 7 hat einen ganz eigenen User Agent-String, welcher auch den Gerätehersteller angibt:

Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; HTC; 7

Es ist zu erkennen, dass Windows Phone 7 den alten Internet Explorer 7 als Browser verwendet. Dies wird sich mit dem Mango Update ändern, da auch Windows Phone zukünftig den IE9 verwenden wird.

Ich habe ein paar Tests durchgeführt und dabei folgendes entdeckt. Beim Abruf von E-Mails mit dem Windows Phone 7 ändert sich plötzlich der Useragent String:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

Beim Abruf von E-Mails gibt sich also das Windows Phone (stand Heute) als Windows XP aus. Eine Optimierung der E-Mails durch die Client-Erkennung ist hier also nicht möglich Sad smile. Hoffentlich ändert sich dies mit dem Mango Update!

Categories: Mobile

IE10 Platform Preview verfügbar

by Bernhard Wurm 15. April 2011 02:27

Wow! Ich bin erstaunt! Die erste Preview zum Internet Explorer 10 ist verfügbar, wie auf codefest berichtet wurde. Wirft man einen Blick auf den IE Blog, sieht man auch gleich dass es sich bei der Preview um die Umsetzung von CSS3 Features handelt.

Da ja auch bei Firefox sehr kurze Releasezyklen angekündigt wurden hoffe ich doch dass nun auch Microsoft Schritt hält und uns mit sehr kurzen Zylken erfreut!

Und wir hoffen natürlich stark, dass auch WebSockets bald “stabil genug” für Microsoft sind, sodass diese bald eingebaut werden. Zitat: “Other emerging standards (like WebSockets and IndexedDB) need to stabilize before developers can expect that. We work with the community on these as part of HTML5 Labs, where iteration will not affect consumers and mainstream developers.” [Quelle: http://blogs.msdn.com/b/ie/archive/2011/04/12/native-html5-first-ie10-platform-preview-available-for-download.aspx]

Tags:
Categories:

IE9 ist da!

by Bernhard Wurm 15. March 2011 04:01

IE9 ist nun endlich da. Das Release des Browser enthält jedoch wie beürchtet keine Websocket Unterstützung.

Nun ja. Trauen wir nicht über das was fehlt, sondern freuen wir uns über das was da ist. HTML5 Canvas, Video, Audio, CSS, ES5… Download unter http://www.beautyoftheweb.com/

Tags:
Categories:

IE9 kommt! Aber fehlt da nicht was?

by Bernhard Wurm 11. March 2011 08:09

IE9 wird laut Microsoft kommenden Dienstag veröffentlicht. Wenn dann auch noch Firefox 4 zur Verfügung steht, dann freuen wir uns alle auf HTML5 – oder?

Naja. Firefox 4 und Opera haben Websockets deaktiviert. Microsoft verliert über das Thema kaum ein Wort. Lediglich wenige Blog Beiträge und fehlende IE-Testdrive-Samples lassen vermuten, dass der IE9 – leider – wohl keinen Websocket Support haben wird.

Der Standard für Websockets ist auch noch nicht fertig und bereits jetzt mit einem Ablaufdatum versehen. Daher ist die strategische Entscheidung durchaus verständlich – nichts desto trotz blutet das Entwickler-Herz durch die fehlende Funktion, würden sich doch so viele coole Sachen machen lassen.

Die wohl größte Gefahr für Microsoft und den Internet Explorer sind jedoch die langen Release-Zyklen. Während Google, Opera und Firefox ständig neue Versionen auf den Markt bringen dauert es bei Microsoft einfach viel zu lange. Die Einführung derartiger Funktionen wird dadurch blockiert.

Die großen Vorteile lassen dennoch Anwendungen darauf aufbauen und fordern somit Browser Alternativen zu IE. Alles in allem: eine bedauerliche und gefährliche Entwicklung.

Tags:
Categories: Standards

Voten und mitreden

by Bernhard Wurm 2. March 2011 07:29

image

Microsoft hat die Abstimmung für die Features von Silverlight erneut eröffnet. Also gleich mit voten und Features posten http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions

Aber erwartet nicht das das Voting Ergebnis noch Einfluss auf die kommende Version 5 hat, denn diese steht bereits in den Startlöchern!
Categories: Silverlight

CreateIfNotExists… naja

by Bernhard Wurm 1. March 2011 09:28

Die MSDN ist meiner Meinung nach eine der besten Dokumentationen weltweit. Auch das .NET Framework ist eine tolle Plattform. Aber Fehler gibt es überall. Was also soll dieser Methodenname und diese Erklärung dazu: “The CreateIfNotExist method throws a StorageClientException if the specified container already exists.” Quelle: http://msdn.microsoft.com/en-us/library/ee772864.aspx

Eigentlich würde man sich erwarten, dass CreateIfNotExists den Container erstellt oder einfach nichts macht falls dieser schon existiert. Ansonsten könnte die Methode ja einfach Create heißen
Smile

Categories: Dev-WTF>

Zeit, Projekte und Prioritäten

by Bernhard Wurm 27. February 2011 05:19

Aktuell sind die neuen Posts rund um Software Entwicklung ziemlich mager. Dies hängt mit aktuellen Prioritäten zusammen. Deswegen gibt es zusätzlich einen neuen Hausbau-Blog: http://house.raupes.net.

Außerdem findet ihr natürlich  noch E-Mail-Marketing-Tipps von mir auf www.mailworx.info/blog.

Bei Bedarf werde ich natürlich weiterhin viel interessantes hier posten.

PS: Nicht Vergessen: Windows 7 SP1 installieren!

Tags:
Categories:

IE9 RC1 ist da

by Bernhard Wurm 10. February 2011 11:55

und zwar ohne Websocket Unterstützung. Meine Frage: WARUM?
Microsoft bleib doch bitte am Ball!

Tags:
Categories:

Windows 7 Ruhezustand aktivieren

by Bernhard Wurm 15. January 2011 10:51

Der Ruhezustand von Windows ist ein sehr gutes Feature, da es vor allem die Bootzeit stark reduziert.

Doch wo aktiviert man den Ruhezustand in Windows 7? Microsoft hat diese Option standardmäßig deaktivert und gleichzeitig nahezu unauffindbar versteckt:

-> Systemsteuerung –> Hardware & Sounds –> Energieoptionen –> Energiesparplaneinstellungen ändern –> Erweiterte Energieeinstellungen ändern –> Unter Energie sparen –> Hybridien Standbymodus zulassen –> “AUS” setzen

Dann erscheint endlich der Ruhezustand (Hybernate beim englischen Betriebssystem) im Startmenü.

Hier noch ein paar Screenshots zur Option:

image

image

image

Ich hoffe das ersparrt euch so einiges der Zeit um dies zu finden.

Tags:
Categories:

Autoscroll eines DIV’s mit JavaScript

by Bernhard Wurm 7. January 2011 07:39

Mithilfe einer Log-Funktion möchte ich kurz eine nette Auto-Scroll-Funktion vorstellen.

Nehmen wir eine Funktion die Logging mit Javascript ermöglicht, indem in ein DIV der Inhalt hinzugefügt wird. Die Herausforderung: Jeder Log-Eintrag wird chronologisch unten angereiht. Daher sollte der Scrollbalken immer unten stehen. – Also muss ein Auto-Scroll-Mechanismus her:

function log(msg) {
    $("#log").append(msg).append("<br />")
        .scrollTop(document.getElementById("log").scrollHeight);
}

So einfach gehts Smile

Viel Spass!

Categories: jQuery

Gelöschte Dateien mit Windows wiederherstellen

by Bernhard Wurm 2. January 2011 04:46

Manchmal passiert es einfach, dass eine Datei ungewollt gelöscht wird. Zum Beispiel wenn ein Programm beim Öffnen der Datei einen Fehler wirft und anschließend die Datei löscht (wtf).

Nun ja. Das Problem ist nun dass die Datei weg ist und somit arbeitsvolle Stunden verloren sind.

Ich habe zwar nicht den letzten Stand aber zumindest doch etwas mit eingebauten Windows-Funktionen retten können.

  1. Im Verzeichnis in welchem sich die Datei befindet eine neue Datei anlegen mit genau dem gleichen Namen.
  2. Rechte Maustaste – Eigenschaften.
  3. Karteireiter wechseln auf die alten Versionen.
  4. Die Schattenkopie, welche vom Windows angelegt wurde wiederherstellen. – sofern hoffentlich welche da sind.

Dies sieht ungefähr wie folgt aus:

image

Tags:
Categories:

Nützliche Add-Ons für Visual Studio 2010–StyleCop

by Bernhard Wurm 4. December 2010 04:33

In diesem Beitrag wurde auf die Microsoft Productivity Power Tools hingewiesen.

Heute wollen wir uns kur StyleCop widmen:
image

Warum StyleCop?

Stylecop ermöglicht es Programmierrichtlinien konsequent umzusetzen. In einem Team ist es wünschenswert dass die Struktur eines Programmcodes ident ist unabhängig von welchem Entwickler der Code erstellt wurde.

StyleCop setzt genau hier an und überprüft den Code auf die Einhaltung von Regeln. Dabei kennt StyleCop kein Pardon und sieht richtig schnell rot und liefert sofort Warnungen.

Der Einsatz

Rechte-Maustaste auf das Projekt und im Context-Menü findet sich der Eintrag “Run StyleCop”. Bei so ca. 800 Warnungen bricht dieser ab – also glaubt nicht  das sei es gewesen Winking smile

Im Projektverzeichnis wird eine Datei Settings.StyleCop angelegt welche die Einstellungen für dieses Projekt beinhaltet – falls Regeln deaktiviert werden etc.

Kurz-Fazit

StyleCop zwingt die Entwickler eine Struktur. Der Code wird vereinheitlicht. Allerdings sollte StyleCop sofort und nicht erst später in einem Projekt eingesetzt werden, da das ausmerzen der alten Unschönheiten weder lusting, noch spannend ist. Gleichzeitig wird die Einführung dadurch sehr negativ behaftet sein und eher auf wenig Akzeptanz stoßen.

Categories: Visual Studio | Tools

XSLT Laufvariablenersatz & die Ermittlung der Position des Parent-Elements

by Bernhard Wurm 11. November 2010 13:54

XSLT ist eine Transformationssprache und keine Programmiersprache. Daher ist es auch nicht verwunderlich, dass es hier keine Laufvariablen gibt.

Dennoch gibt es Herausforderungen die nach der Verwendung von Variablen lechst. Also gilt es sich hier entsprechend anderwertig abzuhelfen:

position() ermöglicht den Zugriff auf die Position des aktuellen Elements.

count() ermöglicht das Herausfinden der Anzahl der verfügbaren Elemente.

So weit ist es auch nicht schwer anzuwenden. Doch was wenn Sie aufgrund der Hierarchie die Position des übergeordneten Elementes ermitteln möchten?

../position() funktioniert leider nicht so wie gewollt, da hier durch die eindeutige Hierarchie immer 0 zurück gegeben wird.

Das Problem wird mithilfe der “vorangegangenen Geschwister” gelöst:

count(../preceding-sibling::node()) + 1

  • count = Zähle;
  • ../ = navigiere zum Parent-Element;
  • preceding-sibling = alle geschwister, welche in der Reihenfolge vorher gekommen sind;
  • ::node() = die Knoten selektieren, sodass das Count auch durchgeführt werden kann.

Und schon ist die Position des Eltern-Elements ermittelt. Dies funktioniert übrigends auch mit Großeltern usw.

Fazit: Auch wenn keine prozedurale Implementierung möglich ist. Mithilfe so mancher eingebauten XPath Funktionen kann dennoch so manche  Prozedurale Anforderung umgesetzt werden.
Tags: ,
Categories:

LINQ-Provider als D(o)I(t)Y(oursef)

by Bernhard Wurm 5. November 2010 11:35

LINQ funktioniert mit allen Objekten, welche IEnumerable implementieren. Richtig? Richtig!
Doch dies ist nicht unbedingt ein muss!

Verschiedene Linq-Provider ermöglichen den Zugriff auf verschiedenste Datenquellen. Z.B.: Linq2Sql, Linq2Xml, Linq2Sap, Linq2Twitter und so weiter. Auch selbst kann ein entsprechender Provider gebaut werden indem das Interface IQueryProvider implementiert wird. Doch wer einen entsprechenden Provider implementiert wird viele Methoden zu implementieren haben, damit die Linq-Syntax auch wirklich unterstützt wird und keine Laufzeitfehler auftreten. Es sind nicht nur die Methoden select und where zu implementieren sondern auch groupby etc. werden diese nicht implementiert, so kommt es zu einem Laufzeitfehler.

Wie kann für eine eigene Klasse eine einfache, eingeschränkte Linq-Abfrage abgesetzt werden ohne dass ein eigener großer Provider implementiert wird und gleichzeitig der Compiler Prüfungen durchführen kann.

Interessanter Punkt:

Was man mit LINQ abfragen will muss nicht IEnumerable<T> implementieren! Es muss lediglich eine GetEnumerator()-Methode verfügbar sein. Ja nicht mal für foreach muss IEnumerable implementiert werden. Auch hier reicht eine GetEnumerator()-Methode.

Spannendes zu LINQ:

Was muss ich machen, damit meine Klasse MyContainerClass mit Linq abfragen kann?

var data = new MyContainerClass();
var result = from d in data
where d.Name == "Third"
select d;

Dabei soll jedoch lediglich select und where verfügbar sein, da ich mich z.B.: über groupby nicht kümmern will. Es soll aber wie gesagt auch nicht zu einem Runtime-Fehler führen, sondern der Compiler prüfen.

Nun ja. Als erstes wird die Klasse mit der Eigenschaft Name, sowie der GetEnumerator-Methode.

class MyContainerClass  {
//Simulate data :)
static MyContainerClass[] data = new MyContainerClass[] {
new MyContainerClass() { Name = "First" },
new MyContainerClass() { Name = "Second" },
new MyContainerClass() { Name = "Third" },
new MyContainerClass() { Name = "Fourth" }
};

public string Name {get; set;}

public IEnumerator<MyContainerClass> GetEnumerator() {
foreach (var item in data)
yield return item;
}
}

So weit so einfach. Doch wie bekommen wir nun die echte LINQ Unterstützung? Ebenfalls ganz einfach: Man implementiere lediglich Methoden mit einem bestimmten Namen und einer bestimmten Signatur:

class MyContainerClass  {
  //Simulate data :)
  static MyContainerClass[] data = new MyContainerClass[] {
    new MyContainerClass() { Name = "First" },
    new MyContainerClass() { Name = "Second" },
    new MyContainerClass() { Name = "Third" },
    new MyContainerClass() { Name = "Fourth" }
  };
  public string Name {get; set;}
  public IEnumerator<MyContainerClass> GetEnumerator() {
    foreach (var item in data)
      yield return item;
  }
  public IEnumerable<MyContainerClass> Where(Func<MyContainerClass, bool> predicate) {
    return data.Where(predicate);  //Simulate where by just delegate it
  }
  public IEnumerable<MyContainerClass> Select(Func<MyContainerClass, MyContainerClass> selector) {
    return data.Select(selector);  //Simulate select by just delegate it
  }
}

FERTIG! Das ist es. Es müssen nur die Methoden vorhanden sein und der Compiler lässt die LINQ-Syntax zu.

Man lernt nie aus!

Categories: Programmiersprachen | C#

Downloads und File Sharing

by Bernhard Wurm 30. October 2010 03:56

Buch Cover

Vor kurzem hat mich ein Freund darauf aufmerksam gemacht, dass mein Buch Programmieren lernen! als illegaler Download auf File-Sharing-Seiten zur Verfügung steht.

Doch was tun?
Natürlich das einfachste: dem Verlag den Link schicken. Dieser kümmert sich um die Angelegenheit.

Warum ist der Download eigentlich illegal?
Nun ja, ich versuche es mal Sinngemäß zu formulieren – Angaben ohne Gewähr. In Österreich stützt man sich hier auf das Argument, dass es verboten ist eine Kopie von einem urheberrechtlich geschütztem Werk (in diesem Fall das Buch) einem unbekannten Kreis zur Verfügung zu stellen. Das würde bedeuten, dass das Hauptproblem nicht ist, selbst eine Privatkopie zu besitzen, sofern diese von einem Original stammt, sondern viel mehr das zur Verfügung stellen als Download.

Also bleibt legal und kauft das Buch Smile - Ach ja, wer einem Autor die Prämie gut heißt, sollte allgemein lieber direkt beim Verlag bestellen. Dort gibt es im Allgemeinen die gleichen Preise, jedoch für den Autor keine Minderung durch den Handel…
Categories:

Reactive Extensions for .NET – Teil 1

by Bernhard Wurm 18. October 2010 15:20

Ich bin gestern auf etwas interessantes gestoßen: Reactive Extensions for .NET. Hört sich spannend an.

Hierbei handelt es sich um ein Lab-Projekt von Microsoft Research mit dem Ziel ein einheitliches, einfaches Programmiermodell für Ansynchrone und Event-basierte Implementierung. Bzw. ein Programmiermodell um hier eine einfachere Verknüpfung dieser beiden (Asynchron und Event-Based) Welten.

Also habe ich  mir RX für .NET 4 von der Webseite heruntergeladen und installiert und meine ersten Gehversuche gestartet.

Demoprojekt: AutoComplete-Textbox

Also man nehme eine Textbox “txtEnter”, sowie eine Listbox, in welche die Ergebnisse geschrieben werden sollen “lstBx”.

Die klassischen Anforderungen:

  1. Während der Benutzer in eine Textbox Suchbegriffe eintippt, wird die Listbox mit  Suchergebnissen gefüllt.
  2. Die Suchergebnisse werden vom Server geladen. Daher kann es zu einer Zeitverzögerung kommen. Die Benutzeroberfläche muss jedoch reaktiv bleiben!
  3. Um die Serverlast in Grenzen zu halten soll dieser erst ab dem 6. eingegebenen Zeichen befragt werden
  4. Um die Serverlast in Grenzen zu halten, soll der Server erst befragt werden, wenn der Benutzer eine Tipppause (von 500ms) macht.

Nun ja, das sind klassische Anforderungen. Und nun wollen wir sehen, wie dies mittels RX gelöst werden kann.

Die Projektreferenzen

Es sind nach der Installation folgende neue Assemblies verfügbar, welche referenziert werden

  • System.CoreEx
  • System.Reactive
  • System.Interactive

Simulation der Server-Methode

Da es sich um ein Demo-Sample handelt wird hier die Servermethode mit einer klassichem Thread-Sleep-Methode simuliert:

image

RX im Einsatz

Punkt 1: Auf das Text-Changed Event der Textbox registrieren:

var input = (from evt in Observable.FromEvent<TextChangedEventArgs>(this.txtEnter, "TextChanged") select ((TextBox)evt.Sender).Text);

RX ist auf Observable und Observer bzw. auf den resultierenden Interfaces IObservable<T> und IObserver<T> aufgesetzt. Mittels den Factory-Klassen können entsprechende Instanzen generiert werden. Dabei stehen verschiedenste Möglichkeiten zur Registrierung zur Verfügung wie hier z.B.: FromEvent. Hier wird einfach das Objekt, sowie das Event (als String) angegeben. Mittels reflection wird sich auf das Event registriert.

Das Objekt input ist nun ein IObserveable<string>.

Mittels LINQ bzw. Lambda Expressions können nun diverseste Einschränkungen durchgeführt werden wie z.B.: die Anforderung (3):

image

Auf die Anforderung (4) lässt sich einfachst umsetzen:
image

Nun denn. Man Abonniere jetzt konkret dieses Observable-Objekt mittels Subscribe(Action). Die tatsächliche Implementierung dieser Action, welche aufgerufen wird, wenn das Event auftritt, kann natürlich anonym durchgeführt werden:

image

Die Methode  GetResult (also die Server-Simulation) legt den Thrad für 1sec schlafen. Das heißt, damit die Benutzeroberfläche reaktiv bleibt, ist ein Hintergrundthread notwendig.

image

Eine kleine Unschönheit, mit der man sich noch herumschlagen muss ist, dass mittels Thorttle ein eigener Thread geöffnet wird. Damit also in der letzten Subscriber-Methode, welche die Action aufruft, sobald Observable.Start() das Ergebnis liefert, nicht auf die Oberflächenelemente zugegriffen werden kann. Also ist hier noch ein extra Dispatch nötig:

image

Fazit

Nun ja, einerseits sieht dies schon etwas komplex aus. Andererseits wie sieht die Alternative aus :-).

Skip und Throttle ist einfach, nur leider mit ein paar Konsequenzen. Observeable.Start() mit anschließendem Subscribe zum Abholen der Ergebnisse ist ebenfalls einfach. Der Dispatcher ist klassisch.

Dies ist ein Anwendungsbeispiel. Mal schaun was es dort noch so gibt…

 

Hier nochmals der der gesamte Programmcode:

private void Window_Loaded(object sender, RoutedEventArgs e) {
    //Subscribe on the TextChanged - Event
    var input = (from evt in Observable.FromEvent<TextChangedEventArgs>(
                        this.txtEnter, "TextChanged")
                    select ((TextBox)evt.Sender).Text);

    var subscription2 = input
        .Skip(5)   //Skip until there are at least 6 characters entered
        .Throttle(TimeSpan.FromMilliseconds(500))  //Wait until a pause of the user...
        .Subscribe(n => {

            Observable.Start(() => {
                return GetResults(n);  //Call this method asynchron!
            }).Subscribe((result) => { //subscribe to the result as soon as it is back

                //It's still an other thread because of Throttle :(
                this.lstBx.Dispatcher.BeginInvoke((ThreadStart)delegate() {
                    //Show the result in the listbox
                    lstBx.Items.Clear();
                    foreach (var item in (IEnumerable<string>)result)
                        lstBx.Items.Add(item);
                });
            });
        });

}

static int cnt = 0;
private static IEnumerable<string> GetResults(string searchStuff) {
    cnt++;
    System.Threading.Thread.Sleep(1000);
    return new String[] { "Some" + cnt, "Results" + cnt,
        "From" + cnt, "The" + cnt, "Server" + cnt };
}
Categories: C# | RX

Standby und Ruhezustand mit C#

by Bernhard Wurm 29. September 2010 13:15

Wie schickt man mit einem Programm den Computer in den Standy-Modus oder in den Ruhezustand, was auf englisch übrigends Hibernate heißt und Winterschlaf bedeutet?

Mit folgendem Code:

Application.SetSuspendState(PowerState.Suspend, true, false);
bzw.
Application.SetSuspendState(PowerState.Hibernate, true, false);

Doch meist ist nicht spannend, wie man den Computer dort hin schickt, sondern wie man in der Anwendung merkt, dass der Computer in Standby bzw in den Ruhezustand geschickt wird.
Hierzu existiert unter Microsoft.Win32 die Klasse SystemEvents mit einem Eventhandler:

SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) {
    switch(e.Mode) {
        case PowerModes.Suspend:
            Console.WriteLine("Good Bye. Standby oder Hibernate.");
            break;
        case PowerModes.Resume:
            Console.WriteLine("I'm back!");
            break;
        case PowerModes.StatusChange:
            Console.WriteLine("Do you have a weak battery?");
            break;
        default:
            Console.WriteLine("How the hell did you do that?");
            break;
    }
}

StatusChanged wird ausgelöst wenn vom Betriebssystem eine Statusänderung, wie beispielsweise eine Batteriewarnung auftritt. – Detailinfo hier.

Also alles einfacher als gedacht!

Categories: API

Formularspam und die Gegenmaßnahmen

by Bernhard Wurm 24. September 2010 13:57

Sofern man keine Gegenmaßnahmen ergreift ist man defakto nicht gegen Formularspam gefeilt. – leider.

Was ist Formularspam?

Man spricht von Formularspam, wenn Formulare, wie beispielsweise das Kommentar-Formular bei einem Blog, das Anfrageformular einer Webseite oder das Anmeldeformular eines Newsletters von Computerprogrammen automatisch mit scheinbar sinnlosem Inhalt ausgefüllt wird.

Die ist beim Blog ärgerlich oder bei einem E-Mail-Marketing-System welches nach Anzahl der Abonnenten abrechnet u.U. auch mit Kosten verbunden. Im Falle von verbotenen Inhalten könnte der unter Umständen sogar rechtlich belangt werden.

Warum wird das gemacht?

So wie bei klassischem Spam oftmals aufgrund von Geld. Irgendjemand wird diesen Formularspam lesen und möglicherweise etwas kaufen. Wenn ihn niemand liest ist dies auch nicht schlim denn meist enthält die Spam-Nachricht Links, wodurch der Pagerank bei Suchmaschinen erhöht wird. Dabei fallen quasi keine Kosten an.

Wie schützt man sich vor Formularspam?

Doch wie wird man die Quälgeister wieder los? Hierzu existieren verschiedene technische Maßnahmen:

Chaptcha’s

Im Blog aktivierte ich ein sogenanntes Chaptcha. Genauer das Produkt ReChaptcha von Google. Dabei wird in einem Bild eine Zahlen-Buchstabenfolge angezeigt, welche vom Benutzer abgetippt werden muss, bevor das Formular abgeschickt werden kann. Diese Zahlen-Buchstabenfolge ist leicht verunstaltet, sodass es lediglich Menschen lesen können. Computerprogramme sollten dies nicht analysieren und daher das Formular nicht abschicken können.
Das Problem: Leider steigt dadurch auch die menschliche-Drop-Out-Quote, da manchmal auch Menschen an der zusätzlichen Hürde scheitern.

Thinktime

Ein Mensch benötigt im Allgemeinen Zeit zum Tippen und Lesen, bevor das Formular nach dem Aufruf abgeschickt wird. Hier spricht man von einer sog. Thinktime. Wenige Formularspam Programme benutzen eine Thinktime, wodurch diese einfach erkennbar und auszuschließen sind. Diese Methode ist (noch) sehr wirksam, doch da es technisch sehr einfach ist eine Thinktime einzubauen handelt es sich hier nur um eine Frage der Zeit.

Javascript

Formularspam-Programme sind sehr einfach zu programmieren, solange sie kein Javascript interpretieren. Und genau das kann man sich zu nutze machen. Ein/Zwei versteckte Felder im HTML-Code welche durch Javascript ausgefüllt werden Beispielsweise durch die Generierung einer Zufallszahl,welche in ein Feld geschrieben wird. Im zweiten Feld steht die Zahl + 1. Erst wenn die Überprüfung der beiden Werte korrekt durchgeführt wurde lässt sich das Formular absenden (bzw. läuft die Überprüfung idealerweise natürlich auch am Server). Da kaum ein Programm Javascript auswertet ist dies ein sehr guter Schutzmechanismus.

Einfache Aufgaben

Bauen Sie einfache textuelle Aufgaben ein, die der Benutzer lösen muss und in ein Eingabefeld schreibt. Also zum Beispiel “3 + 4”. Am Server wird die Lösung überprüft. Ein guter Schutz mit sehr geringer Drop-Out-Quote.

Plausibilitätsprüfung

Dieser Schutz funktioniert nicht mehr so gut wie das schon einmal der Fall war, aber immerhin besser als nichts! Prüfen Sie Eingabefelder auf Plausibilität. Prüfen Sie Formate in ensprechenden Feldern, Prüfen Sie, ob in zwei verschiedenen Feldern gleiche Eingaben gemacht wurden etc. und verweigern Sie im zweifelsfall die Annahme.

Ich habe bereits all diese Mechanismen in verschiedenen Systemen eingabaut. Es handelt sich daher um Erfahrungswerte :-)

Da ich es leid bin automatisierte Kommentare (vor allem in Russisch) zu löschen habe ich nun einen Chaptcha Mechanismus eingebaut.  Scheut also bitte nicht vor Kommentaren!

Tags:
Categories: General

Spannende Cast-Implementierung in C#

by Bernhard Wurm 14. September 2010 08:32

Jeder der mit der Software Entwicklung beginnt lernt relativ schnell zwischen verschiedenen Datentypen umzuwandeln und zu casten. Von Object nach String. Von double zu int usw.

Doch wie wird eigentlich zwischen komplexeren Datentypen ein Cast durchgeführt?
Also von Duration nach Timespan? Von ServiceObject to BusinessEntity?
Als kleines Beispiel wär doch folgendes echt nett:

MyPoint p1 = new MyPoint();
p1.X = 10.1F;
p1.Y = 3.5F;
//Cast MyPoint to a string.
string pointInfo = (string)p1;

Oder noch viel schöner:

MyPoint p1 = new MyPoint();
p1.X = 10.1F;
p1.Y = 3.5F;
//Directly assign MyPoint object to a string.
string pointInfo1 = p1;

C# bietet hier tatsächlich entsprechende Operator-Implementierungen:
Für die implizite Implementierung

class MyPoint {
	public float X { get; set; }
	public float Y { get; set; }
	/// <summary>
	/// Allow the cast from a MyPoint object to a string. Allow an implicit cast!
	/// </summary>
	public static implicit operator string(MyPoint p) {
		return String.Format("{0};{1}", p.X, p.Y);
	}
	/// <summary>
	/// Cast from a string to a MyPoint-object
	/// </summary>
	public static implicit operator MyPoint(string s) {
		if (s == null)
			return null;
		if (s.IndexOf(';') == -1)
			return new MyPoint();
		//Get values
		float x = float.Parse(s.Split(';')[0]);
		float y = float.Parse(s.Split(';')[1]);
		return new MyPoint() { X = x, Y = y };
	}
}

Dadurch sind folgende Aufrufe möglich:

MyPoint p2 = "10.1;4";
string info = p2;

Eine feine Sache!
Tauscht man nun bei der operator-Implementierung das Wort “implicit” durch “explicit” sind explizite Casts möglich.

DEV-WTF:> NULL or not NULL

by Bernhard Wurm 10. September 2010 17:00

Was ist das Gegenteil von true? Selbstverständlich false.
Was ist das Gegenteil von false? Selstverständlich true.

So weit ist alles klar, doch was ist das Gegenteil von null?
Ist die Antwort not null? Vielleicht etwas konkretes ? – aber was?

Ok, stellen wir die Frage nach der Sinnhaftigkeit. Mein Lehrling hat gestern einen Code von der Struktur ähnlich wie diesen erzeugt:

public bool? DoSmth() {
   if (....)
      return true;
   if (....)
      return false;
   if (....)
      return null;
}
//Funktionsaufruf
bool? CallDoSmth() {
   //......
   return !DoSmth();
}

 

Da zwängte sich mir die Frage auf, was passiert eigentlich, wenn DoSmth den Wert null liefert. Was ist das Ergebnis von !null?

Folgenden Code beispielsweise verweigert bereits der Compiler:

Console.WriteLine(!null);

Doch nicht den oben dargestellten. Es kommt nicht einmal zu einem Laufzeitfehler!

Den das Ergebnis ist: !null == null
Beispielsweise lässt sich sogar dieser Code ausführen:

Console.WriteLine(!DoSmth());
Tja, wer hätte das gedacht :)
Categories: Dev-WTF> | C#

Teamfoundation Server – Warehouse Update erzwingen

by Bernhard Wurm 7. September 2010 13:00

Das Datawarehouse vom Teamfoundation Server wird immer wieder mal, in periodischen Abständen, aktualisiert. Doch manchmal ist es von Vorteil, es sofort zu aktualisieren, vor allem dann, wenn aktuellste Reports gefragt sind!

Hierzu gibt es folgende Möglichkeit:

  1. Verbinden Sie sich per Remote Desktop auf den Teamfoundation Server.
  2. Wechseln Sie im Browser auf die Adresse: http://[IhrTFS]:8080/Warehouse/v1.0/WarehouseController.asmx Dies ist ein Webservice zum Fernsteuern des Datawarehouses vom Teamfoundation Server.
  3. Klicken Sie auf RUN
  4. image
  5. und anschließend auf INVOKE.

Sie werden merken, dass die CPU-Belastung steigt, da nun das Datawarehouse aktualisiert wird und die Reports neu generiert werden. Anschließend verfügen Sie über die neuesten Grafiken.

Categories: Tools

Windows Phone 7 ist fertig

by Bernhard Wurm 4. September 2010 09:58

Wie am Windows Phone Blog veröffentlicht wurde ist Windows Phone 7 nun fertig und wird zu den Geräteherstellern ausgeliefert.

Ich bin schon gespannt welche Hersteller wirklich auf Phone 7 setzen werden und wie teuer die Geräte werden. Anscheinend sollte es zumindest von LG, Acer und Samsung entsprechende Geräte geben.

Viele, ok fast alle, in meinem Bekanntenkreis sind davon überzeugt, das Microsoft der Zug im Smartphone-Bereich bereits davon gefahren ist. Andererseits hat Microsoft auch kurzerhand 1 Milliarde Dollar in die Hand genommen um aufzuholen und mit einer Mrd. lässt sich ganz schön viel bewegen.

Ich bin auf jeden Fall neugierig! Hat mich mein Windows Mobile 6.5 doch sehr enttäuscht, vor allem was die Unterstützung für Softwareentwickler angeht – Silverlight wurde ja leider für die Plattform gestrichen und ist erst jetzt mit WP7 verfügbar.

Mal schaun was die Zukunft bringt!

Categories: Mobile

Silverlight – PlaneProjection qualitätsproblem

by Bernhard Wurm 16. August 2010 14:38

image

Mithilfe der PlaneProjection kann man toll 3D-Effekte basteln. Nur leider wird der Text etc. verschwommen, wenn man GlobalOffsetZ oder LocalOffsetZ verwendet, da der Text als Bitmap und leider nicht die Vektorschriftart und wie das so mit dem Vergrößern von Bitmaps ist wird es pixelig.

Also wieder zurück zum RenderTransform und Scale-Faktor.

Categories: Silverlight

USB Stick am Prüfstand

by Bernhard Wurm 13. August 2010 05:28

Ich muss gestehen, ich mache meinem USB-Stick das Dasein nicht einfach. Er fällt mal runter, wird absichtlich in der Gegend herum geworfen und steckt ständig in irgendwelchen Steckplätzen von PCs und Notebooks.

Doch der gestrige Prüfstand hat mich vollendens von der Qualität der Corsair-Produkte überzeugt: Ein Überlebender der Waschmaschine! Der Verlust der Daten des 16GB Sticks hätte schon geschmerzt. Aber zum Glück ist alles gut gegangen!

Der Stick kostet auch sein Geld aber er ist es wohl auch Wert.

 

P.S.: Es war kein absichtliches Experiment und ich  habe es auch mit noch keinem anderen Produkt versucht. Möglicherweise gehört ein Waschgang ohnehin zu den Mindestanforderungen eines USB-Sticks :-)

Tags:
Categories:

Nützliches Add-On für Visual Studio 2010

by Bernhard Wurm 1. August 2010 05:15

Die Microsoft Productivity Power Tools sind ein nützliches Add-On für die Entwicklung.

Eigentlich gibts gar ned viel zu sagen, da die Features übersichtlich auf  der Webseite dargestellt sind: http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef.

Meine Empfehlung: Herunterladen und installieren!

Tags:
Categories: Visual Studio

Facebook, Datenschutz und Foto-Tagging

by Bernhard Wurm 26. July 2010 13:49

Oftmals sind gut gut gemeinte Features in einer Software einfach nicht unbedenklich. Und die Kritiken am Datenschutz von Facebook sind in aller Munde und wohl bekannt.

Ich möchte hierzu ein kleines Feature aufgreifen und zum Nachdenken anregen: Das Tagging von Freunden und Personen in Facebook.

image

Es ist ganz einfach. Ich habe ein Foto und lade dieses hoch. Darauf bin ich oder, wie oben ein Freund und damit auch jeder weiß wer das ist, kann ich ihn nun im Foto “taggen” (= das Gesicht mit einem Namen versehen). Dadurch ist es auch leichter Fotos einer Person in Facebook zu finden.

Jedoch, je nach Einstellungen  zum Beispiel auch in Google, Bing oder anderen Suchmaschinen. Viele Fotos in Facebook sind von Parties und nicht unbedingt für ein unbekanntes Publikum bestimmt, und meist auch nicht für den Arbeitgeber oder einen potentiellen Arbeitgeber. Ein falsches Hackerl und ein Tag im Foto und schon kann es passieren, dass man den Traumjob vielleicht doch nicht bekommt, weil man zuvor “gegoogelt” wurde und das Ergebnis ein Foto war, in welchem man vollgetrunken halb-bewustlos herumliegt.

Keine schöne Vorstellung? – Realität!

Spinnen wir die Gedanken weiter. Intelligente Algorithmen die selbstlernend sind, wie Gestichtserkennungsalgorithmen benötigen immer Beispiele um zu lernen. Die steigende Leistung der Computer macht die Algorithmen schön langsam richtig nützlich. Dadurch ergeben sich weitere Möglichkeiten:

Diese Algorithmen können nun Gesichter erkennen und gehen wir davon aus, dieses Gesicht in anderen Fotos wiederfinden, vor allem wenn genügend Beispielbilder vorhanden sind.

Dadraus ergibt sich noch mehr bedenkliches! Denn ist man nur oft genug in Facebook, oder auch anderen Plattformen, in einem Foto getaggt, desto genauer ist das “Phantombild”, dass ein Computerprogramm von einer Person erzeugen kann und desto einfacher ist es für ein Programm eine Person auf einem Foto (oder Bild von einer Überwachungskamera) zu identifizieren, auch wenn es nicht zuvor getaggt wurde.

Das Gesichter-Tagging bereitet also den Weg für das Auffinden beliebiger Personen auf Fotos, Filmen etc. und dabei reicht es oftmals den Namen zu wissen, oder ein Beispielfoto zu haben. Außerdem kann es den Job kosten!

Was kann ich dagegen tun?

image

Realistisch betrachtet kaum etwas, der Anteil des einzelnen ist zu gering – aber wie heißt es so schön “Kleinvieh macht auch Dreck”. Drum hier ein paar Tipps:

  1. Das Wichtigste: Gleich mal keine Gesichter taggen.
  2. Wenn ich getaggt wurde, werde ich normalerweise darüber informiert – tagging entfernen.
  3. Immer gut überlegen welches Foto man wirklich im Netz veröffentlichen will und im Zweifelsfall nicht veröffentlichen
  4. Oder wie in meinen 2 Screenshots: Man kann ja auch andere spannende sachen Taggen. z.B.: einen Bagger, ein Schild, etc. :-) Die Zuordnung für einen Gesichtserkennungsalgorithmus wird hierdurch nicht nur erschwert, sondern es stört auch bereits vorhandene Auswertungsergebnisse, da es eine Falschinformation ist.

In diesem Sinn: Auf ein klein wenig Privatsphäre!

Categories:

Silverlight Controls dynamisch im Sourcecode erstellen

by Bernhard Wurm 18. July 2010 09:34

All zu oft ist das Layout nicht statisch, sondern es werden Controls dynamisch im Code-Behind-File geladen oder erstellt und der Benutzeroberfläche hinzugefügt.

In Windows Forms oder ASP.NET sind wir alle mit der Controls-Eigenschaft vertraut, welche den Control-Tree enthält. Doch in WPF bzw. Silverlight sucht man diese Eigenschaft vergebens, da diese “Children” heißt.

Doch wie wird das erstellte Contorl nun positioniert? Immerhin fehlt die Left- bzw. Top-Eigenschaft.

Hierzu stehen statische Methoden der Container-Klassen zur Verfügung. Also z.B.: Canvas.SetLeft bzw. Grid.SetColumn etc.

Das Hinzufügen und die Positionierung der Controls ist in Silverlight und WPF ein klein wenig anders als bei WinForms und ASP.NET:

image

Categories: Silverlight

Basic HTTP Authentication und JQuery (Javascript/AJAX)

by Bernhard Wurm 11. July 2010 13:47

Die Herausforderung ist folgende: Man nehme eine Seite, welche per http-Authentication geschützt ist und diese Seite hat ein JQuery oder Javascript, welches mittels eines AJAX-Requests Daten aus einem weiteren Service holt, welcher Ebefalls der gleichen Authentifizierung unterliegt.

Beim Aufruf der Seite wird der Benutzer davon überzeugt, dass seine Zugangsdaten erforderlich sind:

image

Das ist auch  gut so, ABER sobald das weitere Daten mittels AJAX abgefragt werden, werden die Zugangsdaten erneut abgefragt – und zwar für den Service-Aufruf. Der Grund: der aktuell gültige Authentifizierungstoken im HTTP-Header wird nicht mitgegeben!

image
Hierzu ist es notwendig, dass beim Aufruf zusätzlich Username und Passwort mitgegeben werden:
image

Dann funktionierts auch mittels AJAX.

Doch….

  • Doch woher Username und Passwort nehmen, wenn diese lediglich der Benutzer besitzt?
  • Eine Alternative wäre das direkte Setzen des aktuellen Authentication Tokens:

image

doch auch hier beißt sich die Katze in den Schwanz, denn woher diesen nehmen?

Aus Security-Sicht ergibt es Sinn, dass dies nicht möglich ist, aus Usersicht jedoch ist diese Situation die sich daraus ergibt jedoch untragbar. Lösung: Keine :( – Das heißt: wir benötigen Cookie Based Authentication

Categories: jQuery

Webseiten Autozoom bei iPod & iPhone

by Bernhard Wurm 6. July 2010 11:40

Der iPod und das iPhone, verfügen über die Eigenheit, dass Webseiten automatisch verkleinert werden, sodass diese sicher auf den ganzen Display platz finden.

Das Problem: Manchmal will man das nicht :-)

Mit diesem Meta Tag lässt sich dies unterbinden:

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>

Categories: Mobile

JQuery/AJAX und IE Cache

by Bernhard Wurm 4. July 2010 06:57

Caching ist eigentlich etwas gutes, da dadurch die Ladezeit verringert werden kann. Doch wenn man per AJAX-Call Befehle absetzt und der Internet Explorer entscheidet dies nicht zu  tun, da er aufgrund seines aktuellen Caches glaubt, er wüsste das Ergebnis ohnehin schon ist dies nicht förderlich.

Warum ist das so?

  • Im HTTP-Header sind keine Caching-Attribute gesetzt. Dadurch cached der IE

Was kann ich dagegen tun?

Im IE das Caching deaktivieren: Unter Extras –> Internet Optionen –> Browsing History –> Einstellungen sollte anstatt auf Automatisch lieber “Bei jedem Zugriff auf die Seite” eingestellt werden. Dadurch wird das Problem behoben.
 image image

Doch dies ist nur eine Lösung für die lokale Maschine! Etwas anderes muss her.

Angenommen wir können auf dem Server die Caching-Header nicht ändern (was durch Konfiguration im IIS, oder durch ASP, ASP.NET, PHP, etc. Befehle möglich, so existiert noch eine Konfiguration im JQuery, die das Caching für den AJAX-Aufruf deaktiviert:

image

Die Frage die ich mir dabei stelle: warum cached nur der IE und Firefox etc. nicht? Eigentlich wäre caching hier, vor allem da der Default-parameter beim Aufruf true ist, für jeden Browser legitim!

Naja. Cache:false ist auf jeden Fall die Lösung :-)

Categories: jQuery

Nützliches im Visual Studio – Conditional Breakpoints

by Bernhard Wurm 1. July 2010 15:28

Mein Kollege Georg hat mich heute auf ein tolles Feature im Visual Studio aufmerksam gemacht: Bedingungen bei Breakpoints!

Was bringt das?

Nehmen wir an wir debuggen durch eine Schleife mit vielen Durchläufen. Es ist außerst mühsam sich bis zur 187 Iteration zu debuggen, oder jedes Mal zu prüfen, ob eine  bestimmte Bedingung erfüllt ist, um einen Fehler zu finden. Abhilfe schaffen hier Conditions bei Breakpoints:

image

Dort können beliebige bool’sche Ausdrücke eingefügt werden z.B.: i == 50. Es gibt sogar Intellisence und Abfragemöglichkeiten auf komplexe Objekte!

Das Contextmenü bietet aber noch mehr: Hit Count für die Anzahl von Schleifendurchläufe etc.

Heute erst gelernt und schon frage ich mich: Wie konnte ich früher ohne dieses Feature leben? Und warum habe ich noch nie auf die Einträge im Kontextmenü geachtet? – Wie auch immer: danke Georg!

Tags:
Categories: Visual Studio

Das perfekte Betriebssystem – ein lachendes und ein weinendes Auge

by Bernhard Wurm 12. June 2010 10:35

Ein, für den Einsatz optimiertes Betriebssystem ist natürlich wünschenswert. Doch Frage ich mich, ob man da nicht langsam die Übersicht verliert. Die PC-Welt online Redaktion hat den Artikel “Linux für jeden Zweck und Anwender” veröffentlicht und Sage und Schreibe 49 verschiedene Linux Distributionen oder entsprechende Erweiterungen kurz vorgestellt.

Jedes für sich soll einen spezialisten für einen bestimmten Anwendungsfall sein. Das eine für Audio/Video/Movie das nächste zum Aufdecken von Sicherheitslücken usw.

Wer länger in der Software-Entwicklungs-Branche tätig ist weiß jedoch, dass es, gerade für die Anwender, zu oft äußerst schwierig ist die eigentlichen Anwendungsfälle abzugrenzen. Von der Vollständigkeit von Anforderungen möchte ich dabei überhaupt noch nicht sprechen. Was ist wenn ich mit meinem “Damn Small Linux” (DSLinux) nicht mehr auskomme, weil ich plötzlich “Medium Anforderungen” habe. Ist die Lösung die Einarbeitung in ein neues System? Soll ich doch lieber auf die großen Allrounder wie Debian Mandriva, Suse, etc. setzen? Wie entscheide ich als Benutzer welches System für mich nun tatsächlich optimal ist?

Zum Vergrößern bitte klicken
Screenshot aus dem Artikel von PC-Welt entnommen.

Ich muss gestehen ich bin mit Windows 7 sehr zufrieden. Ein guter Allrounder der alles mit macht. Und die Unterschiede zwischen den einzelnen Editionen von Windows sind überschaubar und ermöglichen eine leichte Entscheidungsfindung.

Tags:
Categories:

Mobile Webanwendungen – Herausforderung: Display drehen

by Bernhard Wurm 6. June 2010 08:57

Smartphones verfügen über ein relativ großes Display mit z.B.: 800x480px Auflösung (Samsung Omnia II). Die Browser auf den Smartphones eifern ihren großen Vorbildern nach und so existieren auch im mobilen Bereich die klassischen Browser wie Opera, Internet Explorer oder Firefox.

Doch bei Smartphones und Handies existiert so manches Features, welche bei normalen Browsern nicht vorhanden sind: Automatischer Zoom oder auch das Drehen des Gerätes. Dies führt dazu, dass der Browser selbstständig das Bild dreht, wenn das Handy gedreht wird. Die Herausforderung ist nun, die Webseite erneut richtig zu skalieren, denn der zu erwartende Weg, dass das JavaScript-Event window.resize aufgerufen wird, ist ein Irrtum.

Die Lösung dieser Herausforderung – per Timer prüfen, ob sich die Richtung des Displays geändert hat und mittels einer Funktion “UpdateView” die Elemente am Display neu positionieren:

var lastWidth = screen.width;
var lastHeight = screen.height;
$(document).ready(function () {
    UpdateView();
    ChkOriChange();
});

//Orientation change method
function ChkOriChange() {
    if (screen.width != lastWidth || screen.height != lastHeight) {
        lastWidth = screen.width;
        lastHeight = screen.height;
        UpdateView();
    }
    window.setTimeout('ChkOriChange()', 100);
}
$(window).resize(function () {
    UpdateView();
});

Ich hoffe dieses Snippet spart so manche Recherchen.

Categories: Mobile

XSLT 2.0

by Bernhard Wurm 21. May 2010 18:57

Visual Studio hat eigentlich einen tollen XSLT Support, wie die folgenden zwei Punkte belegen:

  1. Intellisence
    Jeder Programmierer kennt es und jeder liebt es. Auch für XSLT gibt es Intellisence, auch wenn es lediglich das normale Intellisence ist, welches für XML-Dateien verfügbar ist, sobald ein Schema angegeben wird, aber was will man mehr?
    Das zugehörige Schema liegt übrigends unter C:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemas\xslt.xsd
  2. Debugging
    Jeder Fehler wird sofort angezeigt und das XSLT kann im Debug-Modus schrittweise ausgeführt werden, wodurch die Fehlersuche erleichtert wird. Bei so manchen Fehlern ist auch dies ein echt super Feature!

Um so mehr ist es ernüchternd, wenn XSLT2.0 Features benötigt werden. Ab diesem Zeitpunkt versagt jegliche Unterstützung :-(

Folgendes Szenario: Aufgrund einer XML-Datei sollen mehrere XML- oder HTML-Dateien generiert werden. Ab diesem Zeitpunkt ist XSLT 2.0 notwendig: <xsl:result-document>

Die Konsequenz aus dieser Problematik ist, dass keinerlei Support von Visual Studio (auch nicht VS 2010) verfügbar ist, weder im Bereich Intellisence, noch im Bereich der Ausführung.

Wie also mithilfe von XSLT 2.0 Dateien transformieren? Saxon.NET hilft dabei. Mit wenigen Zeilen .NET-Code oder auch per Commandline lassen sich damit die Datei transformieren; auch wenn das Debugging schwer vermisst wird!

Der Code für die Verwendung ist relativ simple, doch damit nicht lange gesucht werden muss, hier eine Abwandlung von Terry’s Worklog-Blog veröffentlichen Code:

Processor processor = new Processor();
using (System.IO.StreamReader reader = new System.IO.StreamReader(XmlFile, System.Text.Encoding.UTF8)) {
    using (System.IO.TextWriter stringWriter = new System.IO.StringWriter()) {
        stringWriter.Write(reader.ReadToEnd());
        stringWriter.Close();

        reader.Close();

        using (System.IO.TextReader stringReader = new System.IO.StringReader(stringWriter.ToString())) {
            using (System.Xml.XmlTextReader reader2 = new System.Xml.XmlTextReader(stringReader)) {
                reader2.XmlResolver = null;

                XdmNode input = processor.NewDocumentBuilder().Build(reader2);

                // Create a transformer for the stylesheet.
                XsltTransformer transformer = processor.NewXsltCompiler().Compile(new System.Uri(Xslt2File)).Load();
                transformer.InputXmlResolver = null;

                // Set the root node of the source document to be the initial context node
                transformer.InitialContextNode = input;

                Serializer serializer = new Serializer();
                serializer.SetOutputFile(“c:\\myfile.xml”);

                // Do the xslt transformation
                transformer.Run(serializer);
            }
        }
    }
}

Tags: , ,
Categories: Visual Studio

Urlaub

by Bernhard Wurm 7. May 2010 08:04

Das Wetter ist mies. Und laut Prognosen von wetter.at wird es auch nicht besser.

image

Macht aber nix! Urlaub!

Also ab in den Süden und eine Woche lang abschalten. Oder mit Entwicklerhumor:

System.Threading.Thread.Sleep(new TimeSpan(7, 0, 0, 0));

Wünsche allen eine schöne Woche!

Tags:
Categories:

VC# Express 2010 in Deutsch ist da!

by Bernhard Wurm 30. April 2010 10:10

Es ist so weit! An alle die auf Visual C# Express Edition 2010 auf DEUTSCH gewartet haben. Seit heute ist es unter http://www.microsoft.com/germany/express/ verfügbar.

csharp_logo

Was heißt das für mich? Nun ja, obwohl das Buch Programmieren Lernen! ohnehin auch 2010 noch Gültigkeit besitzt wirken so manche Screenshots nun wohl etwas verstaubt. Also ran an die Arbeit und das Buch entstauben!

Immerhin soll es doch nicht passieren, das jemand in der Buchhandlung glaubt das Buch sei veraltet.

Wie gesagt das Buch ist nach wie vor aktuell!

Tot geglaubte leben länger

by Bernhard Wurm 29. April 2010 10:43

Ja es gibt ihn anscheinend noch: Den Bluescreen. Bei diesem Anblick fühlt man sich doch gleich wieder zurück gesetzt in die ?gute? alte Zeit von Windows 95 – Windows ME. Aber Hand aufs Herz. Seit Windows 2000 und Windows XP ist die Situation ständig besser geworden. Der Bluescreen gehört scheinbar zu einer aussterbenden Rasse.

Aber heute hab ich es wieder mal geschafft. Notebook – Dockingstation – Windows 7 - WIN+P. Die äußerst nützliche Funktion von Windows 7 hatte anscheined der Hardware-Treiber nicht verkraftet:

Omnia II 004

Bitte das schlechte Foto zu entschuldigen – Handy…
Aber zumindest sind die Meldungen aussagekräftiger und viel pregnanter als früher.

Omnia II 005

Die Message für den Benutzer ist klar: “Hast du Pech. Aber die anderen haben Schuld”.

Wie dem auch sei. Lieber Bluescreen schön dass du mich nach so langer Zeit wieder einmal besucht hast :-)

Tags:
Categories:

Die Zeiten ändern sich… also herzlich Willkommen!

by Bernhard Wurm 22. April 2010 12:01

Nichts, abgesehen von der Zeitung von gestern, ist langweiliger als eine Webseite die sich kaum ändert. Andererseits ist die Wartung einer Webseite sehr aufwendig und es gibt Interessanteres im Leben als die Webseite zu aktualisieren. Dies wiederum steht im Zwiespalt damit, dass es doch so manches gibt, was einem so beschäftigt.

Kurzartikel in Blog Form … vielleicht ist dies die Lösung. Mal sehen.

Es gibt viele Blogs zum Thema IT, Softwareentwicklung etc. nun ja, dann existiert nun einer mehr :-)

Ich wünsche allen Interessenten viel Spaß beim Lesen

Grüße

/> Raupes

Tags:
Categories: