Wo war ich im 2017

Anfangs Jahr ist ein guter Zeitpunkt, um aufs vergangene Jahr zurückzublicken. Das heisst, es gibt mal wieder ein paar nerdige Blogeinträge. Der Rest (wenn er dann kommt) ist unter dem Tag jahresrückblick17 zu finden.

Da ich erst Mitte 2017 herausgefunden habe, dass OpenPaths tot ist (die Daten können nicht mehr exportiert werden, auf Mails und Twitter-Nachrichten reagiert niemand), habe ich mich nach Alternativen umgesehen. Leider erst ab Juli, daher fehlen die Daten der ersten Jahreshälfte…
Nachdem Moves ausgeschieden ist, weil es zu Facebook gehört, und Arc ausgeschieden ist, weil die Batterielaufzeit des Telefons massiv verringert wurde, bin ich bei WHIB gelandet. Dank einem 2$-premium-Feature können alle aufgenommenen Daten als CSV exportiert werden, das macht es möglich, mit ein bisschen Python zu schauen, wo ich mich (in der zweiten Hälfte) 2017 rumgetrieben habe, als ich das Telefon dabei hatte.

Dazu brauchen wir ein paar Bibliotheken

import pandas
import matplotlib.pylab as plt
import seaborn
import folium

Laden wir mal das exportierte File in eine Pandas Tabelle

locations = pandas.read_csv('journey.csv')

Das sieht doch schon mal ganz gut aus, wir haben nämlich 6233 Datenpunkte.

locations.describe()
Crumb Latitude Longitude Altitude (in metres) Accuracy (in metres)
count 6233.000000 6233.000000 6233.000000 6233.000000 6233.000000
mean 3116.000000 46.932620 7.437850 533.149527 125.461736
std 1799.456446 0.067238 0.115774 159.792018 596.847400
min 0.000000 46.434918 7.026148 -43.000000 0.000000
25% 1558.000000 46.935265 7.417971 545.000000 47.000000
50% 3116.000000 46.937312 7.424690 555.000000 65.000000
75% 4674.000000 46.948112 7.433138 558.000000 70.000000
max 6232.000000 47.398817 8.577597 2003.000000 23964.000000

Mit etwas Hilfe von Folium können wir dann diese gut 6000 Datenpunkte auf einer schwarz-weissen Karte darstellen. Damit überhaupt ‘richtig’ etwas zu sehen ist, machen wir eine sogenannte Heatmap, dann ist das Ganze etwas übersichtlicher.

from folium.plugins import HeatMap
xy = [[row['Latitude'], row['Longitude']] for index, row in locations.iterrows()]
m = folium.Map(location=[locations['Latitude'].mean(),
                         locations['Longitude'].mean()], tiles='Stamen Toner', zoom_start=9)
folium.plugins.HeatMap(xy).add_to(m)
m

Schlussendlich sieht das dann so aus; da war ich überall in der zweiten Hälfte vom 2017. Rein- und rauszoomen ist erlaubt und erwünscht :)

Kommentare sind wohl wirklich tot

Dies ist der vierte und letzte meiner Jahresrückblick 2014-Posts. Die anderen sind unter dem Tag jahresrückblick14 zu finden.

Wie schon voremene Zitli nahm es mich letzthin wunder, wie’s denn heutzutage so mit den Kommentaren hier aussieht.

Dafür hab’ ich mein Skript zur Kommentar-Visualisierung ausgegraben, minimalst aufgehübscht und liess es über meine WordPress Datenbank laufen.

Wie früher auch schon klar ersichtlich, hat die Kommentar-Zahl sowohl die Posting-Zahl abgenommen. Die Posts haben sich in der Region von ca. anderthalb Posts pro Woche eingependelt, während seit ein paar Jahren ein Post von mir im Schnitt höchstens noch einen Kommentar generiert.

Aber wie schon das letzte Mal soll nicht unerwähnt bleiben, dass das hier ja mehr so ein halbwegs visuelles Tagebuch meiner coolen Erlebnisse ist und ich nicht auf die Kommentare angewiesen bin. Interessieren würde mich aber schon, wie das bei anderen (WordPress)-Bloggern aussieht. Wenn ihr einen solchen Plot macht, macht doch einen Kommentar oder Trackback hierhin, damit wir ein paar Datenpunkte mehr haben.

Jahresrückblick auf mich selbst

