Arduino Adè :-)

Meine bisherigen Controllerprojekte habe ich immer mit Arduino gemacht. Ich bin damit zwar zufrieden, aber es ist doch etwas teuer. Vor allem deshalb, weil man den Arduino nachher irgendwo verbaut hat und somit nicht mehr für Experimente benutzen kann. Sehr schlecht.

So bin ich irgendwann auf AVR Controller gekommen. Eine Weile hab ich mit einem Attiny85 rumgespielt. Um den zu programmieren, hab ich mir den Diamex-USB-ISP besorgt und mir eine kleine Adapterplatine gebastelt. Das war schon ganz gut ... Aber! Ein Attiny85 macht nicht viel her, nur ein paar Pins, kein UART usw. Ich wollte also was grösseres, ein Attiny2313 musste her und ein Atmega168. Aber die haben viel mehr Pins und passen logischerweise nicht in meine Platine. Schöner Mist. Nun hätte ich mir noch eine Platine basteln können, und noch eine usw. Alles Kacke.

Zufällig habe ich myAVR entdeckt und mir die universelle Platine myMultiProg MK2 und den myMultiProg MK2 bestellt.

Und was soll ich sagen? Ich bin SOWAS von happy damit! Atmega draufgesteckt, USB Kabel rein, Port rausgesucht und ins Makefile eingetragen. "make upload" - und fertig!

Seeeehr genial. Ich bin von den Socken. Und hiermit hat sich das Thema Arduino für mich im Grunde erledigt. Ich kann zukünftig direkt mit AVR arbeiten. Und auf den Komfort muss ich nicht verzichten, ino sei Dank!

Ich hab mal mein Makefile samt bisserl Beispielcode hochgeladen. Das Makefile ist für FreeBSD, den Port sucht ein Script raus (ist dabei): Blinktest-Mega8-myAVR.








Ich bleibe bei Amazon Kunde, alles andere wäre Heuchelei

Amazon wird derzeit von allen Seiten heftig wegen der Arbeitsbedingungen in den Logistikzentren kritisiert. Während alle auf Amazon rumhacken, ist mir ein Detail aufgefallen, im oben verlinkten Artikel:

Rund 90 Prozent der Zeitarbeiter bei den Mitgliedsfirmen hätten einen unbefristeten Arbeitsvertrag, betonte Stolz. Der iGZ ist einer der Arbeitgeberverbände der Branche und vertritt nach eigenen Angaben rund 2.700 mittelständische Unternehmen.

Ist das so?

Die Wirklichkeit sieht anders aus. Mehrere Millionen Menschen in Deutschland arbeiten im Niedriglohnsektor zu ähnlichen oder schlechteren Bedingungen als die Leiharbeiter bei Amazon. Ein grosser Teil dieser Menschen verdient nicht genug Geld, um zu überleben und muss mit Hartz IV aufstocken.

Ein Bekannter von mir hat neulich so einen Job angenommen: befristet für 3 Monate bei einer Zeitfirma angestellt für 7,50 Euro die Stunde brutto. Die Zeitfirma verleiht ihn an einen Callcenterbetreiber, der widerum Callcenter für irgendwelche Unternehmen betreibt. Jetzt ist er krank geworden, der Vertrag wird nicht erneuert. Raus.

So oder ähnlich sieht der Alltag vieler Menschen in Deutschland heute aus. Die Kritik an Amazon an sich ist natürlich grundsätzlich nicht falsch. Der Fehler ist, dass Amazon aber lediglich die Möglichkeiten nutzt, die es in Deutschland hat. Gäbe es diese Möglichkeiten nicht, würden sie das auch nicht tun. Zu verdanken haben wir diesen Zustand unserer Regierung (und der davor), die den Arbeitsmarkt systematisch in Richtung chinesischer Verhältnisse umgebaut haben und damit 100 Jahre gewerkschaftliche Kämpfe zunichte gemacht haben.

Die Kritik hat der Regierung zu gelten und nicht einem einzelnen Unternehmen. Ein Unternehmen ist stets bestrebt die Kosten zu senken, und dabei reizt es die gesetzlichen Möglichkeiten aus soweit es geht. Nicht nur Amazon tut das. Auch die Telekom. Oder Zalando. Oder DHS. Oder Apple. Jedoch kommt niemand dieser Möchtegern-Protestler bei Facebook auf die Idee, bei denen auch zu kündigen. Ganz zu schweigen davon, ihre Kritik an die Regierung zu richten, die diesen unerträglichen Zustand überhaupt erst zugelassen hat. Oder an die Gewerkschaften, die sich haben korrumpieren und kaufen lassen.

Dieses ganze Gezeter gegen Amazon ist nichts weiter als stinkende, ignorante Heuchelei. Wollte irgendeiner von denen tatsächlich etwas ändern, würde er seinen Abgeordneten anschreiben, anders wählen und grundsätzlich sein Konsumverhalten ändern. Und das nervt mich schon ziemlich gewaltig.








Mal wieder die Endlers

Ja, die gibts auch noch :)

Bild: Endlers 1
Endlers 1 (Feb. 5, 2013, 9:03 p.m.)
[Tags: fische ] [Album: Aquarium ]
Bild: Endlers 2
Endlers 2 (Feb. 5, 2013, 9:03 p.m.)
[Tags: fische ] [Album: Aquarium ]







