Montag, 4. Juli 2011

Freie Fahrt für seriöse Statistiken!

Gemeinsam mit ca. 18,4 Mio. anderen* lese ich monatlich die ADAC Motorwelt. Das sind 22,5% der Bevölkerung. Es lesen also mehr Leser_innen die Motowelt als die BILD (12,5 Mio.); Spiegel, Stern und Focus zusammen vertreiben nur wenig mehr Abos (Σ=19,1 Mio.). Noch einfacher: mehr Personen als 2009 CDU oder FDP gewählt haben, lesen die ADAC Motorwelt - es sind jedoch nicht zwangsläufig die selben, ich, zum Beispiel, lese nur die ADAC Motorwelt. Das Begleitheft zur Clubmitgliedschaft kann also getrost als Zeitschrift mit extrem großem Einflussbereich bezeichnet werden.

Offensichtlich ist die Motorwelt auto(fahr)freundlich eingestellt, und getreu des Mottos „freie Fahrt für freie Bürger” ist die Juli-2011-Ausgabe dem Thema Stau gewidmet. Um zu verdeutlichen wie sehr die freie Fahrt behindert wird, findet sich auf Seite 24 in der Mitte eine Grafik, welche die starke Zunahme der Staus (gemessen an der Gesamtlänge der Staus eines Jahres)  verdeutlichen soll.

Originalgrafik aus ADAC Motorwelt Juli 2011, S. 241,2
Leider dramatisiert die Grafik die Situation und verfehlt komplett ihren Zweck. Anstatt komplexe Sachverhalte einfacher erfaßbar zu machen vermittelt sie das Bild einer drohenden Katastrophe.

Die Zahlen der Grafik als Tabelle, die Balkenlängen sind handgemessen, die restlichen Zahlen direkt übernommen.
Jahr   Balkenlänge    Staulänge     Maßstab
       [cm]           [1.000 km]    [cm/100.000km]
2002   11             321           3,4
2006   14,1           359           3,9
2010   17,6           400           4,4


Unterschiedliche Maßstäbe in einem Diagramm sind jedoch höchst verwirrden, deuten auf die Inkompetenz bei der Gestaltung, eventuell sogar mutwilliges Lügen3 hin. Bei einheitlicher Verwendung des Maßstabes 4,4cm/100.000km, der dem Verhältnis von Balkenlänge zu Staulänge im Jahr 2010 entspricht, wäre der 2002er Balken genau so lang, wie jetzt der Balken für das Jahr 2006. Im Handumdrehen sähe die Situations sicher immer noch unangenehm aus, jedoch nicht nach einem Verkehrsinfakt noch vor dem Atomausstieg (ob das wünschenswert ist, soll anderswo diskutiert werden).

Des Rätsels Lösung ist ein unsichtbarer Offset, also eine Verschiebung des Nullpunkts, so dass ein Balken mit der Länge 0 cm nicht der Staulänge 0 km entspricht. Das Verhältnis zwischen den Abständen der Staukilometer der einzelnen Jahre und den Abständen der Balkenlängen ist nämlich, im Rahmen der Messgenauigkeit, konstant. Die drei Balken müssten also alle jeweils 16 cm länger sein - mehr als der 2006er Balken in der Originalgrafik. Um wieder von Staukilometern zu sprechen, rund 190.000 km Stau. Warum die ADAC Motorwelt so viel Stau unterschlägt und gleichzeitig vor 80.000 km Stau zusätzlich in den letzten 8 Jahren erblasst, wird wohl auf ewig ein Geheimnis bleiben.

Ich glaube, dass der ADAC versucht durch die absichtliche Verzerrung der Realität  seinen immensen Einfluß auf die Politik, weiter auszubauen. Die Situation wird einem riesigen Empfänger_innenkreis drastischer dargstellt als sie ist und der ADAC weiß, wer dir mal aus bei einer Panne geholfen hat, dem vertraust du auch. Mit der Impatinenz eines Kindes am Süßwarenstand vor der Kasse fordert der Club seit Jahren (Jahrzehnten?), mehr Geld in Ausbau und Erneuerung der Straßen zu stecken. Ein umfassenderes Verkehrskonzept wird dabei ebenso wenig diskutiert wie die Frage welcher Haushaltsposten für die neuen Autobahnen bluten soll.

