André Krämers Blog

ASP.NET, JavaScript, TFS und App-Entwicklung

In diesem Beitrag möchte ich die nächsten Fragen meines Developer Media Webinars zur Cross Plattform App Entwicklung in Visual Studio 2015 mit Xamarin und Cordova beantworten. Die Antworten des ersten Teils können hier nachgelesen werden. Wer nicht am Webinar teilnehmen konnte, kann sich die Aufzeichnung übrigens kostenlos bei Developer Media ansehen.

F: Wie kann unter Xamarin die Ländereinstellung (CurrentThread.Culture) verändert werden?

A:  Ich vermute, dass sich die Frage darauf bezieht, dass in meinen Apps die Währungen in $ dargestellt wurden. Dies lag daran, dass mein iOS Simulator und auch mein Android Emulator auf englisch eingestellt waren (EN_US). Ich hätte lediglich in den Einstellungen des Simulators die Ländereinstellungen ändern müssen, dann hätte ich auch das Euro-Zeichen gesehen. Standardmäßig wird also immer die aktuelle Ländereinstellung des Geräts berücksichtigt.

Wie man eine bestimmte Ländereinstellung in seiner App erzwingt, ist in diesem StackOverflow Post beschrieben.

F: Worin genau liegt der Mehrwert von Xamarin, außer, dass es eine vereinheitlichte Sprache ist? Das Layout etc. scheint man ja doch separat machen zu müssen. Das kann man notfalls auch durch einen einfachen Java-to-Whatever compiler erreichen. Ist zwar nicht schön, aber für so viel gespartes Geld kann man darüber hinwegsehen, oder?

A: In den ersten Versionen von Xamarin lagt der Mehrwert tatsächlich darin C# und die .NET Klassenbibliothek plattformübergreifend nutzen zu können. Das Layout musste tatsächlich separat entwickelt werden. Bereits dies sehe ich als großen Mehrwert an, da ich so als .NET Entwickler auf mein bestehendes Wissen bezüglich der .NET Klassenbibliothek zurück greifen kann. Seit Mitte 2014 liefert Xamarin mit Xamarin.Forms nun jedoch auch eine Abstraktionsschicht über die Benutzeroberfläche, die es ermöglicht den Oberflächencode plattformübergreifend zu nutzen.

F: Was hat es nochmal mit dem VB Code auf sich, was anfangs erwähnt wurde?

Xamarin unterstützt zwar zur Entwicklung nur C#, Bibliotheken können jedoch auch in einer anderen .NET Sprache, z. B. VB.NET, geschrieben werden. Wer also VB.NET mit Xamarin nutzen möchte, der legt sich einfach eine VB.NET Portable Class Library an. In dieser kann fast der gesamte Applikationscode enthalten sein. Die eigentlichen Xamarin Projekte enthalten dann nur noch Aufrufe an die PCL. Xamarin beschreibt diese Vorgehensweise hier. Darüber hinaus gibt es auch eine VB.NET Beispielanwendung.

F: Wie erhält (konfiguriert) man den "schnellen" Emulator für Android? Mein Emulator benötigt mehrere Minuten für den Start!

A: Das stimmt, der Standard Android Emulator ist gähnend langsam. Zumindest wenn man ein ARM Image bootet. Schneller geht es, wenn man im AVD Manager des Android SDK einen X86 basierten Emulator anlegt. Der im Webinar gezeigte Emulator ist der Microsoft Visual Studio-Emulator für Android. Anders als der Namen vermuten lässt, funktioniert dieser übrigens auch ohne Visual Studio. Er kann hier kostenfrei herunter geladen werden. Der Emulator basiert auf Hyper-V, bedeutet er kann erst ab Windows 8.1 oder höher genutzt werden. Alternativ können auch die Intel HAXM Treiber genutzt werden. Diese können auch unter Windows 7 eingesetzt werden und beschleunigen den Start eines X86 basierten Android Emulators merklich. Eine Anleitung dazu gibt es direkt bei Intel. Xamarin liefert übrigens auch einen eigenen Android Emulator, den Android Player. Auch dieser startet sehr schnell, ist allerdings aktuell noch in der Preview Phase. Eine weitere Option wäre der kostenpflichtige Emulator von Genymotion.

