App Entwicklung mit Apache Cordova

Nachdem ich größtenteils schon wieder vergessen hatte, wie man für Android Apps nativ entwickelt und mal wieder Lust hatte, neue Apps zu programmieren und in den Play Store zu bringen, habe ich mir angeschaut, wie man so etwas ohne native Android-Entwicklung bewerkstelligen kann.

Es gibt mehrere populäre Frameworks, um Apps möglichst auf unterschiedlichen Plattformen (Android, iOS, Windows 10) zu publizieren, aber nur einmal, üblicherweise mit gängigen Web-Tech
nologien (HMTL5 / Javascript / CSS + sehr viele tolle neue Frameworks) entwickeln zu müssen. Klassisch, write once, debug everywhere halt;-)
Ionic und React Native sind wohl zwei der populärsten Frameworks dieser Art. Hier soll der Anwender möglichst denken, die App wäre nativ für das jeweiligen Betriebssystem geschrieben worden. Ich hatte mich für mein Projekt initial für Ionic entschieden, aber dann gemerkt, dass für meine Zwecke der Overhead dieses Frameworks gar nicht nötig war.
Ionic verwendet nämlich zur Integration in die Zielplattform (i.e. Android) Apache Cordova, welches auch ohne diese zusätzliche Schicht das bietet was mich interessiert hat: Single Page Applications (SPA), also clientseitig laufende, mit Javascript geschriebene Anwendungen nach Android kompilieren zu können. Heutzutage benutzt man dazu ein SPA Framework, und da hat man eine gewaltige Auswahl. Wenn man anfängt sich zu Javascript Frameworks und anderer Web-Technologien zu informieren, kann einem schon etwas schwindelig werden – irgendwann muss man einfach aufhören Alternativen zu vergleichen und einfach anfangen. Ich habe mich für AngularJS entschieden, verwende ehrlich gesagt aber nur eine kleine Teilmenge der Features und Komplexität.

Angular JS

Was wirklich nett ist, ist das Angular die Verknüpfung zwischen Datenmodell und Darstellung im DOM (Document Object Model, die Repräsentation des HTML Dokuments zur Laufzeit) automatisch und in Echtzeit übernimmt. Wenn man also im Datenmodell beispielsweise einen Counter hochzählt, sieht man das sofort im Browser – und wenn der Anwender den Wert in einem Eingabefeld ändert, passt sich das Modell sofort an.
Darüber hinaus bin ich bei meiner Verwendung von Angular JS bisher kaum über Hello-World Niveau hinausgegangen, aber ich denke ich werde mich da eher „on demand“ weiterbilden statt erstmal ein dickes Buch durchzuarbeiten. Im Internet gibt es aufgrund der Popularität des Frameworks jedenfalls etliche Ressourcen dazu.

Elephant Brain

Ich habe die Entwicklung erstmal mit einer etwas ambitionierteren App zum Vokabeln/Sprache lernen begonnen, aber nachdem ich dafür ein kleines Memory-Spiel entwickelt hatte, möchte ich dieses erstmal sozusagen als „Spin Off“ veröffentlichen, um Erfahrung mit dem gesamten Prozess zu sammeln. Dabei habe ich einige Sachen gelernt.

elefantengedaechtnisJavascript

Objektorientierte Programmierung mit Javascript ist für einen geübten Java-Entwickler ziemlich ungewohnt. Es gibt keine „Klassen“, aber dafür sind Funktionen Objekte und können ein bisschen so ähnlich verwendet werden. Funktionen können sowohl Daten/Felder wie weitere Funktionen enthalten. Das was in Javascript wiederum Objekte genannt wird ist eigentlich auch nicht mehr als eine Map, die beliebige Daten, etwa auch andere Maps und Funktionen enthalten kann. Einige Male bin ich bei der Entwicklung mit meiner Java-Brille in Sackgassen gelaufen, aber da mein Programm ja nicht groß ist, war das Refactoring nie besonders aufwändig. Langsam komme ich mit der Sprache besser zurecht, und es macht schon Spaß, eine neue Programmiersprache zu lernen, beziehungsweise in diesem Fall etwas besser und detaillierter zu lernen. Ich habe auf die Verwendung der allerneuesten Sprachfeatures (ECMAScript 6/2016) verzichtet, damit es in den meisten Browsern läuft.