* Alle Zahlen, so nicht anders gekennzeichnet. aus Wikipedia
1 Die Faltspuren bezeugen meine erstes Erstaunen beim Lesen des Artikels. Ich faltete die Seite, um sicherzugehen, dass ich keiner optischen Täuschung zum Opfer fiel, bevor ich mein Lineal herausholte.
2 Sollten Sie, sehr geehrte Damen und Herren der ADAC Motorwelt, ein Problem mit der Verwendung der Grafik auf meinem Blog haben, bitte ich um eine Mail anstelle einer kostenpflichtigen Abmahnung.
3 So lügt man mit Statistik - Walter Krämer

Montag, 27. Juni 2011

Umzug meiner Passwortdatenbank

Da ich meine Passwortdatenbank von Gorilla zu KeePassX migriere hab'sch dafür mal ein BASH-script geschrieben welches mir das von-Hand-kopieren abnimmt. Ich teile es wie üblich ohne, dass ich für verlorene, falsch kopierte oder sonstige Probleme mit den Passwörtern, der Welt oder sonstwas Verantwortung übernehmen werde: Konvertierungsskript

PS: Ich habe mir bei GitHub ein Repository für so Zeugs angelegt und nehme auch gerne Verbesserungsvorschläge/Push-Requests an.

Mittwoch, 18. Mai 2011

Aus Webdoku mach PDF-Dokument

Und weiter gehts völlig schamlos wieder mit einem Bash-Skript welches mir erlaubt von Websites (wie der von Doctrine, einem ORM für Symfony) mit Gebrauchsanleitungen drauf tolle PDF Dokumente zu erstellen. Zur Zeit allerdings nur wenn diese Website das Sphinx Markup bereitstellt (wie es eben jende Website tut).
Anleitung
$Programmname OPTIONS URI_der_Indexdatei
OPTIONS:
-r zum Neukonvertieren aber nicht Runterladen verwendet werden (hilfreich wenn kleine Änderungen am Sphinx-Code vorgenommen wurden)
-d wenn nach der erfolgreichen Konvertierung die heruntergeladenen Dateien nicht gelöscht werden sollen.

UPDATE: Jetzt auch auf GitHub zu finden

#!/bin/bash
echo checking prerequisits
sphinx=$(which "sphinx-build");
if [[ ! "$sphinx" ]]; then
    echo "Can't find »sphinx-build« binary!" >&2;
    exit 1;
fi
latex=$(which "pdflatex");
if [[ ! "$latex" ]]; then
    echo "Can't find »pdflatex« binary!" >&2;
    exit 2;
fi
wget=$(which "wget");
if [[ ! "$wget" ]]; then
    echo "Can't find »wget« binary!" >&2;
    exit 3;
fi
sed=$(which "sed");
if [[ ! "$sed" ]]; then
    echo "Can't find »sed« binary!" >&2;
    exit 4;
fi

echo analyzing index link
new="$1";
if [[ "$new" == "-r" ]]; then
    shift;
else
    new="";
fi;
del="$1";
if [[ "$del" == "-d" ]]; then
    shift;
else
    del="";
