Donnerstag, 20. August 2015

Jenkins und NuGet V3 mit UWP Apps

Während der Umstellung einiger Apps zu Windows 10 Universal Windows Platform Apps (UWP Apps) kam es wie es kommen musste ich habe auch ein UWP App Projekt mit dem Jenkins bauen wollen.

Es blieb relativ lang beim wollen denn der Nuget package restore wollte nicht funktionieren.

Ich erledige das mit dem Restore über das Ausführen einer Windows Batch Datei mit folgendem "langweiligen" Inhalt:

C:/JenkinsRoot/nuget.exe restore "C:/JenkinsRoot/workspace/Windows10/SolutionFolder/Solution.sln"

Das hat bisher immer super funktioniert... bisher.

Bei UWP Apps werden die Abhängigkeiten mit Nuget V3 aufgelöst und damit musste ich in das JenkinsRoot die neue Nuget.exe vom command-line tool legen.

Das führte aber immer zu folgender Ausgabe:
Restoring packages for UAP,Version=v10.0...
Unable to resolve GoogleAnalyticsSDK (= 1.3.0) for UAP,Version=v10.0.
Unable to resolve Microsoft.ApplicationInsights (= 1.0.0) for UAP,Version=v10.0.
Unable to resolve Microsoft.ApplicationInsights.PersistenceChannel (= 1.0.0) for UAP,Version=v10.0.
Unable to resolve Microsoft.ApplicationInsights.WindowsApps (= 1.0.0) for UAP,Version=v10.0.
Unable to resolve Microsoft.NETCore.UniversalWindowsPlatform (= 5.0.0) for UAP,Version=v10.0.
Unable to resolve Newtonsoft.Json (= 7.0.1) for UAP,Version=v10.0.

Was dazu führte, dass der Build mit folgender Meldung fehlschlug:

 C:\Program Files (x86)\MSBuild\Microsoft\NuGet\Microsoft.NuGet.targets(83,5): error : Couldn't find the required information in the lock file. Make sure you have UAP,Version=v10.0.10240/win10-x86 mentioned in your targets.

Wenn ich den gleichen Befehl vom gleichen Verzeichnis aus direkt auf dem Buildserver ausführe geht alles. Irgendwo steckt ein Fehler.

Ich erspare Euch jetzt die zweitausend Versuche die ich unternommen habe um irgend etwas zu ändern und komme gleich zum Ergebnis. Ihr müsst den Jenkins Prozess unter einem "echten" Nutzer laufen lassen. Wie das geht fand ich bei StackOverflow.

Danach läuft alles perfekt und Jenkins ist wieder happy.




Mittwoch, 5. August 2015

Blend Behavior SDK für Windows 10 UWP Apps verwenden

Da ich schon einige Apps von Windows 8 und Windows Universal auf Windows 10 "Universal Windows Plattform - UWP" App migrieren durfte kam ich auch schon an die Stelle, dass mir das Behaviors SDk fehlte.



Ich nutze das in einigen Apps z.B. um mit den EventTriggerBehavior und der InvokeCommandAction im Xaml Commands auf Events zu binden.

Es ist also nicht gerade trivial das in einer großen App wie der Windows Phoen App von Marktjagd nebenher bei der Migration zu ersetzen. Das ist auch gar nicht notwendig denn in UWP Apps können Libraries von Windows 8.1 weiterverwendet werde. also einfach das "alte" Behaviors SDk einbinden und alles ist gut. Dazu einfach auf  "References" einen Rechtsklick dann "Add reference" auswählen und dann zwei mal "Browse" auswählen.

Anschließend zu folgenden Pfad navigieren:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1\ExtensionSDKs\BehaviorsXamlSDKManaged\12.0\References\CommonConfiguration\Neutral



Auf die Lösung bin ich gekommen durch einen Thread im MSDN Forum gekommen. 


Problem mit der Installation von *.vsix Dateien nach der Installation von Visual Stuido 2015

Nachdem ich bei mir auf dem Arbeitsrechner das Upgrade zu Windows 10 durchgeführt habe und Visual Studio 2015 installiert habe konnte ich die SQLite Extension für Windows UAP Apps nicht mehr installieren.

Erster Versuch war es eine andere Version also die sqlite-uap-3081101.vsix zu finden und zu installieren. Geht nicht.