Persistenz

Persistenz ist im Browser supereinfach zu haben:
 // Speichern
 localStorage.setItem("meinName", "Paul");
 // Laden
 var name = localStorage.getItem("meinName");

Die Werte in localStorage können aber erstmal nur Strings sein, deswegen braucht man gibt es diverse Frameworks, die sich als Wrapper um LocalStorage legen, um den Umgang damit komfortabler zu machen. Ich verwende dazu Lockr, und es tut was es soll. Objekte werden beim Speichern nach JSON serialisiert und beim Laden entsprechend deserialisiert. Einzige Limitation: Funktionen (Anweisungen) gehen dabei verloren, deswegen habe ich in meinem Code einen einfachen Datencontainer g verwendet, der selbst keine Funktionen hat.

Persistenz gibt es zumindest in der aktuellen Version nur auf dem Client. Es gibt also keine globale Bestenliste, und wenn der Browser-Cache geleert wird sind auch die Punktestände wieder weg. Bei einem ambitionierterem Projekt müsste ich mir also auch über serverseitige Persistenz gedanken machen.

Icons und Bilder

Ich habe Spaß am Programmieren, aber eher weniger dabei, mich mit CSS herumzuschlagen, damit das Ganze gut aussieht, und auch das Erstellen schöner Grafiken ist nicht gerade meine Kernkompetenz. Eine Super-Ressource, die mir hier sehr geholfen hat, war FlatIcons.

APK Generieren mit Cordova

Cordova wird dazu verwendet, aus einer bereits existenten SPA mit wenigen Befehlen eine vollständige APK (Android Package)-Datei zu generieren. Oder auch Output für andere Systeme, aber damit habe ich mich erstmal nicht so intensiv beschäftigt. Eine neue Plattform hinzuzufügen ist in jedem Fall mit etwas Aufwand verbunden, im Fall von iOS braucht an wohl sogar einen Mac dazu. In Fall von Android muss jedenfalls schonmal ein SDK vorliegen. Das hat auf Anhieb nicht geklappt, da sich das installierte SDK, Java und Cordova nicht vertragen haben. Es kam etwa die folgende Fehlermeldung:

Error: Requirements check failed for JDK 1.8 or greater

Mit der Kombination Cordova 5.4.0, Android SDK 6.0 (API 23) und Java 8 JDK hat es dann letztendlich funktioniert, und ich habe erstmal nicht vor, da weiter upzugraden.
Hat man das Projekt erstellt (cordova create <project> ) und Android als target eingerichtet (`cordova platform add android`), wird eine neue Version einfach so gebaut: cordova build –release. Um Apps im Play Store vertreiben zu können, müssen sie signiert werden. Dazu muss eine Keystore-Datei erstellt und eine Datei platforms/android/release-signing.properties erstellt werden, und schon wird die APK Datei automatisch signiert.
storeFile=XYZ.keystore
storeType=jks
keyAlias=
keyPassword=
storePassword=
Wichtig: Viele Dateien in platform/android werden von Cordova generiert, es hat also keinen Sinn sie manuell zu ändern – auf das Änderungsdatum achten. Mit jeder neuen Version die über die Developer Konsole von Android hochgeladen wird, muss die Versionsnummer erhöht werden.

Rechtschreibung

Eine weitere Lektion: Prüfe die Rechtschreibung von deinem App-Namen, bevor Du sie veröffentlichst;) Erst zu spät ist mir aufgefallen, dass das englische Wort für „Elefant“ elephant und nicht elefant ist. Da war der Identifikator für den Play Store bereits vergeben (de.panschk.elefantbrain), deswegen muss das jetzt so bleiben.

Links

Auch dieses Projekt habe ich in meinem Github Profil hochgeladen. Im Play Store von Android ist die App zur Zeit noch im Betatest-Modus, ich werde sie wohl in den nächsten Wochen offiziell veröffentlichen.
Die App ist im Android Store zu laden, funktioniert aber auch im Browser: Zu Elephant Brain im Browser