fi;
index="index"
download="$1";
path="$(dirname $download)";
suffix="$(basename $download)";
suffix=${suffix:${#index}};

if [[ ! "$2" ]]; then
    read -p "Name of project: " projname
else
    projname="$2";
fi
if [[ ! "$3" ]]; then
    read -p "Version of $projname: " projversion
else
    projversion="$3";
fi
echo creating config file
year=$(date +%Y);
wget -q --no-check-certificate https://github.com/fabpot/sphinx-php/raw/master/configurationblock.py
echo "import sys, os
sys.path.append(os.path.abspath('.'))
extensions = ['configurationblock']
master_doc = 'index'
project = u'$projname'
copyright = u'$year, $projname Team'
version = '$projversion'
release = '$projversion'
exclude_trees = ['_build']
pygments_style = 'sphinx'
latex_documents = [
('index', 'index.tex', u'$projname Documentation',
u'$projname Team', 'manual'),
]
latex_show_pagerefs = 1
latex_show_urls = 1
latex_papersize = {'papersize': 'a4paper'}

" > conf.py;

if [[ "$new" ]]; then
    echo "only reloading, no getting";
else
    echo "getting index file";
    index="index.rst";
    $wget -q -O $index "$1";

    dirs="";
    echo -n "getting all documentation files ";
    for name in $($sed -n $index -e '/^\.\. toctree/{:beg; n; s/^$//; T beg; :rep; n; s/^$//; t end; p; T rep; :end}'); do
    dir=$(dirname "$name");
    if [[ "$dir" ]]; then
       mkdir -p "$dir";
       dirs="$dirs $dir";
    fi;
    $wget -q -O "${name}.rst" "$path/$name$suffix";
    echo -n ".";
    done;
    echo "";
fi;

echo converting into latex document
index="index.tex";
$sphinx -b latex . . 1>/dev/null || exit 5;
tmpfile=$(tempfile);
cp $index $tmpfile;
cat $tmpfile | sed 's/fi/fi/' > $index;
rm $tmpfile;

echo -n "creating latex 1/2";
$latex -halt-on-error $index 1>/dev/null || exit 6;

echo -e "\b\b\b2/2";
$latex -halt-on-error $index 1>/dev/null || exit 7;
mv index.pdf "${projname}_${projversion}.pdf"

echo cleaning up
rm conf*.{py,pyc}
rm index.{aux,tex,log,out,toc}
rm Makefile
rm *.{cls,sty,idx}
rm python.ist
rm -rf .doctrees
if [[ ! "$del" ]]; then
    rm -rf$dirs
    rm index.rst
fi;

echo done

Freitag, 29. April 2011

Resize LUKS crypted partition without and sans LVM

Wer mal wissen will wie sowas von statten geht, hier meine Anleitung.


newSizeInByte=$2
newSizeInSectors=$[$newSizeInByte/512];
cryptDevice="$1"
cryptedDevice="/dev/mapper/resizeDevice"

echo "Opening the crypt partition"
cryptsetup luksOpen "$cryptDevice" "$cryptedDevice"

echo "Resizing cryptED partition";
resize2fs "$cryptedDevice" $newSizeInSectors;

echo "Resizing crypt partition";
cryptsetup --size $newSizeInSectors resize "$cryptedDevice"

offset=2056
echo "Guessing offset to $offset sectors";
cryptsetup status "$cryptedDevice" \| grep offset

echo "Closing crypt partition";
cryptsetup luksClose "$cryptedDevice"

echo "Resizing crypt containing partition";
cryptSizeInKiloByte=$[($newSizeInSectors+$offset)/2];
fdisk "$cryptDevice" < echo -e "p\nd\nn\np\n1\n\n${cryptSizeInKiloByte}K\np\nw"

Donnerstag, 28. April 2011

Schmecken lassen!

Heute möchte ich mich über eine Floskel aufregen. Die Floskel lautet schmecken lassen!" und hat sich in Jena ziemlich eingebürgert. Ich behaupte die Wurzel dieses Ausdrucks - zumindest in Jena - sind die meist unfreundlichen, Mitarbeiter der nichts desto trotz erfolgreichen Frittenbude Fritz Mitte in der Jenaer Wagnergasse*. Ich behaupte weiterhin, dass die Floskel dem Versuch entspringt die so genannte Berliner Schnauze zu imitieren.
Und in der Tat, auf den ersten Blick beim ersten Hören klingt "schmecken lassen!" wie die freundliche Aufforderung "lassen Sie es sich schmecken/lass es dir schmecken" oder sogar - zugegeben weit gegriffen - "Guten Appetit". Nur eben verkürzt durch die humorvolle Formulierung als dreist-frechen Befehl. Der Humor liegt ganz offensichtlich also im überraschend Unfreundlichen, obwohl alle wissen, es kann ja gar nicht unfreundlich gemeint sein, schließlich ist die Kundin ja Königin, einer sonst freundlichen Umgangsform.
Doch leider nutzt sich dieser Humor ab, nach dem zweiten, zehnten oder hundertsten Mal klingt "schmecken lassen!" eben nicht mehr wie eine Einladung mit Augenzwinkern, mit Humor verpackt à la, wir kennen uns, wir können so miteinander umgehen, sondern eher wie die unfreundliche Aufforderung sich nicht zu beschweren, getragen von der arroganten Annahme es sei gar nicht möglich etwas an dem Essen auszusetzen. Und was am Anfang unglaublich klingt - der Wirt oder die Servicekraft wäre unfreundlich - rückt durch die ständige Wiederholung durchaus in den Bereich des Möglichen.
Wir fassen zusammen: ich verstehe die ursprüngliche Intention der Floskel und kann sogar erklären warum sie (eigentlich) lustig ist. Dennoch wünsche ich mir, dass der inflationäre Gebrauch von jeder und jedem der mir Essen (oder Trinken) serviert eingestellt wird um die ursprünglich Intention, nämlich mit Freude, gut gelaunt und erfrischt durch einen Scherz zu Mahl zu schreiten, nicht zu zerstören.

* Ich mag zwar die Pommes bei Fritz Mitte ebenso wie die Currywurst, muss jedoch zugeben, dass mir das Essen dort inzwischen auf den Magen schlägt, es ist mir zu fettig. Und Abends/Nachts nach der Rose (oder wohl aufgrund meines gefühlten Alters eher ähnlichen Gelegenheiten) wenn ich also betrunken und mit ordentlichem Appetit derartige Bedenken beiseite wischend nach einer Alternative zu Döner suche hat Fritz Mitte leider schon lange geschlossen.

Donnerstag, 7. April 2011

Snipplets I

Sprache: Bash
Ziel: Auflisten der zuletzt geänderten PHP-Skript in einem Dateibaum mit Ausnahme gecachter vorberechneter Skripte im Ordner './cache/':

ls -l $(
  find -type f -iname '*.php' -printf '%C@ %p\n' | \
  sort -r | \
  grep -v ' ./cache/' | \
  head -5 | \
  cut -d ' ' -f '2-'
)

Auto-Taptetenwechsel

Eine der vielen Seiten die eine nette Sammlung von Hintergrundbildern anbieten habe ich mich spontan für http://interfacelift.com entschieden. Jeden Tag möchte ich auf meinen gnome2 Desktop ein neues Hintergrundbild sehen.
Hier das nötige Skript welches per crontab regelmäßig aufgerufen wird:

UPDATE: Jetzt auch im Repository zu finden


#!/bin/bash

# Ich speichere die letzte Aufrufnummer am Ende des Skripts
counter=$(tail -1 "$0");
# Mein default user agent für wget
user_agent="Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16";
# gnome2 speichert den Desktophintergrund in diesem "registry" key
gconf_key="/desktop/gnome/background/picture_filename"

# da nicht jede Nummer einem Hintergrundbild entspricht wird
# solange gesucht bis eine Nummber gefunden wird die passt
while [[ ! "$page_name" ]]; do
  counter=$[$counter+1];
  base_url="http://interfacelift.com/wallpaper/details/"$counter"/"
  forward=$(wget -q -O - $base_url | sed -n '/URL=/{s%^.*\(http://.*\.html\).*$%\1%;p}');
  page_name=$(echo $forward | sed 's%^.*/\(.*\)\.html.*$%\1%;s/_//;');
done;

die beste 4:3 Auflösung raussuchen
resolution=$(wget -q -O - -U "$user_agent" $forward | sed -n '/4:3/{n;s%^.*>\([0-9]*x[0-9]*\)<.*$%\1%;p}');
page_id=$(printf %05d $counter);
image_url="http://interfacelift.com/wallpaper/7yz4ma1/"$page_id"_"$page_name"_"$resolution".jpg";

# Bild mit temporärem Dateinamen als Hintergrundbild setzen
tmp_filename=$(tempfile);
wget -q -U "$user_agent" -O $tmp_filename --referer=$forward $image_url;
gconftool-2 -s "$gconf_key" --type "string" $tmp_filename

# neuen Coutner im Skript setzen
tmp_filename=$(tempfile);
(head -n -2 "$0"; echo; echo $counter) > $tmp_filename;
cat $tmp_filename > "$0";
rm $tmp_filename;
exit 0;

#Counter

0