Zweiter versuch war den Installer (VSIXinstaller.exe) direkt von  \Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE auszuwählen. Hat auch nichts gebracht.

Dann dachte ich okay vielleicht hat es etwas mit SQLite zu tun und habe die bereits bestehenden Extensions für Windows Phone und Windows RT deinstalliert. Einzige Änderung war, dass ich jetzt mehr Druck hatte denn nun ging nichts mehr.

Jetzt habe ich bei meiner Suche ein Issue bei Github gefunden was mich tatsächlich auf die Lösung gebracht hat.

visual Studio 2015 hat bei der Installation unter \Users\ neben dem Ordner
\Users\Alexander Witkowski\ noch einen weiteren Ordner
\Users\alexander%20Witkowski\ angelegt.

Mal abgesehen davon, dass ich den User mit leerzeihen doof finde aber das kam vom Admin liegt hier das Problem. Nach dem ich meinem User Zugriff zu dem Alexander%20Witkowski-Ordner gegeben habe funktionierte die Installation von .vsix-Datein wieder ohne Probleme per Doppelklick.

Also falls Ihr auch Probleme bei der Installation von Visual Stuido Extensions habt schaut ob ihr einen zweiter Userordner habt. In dem liegen dann auch die VSIX-LogDatein.

Dienstag, 10. Februar 2015

AppBarButton mit PathIcon

Heute bestand ein Teil meiner Aufgabe darin, einen AppBarButton mit einem eigenen Icon zu versehen.

Da gibt es ja eine MSDN Seite dazu.

Kein Problem das Icon vom Grafik also PDF speichern lassen, die Dateiendung in *.ai umbenannt und in Blend Importiert.




Von den Importiertem Path die Inhalte von Data kopieren und in der App in ein PathIcon einsetzen.



<AppBarButton Label="XMyAbb" 
              x:Uid="AbbMyAbb" 
              Command="{Binding MyAbbCommand}">
    <AppBarButton.Icon>
        <PathIcon Data="M37.1446,20.828 C63.1168,19.4391                                     63.8108,1.66132 63.2553,19.3002                                     C62.6997,36.9391 59.2272,38.6053                                     59.2272,38.6053 L42.4219,35.8274                                     L36.5886,27.3555 
                        z" Foreground="White" />
    </AppBarButton.Icon>
</AppBarButton>

Alles ganz einfach - aber es funktioniert natürlich nicht wie gedacht.

Ich möchte den Post kurz halten und verrate gleich die Lösung ohne alle meine vergeblichen Versuche mit Alignment, Margin etc. zu beschreiben.

Ich müssten den Path an die 40x40 px Größe des AppBarButtons anpassen.



Das geht am besten mit dem WPF GeometryTransformer. Spielt ein wenig mit den Parametern, die euch das Tool bietet, kopiert die Ausgabe zurück in den XAML Code und schaut im Zweifel im Properties Window ob es passt.


Es gibt dazu auch Infos in einem MSDN Forums Thread und einen guten weiterführenden TechNet Artikel

Donnerstag, 13. November 2014

Eigene Schriftarten in Universal Apps für Windows 8.1 und Windows Phone 8.1

Vor einiger zeit habe ich mit Loek und Chris von den 6Wunderkindern beim Developer Open Space über best practices zu Universal Apps gesprochen und dabei kam es auf das Thema Icons. Der Tipp über den Loek auch in seinem Blog schreibt ist die Verwendung von eigenen Schriften in denen man die Icons einbettet, da diese vektorbasiert sind und auf allen Plattformen (Web, iOS, Android) dargestellt werden können. Noch dazu hat man alles an einer zentralen stelle in nur einer Datei.

Also ging ich sofort daran die ersten Icons in meinen Apps mit Hilfe von fonttastic in eine Schriftart umzuwandeln und diese dann einzusetzen. 

Aber es gab einen magischen Fehler - der Designer zeigte mir die richtige Schriftart aber auf dem Phone wurde die Standardschriftart - also der Fallback - verwendet.

Nach einigem Suchen nun die Lösung es scheint sich um einen kleinen Bug in Blend for Visual Studio zu handeln. 

Folgenden Code erzeugt Blend bei einem FontIcon mit meiner untitled-font:

<!-- Don't work-->
<FontIcon  Glyph="r" FontFamily="Fonts/untitled-font-5.ttf#untitled-font-5" />

und folgenden Code erzeugt Visual Studio:

<!-- Works :)-->
 <FontIcon  Glyph="r" FontFamily="ms-appx:/Fonts/untitled-font-5.ttf#untitled-font-5" />

Und wem das ms-appx: zuviel ist der kann es auch weg lassen:
<!-- Also Works :)-->
 <FontIcon  Glyph="r" FontFamily="/Fonts/untitled-font-5.ttf#untitled-font-5" />

Bei einer neu erstellten Universal App funktioniert die Zuweisung der Schriftart ohne führenden '/' daher ist das kein Anprangern eines allgemeinen Bugs. Es wird ein Sonderfall sein.


Montag, 27. Oktober 2014

Developer Open Space 2014 - Mein Rückblick

Am vergangenen Wochenende war es endlich wieder so weit. Es war der Developer Open Space 2014 in Leipzig.

Für alle, die den Open Space nicht kennen - es ist eine Unkonferenz - also eine Veranstaltung ohne feste Agenda, ohne Speaker, ohne feste Sessions. Viel mehr lebt der Open Space von allen Teilnehmern, die ihr Wissen teilen und weitergeben.Wer es jetzt noch genauer wissen möchte, kann auf der Website die ganze Story zum #devspace nachlesen.

Workshop Tag

In diesem Jahr hatte ich endlich die Möglichkeit, schon am Freitag am Open Space teilzunehmen. Dabei bin ich gleich in die Vollen gegangen und habe einen Workshop gehalten.

Das Thema war "Connected Devices" oder besser "Hardware mit Apps steuern". Unter den 14 Teilnehmern fanden sich bekannte und neue Gesichter. Alle waren scharf darauf, mit all den angekündigten Gadgets zu spielen.






Doch fangen wir vorn an. Ich hatte meinen Workshop so vorbereitet, dass für fast jeden Teilnehmer ein BeeWi Auto mit Bluetooth Verbindung zum Ansteuern bereitstand. So wurden diese auch gleich verteilt und wild aus den Verpackungen befreit.


Nach meiner Ankündigung der Agenda - wir bauen eine Universal App zur Steuerung des Autos - der erste Schreck. Einige Teilnehmer fragten, ob es ein Alternativprogramm gibt, da Windows nicht ganz in ihrem Interesse ist. Jetzt nur nicht aus der Ruhe bringen lassen. Eine Alternative hatte ich nicht vorbereitet. Ich hatte aber etwas, das auf Zustimmung gestoßen ist. Kurzer Download der bereitgestellten Lösung von GitHub und dann die ganze Sache mit Node.js realisieren.
Für den Großteil der Teilnehmer ging es damit los, die Universal App unter meiner Anleitung zu bauen. Sehr hilfreich war dabei die vorbereitete Lösung bei GitHub. Hier hatte ich die einzelnen Schritte mit Commits abgebildet, so dass wer schneller war vorarbeiten und wer bei einem Schritt langsamer war mit Copy & Paste wieder den Anschluss finden konnte.


Neben der Verbindung zum Device und dem Übertragen von Daten war es mir auch wichtig, eine saubere Architektur zu skizzieren, auch wenn das im engen Zeitrahmen eines 1 Tages Workshops nur bedingt möglich war. Nun ja, damit waren wir bis zur Mittagspause durch, während die Node.js Abteilung schon die ersten Bewegungen des BeeWi Autos hervorgerufen hatte.


Nach dem Mittag ging es dann auch bei den Universal Apps an die Implementierung der Autosteuerung. Nach einigen erfolgreich übermittelten Befehlen per Bluetooth und der Verwendung des Inklinometers habe ich die Teilnehmer mit der Komplettierung der Aufgabe sich selbst überlassen und bin im direkten Gespräch auf Fragen eingegangen.

Zum Abschluss hatte ich noch einen kleinen Gadget Hackathon vorgesehen, aber dafür war die Zeit leider zu knapp. So haben wir den Workshop mit ein paar Informationen zu Arduino, Netduino, Intel Galileo, Raspberry Pi und Co. entspannt ausklingen lassen.


Als Ergebnis hatten wir ein Team, welches die bereitgestellten Phillips hue Lampen ansteuern konnte, ein Team, welches eine Ansteuerung per Node.js fertiggestellt hat (auf einem Linux Rechner), einen Teilnehmer, der eine Lösung für Android mit Xamarin gebaut hat und viele Teilnehmer, die ihr Auto mit der Universal App steuern konnten. Auch das Feedback der Teilnehmer war durchweg positiv und hat einige hilfreiche Tipps für den nächsten Workshop hervorgebracht.