Lubuntu

Mein lieber Bruder Simon hat mir seinen alten Laptop zur Verfügung gestellt, der mit dem Windows 7 was da drauf war tatsächlich kaum noch zu benutzen war. Ich habe Lubuntu (16.04 LTS) drauf installiert, und jetzt kann ich den Laptop noch prima zum Entwickeln benutzen. Das ist nicht das erste Mal, dass ich einem „zu langsamen“ PC durch Installation von Linux ein zweites Leben geben konnte.

Lubuntu gefällt mir bisher jedenfalls sehr gut – nicht fancy, aber alles funktioniert ziemlich reibungslos.

2016-11-13-100731_1366x768_scrot

 

WordPress Update

Mein Webhoster (allinkl.com) hat zum Upgrade von PHP auf eine neuere Version (Jetzt 5.6) gedrängt/geraten, und nachdem ich das gemacht habe musste ein Upgrade von WordPress her, um noch kompatibel zu sein. Das hat mit zwei Klicks einfach funktioniert, und schon bin ich wieder auf dem neuesten Stand. Sehr schön wie das heutzutage funktioniert 🙂

Next up: Mal ein etwas aktuelleres Theme installieren und mal wieder hin und wieder was schreiben…

Tastatur Spiel

Mein letzter Eintrag in dem Blog ist ja schon über zwei Jahre her. Vielleicht sollte ich doch mal hin und wieder was hier posten, aber ich verspreche mir selbst lieber nicht zuviel;-)

Jetzt habe ich wenigstens mal wieder einen Anlass, da ich ein kleines Projekt mit der Welt teilen möchte. Idee war, eine Anwendung zu schreiben, die auf wirklich kinderleichte Art das Üben mit der Tastatur ermöglicht. Es wird einfach nur ein Buchstabe auf dem Bildschirm angezeigt, wenn man den entsprechenden Buchstaben drückt ertönt ein Geräusch und der nächste Buchstabe wird angezeigt. Wenn man irgendeine andere Taste drückt, passiert nichts. Das ganze lässt sich mit wenigen Tasten Javascript implementieren, wobei ich mich auf zwei Bibliotheken gestützt habe, was bei so einem Min-Projekt wohl gar nicht nötig gewesen wäre:

  • Das unvermeidliche JQuery, um etwas einfacheren Code für den Zugriff auf Elemente des DOM verwenden zu können
  • Timbre.js, eine JavaScript Bibliothek zum programmatischen Erzeugen von Sounds, um einfach nur das Piepen nach jedem Anschlag zu erzeugen.

Verlinkt habe ich das auch: Tastaturspiel gleich ausprobieren, oder zum Download.

tastatur_spiel

SQL: Changing type of a column while keeping the contents (Oracle)

At work we just needed to change the data type of a column which already contained data. In such a case, a simple alter table statement would not work, because the type can not be changed on non-empty columns. (ORA-01439: column to be modified must be empty to change datatype)

You can achieve this with the following series of statements. In my case, the type of the id column should be changed from int to string. For other datatypes, some more effort might be needed on step two, to get the data into the new column in the right format.

ALTER TABLE TABLE_NAME ADD ID_STR VARCHAR(20);
update TABLE_NAME set ID_STR = ID;

-- FIND OUT ABOUT possible constraints to delete:
-- SELECT * FROM DBA_CONSTRAINTS WHERE table_name = 'TABLE_NAME';
alter table TABLE_NAME drop constraint PK_TABLE_NAME;
alter table TABLE_NAME drop column ID;

alter table TABLE_NAME rename column ID_STR to ID;
-- recreate constraint if needed
alter table TABLE_NAME add CONSTRAINT "PK_TABLE_NAME" PRIMARY KEY (...) ENABLE;

Displaying My Runkeeper Tours in ArcGIS online