Quick monitoring script for commandline using google graph - Updated 18.10.2015 10:41

So, you need to setup a graph for something you maintain, for instance response time of a webserver, memory consumption of some process or open database handles. Fast.

You could use MRTG, if you've got it already running. But either way - to add a new graph there isn't really done fast. And what if you don't have MRTG? What about GNU Plot or Google Graph? Every tool like this needs handwork to be done before being able to produce usefull output. One needs more than the other.

Enter quickmon. This is a small script I wrote for the very purpose. It doesn't have any dependencies and therefore runs out-of-the-box. You supply it one or more shell commands and it generates a google graph page and a logfile where it maintains history. It is really not possible to create monitoring graphs any faster!

And as a plus, the tool itself doesn't require internet access. It can run anywhere, inside some protected DMZ or the like. Only the browser which is used to view the output page needs internet access to fetch the google graph JS-library. That's it.

So, first of all, grab a copy of the script from here.

Now, let's take a look at some examples:

quickmon.pl -n "google mx lookup responsetime" \
            -t "google millisecs" \
            -c "host -v -t MX google.com 8.8.8.8 | grep Received | awk '{print \$7}'" \
            -l

In this example we monitor the response time of googles nameserver (when asked for its mx-record) in milliseconds. As you can see, there's one -t and one matching -c parameter. -t tells us what we are actually monitoring and -c is the shell command to be executed. In this example we're using host -v which prints the responsetime of a query in milliseconds. We fetch this value using the grep + awk after the pipe. Here's the output:

Here's another example:

quickmon.pl -n "google webserver response" \
            -t "www.google.com" \
            -c "wget -4 -q -O /dev/null www.google.com" \
            -l

Note the difference to the previous one: we didn't put some grep + awk parser stuff into our shell command. If you do that, the script measures the time it takes to execute the command itself.

This is how it looks after some time:

How about having multiple items in a graph? No problem, you can pass multiple -t and -c parameters to the script. However, be careful to have always one -t for every -c. And: order matters.

quickmon.pl -n "webserver comparision" \
            -t "www.google.com"     -c "wget -4 -q -O /dev/null www.google.com" \
            -t "www.facebook.com"   -c "wget -4 -q -O /dev/null www.facebook.com" \
            -t "www.apple.com"      -c "wget -4 -q -O /dev/null www.apple.com" \
            -l

Ok, quite a long commandline. Watch the matching -t and -c parameters. And here's the output:

One last thing: You might have noticed the -l flag. If supplied, the script runs forever and executes the given commands once every second. That's enough for some quick graphing but sometimes you might need to create graphs for longer timescales, say some days or weeks. In such cases running once per second might be overkill. And executed this way, the script doesn't survive reboots. In such cases just add a cronjob, which executes the quickmon.pl script once every 5 minutes (or whatever you like) and leave the -l parameter. Example:

*/5 * * * * cd /home/user/tmp/ && /usr/local/bin/quickmon.pl -t "title" -c "command"

Beware the chdir call: quickmon.pl uses the current directory to write its logfile and the output page (index.html).

In case you want to take a look at a live sample, here you go: it is the webserver comparision described above, run every 5 minutes by cron.

Well. While this all might sound very cool, there's still one usecase where quickmon.pl could be too complicated. Let's recall: for every painted line in the output graph you have to provide a shell command which returns its value. What if you already have a source which returns such values all at once? Given the examples above it might look like we have to provide one -c parameter per value but each command has to split the same input source differently. That's odd. To say the least.

Take a look at this command output:

$ netstat -w 1 -I bge0 -q 1 
            input         (bge0)           output
   packets  errs idrops      bytes    packets  errs      bytes colls
         9     0     0        828          8     0       9108     0

We've entered the netstat command which printed some stats about a specific network interface. Wouldn't it be good to feed quickmon directly with that output? The good news is: it's possible! Here's a quickmon call which catches some of those values - in and out bytes - to generate a graph from it:

while :; do netstat -w 1 -I bge0 -q 1 | egrep -v "(input|packets)"; done \
     | quickmon.pl -t in-bytes -t out-bytes -p -n bge0 -f 3,6

There's a lot new stuff here, let's dig into it:

  • We're calling the netstat command inside an infinite while loop, because otherwise it doesn't print to stdout but to our controlling terminal (which quickmon doesn't catch). This is freebsd specific. Behavior maybe different on other OSes.
  • The egrep filters out the headings.
  • We provide only 2 titles using -t, because we catch only field #3 and #6 (count starts from 0) by using the -f option.
  • Option -p tells quickmon to watch a file. Since we didn't specify a filename, it uses STDIN, which is actually the output of our while loop.

And this is the output of the above after a while:

Nice, isn't it?

By default quickmon splits the input using whitespace. You might alter this behavior by supplying a different field-separator using the -F option.


Update 18.10.2015 10:41:

The script is now available on Github.

The switch -l now has an optional parameter, the time in seconds to wait between loops, a float (i.e. .1 or 2.5 would be legal)
Also, in pipe mode (-p) it's now possible to specify one title with a timestamp using format characters. So if your input file already contains a timestamp you can use that instead of generated ones.








Der kleine Sexismus

Ist ja allerorten heuer viel zum Thema #aufschrei zu lesen. Eben im Mikrocontrollerforum fiel mir der Spruch hier auf:

Kommentare sind was für Mädchen

Auf den ersten Blick nur eine unbedeutende Kleinigkeit. Aber wenn man genauer drüber nachdenkt, insbesondere dass man selbst hier und da mal solche Sprüche gebracht hat.

Bild: was für Mädchen
was für Mädchen (Feb. 1, 2013, 9:44 p.m.)
[Tags: ] [Album: Screencaps ]







Modemtöne - jemand hat eine schöne Seite für die Geschichtsbücher hinzugefügt

Jeder, der schon in den 90ern online war, kennt diesen Sound, den das analoge Modem damals gemacht hat. Man wusste zwar, dass sich da die 2 Modems "unterhalten" über irgendwelche Verbindungsparameter, aber was genau die da reden - keine Ahnung.

Oona Räisänen hat sich der Aufgabe angenommen, das ganze mal zu visualisieren. Und WIE ihr das gelungen ist, ich bin völlig von den Socken.

Das waren noch Zeiten, hach! Was waren wir frei! Keine faschistischen Innenminister, keine Datensammler, keine Abmahner. Was ich nicht alles mit diesem Sound assoziiere :)

