Table of contents

Terraduino Bugfix

Ich steuere ja mein Terrarium mit einem Eigenbau-Controller, dem TerraDuino. Der hatte immer das Problem, dass er ab und zu ausgefallen ist. Oder in der Früh sind die Lichter nicht angegangen. Sehr zum Frust des Lichts meines Lebens.

Nun hat sich herausgestellt, dass ich einen Bug in meinem Code hatte. Und zwar wegen der millis() Funktion der Arduino Platform. Der Fehler wird u.a. hier ganz gut beschrieben. Im Grunde hatte ich sogar mehrere Probleme:

Ich benutze den Rückgabewert von millis() (der die Millisekunden seit dem letzten reset zurückgibt), um in den verschiedenen Schedulerfunktionen zu schauen, ob sie loslaufen sollen. Dazu merke ich mir den letzten Wert von millis(), bilde dann die Differenz und wenn die grösser als der vorgegebene Timerintervall ist, geht er in die Funktion.

Der erste Fehler war, dass ich den Wert in einem signed long gespeichert habe. millis() gibt aber einen unsigned long Wert zurück. Wie man bei Arduino nachlesen kann, passt in den Wert die Zeit von knapp 50 Tagen, danach kommt es zu einem rollover, d.h. es fängt wieder bei Null an. Aber nicht bei mir. Da meine Variable ein signed long war, sprang er bei mir folglich schon nach der Hälfte der Zeit in den negativen Bereich, anstatt wieder bei Null anzufangen.

Das zum Einen. Dann hatte ich - da mir der Rollover bekannt war - extra eine Abfrage eingebaut und meine Variable auf 0 gesetzt, sobald der Rückgabewert von millis() kleiner als der letzte war. Da die Variable aber mit negativen Werten gefüllt war, hätte es 25 Tage gebraucht, bis er wieder in den positiven Bereich gekommen wäre. Und in der Zeit hat er nicht geschaltet.

Zum anderen war die Variable für den Intervall ein Integer. Auf der Arduinoseite steht sogar recht deutlich, dass man Berechnungen mit dem Rückgabewert von millis() nicht mit Integers machen soll, weil das sonst unvorhersehbare Ergebnisse haben kann. Ich denke in meinem Fall ist er auch ab und zu gecrashed. Da bin ich mir aber nicht sicher, weil ich eigentlich auch den Watchdogtimer verwende, der - wenn der Code hängt - nicht mehr resettet würde und eigentlich zu einem Reboot führen müsste. Tat er aber nicht. Entweder sind die Lichter nicht angegangen oder sie sind ausgegangen. Und zwar während der Controller noch lief (er hat eine Kontroll-LED, die durch die Software eingeschaltet wird, die müsste aus sein, wenn er wirklich tot wäre, war sie aber nie).

Nun, jetzt habe ich also sämtliche an den Timerberechnungen beteiligten Variablen auf unsigned long umgestellt und ich habe die Abfrage, ob der Rollover stattfand, entfernt. Der Gag ist nämlich, dass der Prozessor automatisch ein temporäres Bit an die Variable anhängt, wenn das Rechenergebnis nicht in die Variable passt (siehe Forumthread, den ich oben verlinkt habe). Dadurch kriegt man immer das richtige Ergebnis und muss sich um den Rollover gar nicht kümmern!

Das einzige, was ich noch nicht verstanden habe, warum der Compiler meinen alten Code klaglos compiliert hat, in dem ich eine Berechnung mit einem Integer und einem signed long gemacht habe. Hätte er mich ja drauf hinweisen können.

Gestern abend hab ich den Controller also upgedated, als die Barties schliefen und die Lichter aus waren. Nun wollen wir mal sehen, ob's das wirklich war.

↷ 22.07.2012 🠶 #terrarium

rcsedit commandline Editor für PodWiki

Hier möchte ich mal ein kleines Scriptchen vorstellen, mit dem man Wikiseiten für PodWiki auf der Commandline erstellen und bearbeiten kann. Das ist manchmal recht praktisch, man muss nicht im Webinterface rumgurken. Und es hat den Vorteil, dass man auf diese Weise auch mal ein Porno Wiki während der Arbeitszeit bearbeiten kann (nicht, dass ich sowas tun würde *g*). Sozusagen der NSFW compatibility layer von PodWiki.

Also hier ist das Script:

#!/bin/sh

page=$1
me=`whoami`
www="www"

if test -z "$page"; then
        echo "Usage: $0 <page>"
        exit 1
fi

if ! test -e "$page"; then
        touch "$page"
        ci -t$page -minitial-checkin "$page"
        co "$page"
fi

