Archiv für den Monat: Juli 2010

Beschissene Onlinewerbung vs. Journalistenbezahlung

Kurze Zwischenmeldung aus der Versenkung: Bei Felix Schwenzel bin ich nochmal auf einen zwei Artikel gestossen, die ich beim ersten Mal offenbar ueberlesen hatte. Und die eigentlich zusammengehoeren.

Einmal eine Ausfuehrung ueber die von Jens Weinreich aufgezeigten Workflow-Unterschiede zwischen einem per Blog abgesetzten Inhalt und dem Gegenstueck bei einem „etablierten“ Medium (sorry fuer die dumme Bezeichnung, mir faellt gerade nichts besseres ein)

Und einmal der kommentierte Link auf einen NYT-Artikel mit dem schoenen Namen „Why is digital advertising so lousy?“

Und damit verschwinde ich jetzt wieder in der Versenkung, um mir Bayessche Netze anzusehen. Wie spannend!

Elektrotechnikerkompetenz

aus einer nicht naeher genannten Mailingliste:

Unser Drucker eins kann stolz auf sich sein: Er hat eben den ganzen
Switch im Gebäude lahmgelegt.
Dominic ersetzt eben das graue Kabel gegen ein gelbes Netzwerkkabel.

Dies hat FEhlerkorrigierende Wirkung.

Vorschriften und ihre Interpretation

Der Beitrag gestern zum Loveparade-Unglueck kam aus schlechter Laune zustande. Verursacht auch durch die sofortigen Schuldzuweisungen und Interpretationen Sach- und Ortsfremder. Vor allem aber dadurch, dass die laxe Ausfuehrung von Sicherheitsvorschriften kein Einzelfall ist, sondern sich durch quasi alle Veranstaltungen zieht, die man sich denken kann.

(Einschub: Fuer mich sieht es derzeit so aus, als sei die Genehmigung samt aller Auflagen nur fuer den eigentlichen Veranstaltungsort erteilt worden — da der Tunnel aber eben ausserhalb des Ortes gelegen ist, wurde er beflissentlich uebersehen. Das ist zwar reine Spekulation, deckt sich aber mit den Erfahrungen, die ich gemacht habe: Probleme werden zwischen den beteiligten Instanzen hin- und hergeschoben, Hauptsache man kann sich selber reinwaschen.) Nachtrag 1917 Uhr: Bullshit. Was aergere ich mich ueber Rumspekuliererei, wenn ich selber Unsinn verzapfe. Sorry.

Das ist nicht nur bei Grossveranstaltungen so: Jetzt fasst sich bitte mal jeder selber an die Nase, ob er als Veranstalter immer alle Auflagen eingehalten hat. Noch nie mal eben bei der Twitterlesung 100 Besucher mehr eingelassen, „weil ja noch Platz ist“? Immer bei der Bestuhlung auf markierte Fluchtwege gemaess der VstVO geachtet? Wo sind die Loeschgeraete? Wer kann damit umgehen? Sind die Fluchtwege breit genug und unverstellt? Saemtliche Brandlasten aus allen Verkehrswegen entfernt?

Ich weiss, fuer manche wirkt das ueberpenibel, wenn ich bei Veranstaltungen, an denen ich beteiligt bin, mit dem Meterstab herumlaufe, Fluchttore ums Verrecken in die „unaesthetischere“ Richtung schwingend haben moechte oder bei aufgekeilten Tueren herummeckere (meine Holzkeilsammlung ist mittlerweile ziemlich beeindruckend). Aber es ist eben verdammt nochmal wichtig. Ich hoffe, Duisburg sorgt fuer ein Umdenken auch im Kleinen.

Bewusstsein bekommen statt verurteilen

Titelbild von NullProzent, cc-by-nc

Ich werde mich nicht einmal ansatzweise aus dem Fenster lehnen, was die Zulaessigkeit der Fluchtwegefuehrung bei der fatalen Loveparade in Duisburg angeht. Erstens, weil ich die Rechtslage in NRW nicht kenne, und zweitens weil ich die Oertlichkeit und das Brandschutzkonzept noch nie gesehen habe.