Samstag - 1. Open Space Tag

Am Samstag ging es dann in den ersten Open Space Tag mit der Themenfindung los. Jeder konnte ein Thema vorschlagen, zu dem er etwas zu erzählen hatte oder zu dem er gern mehr Informationen bekommen hätte. Nach vielen guten Vorschlägen und einigen humorvollen Kommentaren, ergab sich der folgende Sessionplan.


Mich hat es gleich zu dem von Sebastian vorgeschlagenen Open Space zu Wearables und Smartwatches gezogen. Es wurde viel über Hardware für Smart Homes und die Möglichkeiten der Kopplung gesprochen. Hier ging es über Somfy, HomeMatic, FS20, Raspberry Pi, Gigaset Elements, KNX und vieles mehr. Als einige Eckpunkte haben sich Bedenken im Bereich Sicherheit der Anbieter, das Problem von fehlender Interoperabilität und die Sorge nach der Nachhaltigkeit der einzelnen Lösungen ergeben.

Im Anschluss ging es zu einer Session mit Loek und Chris von den 6 Wunderkindern, mit denen wir über best practices von Universal Apps sprechen wollten - es waren aber so viele Openspacler anwesend, die noch nicht mit Universal Apps in Berührung gekommen sind, dass Loek einen Einstieg in Universal Apps daraus machte. Auch dieser war sehr informativ und enthielt den einen oder anderen guten Trick.


Fazit der Session war - wir wollen mehr. Ein deep dive zu diesem Thema musste folgen.

Im Anschluss ging es für mich in die nächste Session zum Thema Smart Home, diesmal vorgeschlagen von Torsten in Verbindung mit dem Smart Office. Hier ging es darum, wie man mit Technik wie den Phillips hues Geschäftsprozesse und wichtige Geschäftsparameter visualisieren kann. Ich habe dazu etwas Code ausgepackt, den ich geschrieben habe, um nach der Idee von Torsten Daten aus Google Analytics mit Hilfe der hue Lampen in Echtzeit zu visualisieren.

Ganz ohne Pause ging es weiter mit einem Open Space zur Kinect V2 für Windows. Ein brandaktuelles Thema, denn in dieser Woche wurde die finale Version des Kinect für Windows SDK veröffentlicht.
Neben den technischen Möglichkeiten der neuen Kinect ging es auch darum, einige Einsatzzwecke zu besprechen.

Im Anschluss gab es für mich eine Pause, in der ich mit anderen Teilnehmern ein paar kleine Sachen programmiert habe und in der ich kegeln war.


Darauf folgte eine Session zu Sensoren bei mobiler Robotik von Jörg. Er hatte viele Sensoren zum anschauen und anfassen dabei, und schnell wurde unter den Anwesenden diskutiert, was man womit alles anstellen könnte.

Vor lauter Diskussionen habe ich die letzte Session zum Thema Paket von Alex und Steffen leider verpasst.

Zu guter Letzt gab es noch die Auswertung des Kegelwettbewerbs vor dem Netzwerken im Josephs Pub. Was soll ich sagen? Zweiter Platz. Juhu - dafür gab es eine Überraschungstüte von cleverbridge und einen 1 Monats Gutschein für Video2Brain.

Sonntag - 2. Open Space Tag

Am zweiten Tag habe ich bei der Session Planung "Deep dive für Universal Apps" vorgeschlagen.


Der erste Open Space des Tages war von Sven zum Thema openHAB. Damit wurde nun auch beim letzten Teilnehmer das Interesse am Thema Smart Home und Internet of Things geweckt. Es war sehr informativ und ich konnte viele neue Ideen daraus ziehen.


Es folgte die für mich beste Session des Open Space der "Deep dive zu Universal Apps". Neben vielen Teilnehmern, deren Namen ich nicht kannte, sprachen Loek, Chris , Sascha und ich über unsere Erfahrungen. Vor allem aber auch über Lösungen zu unterschiedlichen Herausforderungen im Bereich Universal Apps. Auf Details werde ich in späteren Blogposts eingehen.