Copy & pasted from my submission in the Coursera-Course Maps and the Geospatial Revolution, which I do recommend. At the end of the course, each student has to create a map, which is then peer-reviewed by other students for the final grade. I probably will not get very good grades with this one, because I don’t show any interesting effects on this map, but I wasn’t going to just „throw away“ the work I did on it.

I have been tracking my jogging trips and occasionally the tours I do on my bicycle with the app „Runkeeper“ for a while. It is possible to see one tour at a time on a map from the app, but not all tours at once. I always wanted to get a sense of which places I’ve already „conquered“ surrounding my home and which were still unexplored:-) So I seized the opportunity to finally export the data from Runkeeper and Import it into ArcGis online.

Technical Details

When exporting from Runkeeper, each tour is saved as one GPX-file. I am too lazy to spend one hour to upload each file individually, so I took 3 hours to write some code to automate parts of it. I wrote a program in Java which allows to select a set of GPX-input files and creates one big output file from it. To keep the number of individual points low, I added an option to only keep every Nth data point (coordinate) of one tour. For the posted example, only one point in 50 was kept.

Even with reducing the amount of points, the feature-limit of 1000 in ArcGis Online was still easily broken. Therefore, I added another limitation and only kept the cycling tours, removing all „running“ and „other“. Now I was able to import into ArcGis online.

The source code for the program is hosted on github: https://github.com/panschk/gpxmerge

I finally had some stupid manual effort when coloring the different tours. In the beginning, each one was displayed as a brown line, I had to manally assign a color to each tour. At least the result now looks quite colorful:)

http://bit.ly/16UsDQZ

Story

Quity simply, this map shows the different cycling tours completed by me in 2013 and the end of 2012. For me personally, this is quite interesting, and maybe also to some of my friends, so this would be my audience.

Häufigste madagassische Wörter

Seit über drei Jahren bin ich jetzt schon prinzipiell daran interessiert, madagassich zu lernen. Phasenweise habe ich dann auch mal wirklich Anstalten gemacht, Vokabeln und einfache Satzstrukturen zu lernen, aber immer schnell wieder andere Sachen wichtiger, dringender, spannender gefunden. Leider gibt es auch nicht besonders viele Resourcen, die einem dabei behilflich sein könnten. So habe ich etwa wirklich noch keinen einzigen madagassischen Podcast gefunden und Google Translate kann Malaysisch, Maltesisch und Mazedonisch, aber (noch) kein Madagassisch. Einige Online-Wörterbücher gibt es immerhin doch: Monde Malgache, Mada Dictionaire.
garten_mada
Einige typische „Einsteigervokabeln“ wie Hallo, Tschüß, Danke und Kartoffel habe ich bereits gelernt, aber das reicht noch lange nicht, um einen unbekannten Text lesend zu verstehen (Hören ist nochmal sehr viel schwerer für mich). Damit ich zum Beispiel Artikel in der madagassichen Wikipedia unter Zuhilfenahme eines Wörterbuchs bewältigen kann, müsste ich wenigstens die häufigsten Wörter kennen, damit ich nicht jedes Wort nachschlagen muss. Welches sind denn nun die häufigsten Wörter? Für andere Sprachen, wie Englisch oder Deutsch ist eine solche Liste schnell gefunden. Für die madagassische Sprache war so etwas nicht auffindbar – Lediglich eine Liste der Häufigkeit der Buchstaben konnte ich ausfindig machen.

Also – wenn es so etwas scheinbar noch nicht gibt, muss ich die Liste wohl selbst aufstellen. Dabei halte ich es erstmal einfach; Verben in verschiedenen Zeitformen oder Hauptwörter in Plural und Singular werden nicht zusammengefasst, zusammengesetzte Wörter nicht in ihre Einzelteile zerlegt usw. Wo ein Leerzeichen oder ein Satzzeichen (.;!?) auftritt, ist das Wort zuende und es beginnt das nächste. Solange diese einfachen Regeln gelten, kann (fast) jeder Informatik-Student im ersten Semester eine Liste der häufigsten Wörter für einen gegebenen Text aufstellen. Ob diese Vereinfachung halbwegs akzeptabel ist, werde ich Tahina bei Gelegenheit mal fragen;-)