Sehr schön - dort in den Kommentaren gefunden - ist auch ein Chat-Transscript so einer Modemsession, auf modern gestylt:

Modem A: hey babe, you dtmf?
Modem B: u know it
Modem A: what u up 4 2nite? wanna v.8?
Modem B: i wanna ack u like my daddy net2phone use 2 ack me
Modem A: um ok... v.8 then
Modem B: lol jk, u comin?
Modem A: brt just gotta turn off echo suppressors n cancellers
Modem B: ok i wait
Modem B: my pcm is so modulated
Modem A: lol rly? u think u can handle V.90/V.92?
Modem B: D/A?
Modem A: ...D?
Modem B: wtf no, im not into that
Modem A: lol jk we can do V.42 LAPM if u want im down 4 nething
Modem A: up to 3429 o/c
Modem A: u know i give as good as i get, ne way u want it, loud or soft, high or low, fast or slow, i got all the time in the world 4 u babe, my clock source is internal
Modem B: of course no 3429. and same 4 me. except i might lose track of time, lol
Modem B: and honey if u with me we gon be makin sum NOISE
Modem B: 6db at LEAST u know how i like it
Modem A: lol i hear ya, 3200 all nite long, the way u get me goin maybe we even go 2 4800 lol
Modem A: set ur pre-emphasis filter params n put on that 1920 hz carrier frequency i got u
Modem A: im here baby
[SCRAMBLED]

Ich bin jedenfalls völlig begeistert!








Unterschiedliche Django-Objekte nach gemeinsamen Kriterium sortieren

Dieses Blog läuft ja bekanntlich mit einer von mir selbst geschriebenen Django-App. Ich bin sehr zufrieden mit meinem Werk, aber eins hat mich immer gestört: wenn ich ein Update zu einem Posting geschrieben habe UND neue Bilder angehängt habe, wurden diese unzsammenhängend angezeigt (erst das Posting, dann alle Updates, dann alle Bilder). Wirklich doof.

Jetzt werden Bilder und Updates in zeitlicher Reihenfolge angezeigt, hier in Aktion zu bewundern.

Die Schwierigkeit dabei ist, dass es sich bei den Updates und Bildern um völlig verschiedene Objekte handelt, die - abgesehen davon, dass sie mit dem Posting verknüpft sind - nichts miteinander zu tun haben. Trotzdem kann ich beide nach einem gemeinsamen Kriterium, dem Erstellungsdatum, sortieren und in EINER for-Schleife anzeigen. Wie cool ist das denn?!

So guckt das im Django aus:

        def attachments(self):
                snippets = self.snippet_set.all()
                images   = self.image_set.all()
                both     = []
                both.extend(snippets)
                both.extend(images)
                both.sort(key=lambda x: x.date, reverse=False)
                return both

Der Trick dabei ist, sich eine Liste aus beiden Objektlisten zu erzeugen. Das muss man mit einer neuen Liste und extend() machen, weil das mit '+' nämlich nicht geht. Die Methode all() liefert nämlich keine Liste, sondern ein Queryset aus. Durch das both.extend() mache ich also aus 2 Querysets eines. Da beide Objekttypen das Attribute date haben, kann man dann danach sortieren.

Und so der entsprechende Teil im Template:

        {% for item in post.attachments %}
                {% if item.image %}
                        {% with image=item %}
                         ..
                        {% endwith %}
                {% else %}
                        {% with snippet=item %}
                        ..
                {% endif %}
         {% endfor %}

Um welche Art Objekt es sich jeweils handelt frage ich mit dem {% if item.image %} ab. Das geht, weil nur die Images bei mir das Attribut "image" haben und dieses ist immer befüllt (weil mandatory).

Hachmach...








Wie richtiger Datenschutz vor Willkür schützt - Updated 21.03.2013 20:11

Die Augsburger Allgemeine betreibt ein Forum, in dem Menschen Zeitungsartikel diskutieren können. In einem dieser Artikel ging es um das politische Wirken von Ordnungsreferent Volker Ullrich, das einer der Benutzer wie folgt kommentiert hatte:

Dieser Ullrich verbietet sogar erwachsenen Männern ihr Feierabendbier ab 20.00 Uhr, indem er geltendes Recht beugt und Betreiber massiv bedroht!

