WordPress Twenty Seventeen Theme – Autor bei Post anzeigen

Für ein neues Projekt (dazu später mehr) habe ich einen neuen WordPress Blog eingerichtet und dabei das Default-Theme „Twenty Seventeen“ beibehalten. Der Gesamteindruck des Themes ist gut, aber es hat mich gewaltig gestört, dass bei neuen Posts der Autor nicht angezeigt wird. Auf dem folgenden Weg konnte ich das beheben:

Dazu muss die folgende Datei bearbeitet werden:

wp-content/themes/twentyseventeen/template-parts/post/content.php

Dort muss an der richtigen Stelle der Funktionsaufruf the_author() hinzugefügt werden:

 if ( 'post' === get_post_type() ) :
   echo '<div class="entry-meta">';
     if ( is_single() ) :
       twentyseventeen_posted_on();
     else :
       echo twentyseventeen_time_link();
       twentyseventeen_edit_link();
     endif;
   echo " von ";
   the_author();
   echo '</div><!-- .entry-meta -->';
 endif;

So sieht das dann aus:

 

 

Nachtrag: Besser ist es wohl einfach, im CSS .byline {display: none} zu entfernen….

Audible Abo pausieren

Schon seit 2010 habe ich ein Audible.de Abo, dass ich seitdem auch immer gerne genutzt habe. Allerdings gibt es immer mehr und mehr gute Podcasts und kostenlose Hörbücher da draußen, so dass ich nicht mehr unbedingt 12 Hörbücher im Jahr kaufen und hören möchte. Unter „mein Konto“ gibt es lediglich die Option „Abo kündigen“. Wenn man da drauf klickt während man noch Guthaben hat, wird man darauf hingewiesen, dass dieses bei der Kündigung verfällt. Deswegen habe ich das Guthaben noch ausgegeben – ob das wirklich nötig war weiß ich jetzt auch nicht.

Man kann das Konto aber auch bis zu 3 Monate pausieren und in der Zeit natürlich auf seine Hörbücher normal zugreifen. Allerdings ist diese Option ziemlich versteckt:

  1. Zuerst auf Abo kündigen klicken
  2. Als Begründung: „Ich kann meine Hörbuch-Guthaben nicht so schnell verbrauchen“ angeben
  3. Dann muss man die Kündigung nochmal bestätigen, bevor man das Angebot zum Pausieren bekommt.
  4. Dann die Dauer auswählen und bestätigen

Ich übernehme natürlich nicht die Verantwortung für den Fall, dass Audible den Prozess irgendwann ändert. Schade, dass diese Option nicht transparenter gemacht wird.

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…

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.

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

Centralia und tote Männer

Podcasts sind ein wirklich größartiges Medium, und so suche ich immer wieder mal nach neuen interessanten, informativen oder lustigen Sendungen. Vor ein paar Tagen habe ich die Episode von Radiolab zum Thema Cities gehört. Der letzte Abschnitt der Episode beschäftigte sich mit dem Schicksal des Ortes Centralia, bis 1962 eine normale Kleinstadt von 2000 Einwohnern in Pennsylvania, USA. Dann jedoch entzündeten sich unterhalb der Stadt befindliche Kohlevorkommen, und brennen bis zum heutigen Tag.

Hin und wieder brach die Erde auf und Feuer und Rauch manifestierten sich an der Oberfläche. Verständlicherweise war es vielen Bewohnern nicht geheuer, nur wenige Meter über einem Großbrand zu wohnen, und so ist Centralia mittlerweile beinahe verlassen — etwa ein Dutzend lebende Bewohner halten noch die Stellung. Der Friedhof der Stadt wächst allerdings weiter, denn viele Ex-Centralianer kommen nach dem Tod an diesen Ort zurück. In Centralia gibt es also nur noch alte und tote Männer (und Frauen).

Centralia wafting

Als Kohlebrand bezeichnet man Erdbrände, die sich in einem Kohleflöz oder in umgelagerter Kohle entwickelt haben. Sie entstehen oft spontan, wenn die Kohle mit Luftsauerstoff in Berührung kommt.

Wikipedia: Kohlebrände

Der Luftsauerstoff kann mit der Kohle durch natürliche Begebenheiten in Verbindung kommen, häufig ermöglichen aber erst durch den Menschen geschaffen Bergbauschächte die Zufuhr von Sauerstoff. Deswegen ist natürlich das Ersticken des Feuers, also die Trennung von der Sauerstoffquelle, eine gute Methode, um den Brand zu löschen.

Häufig entstehen die Brände unter Tage in einem Alten Mann, in dem Restkohle zurückgelassen wurde.

Alter Mann/Toter Mann bezeichnet also ein nicht mehr genutztes Bergwerk – wieder was gelernt!

Im Saarland gibt es übringens einen Brennenden Berg. Vielleicht kann ich mir das irgendwann selbst mal ansehen…