Apps auf SurfTab per USB debuggen

Endlich funktioniert mein SurfTab als ADB Gerät, so dass ich Apps per USB debuggen kann – eine schwere Geburt, auch wenn es schlussendlich ganz einfach ist:

  1. SurfTab in den Entwicklereinstellungen auf das USB-Debugging vorbereiten
  2. SurfTab per USB-Kabel an den PC anschließen
  3. Im Geräte -Manager nach dem Gerät suchen (mit einem gelben Dreieck markiert)
  4. Über Eigenschaften die Aktualisierung der Treiber starten
  5. Auf dem Computer nach Treiber-Software suchen > Aus einer Liste auswählen
  6. Alle Geräte auflisten > Datenträger wählen
  7. Google USB-Treiber suchen und auswählen und Warnung ignorieren
  8. Gerät vom USB ab- und wieder anstöpseln
  9. Fertig!

Sonderzeichenprobleme in Git Repos beheben

Als ich mit Git zu arbeiten begann, wurden Sonderzeichen (Umlaute, Akzente, etc.) noch nicht unter Verwendung von Unicode behandelt. Nach der Einführung von Unicode (und einem Update auf die entsprechende Version von Git) wurden die ursprünglichen Dateinamen nicht mehr erkannt. Nach dem Neu-Hinzufügen der betroffenen Dateien hatte ich im Index immer zwei Kodierungen des gleichen Dateinamens gespeichert und der alte wurde immer als fehlerhaft und nicht löschbar angezeigt. Dank eines Artikels, den ich gestern gefunden habe, konnte ich nun meine Repos bereinigen.

Hier die Befehle, die ich in der Git Konsole für die Lösung meines Problems verwendet habe (jeweils im Verzeichnis, das Problemdateien enthielt, ausgeführt):

$ git ls-files | grep "\""
$ git rm --cached "`printf "<Datei>"`"
$ git commit -m "clean up bad encoding of file names"

<Datei> = <problematischer Dateiname ggf. unter Verwendung von * oder ? als Platzhalter>

Das ganze dauerte für meine vielleicht 30 Problemdateien nur einige Minuten und nach dem Hinzufügen der nicht mehr indizierten Dateien war mein Repository wieder in einem sauberen Zustand.

NuGet & Xamarin Studio

Gestern bin ich über ein Add-in für Xamarin Studio gestolpert, das den NuGet-Paketmanager in diese Entwicklungsumgebung integriert. Details finden sich auf der Projekt-Homepage. Eine kleine Ergänzung: Die Repository-URL sollte ohne den letzten Pfadbestandteil „main.rep“ angegeben werden, da es sonst einfach nicht funktionieren will; also: http://mrward.github.com/monodevelop-nuget-addin-repository/4.0 statt: http://mrward.github.com/monodevelop-nuget-addin-repository/4.0/main.mrep – „main.rep“ wird dann automatisch ergänzt.

XPS-Dokumente aus WPF-Anwendung heraus erstellen

Um aus einer WPF-Anwendung heraus zu drucken bzw. ein druckbares Dokument zu generieren, bietet sich ein FlowDocument an, das bequem in XAML geschrieben und formatiert werden kann. Über Datenbindung können dann Platzhalter mit konkreten Inhalten belegt werden, indem das Dokument per XamlReader instanziiert wird und, durch Zuweisung an die Eigenschaft DataContext, Daten gebunden werden. Leider scheint das aber nur zu funktionieren, wenn anschließend noch mindestens ein Dispatcher-Aufruf erfolgt. Diese lässt sich aber leicht mit folgender Code-Zeile durchführen:

Dispatcher.CurrentDispatcher.Invoke(
    DispatcherPriority.SystemIdle,
    new DispatcherOperationCallback(arg => null),
    null);

Dieses Dokument kann nun gedruckt oder als XPS gespeichert werden. Letzteres ist zumindest für mich ein akzeptabler Ersatz für PDF und lässt sich mithilfe des XpsSerializationManager leicht bewerkstelligen.
Zu Berücksichtigen ist dabei jedoch, dass hier Zeichenressourcen genutzt werden, die nur in einem STA-Thread laufen dürfen, weswegen die ganze Operation durch einen entsprechenden Aufruf gekapselt werden muss:

Thread thread = new Thread(WriteXpsDocument);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

Entity Framework – Typen und Ausnahmen

Beim Arbeiten mit dem Entity Framework (EF) bekam ich gestern ständig folgende Ausnahme:

System.Collections.Generic.KeyNotFoundException:
Der angegebene Schlüssel war nicht im Wörterbuch angegeben.

Während der StackTrace von einer „MemberDomainMap“ sprach, bezog ich den Fehler anfangs immer auf einen von mir selbst vergebenen Primärschlüsselwert. Letztlich stellte sich aber heraus, dass eine andere Datenklasse eine Eigenschaft hatte, die nicht vom EF automatisch umgesetzt werden kann – besser gesagt: der Typ dieser Eigenschaft (System.Version) verfügte über kein Standard-Mapping (SQL-CLR Type Mapping).

Auch der Versuch dies mit [Column(TypeName = "ntext")] anders abzubilden und sich dabei auf Parse() und ToString() zu verlassen wie die Dokumentation es vorschlägt schlug fehl. So blieb letztlich nur die „banale“ Lösung, dies zu Fuß zu erledigen:

    [NotMapped]
    public Version Version { get; set; }

    public Version VersionString
    {
        get { return Version.ToString(); }
        set { Version = Version.Parse(value ?? "0.0"); }
    }