Nach dem Mittag folgte für mich die letzte Session mit Jörg zum Intel Galileo Board mit Windows on Devices. Auch diese Session war sehr informativ und von höchster Qualität. Es wurden die Unterschiede zwischen dem Galileo eins und zwei gezeigt. Es gab eine Demo zur Blink App und auch einige fortgeschrittene Sachen. Zum krönenden Abschluss gab es eine Vorführung mit einem grafischen Touch Display am Galileo - die Lösung benötigt noch etwas Entwicklungszeit aber der Ansatz war auf beeindruckende Weise zu erkennen. Ganz ungeduldige Teilnehmer bekamen die Möglichkeit, zum Konferenzpreis gleich ein Galileo Board mitzunehmen.


Nach den Sessions ging es daran, meine sieben Sachen wieder zusammenzusuchen und mich von allen Teilnehmern, Feunden und den Kollegen der develappers zu verabschieden.

Danke!

Ein erster Dank geht an die Develappers UG, welche mich als Berater zum Open Space entsendet hat und mich auch entsprechend unterstützte - danke Jungs, Ihr seid ein super Team! 

Abschließend möchte ich mich für die mehr als gelungene Veranstaltung bei Torsten Weber, Alexander Groß und, Marcel Hoyer als Organisatoren bedanken und bei allen Teilnehmern, denn der Open Space lebt nur durch Euch!

P.S. Hier gibt es noch viel mehr Fotos.

Sonntag, 7. April 2013

STC 2013 Berlin - Zwei Köpfe ein Debugger

Damit Ihr nicht sagen könnt "Hey der Alex von HeiReS war nur am Samstag aus der STC zu faul zum Bloggen" und damit ich das spannenden Thema mit ein paar kurzen Sätzen für mich dokumentiert habe gibt es im Nachgang noch einen Blogpost zu der für mich besten Session der diesjährigen STC (von denen die ich gesehen habe natürlich).

Und das ist die Session die Patric Boscolo zusammen mit Immu Landwerth zum Debuging gehalten hat. Viele Features von Visual Studio kannte ich schon einiges war mir jedoch neu - daher jetzt in Listenform, mache Dinge werden nur genannt, auf andere gehe ich mit ein paar Zeilen Erklärungstext ein.


  • Einen Watch auf eine Variable anpinnen - kann ganz praktisch sein ich nutze ehr das Watch Fenster 

  •  Bei einem Breakpoint nur anhalten, wenn dieser n-Mal erreicht wurde - hilfreich wenn z.B. ab dem 10 Aufruf einer Funktion Probleme auftreten und man keine Zählvariable für einen bedingten Breakpoint zur Hand hat. Ihr könnt eine solche Hit-Bedingung im Kontextmenü angeben, dazu Rechtsklick auf den roten Punkt.


  • Wenn ihr eine Ausgabe von aktuellen werten braucht aber der Code nicht von Euch stammt und ihr kein Console.WriteLine(xyz) einfügen könnt (Ich würde Debug.WriteLine nehmen aber dazu später), dann hilft der Eintrag When Hit... weiter. Hier könnt ihr mit einer etwas eigensinnigen Syntax Ausgaben hinzufügen, die unter anderem auch die Thread Id enthalten können. Aber Achtung diese Geschichte ist nicht die schnellste und sollte wenn der Breakpoint oft getroffen wird und nicht alle ausgaben notwendig sind mit einer Bedingung kombiniert werden. 
  • Im Menü unter Debug -> Windows findet man das Immediate Window - hier kann man scripting mäßig Codezeilen hineinschreiben und bekommt direkt eine entsprechende Ausgabe. Was leider nicht möglich ist sind Lambda Ausdrücke. 

  • Die meisten von euch werden debug-visualizer schon kennen, zum Beispiel wenn man sich den Wert eines Strings anzeigen lässt hat man die Möglichkeit unterschidliche Anzeigeformen wie XML oder HTML zu wählen. Neu ist, dass man solche Visualizer jetzt auch mit managed Code selbst schreiben kann. Natürlich gibt es auch schon zahlreiche Visualizer fertig zum installieren - die Suchmaschine deines Vertrauens hilft hier weiter. 

  • Eine weitere Kleinigkeit die durchaus hilfreiche seien kann ist das verursachen eines Ausführungsstopps mit einem Methodenaufruf ohne einen Breakpoint zu setzen mit - System.Diagnostics.Debugger.Break();


So das war der erste Teil zur Debugging Session, Teil 2 folgt in den kommenden Tagen.