Aufgrund dieses Kommentars fühlte sich Ullrich beleidigt und in seiner Ehre verletzt, was in Deutschland - so traurig das sein mag - rechtlich verfolgbar ist. Er erstattete Anzeige und das Amtsgericht Augsburg beauftragte die Polizei mit einer Durchsuchung der Redaktionsräume um an die Daten des Nutzers zu kommen, die nachher die Daten freiwillig herausgerückt hatten. So weit, so bekannt.

Nun wird vielerorts darauf hingewiesen, dass keineswegs der Politiker Ullrich einen Fehler gemacht hätte, indem er die Sache zur Anzeige gebracht hat, sondern das Amtsgericht Augsburg, das aufgrund dieser Anzeige eine Durchsuchung bei einem verfassungsrechtlich geschützen Organ in die Wege geleitet hatte.

Diese Ansicht ist in zweierlei Hinsicht falsch. Erstens ist es tatsächlich Ulrichs Anzeige, die den Stein ins Rollen brachte. Insofern ist er als der Verursacher einer Willkürjustiz zu betrachten. Er mag formaljuristisch im Recht gewesen sein (d.h. die Anzeige zu erstatten! Ob die Anzeige gerechtfertigt war, darf zu bezweifeln sein). Er hätte, als Person des öffentlichen Interesses, aber auch einfach auf eine Verfolgung verzichten können. Ein Schaden wäre ihm nicht entstanden. Niemand hätte von dem Forenbeitrag überhaupt Notiz genommen. Andererseits ist es auch nicht der Fehler des Amtsgerichts Augsburg, das den Durchsuchungsbeschluss ausgestellt hatte. Denn auch dies geschah im Rahmen geltenden Rechts. Hinzu kommt, dass wir in Deutschland bekanntermaßen keine unabhängige Justiz haben, sondern dass diese weisungsgebunden handelt. Diese Weisungen erhält die Justiz bei uns von der Exekutive, deren Mitglied Ullrich ist. Dieser Zustand ist für eine Demokratie zwar eine völlige Katastrophe, aber es ist eben so. Und insofern kann man einem Amtsgericht auch nicht dahingehend Vorwürfe machen.

Der eigentliche Adressat von Vorwürfen sollte die Augsburger Allgemeine sein. Der Fehler, den das Blatt gemacht hat, ist sehr einfach zu beschreiben: Verletzung des Datenschutzes. Wenn man als Presseorgan ein öffentliches Forum betreibt und den Benutzern nicht die Verwendung ihres Klarnamens vorschreibt, dann hat dieses Presseorgan auch dafür zu sorgen, dass das tatsächlich der Fall ist. Konkret heisst das, dass in einem solchen Setup keine IP-Adressen der Forenbenutzer geloggt werden dürfen, keine Emailadressen oder sonstige Daten, die ein Forenposting mit einer real existierenden Person in Verbindung bringen könnten. Davon abgesehen, ist es der Zeitung ohnehin verboten, solcherlei Daten aufzuzeichnen, da diese für die Zeitung nicht abrechnungsrelevant sind.

Hätte sich die Augsburger Allgemeine an diese einfachen Grundsätze gehalten, wäre sie gar nicht erst in die Lage geraten, die Daten eines Forennutzers an die Polizei herausgeben zu müssen, um eine Redaktionsdurchsuchung zu vermeiden.  Vielmehr hätte sie die Herausgabe der Daten weiter verweigern können unter Verweis auf die öffentlichen Datenschutzrichtlinien. Hätte das Amtsgericht dann trotzdem auf einer Durchsuchung bestanden, um Daten zu finden, die es gar nicht gibt, DANN wäre das nicht nur Rechtsbeugung, sondern Rechtsbruch gewesen und die Zeitung hätte in jedem Fall sämtliche nachfolgenden Prozesse gegen das AG Augsburg und Ullrich mit Pauken und Trompeten gewonnen. Sie hätte als leuchtendes Beispiel für die Verteidigung der Pressefreiheit und Meinungsfreiheit dastehen können.

Aber so? In meinen Augen ist die Augsburger Allgemeine ein nicht vertrauenswürdiges Presseorgan. Sie denunzieren Dritte ohne Not an den Staat. Mit "Ohne Not" meine ich, dass dem Vorgang ja keine gerichtliche Verurteilung vorausgegangen ist. Und nur dann ist ein Bürger eines Verbrechens/Vergehens schuldig, bis dahin hat er als unschuldig zu gelten und ein Presseorgan sollte das verteidigen, anstatt es ad absurdum zu führen.

Sagen wir, ich wäre ein potentieller Informant und würde ein Presseorgan suchen, dem ich brisante Informationen über einen gewissen Herrn Ullrich in Augsburg zuspielen will. Wem würde ich wohl diese Informationen anvertrauen? Der Augsburger Allgemeinen? Auf allergarkeinen Fall! Die würden meinen Namen, Adresse, Telefonnummer und Email in ihrer Datenbank speichern und jedem dahergelaufenen Staatsvertreter aushändigen, der sie nur laut genug bedroht.

Dieses Einknicken der deutschen Presse gegenüber dem deutschen Staat, dessen Kontrolleur sie eigentlich zu sein hat, ist der Grund für ihren Niedergang. Und nicht irgendwelche Raubkopierer oder Suchmaschinen, denen sie mit ihrem Leistungsschutzrecht zu leibe rücken wollen. Und wenn ich mir das Verhalten der Augsburger Allgemeinen anschaue, muss ich sagen: es ist gut, dass eine solche Presse den Bach runtergeht.