F: Kann man Xamarin-Forms auch auf dem Mac in Xamarin-Studio einsetzten?

A: Xamarin.Forms kann sowohl auf dem Mac in Xamarin Studio, als auch unter Windows in Visual Studio (oder Xamarin Studio) genutzt werden. Voraussetzung für die Visual Studio Integration ist jedoch eine Starter, Business oder Enterprise Lizenz. In der Indie Edition kann Xamarin.Forms zum derzeitigen Stand nicht genutzt werden. In Xamarin Studio kann es in allen Lizenzvarianten genutzt werden, also auch in der Indie Edition.

F: Wie kann man die App auf ein IOS-Gerät deployen? Ich meinte eigentlich, wie man die APP auf viele Geräte deployed?

A: Xamarin Apps können nach der Paketierung über iTunes Connect in den Apple App Store geladen werden. Dazu ist jedoch ein Apple Entwickler Account notwendig. Außerdem kann die App auch im Unternehmen über einen Enterprise Store verteilt werden, hierzu ist dann eine Mitgliedschaft im Apple Developer Enterprise Program notwendig. Die letzte Version wäre die "Ad Hoc" Verteilung auf bis zu 100 Geräte. Dies wird in der Regel zum Test genutzt. Nähere Infos zu den Optionen gibt es bei Xamarin und Apple. Informationen, wie man Xcode zum Verteilen von Zertifikaten zum Debugging auf einem iPhone / iPad nutzt, gibt es hier.

F: Kann man über Cordova auch SQLite-Datenbanken nutzen? Vermutlich über die Plugins?

A: Das stimmt. Über ein Plugin kann SQLite auch in Cordova genutzt werden. Ein Beispiel für die Nutzung von SQLite in Ionic gibt es hier. Auf Github findet man außerdem den Quellcode eines Plugins.

F: Vor-/Nachteile im Vergleich zwischen Xamarin und Cordova?

A:  Wie bereits im ersten Teil des Posts beschrieben lässt sich diese Frage nicht so pauschal beantworten. Was für den einen ein Vorteil ist, kann für den anderen ein Nachteil sein. So entsprechend Xamarin UIs durch die Nutzung der nativen SDKs in der Regel den UI Anforderungen der jeweiligen Betriebssysteme und sehen somit auf jedem Betriebssystem etwas anders aus. Cordova Anwendungen sehen jedoch meist auf allen Betriebssystemen gleich aus. Ein zu 100 % natives UI kann von Vorteil sein, wenn man eine App für Consumer oder externe Partner schreibt deren Geräte man nicht unter der eigenen Hoheit hat. Diese erwarten in der Regel, dass sich eine App genauso verhält und sie genauso aussieht wie alle anderen Apps auf ihrem Mobilgerät. Schreibt man jedoch eine In-House App für mehrere 100 Mitarbeiter, dann kann der Cordova Ansatz von Vorteil sein. Sieht die Oberfläche nämlich überall gleich aus, dann reduziert dies nicht nur Dokumentations- sondern auch Schulungsaufwände. Schließlich kann hier für alle Betriebssysteme dieselbe Dokumentation / Schulungsunterlage genutzt werden. Ähnlich sieht es mit anderen Kriterien aus. Deshalb sollte immer eine konkrete Entscheidung je App getroffen werden.

Mit der Ermittlung und Bewertung verschiedener Kriterien habe ich mich in den letzten Monaten sehr intensiv beschäftigt. Das Ergebnis ist Kriterienkatalog und eine darauf aufbauende Bewertungsmethode, die eine belastbare und nachvollziehbare Entscheidungsfindung für eine der Alternativen ermöglicht. Details über die Veröffentlichung des dahinter stehenden Models werde ich Anfang nächsten Jahres über meinen Newsletter bekannt geben. Also am besten gleich hier unten auf andrekraemer.de  am Seitenfuß zum Newsletter anmelden.