Das ist der dritte meiner Jahresrückblick 2014-Posts. Die anderen sind unter dem Tag jahresrückblick14 zu finden.

Im 2014 lernte ich Git lieben, hab’ viel Bildverarbeitung mit Python gemacht und gelernt, dass Gesichts-Erkennung mit OpenCV in ein paar Zeilen Code möglich ist.

Gesichtserkennung, mit Augen

Dazu kam, dass ich praktisch jeden Tag ein Selfie von mir machte, mit der Everyday App. Eigentlich wollte ich diese beiden Dinge verbinden, fand dann aber irgendwann im Herbst raus, dass ich nicht der erste bin, der daran gedacht hat [1]. Rob Lourens hat ein Python-Skript geschrieben, das Bilder nimmt, auf diesen Gesichter und Augen erkennt und die Bilder zueinander ausrichtet.
Mit minimalen Anpassungen liess ich das Skript über meine 339 Selfies aus 2014 laufen. Zusammengesetzt mit der Zeitraffer-App mit 1 Woche pro Sekunde kommt schlussendlich dieses Video hier raus.

Knapp die Hälfte der Tage dachte ich daran beim Arbeitsschluss im Treppenhaus ein Foto zu machen [2]. Dadurch ist der Hintergrund und die Beleuchtung in diesen Bildern etwas konstanter, was das Ganze etwas schöner zum anschauen macht. Dieser Film ist so zusammengesetzt, dass eine Arbeitswoche einer Sekunde entspricht.

Wer die beiden Videos genau anschaut, sieht, dass ich im 2014 5 Mal die Haare und 18 Mal den Bart geschnitten habe. Und diesen Pickel an der Backe nur mit Bildbearbeitung los geworden bin, aber das ist ein guter Vorsatz im neuen Jahr :)
Und, weil’s grad so gäbig geht, und chli zu Rumänien passt. So seh’ ich aus, wenn mensch den Durchschnitt aus allen 339 ausgerichteten Bildern macht. Habis durchschnittliches Gesicht im 2014.

Habis average face for 2014

[1]: Ich sag’ immer: Es gibt fast nichts, das nicht schon jemand mal auch schon als Problem hatte, das schwierige daran ist nur, die Lösung trotzdem herauszufinden.
[2]: Oder war auswärts am arbeiten. Oder nicht am arbeiten.

Das Mitmach-Web ist tot!

Vor fast zwei Jahren haben das Thema schon mal diskutiert; und befunden dass bei verschiedenen Blogs bei den Kommentaren die Peaks überschritten sind.

Letzthin fiel mir ein, dass ich das doch mal wieder anschauen wollte, ob sich daran etwas geändert hat. Nach kurzer Analyse komm ich zur Aussage, dass das Mitmach-Web tot ist, jedenfalls aus meiner Sicht. Auf meinem Blog hier hab’ ich den letzten drei Jahren Kommentarzustände wie 2006, also im Schnitt ca. anderthalb Kommentare pro Eintrag.
Dafür kann es mehrere Gründe geben, der offensichtlichste ist, dass das was ich schreibe generell wenig Reaktionen hervorruft. Ein anderer Grund ist, dass sich kein Schwein für das interessiert, was ich schreibe. Oder dass generell nicht mehr so kommentiert wird, wie vor einigen Jahren.

Das tönt jetzt etwas griesgrämig, ist aber nicht wertend gemeint. Wenn ich das, was ich hier mache nur machen würde, um Rückmeldungen abzuholen, bin ich sowieso auf der falschen Schiene. Das Blog hier dient schon über 10 Jahren (jawoll) als öffentliches Tagebuch, zum festhalten von Eindrücken und Dingen, die mich bewegen.

Und schliesslich sind Blogs nur noch für 40-jährige mit Kindern, wie Herr Kottke letzthin schrieb. Beide Eigenschaften treffen (noch) nicht wirklich auf mich zu, ihr wisst aber schon, worauf ich raus will.

Langer Rede kurzer Sinn; ich hab’ mich mal wieder hinter die Tastatur geklemmt und versucht, ein kleines Skript zu schreiben, welches mir die Arbeit abnimmt, die Aussagen aus der Datenbank zu knübeln, damit ich das Gegreine oben mit Zahlen belegen kann.

Ich hab’ das Skript von vor zwei Jahren etwas ausgebaut, so dass das Datenbank-Gepfriemel und die Anzeige in einem Rutsch gehen. Und zwar so.