Was den Tunnel angeht: In manchen Bundeslaendern genehmigen die jeweiligen Versammlungsstaettenverordnungen auch Fluchtwege, die baulich ueberdeckt sind. Und ich kann mir wirklich nicht vorstellen, dass der Tunnel der einzige abgenommene Fluchtweg ist. In BaWue spricht man von 1,20 Metern lichter Weite pro 600 Veranstaltungsgaesten, das muesste dann schon ein 2,3 Kilometer breiter Tunnel sein. Sowas genehmigt keiner, jedenfalls hoffe ich das.

Nicht zuletzt soll ein Besuchermob im Notfall auch aufgeteilt werden — auch dafuer sind in Veranstaltungsbauten „Wellenbrecher“ Pflicht. Niemand hat etwas davon, wenn auf einmal alle durch denselben Ausgang rennen.

Was ich aber aus der Praxis sagen kann: In der Realitaet geht sowas oft nach hinten los. Wenn eine Masse mal rennt, rennt sie. Und nachdem das Aufhaengen von Fluchtwegeschildern von vielen Veranstaltern als laestige Pflicht empfunden wird, sind die — offiziell abgenommenen — Fluchtwege oft nicht so erkennbar, wie auf dem Papier genehmigt.

Ein Bewusstsein dafuer, dass es wichtig sein koennte, schnell die ausgewiesenen Fluchtwege in der ansonsten wegen womoeglich einsteigender „Schwarzgaeste“ hermetisch abgeriegelten Umfriedung zu oeffnen, finde ich ebenfalls selten.

Von Vorverurteilungen irgendwelcher Leute ohne genaue Kenntnis der Genehmigung, Vorschriften und Objektlage halte ich jedenfalls nicht. Das schlimmste fuer mich ist, dass dieser Vorgang „endlich“ mal ein abschreckendes Beispiel waere, das man bei der Abnahme von Veranstaltungen vorbringen kann. Aber ich habe schon die Antwort in den Ohren: „Das waren eineinhalb Millionen Leute, das ist ja ganz was anderes“.

Denkste.

GPS und Java: NMEA-Daten auswerten (1)

Bild: GPS Recorder von andyp_uk, cc-by-nc

Irgendwann kommt die Zeit im Leben jedes Menschen, an der er GPS-Daten automatisiert verarbeiten will. Vertraut mir, was das angeht. Das passiert jedem.

Unter C++ ist sowas sicher viel simpler und toller. Ich hatte aber die fixe Idee, das unter Java zu machen, weil das ja gewohntes und damit vermeintlich sicheres Terrain fuer mich sei. Das lassen wir jetzt mal so dahingestellt.

Schritt 1: Daten holen

Die Idee, hier java.io verwenden zu wollen, kann man sich ziemlich in die Haare schmieren. Gleich gnu.io.rxtx zu verwenden, spart Aerger. Weil wir NMEA-Daten ueber die serielle Schnittstelle haben wollen, setzen wir die Parameter entsprechend: setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

Hier kommt jetzt alles moegliche NMEA-Zeug heraus, das man theoretisch direkt parsen koennte. Alternativ kann man mit der Java NMEA API gezielt nach den interessanten NMEA-Saetzen lauschen. Kurz deren Doku ueberfliegen lohnt sich auf jeden Fall, da sich auch ein Beispiel findet, wie man ein GPS-Geraet ueber die serielle Schnittstelle einliest.

PS: Viele GPS-Maeuse kommen heute mit einem integrierten Serial-to-USB-Konverter daher, damit man sie per USB anschliessen kann. Sollte RxTx unter Linux zwar einen USB-Port (a la /dev/ttyUSB0) erkennen, darauf aber nicht zugreifen koennen („No such port“), helfen unter Umstaenden chown unsinn! chmod 666 /dev/ttyUSB0 und chgrp tty /dev/ttyUSB0 weiter.

