November 2008 Entries

keyboardr.com schneller suchen geht kaum

Ok, schneller finden ist natürlich wichtiger.

Keyboardr.com ist eine Art Meta Suche die sofort auf das eingegebene Suchwort reagiert, diverse Dienste abklappert und als Mashup die Ergebnisse sofort darstellt.

In den Ergebnissen kann man dann mit der Tastatur navigieren und sich die Seite anzeigen lassen.

keyboardr bild

Weitere Dienste und Funktionen sind in Planung.

Bei mir ist es nun die Browser-Startseite. Mal sehen ob es auch dort bleibt.

In diesem Zusammenhang noch zwei Tastenkombinationen

Alt+Pos1  => Startseite aufrufen
Strg+F4    => Tab-Schließen

Diese funktionieren im Internet Explorer und Firefox

In Silverlight JSON in ein Objekt umwandeln

Einen JSON String mit Silverlight in ein Objekt zu konvertieren ist nicht so schwer und wird bei der Kommunikation vom Diensten des öfteren gebraucht.

Man muss nur den Typ des Objekts wissen. Dann kann man sich einen passenden DataContractJsonSerializier erzeugen. Den JSON-String nur noch in ein Byte-Array umwanden und dieses übergibt man mit einem MemoryStream dem Serializer. Fertig.

Hier nun der Code-Snippsel

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

namespace Newsletter.Administration.Helper
{
    public class Converter
    {
        public static TResult ConvertFromJson(string json)
        {
            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                var serializer = new DataContractJsonSerializer(typeof(TResult));
                return (TResult)serializer.ReadObject(stream);
            }
        }
    }
}

Mehr ist nicht nötig. Einfache Klassen sind kein Problem, Arrays/Listen auch nicht. Dass direkte konvertieren  dieser in eine ObservableCollection<> ist kein Aufwand.

ICommand in Silverlight 2 für Buttons & Co

Leider ist es  - out of the Box – in Silverlight nicht möglich wie in WPF ein auf ICommand basiertes Kommando an ein Button oder andere Controls zu binden. Zwar ist ICommand als Interface definiert, aus Kompatibilitätsgründen, aber es wird von Silverlight selber nicht verwendet.

Überlebensnotwendig ist ICommand sicher nicht, man kann sich ja an die Events binden und wieder alles im Codebehind haben ;)

Arbeitet man mit dem Model-View-ViewModel Pattern, so möchte man sich nicht unbedingt an die Events binden. Dies ist zwar weiterhin nmöglich sich an Events zu binden, jedoch finde ich ICommand von WPF ganz charmant und wollte es auch unter Silverlight 2 verwenden.

Denn von dem Gedanken, dass man Sinnvoll über verschiedenen Architekturen einen Presenter/Controller hat, habe ich mich verabschiedet. Sich auf den kleinsten gemeinsamen Nenner zu einigen wird keiner Darstellungstechnologie (z.B. WinForms, WPF/Silverlight und ASP.NET) gerecht und macht nicht wirklich Sinn. Dann lieber die zur Technologie passenden Patterns.

Also die Unterstützung selber bauen

Ich habe mir ein CommandButton-Control gebaut, sowie ein CommandTextBox-Control. Und da teilen so schön ist, kommt dass ganze hier direkt mit Quelltext.

Es sind meine ersten Silverlight Controls. Wenn es also was zu verbessern gibt, dann teilt es mir mit (am besten über die Kommentare).

Die Anwendung ist ganz einfach, die kompilierte Assembly  - oder das Projekt -in dass entsprechende Silverlight Projekt referenzieren, und in den XAML-Dateien den entsprechenden Namespace ergänzen.

<UserControl
    xmlns:controls="clr-namespace:DerAlbert.Silverlight.Controls;assembly=DerAlbert.Silverlight.Controls" 
>
</UserControl>

CommandButton

Der CommandButton ist eine von Button abgeleitete Klasse und kann somit alles was ein Button kann. Zusätzlich hat er die Properties Command und CommandParameter. An diese kann man nun mit Binding ein Kommando und Parameter binden.

<controls:CommandButton 
          Command="{Binding Path=Commands.DeactivateSubscriber}"
          CommandParameter="{Binding Path=SelectedSubscriber}" 
          Content="Sperren"/>