Dank MySQL Connector/Python wird die Datenbank von WordPress direkt angezapft, mit optparse werden dem Skript ein paar Vorgaben (Server, Datenbank, Username und Passwort) dazu übergeben.

Die Datenbank-Abfrage (ursprünglich von Herr Leu) wird direkt übergeben.

Anschliessend wird mit den abgefragten Daten etwas jongliert und diese dann ausgegeben,

Und schlussendlich wird mit matplotlib das ganze visuell dargestellt und als Bild gespeichert, Dank iWantHue in einer optimalen Farbkombination.
.

Wer das ganze für sich selber auch anschauen möchte, sei herzlichst eingeladen, das Skript hier herunterzuladen und im Terminal zu starten. Ohne Parameter gibt’s mal eine Hilfe, ich verrate schon, dass mensch die Angaben wie Server, Datenbank-Name, -User und -Passwort bereithalten sollte. Wenn du das grad nicht mehr weisst, findest du diese Angaben in deiner wp-config.php-Datei.

Issues und Pull Requests sind herzlich willkommen, genauso wie Kommentare mit den Bildern von euch.

habi_gna_ch.png

Wohin gehen all die Kommentare, visualisiert

Herr Leu hat letzthin davon geschrieben, dass das Kommentar-Volumen auf seinem Blog in der letzten Zeit ziemlich abgenommen hat, während die Reaktionen auf die Beiträge in anderen Kanälen stattfinden.

Dies ist mir auch schon lange aufgefallen, ich konnte es aber nicht wirklich mit Zahlen belegen. Da Herr Leu auch grad noch eine handliche MySQL-Abfrage zur Abfrage der Zahlen mitlieferte, hab’ ich mir mit Sequel Pro die Zahlen aus meiner Blog-Datenbank geholt.

Für mich sieht das Resultat der obigen Abfrage so aus:

Year Count Average
2003 157 0.3057
2004 316 0.6108
2005 197 1.2589
2006 144 1.4375
2007 140 2.8143
2008 146 2.5685
2009 93 3.7419
2010 90 3.1333
2011 73 1.3973
2012 17 0.4706

Ein Peak im Jahr 2009 ist klar erkennbar, danach sinken die Kommentarzahlen absolut und im Durchschnitt. Da ich aber der visuelle Mensch bin, hab’ ich mir gedacht, dass sich diese Zahlen (genau wie bei Herr Leu übrigens) doch in eine schöne Grafik verpacken lassen sollten.

Deshalb hab’ meinen Lieblingseditor gestartet und untenstehendes Python-Skript geschrieben. Das Skript liest die Zahlen aus einem Text-File und stellt die durchschnittlichen Kommentare normiert als Plot über die Jahre dar. Das einlesen aus einem Text-File hab’ ich gemacht, damit sich nicht nur meine Zahlen, sondern auch diejenige visualisieren lassen, welche andere in den Kommentaren bei Herr Leu angegeben haben.

#! /opt/local/bin/python

import optparse
from pylab import *

# Use Pythons Optionparser to define and read the options, and also
# give some help to the user
parser = optparse.OptionParser()
usage = "usage: %prog [options] arg"
parser.add_option('-n', dest='Name', metavar='Fridolin')
(options, args) = parser.parse_args()

# show the help if no parameters are given
if options.Name==None:
	parser.print_help()
	print ''
	print 'Example:'
	print 'The command reads the comment from "comments_sepp.txt"'
	print 'and plots them nicely.'
	print ''
	print 'comments.py -n sepp'
	print ''
	sys.exit(1)
print ''

Data = genfromtxt('comments_' + str(options.Name) + '.txt',skip_header=True)

MaxAverage = 0
for line in Data[:,2]:
	MaxAverage = max(MaxAverage,line)

ax = plt.subplot(111)
ax.plot(Data[:,0],Data[:,2]/MaxAverage)
ax.axis([2003,2012,0,1])
ax.xaxis.set_major_formatter(FormatStrFormatter('%d'))
title('Normalized comments for ' + str(options.Name))
savefig(str(options.Name) + '.png')

Als ich das kleine Skript mit den angegebenen Zahlen laufen liess, entstehen untenstehende Plots. Schön ist zu sehen, dass der Kommentarhöhepunkt bei allen (Markus, Robert, Roger, Manuel [1] und mir) teilweise deutlich überschritten scheint. Ich persönlich bewege mich nicht (mehr) auf Twitter und Facebook, erhalte also auch von dort keine Rückmeldungen.

