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

Freitag, 11. März 2011

Salami II

In meinem letzten Post habe ich über meine Freizeitaktivitäten berichtet. Heute möchte ich ein Update geben:Als erste Antwort auf meine Anfrage habe ich eine freundliche Mail bekommen die zwar nicht großartig war, mich jedoch mit der Auskunft befriedigte, dass ich in Zukunft meine ursprüngliche Produktform zur Wiederverwendung im Supermarkt meiner Wahl vorfinden werde:
Sehr geehrter Verwender,

wir freuen uns, Sie als Kunden des Hauses Wiesenhof betrachten zu dürfen. Gerne erhalten wir Meinungen unserer Kunden, damit wir uns ständig verbessern können. Wie Sie sicherlich bereits bemerkt haben, wurde die Darreichungsform wieder geändert. Wie gewohnt bieten wir die Salami als kleine Scheibe an.

Vielen Dank für Ihre Email.


Ein großzügige Aufmerksam-
keit aus der „in keinem Fall
eine Anerkenntnis […] gel-
tend gemachter Ansprüche
abgeleitet werden“ kann. 

Das wäre sicher vollkommen genug gewesen, was ich jedoch heute in der Post vorfand (bzw. bei meinem verdutzen Nachbarn, den ich mit der Vorgeschichte begeistern konnte, abholen durfte) hat mich selbst ein wenig (positiv) überrascht. Hier also ein Blogeintrag der mich sicher aus dem Verzeichnis der selbsternannten Thüringer Blogzentrale werfen würde, wäre ich dort jemals gelistet gewesen:
Ein freundliches Präsent zur Erinnerung an meinen Wurstverkäufer 
Neben einem äußerst freundlichen Anschreiben, das ausschnittsweise zu zitieren ich mich nicht traue in der Sorge darum möglicherweise den potentiellen Lieblingssatz einer Leserin oder eines Lesers damit zu unterschlagen, erhielt der Umschlag einen Kugelschreiber und als besonderes Präsent eine Trostwurst welche ich zum Beweis hier abgelichtet präsentiere.



































































Dienstag, 1. März 2011

Wenn ich sonst nichts zu tun habe…: Salami

Jetzt wo Karl Guttenberg als Verteidigungsminister zurückgetreten ist können wir uns dankenswerter Weise endlich wieder den wirklich wichtigen deutschen Themen zuwenden.
Wenn ich sonst nichts zu tun habe kommuniziere ich gerne mit Firmen die Produkte des täglichen Bedarfs oder Lebensmittel herstellen. Also Firmen mit denen ich tagtäglich zu tun habe, deren Willkür ich jedoch schutzlos ausgeliefert bin. Natürlich wäre es mir möglich auf andere Produkte anderer Firmen zurückzugreifen, dafür müsste ich jedoch mit meiner Gewohnheit brechen und andere Läden aufsuchen, mit an einen anderen Geschmack gewöhnen oder schlicht mehr Geld bezahlen. Deshalb gehe ich den Weg des für mich geringsten Widerstandes und melde mich bei den Firmen. Die wissen nämlich manchmal gar nicht was sie für einen Flurschaden anrichten:

An die Firma Wiesenhof Geflügel:
Sehr geehrte Damen und Herren,
unsere Familie kauft seit längerem aus Überzeugung die von Ihnen hergestellte Geflügelsalami Classico. Mit Bedauern mussten wir feststellen, dass seit wenigen Wochen die Scheibengröße geändert wurde. Anstelle zweier kleiner runder Scheiben sind in der Packung nun weniger, dafür größere, ovale Salamischeiben. Sicherlich ist dieser Schritt in Ihrem Hause wohlbegründet durchgeführt worden, es ist mir jedoch wichtig Sie darüber in Kenntnis zu setzen, dass in unserem Hause die neue Dareichungsform aufgrund der Form und Größe der örtlichen Bäckereiprodukte zu unnötigen Schnippelaktionen führt.
Ich würde mich freuen, wenn Sie in Zukunft bei ähnlichen Produkten diese Problematik in Ihre Überlegungen einbeziehen würden.

Mit freundlichen Grüßen