Schritt 2: Was brauchen wir da eigentlich?

Wenn man sich mal direkt ansieht, was da ueber die Konsole rauscht, dann ist das ziemlich viel. Beispiel:

$GPRMC,101836.000,A,4825.1856,N,00956.8032,E,0.23,226.38,230710,,*07
$GPVTG,226.38,T,,M,0.23,N,0.4,K*68
$GPGGA,101837.000,4825.1857,N,00956.8023,E,1,04,1.4,567.4,M,48.0,M,,0000*5E
$GPGSA,A,3,17,05,08,18,,,,,,,,,8.6,1.4,8.5*36
$GPRMC,101837.000,A,4825.1857,N,00956.8023,E,0.57,292.18,230710,,*09

Das sieht auf den ersten Blick wenig einladend aus, im Endeffekt aber ziemlich simpel. „$GP“ bedeutet, dass es sich um GPS-Daten handelt. „RMC“, „VTG“, „GGA“, „GSA“ und Co. sind verschiedene Satztypen, die hierzu gehoeren. RMC muss jeder GPS-Empfaenger koennen, idealerweise nehmen wir uns aber die GGA-Saetze her, weil die in einem Satz alle fuer uns wichtigen Informationen bereitstellen.

Durch Kommas getrennt finden sich hier:

  • Uhrzeit in UTC
  • Breite und Bezeichner N oder S fuer die Breite
  • Laenge und Bezeichner W oder E fuer die Laenge
  • Qualität der Messung (0 == ungueltig, 1 == GPS, 2 == DGPS)
  • Anzahl der gemessenen Satelliten
  • Horizontal Dilution Of Precision (mehr dazu im naechsten Post)
  • Hoehe ueber Meer mit Einheit
  • Hoehe ueber Geoid minus Hoehe ueber Ellipsoid, mit Einheit

…gefolgt zum Schluss von einer Pruefsumme, die ich aber nie irgendwie beruecksichtigt habe. Bis auf das aktuelle Datum ist hier also alles vorhanden, was man braucht, es muss nur noch die Zeichenkette aufgetrennt und die WGS84-Koordinate in ein Format umgerechnet werden, mit dem man weiterarbeiten kann.

Schritt 3: Koordinaten umrechnen

Umrechnen? Ja. In den NMEA-Saetzen steht naemlich folgendes:

4825.1857,N,00956.8023,E

Das sind also 48° 25.1857′ noerdlicher Breite und 9° 56.8023′ oestlicher Laenge. In Minuten wollen wir aber nicht rechnen, wir wollen zwei glatte Dezimalbrueche — in diesem Fall etwa 48.4197616 und 9.946705. Dazu muessen wir aber erst einmal unsere NMEA-Saetze in ihre Bestandteile zerlegen.

In einigen Tutorials, die ich gefunden hatte, war hier immer vom StringTokenizer die Rede, um die Zeichenkette zu zerlegen. Das ist aber nicht immer eine gute Idee, da der NMEA-Output direkt nach dem GPS-Start oder beim Fix-Verlust (z.B. in einem Tunnel) so aussehen kann:

$GPGGA,103927.819,,,,,0,00,,,M,0.0,M,,0000*58

Schoener geht das alles mit der split()-Methode, um die Zeichenkette an den Kommas zu trennen:

String sentence_parts[] = e.getContent().split(",");

Nun ist klar definiert, an welcher Stelle was zu erwarten ist. Sollten wir keinen Fix haben, koennen wir das ganz einfach herausfinden:

if (sentence_parts[6].equals("0")) {
    System.err.println("No fix!");
    // TODO: Handle this further, if needed
 }

Gehen wir aber mal davon aus, dass wir einen Fix haben. Dann hilft uns der Algorithmus aus dem oben genannten Tutorial weiter, mit dem wir die Minutenangabe der NMEA-Koordinate in den Dezimalbruch nach dem Komma der Gradangabe umwandeln koennen:

float lat_val = convertLat(sentence_parts[2], sentence_parts[3]);
float lon_val = convertLon(sentence_parts[4], sentence_parts[5]);
public float convertLat (String raw_latitude, String lat_direction) {

  String lat_deg = raw_latitude.substring(0, 2);
  String lat_min1 = raw_latitude.substring(2, 4);
  String lat_min2 = raw_latitude.substring(5);
  String lat_min3 = "0." + lat_min1 + lat_min2;
  float lat_dec = Float.parseFloat(lat_min3)/.6f;
  float lat_val = Float.parseFloat(lat_deg) + lat_dec;

 // Direction of latitude. North is positive, south negative
  if (lat_direction.equals("N")) {
    // no correction needed
  } else {
    lat_val = lat_val * -1;
  }
 return lat_val;
 }
public float convertLon(String raw_longitude, String lon_direction) {
 // Conversion of longitude to floating point values

  String lon_deg = raw_longitude.substring(0, 3);
  String lon_min1 = raw_longitude.substring(3, 5);
  String lon_min2 = raw_longitude.substring(6);
  String lon_min3 = "0." + lon_min1 + lon_min2;
  float lon_dec = Float.parseFloat(lon_min3)/.6f;
  float lon_val = Float.parseFloat(lon_deg) + lon_dec;

  //direction of longitude, east is positive
  if (lon_direction.equals("E")) {
    // No correction needed
  } else {
    lon_val = lon_val * -1;
  }
 return lon_val;
 }

Jetzt haben wir unseren Standort. Naja, eigentlich nicht, sondern nur eine Annaeherung unserer Position. Hier kommt noch eine bestimmte Abweichung ins Spiel, die in Metern auszudruecken gar nicht so leicht ist. Wie man damit umgehen kann und wie das generell mit Genauigkeit, Praezision und Verfahren wie DGPS und SBAS geht, schreibe ich dann demnaechst mal.

Nachtrag: Waehrend ich das hier schreibe, faellt mir auf, dass ich bei den Vorzeichen automatisch das vom UTM-Koordinatensystem her bekannte Nordwert-Ostwert-Paradigma verwendet habe — bin mir aber aktuell nicht sicher, ob bei WGS84-Koordinaten nicht doch der Westwert ein positives Vorzeichen hat.

Nach-Nachtrag: Gpsvisualizer hat meine Annahme bestaetigt. Puh 🙂

Wasser fuer die Feuerwehr

Auch bei der Feuerwehr haben wir dieser Tage mit der Hitze zu kaempfen. Weniger wegen der trockenen Waelder, die seit Wochen von der Luftbeobachtungsstaffel kontrolliert werden — toi toi toi — sondern wegen der Arbeit in der prallen Sonne.

Bei der Vorbereitung auf die Leistungspruefung verzichten wir zumindest zeitweise auf Schutzjacke und Helm. Im Einsatz sind beide aber Pflicht, und da der landeseinheitliche Schutzanzug „Bayern 2000“ diplomatisch ausgedrueckt nicht gerade ein Musterbeispiel in Sachen Atmungsaktivitaet ist, wird die Jacke binnen weniger Minuten zur ganz persoenlichen Sauna.

Nun haben wir zwar schon seit einigen Jahren Trinkwasserflaschen auf allen Loeschfahrzeugen, die aber teilweise gerade mal fuer die besonders belasteten Atemschutzgeraetetraeger reichen — wofuer sie eigentlicht auch einmal gedacht waren. Der Landesfeuerwehrarzt empfiehlt derweil mindestens drei Liter Fluessigkeit pro Einsatzkraft und Tag, und so bringt das jeweils nachrueckende Loeschfahrzeug mindestens noch einmal eine Kiste Wasser an die Einsatzstelle. Alternative Systeme mit Plastik- statt Glasflaschen oder Faltwasserbehaeltern und Bechern sind gerade in Ueberlegung.