imageWährend meines Developer Media Webinars zur Cross Plattform App Entwicklung in Visual Studio 2015 mit Xamarin und Cordova sind leider einige Fragen aufgrund der knappen Zeit unbeantwortet geblieben.

Wie versprochen werde ich diese Fragen jedoch in den nächsten Tagen in mehreren Blog Beiträgen beantworten.

Den Anfang macht dieser Blog Beitrag.

In den nächsten Tagen werden zwei bis drei weitere Beiträge folgenden, in denen ich die weiteren Fragen beantworten werde. (Link zu Teil 2)

Wer nicht am Webinar teilnehmen konnte, kann sich die Aufzeichnung übrigens kostenlos bei Developer Media ansehen.

 

F: Gibt es den iOS-Simulator auch für Windows, oder muss man dann immer zum Mac-Rechner laufen?

A: Apple stellt den iOS-Simulator nur für OS X zur Verfügung. Zum Mac-Rechner muss man allerdings trotzdem nicht laufen. OS X verfügt über eine eingebaute Funktion zur Bildschirmübertragung. Dabei handelt es sich um einen erweiterten VNC Server. Somit kann der Mac und damit auch der iOS Simulator über einen VNC Client bequem vom Windows Rechner aus ferngesteuert werden.

image

Der ferngesteuerte Mac kann übrigens auch in der Cloud betrieben werden: http://www.macincloud.com/

F: Brauche ich Zugriff auf die Mac Oberfläche um den iOS Simulator zu nutzen?

Ja, aber wie bereits in der vorherigen Frage beschrieben, kann der Zugriff auch über VNC oder ähnliches erfolgen.

F: Ist für die App-Erstellung ein Apple- und Android-System zwingend erforderlich?

Theoretisch kann die Entwicklung vollständig mit dem iOS Simulator bzw. Android Emulator durchgeführt werden. In der Praxis ist es jedoch hilfreich die App zusätzlich auf einem echten Gerät zu testen. Gerade im iOS Umfeld kann der Simulator falsche Performance Erwartungen wecken. Eine weitere Alternative ist die Xamarin Test Cloud. Hier können Apps auf über 2000 echten Geräten in der Cloud getestet werden.

F: Gibt es mittlerweile einen Xamarin.Forms Designer ?