meta=`md5 -q $page`
sudo chown $me "$page" "${page},v"

echo n | co -l "$page"
vi $page
newmeta=`md5 -q $page`
if test "$meta" = "$newmeta"; then
        echo "$page hasn't changed"
else
        ci -t-$page -mChangedByShellUser $page
fi
co -f $page
sudo chown www "$page" "${page},v"

Die Variable $www in der 5ten Zeile muss man womöglich seinen Gegebenheiten anpassen.

↷ 20.07.2012 🠶 #source

Amateur Wetter Seite?

Ich hatte neulich mal so eine Seite gefunden, die von Funkamateuren betrieben wurde mit umfangreichen Wetterdaten. Da gab es Regenprognosen und vieles mehr, mit Quelldaten direkt vor Ort.

Ich finde die Seite aber nicht mehr. Nun hab ich mich tot gegoogelt und geschaut, was mir andere Suchmaschinen zu dem Thema sagen. Also hab ich mal bei Blekko nach "Amateur Wetter Seite" gesucht (ein zugegeben infantiler Suchbegriff, aber was solls). Und was finde ich?

Sex Seiten! Ist das zu fassen? Wahrscheinlich, weil die Defaultsprache noch auf englisch stand und im englischen "wetter" feuchter bedeutet. Ganz grosses Kino.

Ach - und die Seite hab ich natürlich nicht wiedergefunden :(

2012-07-20 - amateur wetter seiten:

↷ 20.07.2012 🠶 #unfassbar

Visualisierung statistischer Daten (rrdtool)

Eher zufällig bin ich heute über dieses Blogposting über Descartes gestossen. Es handelt sich dabei um ein Dingens, mit dem man sich ein Dashboard von statistischen Graphen zusammenklicken kann. Die Graphen selbst werden dabei von einem Dingens namens Graphite erzeugt.

Also ich gebe ja zu, dass ich Graphite nicht kenne und wohl auch nie näher kennenlernen werde, weil ich überzeugter RRDTOOL Nutzer bin. Mir ist zwar klar, dass ich hier dem Effekt der kognitiven Dissonanz erliegen könnte, aber ich sehe irgendwie nicht so recht den Bedarf an einem Ersatz dafür.

Wie Christian Köhntopp schon festgehalten hat, ist das Erzeugen guter Graphen gar nicht so einfach und es gibt kaum ernstzunehmende Konkurrenz für RRDTOOl. Insbesondere im RZ-Betrieb mit oft hunderten Geräten und zig Graphen pro Gerät ist es unschlagbar.

Enter "Descartes". Im Grunde ist die Idee an sich ja nicht schlecht, sich selber ein Dashboard zusammenklicken zu können. Wünsche ich mir auch manchmal. Wenn ich mir jedoch die Beschreibung bei Github anschaue, kommt mir das Grausen. Es fängt damit an, dass es in Ruby geschrieben ist. Ich habe da Vorurteile. Und ich mag diese Vorurteile gegen Ruby. Ich liebe es geradezu, Ruby zu hassen :)

Naja, die Anleitung geht jedenfalls von einer Herokuinstallation aus - nichts für den RZ Betrieb. Und damit ist das schonmal eher unpraktisch. Man braucht Postgres UND Redis Datenbanken. Ja, Mehrzahl, laut Anleitung jedenfalls. Mir erschliesst sich zwar nicht wirklich, warum man nicht nur mehrere Datenbanken, sondern auch noch mehrere verschiedene braucht.

Unterm Strich gibt es das alles jedenfalls schon lange. Also so richtig lange. Es gab RRDTOOL Dashboards schon, als der Descartes-Autor noch im Kindersitz gesessen hat. Ich persönlich verwende gerne DRRAW. Wie das aussieht, was Drraw ausspuckt, siehe Grafik anbei. Und das schöne ist: man braucht Perl. Period. Sonst nix. Keine tausend dependencies (die z.b. Redis benötigt) oder irgendwelchen "Cloud" Krempel.

Nennt mich altmodisch. Meinetwegen. Aber das muss echt nicht.

2012-07-19 - sample drraw graph:

↷ 19.07.2012 🠶 #server

Note 1.3.12 Update

In Note war ein ziemlich übler Bug, der dazu geführt hat, dass beim Erstellen eines neuen Eintrags alte überschrieben wurden. Betroffen war nur das Backend NOTEDB::general, in welchem ich den Bug gefixt habe.

Neue Version gibts wie immer hier bei mir als erstes. Beim CPAN ist es hochgeladen, Distributoren und externe Maintainer werden (denke ich) demnächst nachziehen.

↷ 19.07.2012 🠶 #source