Update 13.02.2013 21:58:

Thomas Stadler kommt zum gleichen Ergebnis:

Wenn man dem Betreiber oder Mitarbeiter von Meinungsforen kein Zeugnisverweigerungsrecht zubilligen will, dann wird man ihnen künftig raten müssen, von der gesetzlichen Möglichkeit, Kommentare und Bewertungen anonym abgeben zu lassen, Gebrauch zu machen. Denn wer keine Informationen über die Person des Verfassers eines Kommentars hat, kann auch als Zeuge dazu keine Angaben machen.


Update 21.03.2013 20:11:

Und es kam, wie es kommen musste: Die Aktion war illegal, hat nun das Landgericht geurteilt. Die schlechte Nachricht: das Gericht hat sich nicht der Ansicht angeschlossen, ein Forenuser eines Presseorgans falle unter Zeugnisverweigerungsrecht. Das ist bitter und enttäuschend, aber ich habe nichts anderes erwartet in diesem Staat.








Sensorita - Hutschienen LCD Display für Sensoranzeige - Updated 21.03.2013 21:00

Heute wollte ich eigentlich meinen Sensorcontroller für das neue Terrarium zusammenbauen. Geplant war, in ein leeres Hutschienengehäuse den Arduino Micro, alle Steckeranschlüsse, das LCD-Display und 2 Buttons unterzubringen. Aber ich hab es einfach nicht hingekriegt, den ganzen Kram da so reinzukriegen, dass ich ihn im Fall der Fälle auch wieder herausbekomme. Tja. Somit habe ich umdisponiert und nur das LCD-Display und die beiden Buttons eingebaut. Auf die Leiterplatte habe ich auch die Pulldown-Widerstände für die Buttons und die Widerstände für den LCD-Anschluss drauf. Das Poti für die Kontrasteinstellung hab ich auch mit unterbringen können. Dann habe ich einen standardmässigen JST Stecker an 20cm Kabeln herausgeführt. Den Arduino mit den Sensoranschlüssen werde ich dann auf der Rückseite der Hutschienensteuerung unterbringen und mit dem o.g. Stecker verbinden.

Anbei Bilder vom LCD-Modul und von meiner Hutschienensteuerung. Auf der Vorderseite der Steuerung befindet sich eine Sicherung, die astronomische Jahresschaltuhr von Theben, das 4-Kanal-Erweiterungsmodul davon, ein Wechselschalter um zwischen Theben und Conrad-Uhr umzuschalten (der fehlt momentan, das ist die Lücke, Bestellung ist unterwegs), daneben eine einfache Conrad-Zeitschaltuhr, die für den Notfall gedacht ist, falls die Theben ausfällt (wobei die Conrad alle 8 Kanäle gleichzeitig schalten wird, während die Theben die Kanäle getrennt schaltet), daneben ein weiterer Wechselschalter, um zwischen Zeitschaltuhr oder manuellem Betrieb umzuschalten, daneben 8 Schalter für den manuellen Betrieb und letzlich die oben erwähnte Sensoranzeige.

Auf der Rückseite befinden sich links die Steckdosen für die 8 Schaltknäle, daneben ein paar Verteiler, dann eine Dauersteckdose (für den Worstcase, dass alle Steuerungsoptionen ausgefallen sind), ein 12V Netzteil, mit dem ich den Arduino (Sensorita) betreibe, und der u.U. auch einen Lüfter versorgen könnte.