A:  Leider noch nicht. Stand Dezember 2015 muss der XAML Code vollständig von Hand geschrieben werden (siehe auch https://developer.xamarin.com/guides/cross-platform/xamarin-forms/user-interface/xaml-basics/)

F: Kann man in Xamarin Layout über Code erstellen? Stichwort: Data-driven bzw. Shared Layout (zumindest in Teilen)

A: Benutzeroberflächen können unter Xamarin sowohl für Android, als auch für iOS direkt im Quellcode erstellt werden. Siehe dazu: Dynamische Oberflächen unter iOS und Dynamische Oberflächen unter Android. Gleiches gilt auch für Xamarin.Forms: Dynamische Oberflächen unter Xamarin.Forms

F: Kann man in Visual Studio auch direkt Obj-c oder Swift-Code schreiben in einem iOS-Projekt?

Ab Visual Studio 2015 Update 1 verfügt VS zumindest über IntelliSense für Swift. Somit ist ein komfortables editieren von Swift Quelltexten möglich. Weitere Funktionen, wie zum Beispiel die Übersetzung von Swift Quellcode gibt es jedoch noch nicht.

F: Wie sync SQLITe <--> SQL Server?

A: Die Synchronisation von offline Daten mit einem zentralen Server ist keine triviale Aufgabe. Eine mögliche Lösungsvariante wäre es die Synchronisation vollständig selbst umzusetzen. Dies ist jedoch komplizierter als man zunächst glauben mag.

Eine kommerzielle Lösung für dieses Problem ist Zumero for SQL Server. Selbst habe ich Zumero noch nicht eingesetzt, daher kann ich auch keine Aussage darüber treffen, wie gut das Produkt funktioniert.

Darüber hinaus gib es auch eine Lösung mit Azure Mobile Services.

F: Unterstützt Xamarin eigentlich nicht Windows Phone?

A: Die Kernidee der Xamarin Platform besteht darin, C# und die .NET Klassenbibliothek zur Entwicklung von Android und iOS App nutzen zu können. Eine Implementierung für Windows Phone von C# und der .NET Klassenbibliothek gibt es bereits von Microsoft. Daher ist eine Windows Phone Unterstützung seitens Xamarin erst einmal nicht notwendig. Zumindest so lange das UI vollständig nativ entwickelt wird. Spätestens wenn die Abstraktionsschicht Xamarin.Forms ins Spiel kommt, macht eine Windows Phone Unterstützung seitens Xamarin natürlich schon Sinn. Daher gibt es für Xamarin.Forms tatsächlich eine Unterstützung für Windows Phone 8.1, Windows 8.1 und Windows 10 Universal Apps.

Cordova vs. nativ mit Xamarin?

Diese Frage lässt sich seriös leider nicht in zwei Sätzen beantworten. Stattdessen müsste man anhand eines individuellen Kriterienkatalogs beide Ansätze miteinander vergleichen und dann im Einzelfall für die eine oder andere Technologie entscheiden.

Genau mit dieser Fragestellung nativ vs. Cordova vs. nativ mit Xamarin habe ich mich jedoch in den letzten Monaten sehr intensiv beschäftigt. Das Ergebnis ist eine Bewertungsmethode, die eine belastbare und nachvollziehbare Entscheidungsfindung für eine der Alternativen ermöglicht. Details über die Veröffentlichung des dahinter stehenden Models werde ich Anfang nächsten Jahres über meinen Newsletter bekannt geben. Also am besten gleich hier unten am Seitenfuß zum Newsletter anmelden.

Am 16. Dezember hatte ich die Freude, ein Webinar für developer media zum Thema Cross Plattform App Entwicklung mit Visual Studio 2015 zu halten. In gut zwei Stunden erläuterte ich die Herausforderungen bei der plattformübergreifenden Entwicklung und stellte anschließend die beiden Alternativen Xamarin und Cordova unter Nutzung des Ionic Frameworks vor. Die Aufzeichnung des Webinars kann hier kostenfrei herunter geladen.

Der Quellcode zum Webinar befindet sich auf github und kann dort herunter geladen werden. Die Implementierung der Cordova App ist aktuell noch nicht im Repository enthalten. Sie wird jedoch in Kürze folgen.

Falls Sie aktuell vor der Problemstellung stehen, eine App für mehrere Plattformen entwickeln zu müssen, jedoch noch unentschieden sind, ob es Xamarin, Cordova oder doch eine native App werden soll, dann sollten Sie Ende Januar einen Blick auf meine Homepage werfen. Die letzten Monate habe ich mich damit beschäftigt, ein Model zu entwickeln, welches eine transparente und belastbare Entscheidungsfindung für eine Alternative im Rahmen der Cross-Plattform-App-Entwicklung ermöglicht. Details dazu werden Ende Januar oder Anfang Februar auf meiner Website veröffentlicht. Das genaue Datum werde ich rechtzeitig über meinen Newsletter, zu dem Sie sich im Seitenfuß anmelden können, veröffentlichen.

Einen detaillierten Einblick in die Entwicklung mit Xamarin habe ich übrigens auch bei video2brain als Video-Training aufgezeichnet. Wer sich also bereits für Xamarin entschieden hat, für den lohnt sich ein Blick in meinen Xamarin Crashkurs bei video2brain. Darüber hinaus könnte auch ein Blick in mein Swift für C#-Entwickler Training lohnenswert sein.

Die Fragen, die während des Webinars gestellt wurden, werde ich übrigens ab morgen häppchenweise in mehreren Blog-Posts beantworten.

Wer zusätzliche Fragen hat, kann diese natürlich gerne über die Kommentarfunktion hier im Blog stellen.

Auf die Frage “Hätten Sie gerne noch ein paar Memory-Leaks in Ihrer Anwendung?” würden die meisten Kunden vermutlich vehement mit “Nein” antworten. Und das selbst wenn die Leaks kostenfrei wären. Obwohl die wenigsten Anwender also Memory Leaks wünschen, liefern Entwickler sie trotzdem regelmäßig mit ihren Anwendungen aus. Selbstverständlich geschieht dies nicht bewusst. Stattdessen schleicht sich das Leak still und heimlich in die Applikation und entfaltet seine volle Wirkung erst im Produktivbetrieb beim Kunden.

Als .NET Anwendungsentwickler sind wir uns natürlich keiner Schuld bewusst, schließlich gibt es unter .NET dank des Garbage Collectors gar keine Memory Leaks mehr. Zumindest in der Theorie! In der Praxis befinden sich jedoch in relativ vielen Anwendungen Memory Leak  ähnliche Zustände, die zum unkontrollierten Anwuchs des Speicherverbrauchs einer Anwendung führen und im schlimmsten Fall mit einem Absturz enden.

In meinen ersten Jahren auf der .NET Plattform bin ich selbst oft genug in die Memory Leak Falle hereingetappt. Nach anfänglicher Ratlosigkeit arbeitete ich mich mühevoll in windbg ein und rückte so den Memory Leaks auf die Pelle. Mittlerweile habe ich zwar das Werkzeug gewechselt und nutze statt windbg meist den Redgate Ants Memory Profiler, trotzdem analysiere ich weiterhin regelmäßig Memory Leaks unter .NET. Nicht nur meine eigenen, sondern auch die meiner Kunden. Eine Auswahl der fünf häufigsten bzw. gemeinsten Leaks habe ich Ende 2014 in einem Vortrag zusammengefasst, den ich seitdem auf mehreren Konferenzen und User Group Treffen gehalten habe. Als ich den Vortrag vorbereitet habe ging ich davon aus, dass es sich um ein “Randgruppenthema” handelt, dass nur relativ wenige Teilnehmer interessieren wird. Tatsächlich war jedoch das Gegenteil der Fall. Der Memory Leak Vortrag war mein bisher erfolgreichster. Auf jeder Konferenz war der Vortrag so gut besucht, dass zum Teil einige Teilnehmer sogar auf dem Boden sitzen oder stehen mussten.

Eines der persönliches Highlights für mich war es den Vortrag während der C# Days der BASTA Spring 2015 und auch auf der Herbst-BASTA 2015 halten zu dürfen. Die Aufzeichnung des BASTA Spring Vortrags ist mittlerweile online. Der Einfachheit halber habe ich das Video direkt hier im Blog eingebunden.

In dem Video erkläre ich folgendes:

  • Wie funktioniert der .NET Garbage Collector
  • Wie geht man bei der Analyse von Memory Leaks systematisch vor
  • Welche Leaks befinden sich typischerweise in .NET Anwendungen
  • Wie behebt man gefundene Leaks schnell und zuverlässig

Wer also gerne lernen möchte, wie er Memory Leaks in der eigenen Anwendung finden kann, der sollte sich auf jeden Fall einmal das Video ansehen. Der Quellcode des Vortrags befindet sich übrigens online auf github. Somit kann jeder der möchte gerne selbst auf die Suche gehen. Außerdem unterstütze ich auch sehr gerne bei der Memory Leak Analyse des eigenen Quellcodes.

Über Kommentare, entweder hier im Blog, oder direkt auf Youtube freue ich mich natürlich.

Wie bekomme ich meine Anwendung schneller? Diese Frage stellen mir viele meiner Kunden, die mich zu einer Performanceanalyse Ihrer .NET Anwendung einladen. Natürlich lässt sich eine solche Frage nicht pauschal beantworten. In der Regel hilft nur ein gezieltes Profiling der Anwendung. Trotzdem gibt es einige Best Practices, deren Einhaltung bereits enorm zur Steigerung der Anwendungsperformance führen können.

52 Tips and Tricks to boost NET Performance Book Cover

52 solcher Performance Tipps hat das Team von Red-Gate gesammelt. Dazu wurden Performance Experten aus der ganzen Welt gebeten ihre besten Tipps beizusteuern. Das Ergebnis ist ein kleines E-Book, zu dem ich auch zwei Tipps beitragen durfte.

Das Buch ist in die folgenden Bereiche gegliedert:

  • Allgemeine Performance Ratschläge
  • .NET Performance Verbesserungen
  • ASP.NET Performance Tipps
  • Tipps zum Datenzugriff
  • Speicheroptimierung
  • Generelle Tipps

Meine Tipps beziehen sich auf den Datenzugriff mit dem Entity Framework. Ein Problem, welches ich häufig beobachte besteht darin, dass Daten unnötig mit aktiviertem Change Tracking geladen werden. Change Tracking ist ein Mechanismus, der dafür sorgt, dass das Entity Framework über eine Veränderung der Daten einer Entität informiert wird. Über diesen Weg reicht später ein einfacher Aufruf der Methode SaveChanges am DBContext, um alle Änderungen automatisch zu sichern.

Häufig ist jedoch bereits beim Laden klar, dass die Daten nicht verändert werden. Nutzt man nun jedoch den Standardweg des Entity Framwork 6, wie ihn folgender Code zeigt, werden die Daten automatisch mit aktiviertem Change Tracking abgerufen.

using (var db = new NorthwindDb())
{
    var shippers = db.Shippers.ToList();
    foreach (var shipper in shippers)
    {
        Console.WriteLine("{0} - {1}", shipper.ShipperID, shipper.CompanyName);
    }
}

Die Lösung des Problems ist relativ einfach. Ein Aufruf der Erweiterungsmethode AsNoTracking() deaktiviert das Change-Tracking für die über diesen Weg geladenen Entitäten.

using (var db = new NorthwindDb())
{
    var shippers = db.Shippers..AsNoTracking()ToList();
    foreach (var shipper in shippers)
    {
        Console.WriteLine("{0} - {1}", shipper.ShipperID, shipper.CompanyName);
    }
}

Die Frage ist nun natürlich: Was bringt der Aufruf von AsNoTracking()?

In meinem Beispiel, in dem ich 10.091 Datensätze aus der Tabelle Customers der Northwind Datenbank gelesen habe, konnte ich folgende Werte messen:

Mit Change-Tracking: 10958 ms

Ohne Change Tracking: 9047 ms

Wie wir sehen, spart der Einsatz von AsNoTracking im vorliegenden Fall knapp 2 Sekunden.

Natürlich ist das immer noch nicht sonderlich schnell. Deshalb habe ich einen weiteren Tipp im E-Book veröffentlicht, der ein weiteres, häufiges Problem beim Datenzugriff mit dem Entity Framework behandelt. Wer wissen möchte wie er lautet, sollte einen Blick ins E-Book werfen Smiley

Vor einiger Zeit habe ich übrigens ein kleines Video aufgezeichnet, in dem ich die generelle Vorgehensweise beim Performance Profiling mit dem ANTS Performance Profiler erkläre. Wer sich also unsicher ist, warum die eigene Anwendung zu langsam ist, der sollte hier einmal einen Blick rein werfen.



Ihr habt auch tolle Performance Tipps? Dann schreibt ihn doch in einen Kommentar zu diesem Post!