habi.png markus.png robert.png roger.png sprain.png


Um’s genau wie Herr Leu zu sagen: Auch wenn ich das ganze als Python-Fingerübung benutzt habe, wünsche ich mir mehr Kommentare hier, auch – oder gerade wenn – ein Beitrag nicht gefällt, oder du eine andere Meinung hast.

[1]: der mich übrigens mit dem “wenn auch auf tieferem Niveau” in seinem Kommentar drüben bei Herr Leu dazu gebracht hat, die durchschnittlichen Kommentare zu normalisieren.

mit freier software freie software-daten visualisieren [update]

seit einen halben jahr beantworte ich die frage “what’s up?” nicht bei twitter, sondern der quell-offenen alternative, bei identi.ca [1]. über die beweggründe, eine offene alternative zum fail whale zu benutzen soll hier nicht die rede sein [2].

in den letzten tagen hab’ ich mich gefragt, wie schnell identi.ca wächst. jedes status-update wird bei identi.ca als wachsende nummer, in der form http://identi.ca/notice/1 [3]. jede dieser nachrichten wird dann mit einer klar definierten zeit auf der webseite festgehalten. aufgrund der beiden parameter nummer und zeit könnte schon ein kleiner graph entstehen.

da es mir aber äusserst mühsam erschien, genug status updates anzusurfen, die jeweiligen zeiten aufzuschreiben, dies in eine excel-tabelle [4] einzutragen und dann einen plot zu generieren, habe ich mich nach kurzer überlegung entschieden, das ganze anders anzugehen: mit einem kleinen python-skript (siehe hier) lade ich eine definierte nummer von sogenannten dents, mache eine kleine aufhübschung mit ein bisschen text-ersetzung und schreibe das ganze in ein komma-separiertes textfile.

in diesem textfile landen alle parameter, die für einen plot notwendig sind. nach weitere kleinerer rumbastelei landet das ganze in 23 zeilen LaTeX-code (siehe hier), mit dem dann mit der hilfe von tikz und pgfplots untenstehende graphik entsteht [5]. die rumbastelei hat vor allem mit der anpassung von zeitspannen zu tun, damit’s ein schöner plot wird.

dents.png

im ganzen plot sind nur 55 datenpunkte verwurstet, aber nichtsdestotrotz kann mann einen eher exponentiellen anstieg der anzahl nachrichten in den ersten 300 tage identi.ca feststellen. damit der plot aussagekräftiger wird, muss ich mein python-skript mal etwas länger laufen lassen, oder jemand interessiert sich wirklich so fest dafür, dass er es mit meiner vorlage weiterführt oder verbessert.

dieser post soll auch dazu dienen, dass ich – nach dem blgmndybrn special im musigbistrot – grad noch bastian einen richtigen hinweis auf identi.ca und LaTex geben kann: bastian, identi.ca ist oben abgehandelt, meine code-schnipsel zu LaTeX landen hier, diejenigen zur bildverarbeitung mit imagemagick hier. weiter wollte this noch auf das schöne paket hingewiesen werden, mit dem mann – mit 23 zeilen code – solche plots wie oben stehend generieren kann. eben, pgfplots und mein beispiel an LaTeX-code.
also, wenn ich für die ausrechnung der tage seit dem start nicht doch gestern abend numbers verwendet hätte, würde auch der titel dieses eintrages stimmen, mit python habe ich die frei verfügbaren daten von identi.ca geladen, in ein text-file geschrieben und mit dem übermächtigen LaTeX daraus ein kleines, aber feines pdf erstellt.
und ja, ich geb’s zu, ich bin ein nerd!

[1]: seit längerer zeit wird auch mein status beim moloch facebook von identi.ca aus aktualisiert

[2]: “my data”, “my content”, portabilität, freie meinungsäusserung, etc.

[3]: hier das erste status-update von evan, dem kopf hinter dem ganzen

[4]: oder numbers

[5]: natürlich als pdf, hier der einfachheit halber als .png-bild

ps: fast noch schöner sieht’s mit logarithmischer y-achse aus; dieser plot wurde mit der leicht modifizierten version des latex-codes (hier zu finden) erstellt.

logdents.png

update: tobias diekershoff hat heute ein viel schöneres skript und eine viel fundiertere aussage über die anzahl dents veröffentlicht. falls es jemand interessiert: hier weiterlesen!