Bild: LCD  auf Leiterplatte
LCD auf Leiterplatte (Jan. 25, 2013, 9:17 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: LCD Platte von unten
LCD Platte von unten (Jan. 25, 2013, 9:17 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: LCD im Gehäuse eingesetzt
LCD im Gehäuse eingesetzt (Jan. 25, 2013, 9:18 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Fertiges LCD-Sensor-Anzeige-Gehäuse
Fertiges LCD-Sensor-Anzeige-Gehäuse (Jan. 25, 2013, 9:18 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Steuerung von hinten
Steuerung von hinten (Jan. 25, 2013, 9:18 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Steuerung von vorn
Steuerung von vorn (Jan. 25, 2013, 9:18 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]


Update 26.01.2013 21:37:

Und hier noch ein Video von dem Teil in Aktion:

Man sieht, wie ich mit dem grünen Kopf durch die Untermenüs gehe. Und wenn ich eine Weile nix mache, geht es aus. Aktuell ist der Timeout natürlich noch recht kurz - zum Testen - später bleibt es eine Minute lang an.


Update 28.01.2013 21:47:

Heute habe ich 5 Sensoranschlüsse verlötet (4 x DS1820 Temperatursensor und 1 x LDR) und die entsprechenden Sensorkabel hergestellt. Leider ist einer der DS1820 kaputt (das herauszufinden, hat mich über 2 Stunden Debugging gekostet!). Anbei ein Video der Sensorita in Aktion:

Und ich hab noch 2 Fotos an das Posting gehängt. Auf dem Einen sieht man die komplette gerätschaft und auf dem anderen die Sensorkabel aus der Nähe (links der LDR, in der Mitte der Stecker und rechts der DS1820).

Bild: Sensoren angeschlossen und in Betrieb
Sensoren angeschlossen und in Betrieb (Jan. 28, 2013, 9:51 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Ein Sensorkabel (mit DS1820)
Ein Sensorkabel (mit DS1820) (Jan. 28, 2013, 9:51 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]


Update 29.01.2013 23:39:

Die Sensorita ist heute fertig geworden. War dann doch mehr Arbeit als erwartet. Aber lohnt sich. Anbei wie üblich das aktuelle Video der Endversion:

Die hohen Lux- und Watt-werte rühren daher, dass ich zum Testen einen 500 Watt Halegenstrahler angeschlossen habe. Die Hauptanzeige hab ich geändert, da werden jetzt alle Werte auf einmal dargestellt, bei der Temperatur der Durchschnitt. Mit dem grünen Knopf kommt man zu den Detailanzeigen. Dort werden dann jeweils noch Min- und Max-Werte hinzukommen.

Angeschlossene Sensoren: DHT22 (Temperatur und Luftfeuchtigkeit), Strom (Watt, Ampere, kwh), 4 x DS1820 (Temperatur) und eine Photodiode (Lux).

Ich habe auch mal den aktuellen Sourcecode hochgeladen. Ist noch nicht bei Github, kommt aber noch.


Update 10.02.2013 15:36:

Den Sourcecode habe ich nun endlich mal bei Github eingecheckt.


Update 10.02.2013 17:39:

Bei Github gibts jetzt ne neue Version, ich habe die Anzeige nochmal überarbeitet. Die Steuerung ist inzwischen auch im Terrarium eingebaut, siehe Foto. Ausserdem habe ich mal alle Anzeigemenüs fotografiert, damit man mal sieht, wie das ungefähr aussieht nachher. Der exorbitant hohe Stromverbrauch kommt von der angeschlossenen Testlampe (ein Halegenstrahler).

Bild: Eingebaut ins Terrarium
Eingebaut ins Terrarium (Feb. 10, 2013, 5:40 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Alle Anzeigemenüs im Überblick
Alle Anzeigemenüs im Überblick (Feb. 10, 2013, 5:40 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]


Update 01.03.2013 15:45:

Und hier die finale Ansicht, jetzt mit Beschriftung und Legende.

Bild: Steuerung fertiggestellt
Steuerung fertiggestellt (March 1, 2013, 3:45 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]


Update 11.03.2013 12:10:

So, das Logging hab ich jetzt auch fertiggestellt. Ich wollte dafür ursprünglich meine noch vorhandene und derzeit nicht genutzte NSLU2 benutzen. Ich hatte die deshalb geöffnet und den seriellen Port mit einem Stecker verbunden und herausgeführt. Von einem Arduino aus konnte ich dann auch tatsächlich serielle Daten (via TTL) dorthin schicken. Das Problem war nur, dass das Gerät zu unzuverlässig ist. Zum einen ist es nach diversen Reboots nicht mehr hochgekommen, da musste ich jedesmal mit Redboot rumfrickeln. Ein Scheiss. Und zum anderen läuft unter Linux der serielle Read-Buffer voll, wenn man da Daten hinschickt und die keiner abholt und das ist nur per Reboot abzustellen. Dazu kann ich nur sagen: what the bloody hell?!

Also in die Tonne damit. Mir geht Linux mittlerweile sowieso nur noch auf den Zeiger. Aber sowas? Verdammtes Amateurgeraffel. Also ich verwende jetzt einen zweiten Arduino, den ich eigentlich für Testzwecke da hatte. Ich hab dem Teil einfach den Ethernetshield aus meinem Terraduinoprojekt aufgesteckt. Das hat dort sowieso nie richtig funktioniert und ich benutze es auch nicht mehr. RX und TX verbinden (witzigerweise musste ich TX nach TX und RX nach RX stecken, damit es geht, die Beschriftung ist falsch herum auf dem Teil!) und per Ethernet raus damit.

Source von Sensorita und dem Loggingmodul wie üblich bei Github.

Die Logdaten schickt das Etherlogmodul dann zu meinem Djangoserver, der es in der Datenbank ablegt. Ich schicke mehr Daten als MRTG nutzt, d.h. die tatsächliche Auflösung beträgt etwa 1 Datensatz pro Minute. Für MRTG wird aus diesen Daten ein Durchschnitt ermittelt. In den angehängten Screenshots sieht man die MRTG Graphen und auf der rechten Seite die aktuellen Sensorwerte. Im zweiten Bild sieht man die Rohdaten in der Datenbank.

Weiters habe ich herausgefunden, dass man mit der Obelisksoftware von Theben, mit der ich die Programmierung für die astronomische Jahresschaltuhr einstelle, einen CSV Export machen kann. Das hab ich natürlich sogleich ins Django eingebaut und so kann ich nun sehen, wann die einzelnen Kanäle gemäß Programmierung angehen werden. Sehr feine Sache, das.

Bild: MRTG und Datenanzeige
MRTG und Datenanzeige (March 11, 2013, 12:10 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Sensorlogs in der Django DB
Sensorlogs in der Django DB (March 11, 2013, 12:10 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Schaltzeiten der Theben Schaltuhr
Schaltzeiten der Theben Schaltuhr (March 11, 2013, 12:10 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]


Update 12.03.2013 15:14:

Jetzt, wo ich die Sensordaten erstmal in der Datenbank habe, kann ich die natürlich auch überwachen. Da ich bereits Nagios einsetze, mach ich es damit.

Anbei zwei Screenshots aus meinem Nagios, einmal ohne und einmal mit (künstlichem) Alarm :) Und die SMS kann man auch bewundern :)

Bild: Nagios alles grün
Nagios alles grün (March 12, 2013, 3:15 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Nagios ein Ausfall
Nagios ein Ausfall (March 12, 2013, 3:15 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]
Bild: Nagios SMS bei Ausfall
Nagios SMS bei Ausfall (March 12, 2013, 3:44 p.m.)
[Tags: terra2013 ] [Album: Terrarium ]


Update 21.03.2013 21:00:

Nachdem das MRTG nun eine Weile läuft, habe ich inzwischen auch einen kombinierten Graphen, in dem alle Werte gleichzeitig angezeigt werden (im Bild links oben). Dadurch kann man sehr gut die Zusammenhänge zwischen verschiedenen Dingen erkennen.

Bild: DRRAW kombinierter MRTG Graph
DRRAW kombinierter MRTG Graph (March 21, 2013, 9 p.m.)
[Tags: terra2013 ] [Album: Screencaps ]

25.01.2013 20:49 CC0 Terrarium 2 Kommentare






Privacy vs. Obscurity

Heute bin ich über einen äusserst interessanten Artikel im Atlantik gestossen: Obscurity: A Better Way to Think About Your Data Than 'Privacy'. Kurz gesagt, wird dort treffend festgestellt, dass die meisten Probleme, die die Leute heutzutage mit dem Thema "Datenschutz" haben, eigentlich gar nichts damit zu tun haben, sondern mit dem Thema "Obscurity". Ich finde leider keinen passenden deutschen Begriff dafür, deshabl bleibe ich einfach beim englischen Wort.

In dem Artikel wird das am Beispiel Facebook Graph aufgezeigt. Eine Menge Leute regen sich über die Funktion auf, weil sie ihre Privatsphäre verletze. Das tut die Funktion natürlich nicht. In der Tat werden nur bereits öffentliche Informationen zusammengestellt und durchsuchbar. Geheim - im Sinne von "Keiner ausser mir kann das sehen" - war und ist davon gar nichts. Insofern kann man Facebook verstehen, wenn sie ob der Aufregung nur mit den Schultern zu zucken wissen. Immerhin haben sie an sich ja nichts verbrochen.

Das eigentliche Problem dabei ist Obscurity. Unter Obscurity versteht man das Verbergen von Informationen in der Öffentlichkeit. Das heisst, Informationen sind zwar öffentlich, aber entweder schwer zu finden oder nicht so ohne weiteres jemandem zuzuordnen. Das trifft eben zum Beispiel auf öffentliche Informationen bei Facebook zu. Likes, Kommentare von anno dazumal, ein Bild vor 2 Jahren hier, ein Posting vor einem Jahr dort - aus diesen Informationshäppchen eine verwertbare Aussage herauszuholen ist mühselig bis unmöglich. Hinter dieser Obscurity haben sich die Leute anscheinend relativ sicher gefühlt. Weil sie wussten, dass im Grunde nur Vollprofis mit Zugriff auf die Facebook-Datenbanken so etwas tun konnten.

Jetzt nicht mehr. Jetzt kann es jedermann, Graph sei Dank. Auf einmal kann man aus scheinbar zusammenhanglosen - durchaus öffentlichen - Informationen eine Aussage herausquetschen. Mit ein paar Mausklicks. Das erschreckt die Leute und sie haben Recht, es ist erschreckend. Aber mit der Privatsphäre hat das eben nichts zu tun.

Denn was ist eigentlich Privatsphäre, wenn wir über das Internet reden? Nehmen wir ein Beispiel. In einem sozialen Netzwerk taucht ein Foto von einem Arsch auf. Dabei handelt es sich um eine Information. Verletzt dieses Foto die Privatsphäre von jemandem? Nein! Und zwar, weil - wenn man nur das Bild zur Verfügung hat - man es nicht mit der Person in Verbindung bringen kann. Das Bild wurde von einem User namens "Hans" hochgeladen und nehmen wir an, es handelt sich um den Arsch von ebendiesem. Verletzt es seine Privatsphäre, wenn das Bild öffentlich ist? Nein, immer noch nicht. Denn wir wissen nur, dass es "Hans" war, wir können das Bild immer noch nicht einer echten Person zuordnen.

Tatsächlich können wir das erst, wenn wir Zugang zum Logfile des Webservers hätten, über den das Bild hochgeladen worden ist, das sähe dann zum Beispiel so aus:

172.16.1.1 - - [10/Jul/2012:18:41:02 +0000] "POST /media/user/hans/ HTTP/1.1" 345 403 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" "http://foo.bar/user/hans/profile/"

Hier haben wir:

  • eine IP Adresse
  • ein Datum und Uhrzeit
  • Betriebssystem
  • Browser
  • Referrer (wo der User vorher war)

Anhand dieser Daten kann man den Vorgang einer lebenden Person zuordnen. "Kann man" ist natürlich einzuschränken. Können kann das nur der Betreiber des Internetzugangs aus dessen Bereich die IP-Adresse kommt. Und Zugriff auf obigen Logeintrag hat nur der Betreiber des Webservers.

Wenn wir also hier über den Schutz der Privatsphäre sprechen, dann meinen wir, wie diese Daten geschützt sind:

  • Wer hat Zugriff auf die Logdaten?
  • Wie weit in die Vergangenheit reichen die Daten?
  • Wer hat Zugriff auf die Logdaten beim Betreiber des Internetzugangs?
  • Auch hier: wie weit in die Vergangenheit reichen die Daten?

Diese Fakten sind der Datenschutz. Und zwar NUR diese. Alles andere betrifft im Grossen und Ganzen das Thema Obscurity. Wenn also jemand sagt, Facebook würde die Privatsphäre der Nutzer verletzen, dann sollte er damit meinen, dass die Logdaten, die bei einem POST- oder GET-Request auf Facebooks Webservern erscheinen, zu lange vorgehalten werden, oder dass Leute auf die Daten Zugriff haben, die das nicht sollten (zum Beispiel externe Entwickler oder Ermittlungsbehörden ohne Gerichtsbeschluss).

Man wird jetzt einwenden können, dass das zu kurz gedachtt ist, denn immerhin verwenden die Leute bei Facebook ja ihren echten Namen, über diesen seien Informationen einer Person zuzuordnen. Das ist theoretisch richtig. Bei Lichte betrachtet jedoch nicht. Zwar schreiben die AGB von Facebook die Verwendung des echten Namens vor, aber AGB haben keinen Gesetzesrang. Mithin zwingt niemand die Menschen, dort ihren echten Namen zu verwenden. Und tatsächlich gibt es genug Leute, die das auch nicht tun. Hinzu kommt der vielleicht nicht unbedeutende Aspekt, dass man aus diesem Grund auch nie ganz genau wissen kann, ob der Facebooknutzer mit dem Namen "Hans Wurst" wirklich DER Hans Wurst, Foostrasse 1, 11111 Bardorf, ist. Es könnte auch dessen Frau sein, oder sein Sohn, ein Nachbar, oder sonstwer, der womöglich zufällig auch so heisst. 100%ig wissen kann man es nicht. Das kann man NUR, wenn man Zugriff auf die PRIVATEN Daten des Nutzers hat, also das Logfile des Webservers bei Facebook.

Davon abgesehen finde ich es immer wieder faszinierend, dass sich Leute über das Thema Datenschutz erregen, die bei Facebook ihren echten Namen verwenden. Völlig freiwillig. Aber nur weil sie das tun, heisst das nicht, dass es dadurch automatisch Facebooks Schuld ist, wenn private Details über deren Leben ans Tageslicht geraten. Es handelt sich um eine persönliche Entscheidung, die man so oder so fällen kann. Dies impliziert somit, dass die Verantwortung bei demjenigen liegt, der die Entscheidung getroffen hat.

Teil dieser Entscheidung, für die es durchaus akzeptable Gründe geben kann, ist die Frage, wieviele echte Details über sich selbst eine Person mit diesem Datum - dem Namen - verknüpft. Die Anhänger der sogenannten Spackeria beantworten diese Frage sehr einfach mit: alles, womit Du leben könntest, wäre es weltweit für jeden sichtbar. Gibt es also ein Detail, mit dem ich ein Problem hätte, wüsste es jeder, dann sollte ich dieses Detail NICHT posten und somit mit meinem echten Namen verknüpfen. Sollte es aber notwendig sein, sich mit jemandem darüber auszutauschen, dann tut man das, indem man Obscurity herstellt: man verwende ein Pseudonym und stelle es in einem anderen Netzwerk/Forum ein und diskutiere es dort.

Wenn man sich an diese kleine, einfache Regel hält, wird es niemandem überhaupt möglich sein, die Privatsphäre zu verletzen (von Kriminellen, Gesetze misachtenden Konzernen und Behörden und verfassungsmissachtenden Gesetzgebern einmal abgesehen). Es wird jedoch möglich sein, den Schleier der Obscurity zu senken. Vielleicht jedenfalls. Irgendwann einmal. So wie es heutzutage mit Facebook Graph passiert ist, mag es morgen ein neues Tool geben, dass in der Lage ist, Dinge zu verknüpfen.

Man muss von einer Wahrscheinlichkeit von 1 ausgehen, dass das passieren wird. Und zwar immer, mit allem, was man von sich preisgibt. Es muss immer klar sein: irgendwann wird das jemand mit anderen Informationen verknüpfen können und womöglich wird es jemandem möglich sein, diese miteinander verknüpften Informationen - die neue Aussage - meiner Person zuzuordnen, weil ein Datum aus diesen Informationen bereits mit meiner Person verknüpft ist.

Das einzige Problem ist, dass sowohl millitante Datenschützer, als auch Spackeria-Anhänger, anscheinend nicht in der Lage sind, das Problem und die naheliegende Lösung so zu formulieren, dass man daraus eine Handlungsweise ableiten kann. Ich hab das hier mal probiert. Hinzu kommt, dass das präzise die Methode ist, mit der ich mich im Internet bewege. Ich bin seit fast 20 Jahren online und meine Spuren sind dünn. Äusserst dünn. Aber das heisst nicht, dass ich nie etwas poste oder mit Leuten kommuniziere. Tue ich schon, nur weiss keiner, dass ich es bin. Es sei denn, ich will es so.