Wieder in Bastellaune…

Heute bin ich irgendwie in Bastellaune. In Ermangelung von Hardware blieb es aber erstmal beim Durchstöbern von Onlineshops. Wie immer ging’s dabei hauptsächlich um das weite Anwendungsgebiet Quantified Self. Nach dem (immer noch nicht abgeschlossenen) Projekt “Pulsmesser” hab ich mir mal Gedanken gemacht, wie ich eine Lifelogging-Kamera bauen würde. Herausgekommen ist dabei diese kurze Liste:

Damit sollte es doch leicht möglich sein, eine selbstständige Kamera zu bauen, die alle 60s ein Bild aufnimmt und auf ein Speichermedium ablegt.

Ich muss nochmal ein wenig recherchieren, aber das klingt alles relativ simpel und man würde dann nicht mehr (wie z.B. bei Narrative) von einem gehosteten Dienst abhängen… muss ich mir mal durch den Kopf gehen lassen. Der Knackpunkt wäre dann natürlich die Batterielaufzeit. Und das Gehäuse – was auch beim Pulssensor die letzte Hürde für mich ist. Dazu fehlt mir noch der 3D-Drucker. 🙂

Ich bin auf dem 30c3.

Die nächsten Tage werde ich wieder im CCH beim 30. Chaos Communication Congress verbringen.


Adding Ghost to your init scripts

Yesterday I noticed that my blog was down – again. Judging from the output of the uptime command, my server restarted during the night and until now I started the Ghost process manually.

A quick search revealed the official installation manuals with a nice init.d script. Unfortunately the curl command in the manual is wrong, and I had to adapt it slightly:

curl https://raw.github.com/TryGhost/Ghost-Config/master/init.d/ghost -o /etc/init.d/ghost

I don’t know if there is an open issue for this yet, but I’ll check later to see if I can open a pull requests on the documentation.

Update I opened pull request 1701 to fix the curl command in the documentation.
Update 2 The pull request got merged and the german installation manual now shows the correct curl command. 🙂

Oh, and while you’re at it, enable GZIP compession in Ghost too.

Agile Developer Skills

Diese Woche bin ich bei it-agile und besuche den Workshop Agile Developer Skills. Der erste Tag gestern war schon sehr interessant, was hauptsächlich daran liegt, dass wir uns eher auf Test Driven Development konzentriert haben: Katas, Mini-Sprints mit echten Entwicklungsaufgaben, Coding Dojo am Abend.

Der Schulungsraum bei it-agile geht auf den Hafen raus, aber das Wetter war gestern so schlecht, dass man das andere Elbufer kaum gesehen hat…

Ich bin gespannt, wie es heute und morgen weiter geht. Die Tage werden allerdings etwas lang, da ich heute abend auch gleich zum Training weiterfahren möchte. Mal sehen, wie sich das morgen oder Donnerstag auf meine Konzentration auswirkt. 😉

Simple Fitbit API webapp example

Yesterday I decided to create a simple web application that demonstrates how to authorize with the Fitbit API and extract data from your account. You can see the result on my github repository. You can also download a runnable version of my webapp – all you need is Java.

Ok, now let’s get to the details. 🙂

First of all, I didn’t want any bloated framework to create a very simple example application, so I decided to use the Spark framework to build my web application. If you are familiar with frameworks like Sinatra or NodeJS you will feel at home. It’s a very basic framework, and you have to care only about the bare minimum to get a web application running. I’ll use a lot of Spark/Sinatra/Node-lingo now.

Here’s the main part of my application, the routes that are responsible for authorization with Fitbit, retrieving steps data and finally displaying the step count as a graph:

Please note that I left out the error handling and some other things for brevity. If you want to see the full code, go to my github repository.

The first route /login is responsible to create the redirect to the authorization page if no credentials are found for the current user. After authorization the user is redirected back to the application where she ends up in the /login route again, this time with valid authorization query parameters (if parameter completeAuthorization is found, Fitbit completed the authorization for the user successfully). I’m then storing the credentials in the Fitbit API client fitbit, putting the user and the client into the session and redirect to the route /steps.

The route /steps then makes a call to the Fitbit API and retrieve the steps for the last 7 days. The method loadData(...) uses the fitbit client to get a TimeSeries of TimeSeriesResourceType.STEPS for a period of TimePeriod.ONE_WEEK.

Then the route redirects to a freemarker template that uses Google Chart API and iterates over the time series data to create the javascript code to populate the graph:

If you have any questions, feel free to leave a comment or contact me on Google+.