Der CommandButton unterstützt ICommand.CanExecute() und aktiviert und deaktiviert sich selbst entsprechend.

CommandTextBox

Die CommandTextBox ist von TextBox abgeleitet und führt das angegebene Kommando immer dann aus wenn sich der Text geändert hat und noch nicht über das DataBinding an das ViewModel weitergegeben wurde.

Neben dem Property TextChangedCommand für das Kommando gibt es noch CommandDelay womit die Verzögerung des Ausführens in Millisekunden angeben wird. Nach jedem Tastendruck wir die Verzögerung zurückgesetzt.

<controls:CommandTextBox 
         Text="{Binding Mode=TwoWay, Path=SearchText}" 
         TextChangedCommand="{Binding Path=Commands.SearchSubscriber}" 
         CommandDelay="300" />

ICommand.CanExecute() wird hier nicht berücksichtigt und als Execute-Parameter erhält man den eingebenen Text.

Download

Ein Kennwort muss gesalzen werden

Beim Speichern von Kennwörtern hat man üblicherweise drei Möglichkeiten.

  1. Klartext
  2. Verschlüsselt jedoch wiederherstellbar
  3. Als Hash und somit nicht wiederherstellbar

Von 1. und 2. halte ich nicht viel, da so die Kennwörter im falle eines Datenlecks oder neugierigen Administrators ausgelesen werden können und somit für die Allgemeinheit zu Verfügung stehen. Und kaum jemand hat wohl für jedes Online-Angebot ein eigenes Kennwort, wobei dies natürlich zu bevorzugen wäre.

Somit verwende ich in meinen Anwendungen immer einen Hash aus dem sich das Kennwort nicht zurückrechnen lässt, meist MD5 oder SHA1. Jedoch besteht bei jedem Hash die Möglichkeit einer Kollision, dies bedeutet das eine andere Zeichenkette (oder auch Daten) den gleichen Hashwert liefert. Desweiteren gibt insbesondere für MD5 Listen von Zeichenketten mit denen sich bestimmte Hashwerte erzeugen lassen.

Somit wäre es mit dem Zugriff auf den Hashwert möglich eine Eingabe zu erzeugen die diesem entspricht und mit etwas Glück kann man sich mit diesem dann an anderen Systemen anmelden.

Dieses gilt es zu vermeiden, deshalb muss man den Hash des Kennwortes salzen.

Es gibt verschiedene Wege einen Wert zu ermitteln mit dem gesalzen wird. Oft wird ein Zufallswert genommen der auch mit der Datenbank gespeichert wird, sonst ist der Hash ja nicht rekonstruierbar. Ein Beispiel dazu findet sich hier http://www.aspheute.com/artikel/20040105.htm.

Durch das Salzen verhindert man zwar nicht das zu dem Hashwert eine passende Kollision erzeugt wird, jedoch verhindert dies dass man sich mit damit an anderen Systemen anmelden kann.

Auf keinen Fall sollte man immer denselben Wert für alle Kennwörter verwenden. Da so für gleiche Kennwörter auch dieselben Hashs erzeugt werden. Dies kann ein Zufallswert sein oder eine andere Benutzerspezifischer Wert (z.B. Zeitpunkt der Erstellung, Id in der Datenbank).

Zusätzlich nehme ich dann noch einen Anwendungsspezifischen Wert der einmalig bei der Einrichtung der Anwendung festgelegt wird. Somit sind dann auch Hashes mit denselben Daten von anderen Anwendungen unterschiedlich.

Mit dieser, nicht ganz neuen Technik, kann man die Kennwörter so speichern das diese woanders nicht zum Einsatz gebracht werden können. Leider ist dies auch heute noch nicht immer der Fall und Kennwörter werden im Klartext oder mit einem ungesalzenen Hash gespeichert. Also an die Arbeit.

Als ATE beim Technical Summit in Berlin

ts_banner_150x150_ate_1205In zwei Wochen, vom 19.11. bis 21.11.2008, findet in Berlin der Technical Summit statt. 

Ich selbst werde dort in den ATE-Sessions als “Ask The Expert” Ansprechpartner vor Ort sein um mit euch Fragen und Probleme zu diskutieren, sowie sicher auch die eine oder andere Lösung finden.  Es werden sicher spannende Tage und auch anstrengende Tage.

Also kommt zahlreich, wir ATEs erwarten euch.

Technorati-Tags: ,