Stellt sich die Frage – Welchen Input sollte für die Analyse verwendet werden? Ich dachte zuerst an die madagassischsprachige Wikipedia, aber das Lernen der API zum „scrapen“ der Inhalte wäre nochmal ein Projekt für sich, dass ich vielleicht zu einem späteren Zeitpunkt nochmal angehe. Vorerst suchte ich nach einem Text, den ich ohne größeren Aufwand in mein Programm „hineinwerfen“ kann. Hier bin ich (zumindest vorerst) bei der madagassischen Bibelübersetzung von 1865 gelandet – weder aktuell noch unbedingt repräsentativ für die Alltagssprache, aber immerhin vom Umfang schonmal interessant. Wenn die Ergebnisse wirklich repräsentativ sein sollten, bräuchte ich natürlich deutlich aktuellere und thematisch breiter gestreute Texte.

Trotzdem: Besser als nichts. Es folgen die 100 häufigsten Wörter aus der madagassischen Bibel. Da ich mich entschieden habe, Idiome, die mit Apostroph oder Bindestrich zusammengehalten werden als ein Wort zu betrachten, tauchen auch einige davon in der Liste auf.

Platzierung Wort Vorkommen Übersetzung
1 ny 53992 der/die/das
2 ary 25139 und; also
3 dia 22759 und; dann
4 sy 13975 und (Aufzählung)
5 amin’ny 13678 zum/zur
6 ho 12727 werden
7 ka 12260 aber;und;deshalb
8 izy 11324 er/sie/es
9 fa 10722 aber; dass; weil
10 tsy 10614 nicht
11 izay 10614 der/die/das
12 no 10514 Hilfswort in Fragen
13 na 7486 oder
14 jehovah 7027 Gott (?)
15 azy 6717 ihn/ihm/sein/ihr
16 rehetra 6342 alles/alles
17 izany 5655 der/die/das
18 tany 5355 Feld; Erde
19 tamin’ny 4936 zum/zur
20 hoe 4312 also
21 efa 3948 abgeschlossen
22 koa 3757 auch
23 avy 3623 kommen
24 eo 3619 hier
25 teo 3543 da
26 raha 3521 als/wenn/falls
27 any 3514 dort
28 aho 3446 ich
29 hoy 3434 direkte Rede „er sagt“
30 an’i 3245 zugehörig
31 olona 3057 Mensch; Jemand
32 mba 3042 so dass
33 nanao 2833 machen (Vergangenheitsform)
34 ao 2799 dort
35 izao 2410 jetzt; dieser („this“)
36 ireo 2325
37 aza 2317
38 ianao 2303
39 tao 2275
40 andro 2203
41 ahy 2167
42 noho 2155
43 ianareo 2085
44 taminy 1936
45 anao 1914
46 ihany 1891
47 sady 1884
48 isiraely 1811
49 araka 1778
50 mpanjaka 1756
51 misy 1749
52 tahaka 1739
53 eny 1676
54 aminy 1662
55 tonga 1590
56 kosa 1563
57 teny 1522
58 nisy 1491
59 aoka 1481
60 tamin’i 1451
61 zanak’i 1391
62 izaho 1340
63 toy 1317
64 va 1306
65 rehefa 1304
66 zavatra 1296
67 iray 1270
68 ry 1259
69 jesosy 1257
70 nefa 1255
71 roa 1225
72 indro 1208
73 davida 1197
74 anareo 1187
75 tsara 1181
76 mbola 1156
77 ilay 1151
78 satria 1115
79 amin’i 1091
80 ratsy 1076
81 an’ny 1057
82 fanatitra 1053
83 chapitre 1034
84 tan 1012
85 firenena 979
86 ity 969
87 aminao 959
88 maro 957
89 nony 934
90 lehilahy 921
91 manao 918
92 samy 915
93 aminareo 915
94 taranak’i 900
95 marina 895
96 mosesy 877
97 masina 875
98 joda 867
99 jerosalema 859
100 fanahy 841