Frueher gab’s Wasser allenfalls aus dem Fahrzeugtank. Womit wieder mal bewiesen waere, dass heutzutage zwar fast alles komplizierter, dafuer aber das meiste besser ist.

Auch bei der Feuerwehr haben wir dieser Tage mit der Hitze zu kaempfen. Weniger wegen der trockenen

Waelder, die seit Wochen von der Luftbeobachtungsstaffel kontrolliert werden — toi toi toi — sondern

wegen der Arbeit in der prallen Sonne.

Bei der Vorbereitung auf die Leistungspruefung verzichten wir zumindest zeitweise auf Schutzjacke und

Helm. Im Einsatz sind beide aber Pflicht, und da der landesweite Schutzanzug „Bayern 2000“

diplomatisch ausgedrueckt nicht gerade ein Musterbeispiel in Sachen Atmungsaktivitaet ist, wird die

Jacke binnen weniger Minuten zur ganz persoenlichen Sauna.

Nun haben wir zwar schon seit einigen Jahren Trinkwasserflaschen auf allen Loeschfahrzeugen, die aber

eigentlich nur fuer die besonders belasteten Atemschutzgeraetetraeger gedacht sind. Der

Landesfeuerwehrarzt empfiehlt derweil mindestens drei Liter Fluessigkeit pro Einsatzkraft und Tag, und

so bringt das jeweils nachrueckende Loeschfahrzeug mindestens noch einmal eine Kiste Wasser an die

Einsatzstelle. Alternative Systeme mit Plastik- statt Glasflaschen oder Faltwasserbehaeltern und

Bechern sind in Ueberlegung.

Frueher gab’s Wasser allenfalls aus dem Fahrzeugtank. Womit wieder mal bewiesen waere, dass heutzutage

zwar fast alles komplizierter, dafuer aber das meiste besser ist.

Marschausfall

Letztes Jahr hatte ich ja schon grossspurig angekuendigt, wieder beim Nijmegse Vierdaagse mitzulaufen und mir ein Kroenchen aufs Viertagekreuz zu holen — die fehlende Zeit und die Mitarbeit beim Schwoermontag sorgten aber dafuer, dass Kollege Chris dieses Jahr alleine in die Niederlande gefahren ist, und ich war ja schon ein wenig neidisch auf ihn.

Chris hat eben angerufen. Ich brauche nicht neidisch zu sein: 37 Grad habe das Thermometer am Wedren mittags angezeigt, es sei noch heisser als im letzten Jahr, als bisweilen der Teer auf der Strasse zu schmelzen anfing und an die Schuhsohlen klebte.

Dazu ist eingetreten, wovor ihn sein Arzt gewarnt hatte: Sein laedierter rechter Ballen ist wundgelaufen, und auch der Klebeverband, den ihm eine schwedische Militaeraerztin am ersten Tag verpasst hatte, hat nichts mehr geholfen. Kurz gesagt: Chris hat nach 100 Kilometern ehrenvoll das Handtuch geworfen. Naechste Chance im naechsten Jahr. Und vielleicht holen wir dann ja beide das Kroenchen.

Don’t spam me, bro!

Liebe Facebook-Kontakte: Hört auf, mir eure scheiß Page-Suggestions zu senden. […]

Bitte macht euch endlich die Arbeit und schaut euch an, an wen ihr was schickt, statt erstmal an alle Kontakte auszuwählen.

Ich bitte auch darum. Weil es mir langsam zum Hals heraus haengt. Gemeint sind nicht die sinnvollen Suggestions, die tatsaechlich ab und zu kommen, weil sich jemand Gedanken gemacht hat, was mir gefallen koennte. Sondern die Leute, die Facebook in erster Linie als (Selbst-)Vermarktungsinstrument zu verstehen scheinen.

Hoert auf mit dem Scheiss. Sonst sind wir bald keine Facebook-Freunde mehr.