Der nächste Schritt ist jetzt wohl, sich auch um die Übersetzung für die Wörter zu bemühen, sonst ist das ganze natürlich nicht viel Wert. Aber für heute mache ich erstmal Schluss;-)

Terra Map Quiz im Google Play Store

Ich habe meine erste App für Android programmiert und im Google Play Store veröffentlicht.

Der Name ist „Terra Map Quiz“ und es handelt sich um ein „Geo-Quiz“, bei dem man durch Klicken auf die richtigen Punkte auf der Karte die verschiedenen Länder und Städte der Erde erraten muss. Das Prinzip ist inspiriert von „Kennst Du deine Erde“, das meine Brüder und ich in unserer Kindheit auf dem 2/86 meines Vaters gerne gespielt haben.

Ich werde später vielleicht noch mehr dazu schreiben, aber vorerst muss der Link zur App genügen:

https://play.google.com/store/apps/details?id=de.panschk.mapquiz

Bilder mit Irfanview bearbeiten (Batch Resize)

Fast jeder, der schon mal Fotos mit einer Digitalkamera gemacht hat, kennt das: Die Dateien sind in der Regel für Facebook oder eine schnelle Mail überdimensioniert, denn in vielen Fällen braucht man keine 8 Megapixel, wenn gerade mal eine halbe Million Pixel auf dem Monitor dargestellt werden können. Es gibt natürlich diverse Programme und Methoden, die Bilder auf eine angemessene Größe herunterzurechnen, aber ich benutze seit Panschkgedenken, Irfanview für diesen Zweck. Irfanview ist ein mächtiges, aber leicht bedienbares und vor allem schnelles und anspruchloses Bildbearbeitungsprogramm, die man kostenlos im Internet herunterladen kann. Für nicht-kommerzielle Zwecke ist die Software kostenlos und ohne Einschränkungen nutzbar.

Ich war überrascht, dass ich keinen einfachen und bebilderten Artikel zu dem Thema „Batch Konvertierung“ auf deutsch finden konnte, also versuche ich mich mal selbst daran; Schritt für Schritt:

  1. Download: z.B. von Chip.de, und Installieren.
  2. Irfanview starten
  3. Optional: Sprache ändern. Optionen –> Einstellungen –> Sprache
  4. Datei –> Batch-Konvertierung
  5. Irfanview Menü

  6. Oben rechts navigiert man zu den Bildern die man umwandeln möchte, mit „Hinzufügen“ fügt man sie der Liste hinzu. Nur die Dateien in der Liste rechts unten werden letztendlich bearbeitet! Keine Sorge, die Originale der Dateien bleiben bestehen.
  7. dateiauswahl

  8. Auf der linken Seite sind Dateiformat und ähnliche Einstellungen zu wählen. Ich empfehle folgende Einstellungen:
    • Batch-Konvertierung+Umbenennen
    • Format für Fotos unbedingt JPG!
    • Optionen: JPG-Qualität von 80 bis 90%. Je höher die Qualität, desto größer natürlich die entstehenden Dateien.
    • Spezial-Optionen setzen, sonst kann man die Größe nicht ändern!
    • Der Einfachheit halber: Bei Zielverzeichnis „Aktuelles Verzeichnis wählen“
  9. erweiterte_optionen

  10. Bei der gewünschten Größe der neuen Bilder kommt es natürlich auf den Verwendungszweck an. Für das Facebook Fotoalbum sollten 800 Pixel Länge genügen (siehe Screenshot). Mit den Farben und der Ausrichtung kann man auch noch spielen, das halte ich aber in der Regel für nicht notwendig.
  11. Schließlich bleibt nur noch „Starten“ zu klicken und wenig später hat man die Bilder in deutlich Internet-freundlicherer Größe. Wenn man ein wenig Übung hat, sind die paar Klicks in wenigen Sekunden erledigt, und man spart sich viel Zeit beim Upload.

Warnung: Bei der Konvertierung gehen logischerweise viele Bildinformationen verloren. Wenn also noch beispielsweise noch Foto-Abzüge aus den Bildern gemacht werden sollen, sollte die Original-Datei unbedingt aufbewahrt werden.