ubuntuusers.de

3. Juli 2014

Heute geht durch die Medien, dass ein TOR Directory Server durch die NSA intensiv überwacht wird. Das soll Anlass genug sein, das Projekt zu unterstützen und mit einem weiteren Relay Server zu unterstützen. Server können immer gebraucht werden, um die Gesamtleistung des Netzwerks zu steigern und den Informationsaustausch zu beschleunigen.

Am Nachmittag habe ich bereits ein TOR Relay aufgesetzt, welches auch schon im „TOR Atlas” sichtbar ist. Anleitungen für Ubuntu Server werden vom Tor Project bereitgestellt. Die Installation und Konfiguration ist in < 10 Minuten erledigt und kein großer Aufwand.

Beim Betrieb eines TOR Relays ist übrigens Vorsicht geboten: Es ist riskant, einen sog. „Exit Node” zu betreiben, also einen Server, an dem die Anfragen aus dem Netzwerk wieder in das Internet entlassen werden. Sollte ein TOR User über den eigenen Exit Node illegales Material downloaden, sieht es von außen so aus, als wäre der Serverbetreiber der Verantwortliche. Die Nachfrage nach neuen Exit-Nodes ist hoch, trotzdem sollte man sich vor dem Betrieb eines solchen zuerst juristisch absichern, sodass man nicht für den möglichen Missbrauch des Exit Nodes haftet.

Der Betrieb eines nicht-Exit Nodes (einstellbar in der TOR Konfiguration) ist hingegen harmlos und birgt keine Risiken. Server, die keine Exit Nodes sind, werden genutzt, um die Herkunft der Anfragen zu anonymisieren.

Im Urlaub laß ich ein wunderbares Buch. The Phoenix Project.

Das eBook handelt von Bill Parmer der von heute auf morgen zum Leiter der IT des ~4 Milliarden Dollar Unternehmens befördert wird, in dem er arbeitet.

Wer ITIL, ISO20000 oder ISO27001 kennt, kennt einige Konzepte die hinter Opetations und Development stecken. Das Buch verpackt all die schönen Best Practices und Vorgehensweisen zur Beherschung moderner IT Abteilungen in einen Roman. Eine nerdige, lustige und teils schockierende Story, in der Bill die völlig marode IT im Trial and Error Verfahren trotz immer neuer Rückschläge wieder auf Kurs bringt.

Ich denke es ist großartige Alternative den ganzen trockenen Content obiger Konzepte zu ersparen und trotzdem vermittelt zu bekommen um was es im Dev/Ops Bereich geht.

Jeder der was mit IT zu tun hat: Lesen. Oder gebt es euren Chefs, damit die es lesen.

Im Urlaub laß ich ein wunderbares Buch. The Phoenix Project.

Das eBook handelt von Bill Parmer der von heute auf morgen zum Leiter der IT des ~4 Milliarden Dollar Unternehmens befördert wird, in dem er arbeitet.

Wer ITIL, ISO20000 oder ISO27001 kennt, kennt einige Konzepte die hinter Opetations und Development stecken. Das Buch verpackt all die schönen Best Practices und Vorgehensweisen zur Beherschung moderner IT Abteilungen in einen Roman. Eine nerdige, lustige und teils schockierende Story, in der Bill die völlig marode IT im Trial and Error Verfahren trotz immer neuer Rückschläge wieder auf Kurs bringt.

Ich denke es ist großartige Alternative den ganzen trockenen Content obiger Konzepte zu ersparen und trotzdem vermittelt zu bekommen um was es im Dev/Ops Bereich geht.

Jeder der was mit IT zu tun hat: Lesen. Oder gebt es euren Chefs, damit die es lesen.

Als Besitzer eines RaspberryPi und eines DHT22 Sensors habe ich ein Nagios Plugin geschrieben, welches die Temperatur und Luftfeuchtigkeit mit Hilfe des Adafruit DHT Drivers ermittelt. In der Vergangenheit hat das nicht sehr gut funktioniert, nach einigen Tagen konnten keine Werte mehr vom Sensor abgefragt werden. Nun habe ich festgestellt, dass die DHT Sensor Bibliothek inzwischen in einem Python Modul weiter gepflegt wird, mein Nagios Plugin habe ich entsprechend angepasst.

Der Quellcode des DHT Python Moduls ist bei GitHub verfügbar, mein Plugin samt PNP4Nagios Template ebenfalls. Ich hoffe nun, dass mit dem Python Modul die langen Aussetzer des DHT Sensors, welche nur durch Herunterfahren des RaspberryPi beseitigt werden konnten, Geschichte sind. Lücken in den Graphen dürfte es also bald nicht mehr geben:

check_dht

Ich verfüge über ein Samsung Galaxy Ace 5839i, auch bekannte als cooperve, welches inzwischen ein wenig in die Jahre gekommen ist und mit Android 2.3 quasi schon als veraltet angesehen werden kann. Die geringe Displayauflösung von 320×480 Pixeln und die geringe Leistung stören mich eher weniger, aber viele Apps setzen inzwischen Android 4.x voraus. Ein neues Smartphone kommt für mich vorerst nicht in Frage, aber ich beobachte seit langem das Projekt von bieltv.3.

Er und sein Team haben schon vor langer Zeit Android 4.0.4 Ice Cream Sandwich auf das alte Gerät gebracht. Leider gab es Probleme mit den Audio Treibern, was u.a. mit dem seit Android 4 veränderten Audiosystem (ALSA wurde durch TinyALSA ersetzt) und den fehlenden offenen Treibern zusammenhängt. Kurz gesagt: Lautsprecher und Mikrofon haben nie funktioniert. Inzwischen gab es Fortschritte und das Team BroadcomCM hat sich mit dem Team AndroidArmv6 zusammengetan und nun steht eine Portierung von Cyanogenmod 11 für diverse alte Geräte vor der Tür.

Die ersten noch als instabil anzusehenden Builds treffen nun langsam ein. Wer also nicht davor zurückschreckt, sein Smartphone zu flashen und mit den Vorgängen allgemein vertraut ist, sollte die Entwicklung sicherlich verfolgen wollen. Ich bin gespannt, ob dabei wirklich eine stabile und alltagstaugliche ROM entsteht oder ob ein kleines Problem die gesamte Entwicklung wieder zum erliegen bringt.

Wer heute auf die Steamseite von Limbo geschaut hat sollte mitbekommen haben dass die Entwickler nun einen verbesserten Linux Port veröffentlicht haben.
Dieser ist nun wirklich nativ jedoch können noch ein paar Bugs enthalten sein die man an die in der Ankündigung enthaltenen Email Adresse melden kann.

Da dass Spiel jetzt nativ läuft werde ich über dass Spiel auch einen Testbericht schreiben indem ausführlich auf dass Spiel eingegangen wird.
Über Steam wird dass Spiel Automatisch geupdated falls es bereits installiert ist und im Humble Store sollte dass Update ebenfalls bald verfügbar sein.

Ich nutze seit Jahren rsnapshot, um inkrementelle Backups durchzuführen. Inkrementelle Backups haben den Vorteil, dass bei jedem Backup nur geänderte oder neue Dateien übertragen werden müssen. Nicht veränderte Dateien liegen dann noch in älteren Backups vor und werden von rsnapshot mit einem platzsparenden Hardlink in das aktuelle Backupverzeichnis verlinkt. Die grundlegende Benutzung von rsnapshot ist gut im Ubuntuusers Wiki erklärt, weswegen ich nur kurz meinen Weg erläutern möchte.

Die Installation ist bei den meisten Distributionen einfach, bei Ubuntu und Fedora liegt die Software im Paket 

rsnapshot
. Die Konfiguration selbst ist ebenfalls recht einfach und liegt in einer einzigen Datei
/etc/rsnapshot.conf
 , aber die eigene Backup-Strategie sollte gut durchdacht sein. Die wichtigsten Regeln oder Fragen, die man sich stellen sollte, sind meiner Meinung nach folgende:
  1. Backups sollten stets auf einem externen Medium durchgeführt werden (z.B. ein im Netzwerk verfügbarer Server, NAS, externe Festplatte, großer USB Stick). Eine zweite Festplatte im Rechner wäre notfalls noch in Ordnung, aber bei Diebstahl oder einer Überspannung im Netzteil wäre auch das Backup betroffen.
  2. Backups sollten automatisch und regelmäßig durchgeführt werden. Zwar ist ein manuelles Backup besser als kein Backup, aber ein Datenverlust tritt vielleicht dann auf, wenn man gerade kein aktuelles Backup zur Hand hat.
  3. Es muss regelmäßig geprüft werden, ob die Backups auch wirklich ausgeführt wurden. Ich lasse mir dazu eine E-Mail schicken.
  4. Backups müssen sinnvoll und effizient durchgeführt werden. Ich sichere z.B. nicht meine gesamte Festplatte, da ich nach einem Festplattendefekt das Betriebssystem und die Programme eh per Hand neu installiere. Meine 60 GB Windows-VM sichere ich hingegen nur gelegentlich manuell, da dort keine wichtigen Daten liegen, sondern nur einige Programme, die ich manchmal benötige.
  5. Rücksichern muss geübt sein. Das beste Backup nützt nichts, wenn man nicht schnell an seine Daten gelangt und nicht weiß, wie man die Daten des Backups wieder in sein System bekommt. Ich habe bei der letzten Neuinstallation meines Desktop Rechners zwar auch ein vollständiges manuelles Backup der Festplatte mit ddrescue durchgeführt, aber die eigentliche Rücksicherung habe ich mit den Daten aus dem rsnapshot Backup durchgeführt. Dabei habe ich erfreut festgestellt, dass ich keine Verzeichnisse vergessen habe und rsnapshot so sichert, wie ich es möchte.

Nachdem ich mit grep alle Kommentare entfernt habe, sieht meine 

rsnapshot.conf
  wie folgt aus:
config_version	1.2
snapshot_root	/media/nas/Backups/rsnapshot/
no_create_root	1
cmd_cp		/usr/bin/cp
cmd_rm		/usr/bin/rm
cmd_rsync	/usr/bin/rsync
cmd_logger	/usr/bin/logger
cmd_du		/usr/bin/du
interval	daily	7
interval	weekly	4
interval	monthly	3
verbose		2
loglevel	3
logfile	/var/log/rsnapshot
lockfile	/var/run/rsnapshot.pid
exclude		/home/finn/Downloads/
exclude		/home/finn/.gvfs/
exclude		/home/lost+found/
exclude		'/home/finn/VirtualBox VMs/'
backup	/home/		desktop/
backup	/etc/		desktop/
backup	/usr/local/	desktop/

Wie man sieht, ist die Konfiguration sehr einfach. 

snapshot_root
ist das Zielverzeichnis des Backups, welches durch 
no_create_root
nicht erstellt wird, falls es nicht vorhanden ist. In der Regel ist das so gewollt, in meinem Fall ist 
/media/nas
eine gemountets NFS Share.

Als Intervalle (genauer gesagt Aufbewahrungszeiträume) nutze ich

daily
weekly
und
monthly
, somit habe ich jeweils Backups der letzten 7 Tage, 4 Wochen (genauer: 4 Sonntage) und 3 Monate (genauer: 3 Monatsanfänge, jeweils der 1. Tag im Monat). In späteren Version heißt der Parameter deswegen
retain
. Mit 
exclude
schließe ich noch ein paar Verzeichnisse aus, die nicht gesichert werden sollen. Die Verzeichnisse, die gesichert werden sollen, sind beim Parameter 
backup
angegeben. Für meinen Desktop Rechner reichen diese Verzeichnisse, auf meinem Server sind es noch ein paar weitere Verzeichnisse (u.a. /var/www).

rsnapshot
kann nun jeweils mit den Parametern
daily
weekly
und
monthly
aufgerufen werden. Dazu haben sich folgende Cronjobs für mich etabliert:
MAILTO="kontakt@finnchristiansen.de"
*/10 * * * * /usr/local/bin/set-wakeup.sh
01 0 * * * /usr/bin/mount /media/nas
02 0 1 * * /usr/bin/rsnapshot monthly
07 0 * * 0 /usr/bin/rsnapshot weekly
12 0 * * * /usr/bin/rsnapshot daily && /usr/local/bin/halt_after_backup.sh

Ein Hinweis am Rande: Mein Rechner fährt täglich um 23:55 Uhr per ACPI Wakeup hoch. Die Uhrzeit hierfür wird alle 10 Minuten gesetzt (erster Cronjob), um 00:01 wird das NFS Share gemountet und im Abstand von jeweils 5 Minuten werden eventuell anstehende monatliche Backups, wöchentliche Backups und schließlich das tägliche Backup durchgeführt. Wenn das tägliche Backup erfolgreich ausgeführt wurde, wird noch ein kleines Script aufgerufen, welches meinem NAS Bescheid gibt, dass es herunterfahren kann, der Desktop Rechner selbst wird dann auch heruntergefahren. Außerdem versendet das Script eine E-Mail und fährt den Rechner nur herunter, wenn keine Anwendungen wie z.B. Firefox oder Thunderbird laufen, was nämlich bedeuten würde, dass ich noch am Rechner sitze.

Mein Ziel war es, zuverlässige, regelmäßige Backups durchzuführen und gleichzeitig den Stromverbrauch nicht deutlich zu erhöhen, weswegen ich dieses Shutdown-Script am Ende des täglichen Backups aufrufe:

#!/bin/bash
FIREFOX_RUNNING=$(ps ax | grep -c firefox)
THUNDERBIRD_RUNNING=$(ps ax | grep -c thunderbird)
VIRTUALBOX_RUNNING=$(ps ax | grep -c VirtualBox)
RSNAPSHOD_PID=/var/run/rsnapshot.pid
if      [ $FIREFOX_RUNNING -gt 1 ] ||  
        [ $THUNDERBIRD_RUNNING -gt 1 ] ||
        [ $VIRTUALBOX_RUNNING -gt 1 ]; then
        /usr/bin/touch /media/nas/Backups/rsnapshot/finished
        sleep 1
        /bin/umount -l /media/nas
        printf "Hello, I am $(whoami)@$(hostname),\nthe Backup is finsihed.\nComputer will not halt now, some processes are still running." | mail -s "Backup done" kontakt@finnchristiansen.de
        exit 0
else
        /usr/bin/touch /media/nas/Backups/rsnapshot/finished
        sleep 1
        /bin/umount -l /media/nas
        printf "Hello, I am $(whoami)@$(hostname),\nthe Backup is finsihed.\nComputer will halt now." | mail -s "Backup done" kontakt@finnchristiansen.de
        sleep 2m
        /usr/sbin/shutdown -h now 
        exit 0
fi

Die Verwendung von rsnapshot oder anderen Backup-Lösungen ist zwar relativ einfach, aber es gibt eben einige andere Bedingungen, die man beachten muss. Je nach Situation muss man überlegen, was man wann wie wohin sichert, wie man sicherstellt, dass alles funktioniert und was man im Notfall tun muss. Vielleicht hilft es ja dem einen oder anderen ein wenig weiter.

2. Juli 2014

Mit dem folgenden Script image2html.sh kann ein Bild direkt in Html Code nach rfc2397 untergebracht werden. Dies ist nützlich um z.B. Bilder in Email Signatur zu verwenden.

#!/bin/sh

if [ $# -ne 1 ];  then
	echo "No arguments supplied"
	echo "Usage: ${0} image.jpg"
	exit 1	
fi

if [ -r ${1} ]; then
	echo "" > "${1}.html"
	exit 0
else
	echo "Can not read file ${1}"
	exit 1
fi

Erklärung:

Die Abfragen überprüfen, ob erstens genau ein Argument übergeben worden ist, und zweitens, ob dieses Argument eine lesbare Datei ist.
Der Programmaufruf file ermittelt den mime Type und das Programm base64 kodiert die übergebene Datei in das Base64 Format. Das img Tag und die beiden Aufrufe werden zum Schluss in die html Datei gespeichert und kann von dort aus kopiert werden.

Die Inbetriebnahme des NFC Moduls ist wie in dem Artikel zu lesen sehr einfach. Leider lässt sich die Ausgabe mit Hilfe von | nicht umleiten und kann somit auf der Shell nicht weiter verwendet werden.
Ich habe mit den Sourcecode(main.c) der mitgelieferten Polling Software angesehen und ein wenig angepasst, nun wird die UID des Tags in die Datei polling.log geschrieben.

Um so wenig Ausgaben wie möglich zu erhalten habe ich die meisten printf... Ausgaben aus dem Code entfernt, ausgegeben werden nun nur noch Fehlerausgaben und die UID.

Damit die Ausgabe in eine Datei geschrieben wird, habe ich folgendes in der main.c ausgetauscht.
Vorher:
printf("UID: ");
uint8_t i;
for(i = 0; i {
printf("%02X ", bUid[i]);
}
printf("\n\n");

Nachher:
uint8_t i;
FILE *f = fopen("polling.log","a+");
for(i = 0; i {
fprintf(f,"%02X", bUid[i]);
}
fprintf(f,"%s\n", "");
fclose(f);

Zusätzlich habe ich sleep(1) auf sleep(4) gesetzt.

Nach dem kompilieren kann die Software wie vorher über ./card_polling gestartet werde und die UID´s werden in die polling.log geschrieben.

Die UID´s aus der polling.log greife ich über ein kleines Shellscript ab, hierfür mussten zuvor die inotify-tools installiert werden.

apt-get install inotify-tools

Das Script selbst ist wie folgt aufgebaut:
#!/bin/bash
FILE="polling.log"
while true;
do
inotifywait -e modify "${FILE}"
for i in `cat ${FILE}`
do
echo $i
echo "" > ${FILE}
done
done

Wenn das Shellscript gestartet wurde, wird die polling.log überwacht.
Sobald es eine Änderung gibt wird die UID(echo $i) ausgegeben und im Anschluss wird die polling.log geleert.
Anstatt der echo $i Ausgabe könnte die UID auch in eine mysql Datenbank geschrieben werden, diese könnte dann in einem Webfrontend für zum Beispiel eine Zeiterfassung verwendet werden.
Es wäre auch möglich mit zusätzlicher Hardware ein Türschloss zu öffnen oder ein Programm auf dem Raspberry Pi zu starten.

Natürlich wäre das ganze einfacher wenn man den Sourcecode komplett anpassen würde, um zum Beispiel die UID in die mysql Datenbank zu schreiben, für mich reicht jedoch die Verwendung der UID über die Shell.

Croteam, die Erschaffer der Serious Sam Reihe, haben ein neues Spiel namens The Talos Principle für Herbst 2014 angekündigt.
In dem Spiel geht es ähnlich wie bei Portal darum Rätsel mithilfe von Gegenständen zu lösen um in dass nächste Level zu gelangen.

Es gibt bereits erste Spielszenen welche aus dem Spiel stammen und eine recht hübsche Levelgestaltung offenbart.
Die Grafik erinnert mich persönlich etwas an Serious Sam 3 jedoch wurde offenbar weiter an der Engine geschraubt.
In dem Video wird auch ein Level gespielt welches nicht nur Grafisch überzeugen kann sondern auch eine schöne Spielmechanik zeigt.

Dass Spiel wird voraussichtlich dann ab Herbst 2014 für Linux, Mac und Windows erhältlich sein jedoch ist über den Preis noch nichts bekannt.
Als Publisher wird genau wie bei Serious Sam 3 Devolver Digital genommen.
Ich freue mich schon auf dass Spiel welches einer meiner Höhepunkte 2014 werden wird.

Häufig arbeite ich mit PDF Dateien, das Portable Document Format ist wohl das gängigste Dateiaustauschformat für Dokumente. Die Vorteile liegen auf der Hand, anstatt proprietäre Dateien z.B. von Microsoft Word auszutauschen, kann eine PDF Datei erzeugt werden. Erstens kann diese PDF Datei auf beinahe jedem Gerät mit einem gängigen PDF Betrachter geöffnet werden und behält dabei das ursprüngliche Aussehen bei. Zweitens ist die Bearbeitung der PDF Dateien in der Regel nicht gewollt und nur eingeschränkt mit einem entsprechenden Editor möglich. Eine Ausnahme bilden Formulare, bei denen eine Ausfüllung entsprechend dafür vorgesehener Felder möglich. Wie auf den meisten anderen Rechnern auch, liegen auf meinem jede Menge PDF Dateien, einige davon sind selbst erzeugt. Ich möchte kurz zeigen, welche Werkzeuge ich nutze, um mir den Alltag ein wenig zu erleichtern.

LibreOffice und OpenOffice bieten seit langer Zeit die Möglichkeit, Dokumente als PDF Datei zu exportieren. Für das Scannen nutze ich SimpleScan, welches ebenfalls beim Speichern mehrseitige PDFs erstellen kann.

Wenn ich z.B. mit LibreOffice erstellte PDF Dateien mit eingescannten Dokumenten zu einem PDF Dokument zusammenführen möchte, nutze ich

pdfunite
 , welches neben vielen anderen nützlichen Tools im Paket 
poppler-utils
  enthalten ist:
pdfunite Dokument-Teil-1.pdf Dokument-Teil-2.pdf Dokument-Vollständig.pdf

Die Benutzung ist denkbar einfach: Man gibt anfangs beliebig viele PDF Dokumente an, die dann in eine gemeinsame Datei, die als letzter Parameter angegeben wird, an.

Mit 

pdfinfo
  lassen sich ein paar allgemeine Informationen zu einem PDF Dokument anzeigen:
pdfinfo foobar.pdf
Tagged:         no
Form:           none
Pages:          10
Encrypted:      no
Page size:      841.92 x 595.32 pts (A4)
Page rot:       0
File size:      547124 bytes
Optimized:      no
PDF version:    1.5

Eventuell möchte man dieses 10 seitige Dokument ja in seine Einzelzeile zerlegen, dazu könnte man z.B. jede Seite in einem einzelnen PDF Dokument speichern, 

pdfseparate
  hilft dabei:
pdfseparate foobar.pdf foobar_page_%d.pdf

Das 

%d
  ist hier das Pattern, welches für die Ausgabedateinamen verwendet wird, es wird für jede Datei durch die entsprechende Seite ersetzt. Aber vielleicht möchte man ja auch nur an die Bilder eines PDF Dokumentes, dies funktioniert mit
pdfimages
 .
pdfimages foobar.pdf filename-prefix

Ebenso einfach ist es, den Text aus einem PDF Dokument zu extrahieren:

pdftotext foobar.pdf

Mit diesem Befehl wird nun eine foobar.txt erstellt, welche den im Dokument enthaltenen Text enthält. Dies funktioniert natürlich nur bei Text, der auch als solcher eingebunden ist. Wurde der Text in Form eines Bildes in das Dokument integriert, funktioniert diese Methode nicht.

Anstelle der reines Textausgabe kann man auch eine HTML Ausgabe verwenden, welche Text und Bilder beinhaltet:

pdftohtml foobar.pdf

Mit den poppler-utils lässt sich schon eine Menge anfangen, wer mehr machen möchte, kann sich GhostScript ansehen, welches deutlich komplexere Möglichkeiten bietet. Für den Alltag reichen mir aber die poppler-utils.

Wer so wie ich gerne mit Shellscripten experimentiert sucht irgendwann nach einer Möglichkeit Daten aus den Scripten in eine externe Datei auszulagern. Für diesen Zweck nutze ich gerne CSV das sind Textdateien mit einfach strukturierten Daten. In Kombination mit Zenity lassen sich Daten Ein und Ausgaben sehr leicht realisieren. In diesem Artikel möchte ich erklären wie das funktioniert.

Daten erfassen

Viele Wege führen nach Rom manche sind bequem und einige eher unbequem. Es gibt verschiedene Lösungen eine CSV Datei anzulegen und diese mit Daten zu füttern. Eine Möglichkeit wäre der Weg über einen Texteditor. Die einzelnen Daten in der Abbildung sind durch ein Semikolon das ist ein so genannter Separator ( Feldtrenner ) getrennt:

Eine weitere Lösung wäre die CSV Datei mit der Tabellenkalkulation von Open Office zu verwalten:

Man könnte auch die Daten direkt über die Konsole in eine CSV Datei schreiben:

[codesyntax lang=”bash”]

echo "Zahnarzt;29.06.2013;15:00Uhr;1 Stunde" >>Beispiel.csv

[/codesyntax]

Sehr bequeme aber ist das Erstellen einer Eingabemaske mit Zenity und diese über ein Shellscript aufzurufen:

Eine Eingabemaske in dieser Form ist mit wenig Aufwand schnell erstellt. Für das Beispiel in der Abbildung kommt folgender Code zum Einsatz:

[codesyntax lang=”bash”]

termin=$(zenity --forms --title="Terminator" --text="Einen neuen Termin anlegen" --separator=";" --add-entry="Termin" --add-calendar="Datum" --add-entry="Uhrzeit" --add-entry="Dauer")

[/codesyntax]

Sieht auf den ersten Blick für jemanden der Zenity nicht kennt kompliziert aus, ist es aber nicht. In dem Codebeispiel wird die abgebildete Eingabemaske mit der Zenity Funktion –forms erstellt. Nachdem die Felder ausgefüllt und der OK Button geklickt wurde wird aus den Eingaben ein durch das Semikolon getrennter Datensatz erzeugt und in der Variable $termin gespeichert. Mann kann den Datensatz auch direkt in die entsprechende CSV Datei schreiben lassen:

[codesyntax lang=”bash”]

zenity --forms --title="Terminator" --text="Einen neuen Termin anlegen" --separator=";" --add-entry="Termin" --add-calendar="Datum" --add-entry="Uhrzeit" --add-entry="Dauer" >>Beispiel.csv

[/codesyntax]

Zenity –forms bietet zahlreiche Möglichkeiten für das Erstellen von Eingabemasken, eine Übersicht erhält man in der Konsole mit

[codesyntax lang=”bash”]

zenity --help-forms

[/codesyntax]

Daten ausgeben

Genauso einfach wie das erfassen von Daten ist die Ausgabe der Daten einer CSV Datei, Zenity bietet dafür die Funktion –list. Mit folgendem Code listet Zenity die Daten der erstellen Beispiel.csv auf:

[codesyntax lang=”bash”]

awk -F ";" '{print $1"n"$2,"n"$3,"n"$4,"n"$5}' Beispiel.csv | zenity --list  --column "Termin" --column "Datum" --column "Uhrzeit" --column "Dauer"  --separator=";" --print-column=all --width=600

[/codesyntax]

Die gezeigten Codebeispiele lassen sich sehr leicht an eigene Bedürfnisse anpassen und in Scripte verbauen.

The post Kleine CSV Datenbanken mit ZENITY verwalten appeared first on Radiolauscher.de.

1. Juli 2014

Zusammen mit der Fußball-WM nähert sich auch der Call for Papers so langsam dem Ende. Nur noch anderthalb Monate, d.h. bis zum 15. August 2014, können interessierte Referenten ihre Ideen für Ubucon-Vorträge an idee@ubucon.de schicken. Thematisch ist die Ubucon für alles offen, es sollte nur mit Ubuntu, Linux und/oder Open Source zu tun haben. Ob Vortrag, Workshop oder eine Diskussion – alles ist gefragt.

Aber nicht nur Referenten, auch alle Besucher können uns über idee@ubucon.de mitteilen, an welchen Themen sie Interesse haben. Die Themen werden dann in der Themenwunschliste zur Ubucon 2014 gesammelt und interessierte Referenten können sich daran orientieren, wenn sie möchten.

Aktuell ist die Programmseite noch recht leer. Die Ubucon steht unter dem Motto „10 Jahre Ubuntu, 10 Jahre Community“, und so kann die starke Community auch mitmachen und das Programm aktiv gestalten.

Projekte organisieren mit Trello.com

Heute möchte ich ein Web-Tool zur Organisation von Projekten vorstellen: https://trello.com

Trello nutzt „Listen“, welche sich auf sogenannten „Boards“ befinden, um verschiedene Kategorien in einem Projekt abzubilden. Diese Listen beinhalten „Cards“, welche wiederum verschiedene Elemente (Checklisten, Bilder, E-Mails, Kommentare, etc.) enthalten können. Dabei empfehle ich das Tool einfach mal auszuprobieren, bevor man sich diesen und weitere Texte durchliest.

Live-Beispiel:  suckup.de

https://trello.com/b/SgOH9gbE/it-blog-suckup-de

Als Live-Beispiel möchte ich meinen Blog nutzen. Ich versuche meine Blog-Posts nun via Trello & Google-Docs zu organisieren. Dazu habe ich einige Kategorien (Blog-Ideen, Blog-Query, Blog-Artikel und Done) angelegt und bereits einige Themen-Vorschläge eingefügt.

trello

Weitere Überlegungen

Momentan überlege ich, wie man dieses grandiose Tool auch in der täglichen Arbeit einsetzten kann. Dazu würde ich zunächst (ganz noch Projektgröße) verschiedene Trello-Boards anlegen. Dabei kann man „Boards“ auch in bestimmten „Organisations“ anlegen, was ggf. eine bessere Übersichtlichkeit liefert.

Unbenannt-4

z.B. einige fiktive Organisation für meine private Webseite: http://moelleken.org

– „Planung“
– „Development“
– „Bugs“
– („Refactoring“)
– („Roadmap“)

Unbenannt-2

Dabei können die verschiedenen Tasks zur nächsten Projektphase weitergereicht werden.

Planung: erste Ideen
Trello_planung

Planung: konkrete Beschreibungen und Vorstellungen (hier sollten nach externe Dokumente / Bilder etc zur Beschreibung beigefügt werden)
Trello_planung2

Development: Bugs, Refactoring-Maßnahmen und neue Features können z.B. in einem Team Meeting in diese Kategorie verschoben und Priorisiert werden.
Trello_dev

Development: jeder im Team kann sehen, wer welches Feature, Bug etc. bearbeitet (dies Übersicht kann man mit farblichen „Labels“ noch verbessern)
Trello_dev2

Am Ende der Woche kann man ein Fazit ziehen und ggf. im Team vorstellen, welche Tasks umgesetzt wurden, dies förder die Motivation, bringt Strukturen in das Projekt und verteilt das Wissen nebenbei noch auf verschiedene Mitarbeitet.

Fazit

Noch kann ich nicht sagen, ob diese Überlegungen auch im täglichen „Doing“ einsetzbar oder von Vorteil sind. Daher folgt in den nächsten Tagen / Wochen ein weitere Blog-Post, welcher soeben unter „https://trello.com/b/SgOH9gbE/it-blog-suckup-de“ geplant wird. ;)

Links

Trello: Projektmanagement leicht gemacht
Productivity-Tools: Projekte organisieren mit Trello.com

30. Juni 2014

Nach der Durchführung des letzten ownCloud Updates von der Version 6.0.3 auf die Version 6.0.4 musste ich leider feststellen, dass ownCloud nicht mehr funktionierte. Ich nutze CentOS 6.5 und dort ist PostgreSQL in der Version 8.4 vorhanden. Mit dem ownCloud Update wurde nun eine Versionskontrolle für die PostgreSQL Datenbank eingefügt. Ich habe beim ownCloud-Upgrade von Version 5 auf Version 6 übersehen, dass Version 6 nun eine PostgreSQL Version >= 9 benötigt.

Ich muss mir nun dringend Gedanken über das weitere Verbleiben mit ownCloud machen, da die Anforderungen von Version 6 und vermutlich mindestens ebenso die Version 7 nicht mehr durch CentOS 6.5 gedeckt werden. Als Übergangslösung habe ich mir den entsprechenden Commit genauer angesehen und eine sehr dreckige Lösung angewendet. Die neu hinzugekommen Zeilen bzw. genauer gesagt nur die relevanten Teile habe ich auskommentiert:

/**
         * Check the database version
         * @return array errors array
         */
        public static function checkDatabaseVersion() {
                $errors = array();
                $dbType = \OC_Config::getValue('dbtype', 'sqlite');
                if ($dbType === 'pgsql') {
                        // check PostgreSQL version
/*                      try {
                                $result = \OC_DB::executeAudited('SHOW SERVER_VERSION');
                                $data = $result->fetchRow();
                                if (isset($data['server_version'])) {
                                        $version = $data['server_version'];
                                        if (version_compare($version, '9.0.0', '<')) {
                                                $errors[] = array(
                                                        'error' => 'PostgreSQL >= 9 required',
                                                        'hint' => 'Please upgrade your database version'
                                                );
                                        }
                                }
                        } catch (\Doctrine\DBAL\DBALException $e) {
                                \OCP\Util::logException('core', $e);
                                $errors[] = array(
                                        'error' => 'Error occurred while checking PostgreSQL version',
                                        'hint' => 'Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error'
                                );
                        }   */
                }
                return $errors;
        }

Das ist absolut keine zufriedenstellende Lösung, aber ownCloud lief bisher auch mit PostgreSQL 8.4 fehlerfrei, weshalb ich vorerst so verbleibe. Falls jemand eine Lösung parat hat, die nicht darin besteht, nicht vertrauenswürdige Repositories oder eine andere Distribution zu verwenden, dann bin ich über einen Hinweis sehr dankbar.

In letzter Zeit habe ich in diesem Blog ein paar Beiträge zum Sieve Filter mit Dovecot veröffentlicht. Bisher habe ich meine Filterregeln immer direkt auf den Server geschoben oder Roundcube mit einem Sieve Plugin genutzt – jetzt habe ich auch eine Lösung für Mozilla Thunderbird gefunden. Natürlich ist mir gleich das Sieve Addon im Mozilla Addons Directory aufgefallen – dieses Addon hat mit der neuen Thunderbird Version aber nicht funktioniert.

In den Kommentaren unter der Addonseite habe ich aber noch einen kleinen, entscheidenden Tipp gefunden: Es gäbe eine Nightly Version des Addons, die auch mit der neuesten Thunderbird Version funktioniere. Und tatsächlich – das Sieve Addon funktioniert ohne Probleme. Endlich kann ich meine Sieve Filter auch unter Thunderbird verwalten.

Die Nightly Version kann hier heruntergeladen werden (Direktlink!): https://github.com/thsmi/sieve/blob/master/nightly/0.2.3/sieve-0.2.3d.xpi?raw=true

Sieve Addon für Thunderbird

Nach der Installation (Plugin Datei mit Mozilla Thunderbird öffnen) wird die Sieve Unterstützung für jedes einzelne E-Mail Konto in den Konteneinstellungen aktiviert. Von dort gelangt man auch zu den Filtereinstellungen.

Leider müssen bei dem Addon für Thunderbird die Scripts wirklich von Hand gescripted werden, und werden nicht aus Formulareingaben generiert, wie es bei dem Roundcube Plugin der Fall ist. Wer sich mehr Komfort wünscht, wird wohl weiterhin auf Roundcube setzen müssen.

Weitere Sieve Clients sind übrigens hier aufgelistet: http://sieve.info/clients

29. Juni 2014

Die Sitzungswiederherstellung ist ein wichtiges Feature von Firefox, denn diese gewährleistet, dass wir Firefox mit den Seiten starten können, mit denen Firefox beendet wurde, ganz gleich ob Firefox freiwillig oder unfreiwillig durch einen Absturz beendet wurde. Umso ärgerlicher ist es, wenn die Sitzungswiederherstellung versagt. In Firefox 33 hat Mozilla die Sitzungswiederherstellung robuster gemacht, um so die Wahrscheinlichkeit von Datenverlusten zu verringern.

Wenn wir Firefox beim Starten die Tabs der letzten Sitzung wieder öffnen lassen, dann zeigt sich dafür die Komponente der Sitzungswiederherstellung verantwortlich, genau wie nach der Installation eines Add-ons und dem dazu unter Umständen notwendigen Browserneustart oder auch, nachdem Firefox abgestürzt ist. Unter bestimmten Umständen kann es allerdings passieren, dass Firefox die Daten der letzten Sitzung nicht lesen kann. Was dann passiert, kann unheimlich ärgerlich sein: Firefox startet mit einem leeren Fenster ohne die zuletzt geöffneten Tabs. Im Normalfall sollte dies nicht passieren, die Möglichkeit besteht aber immer. Darum hat Mozilla die Sitzungswiederherstellung in Firefox 33 überarbeitet und die Wahrscheinlichkeit einer nicht erfolgreichen Sitzungswiederherstellung deutlich verringert.

Was Firefox im Falle einer Sitzungswiederherstellung wiederherstellt, das sind nicht nur die Webseiten an sich, sondern auch deren Status, sprich Formulareingaben, Session-Cookies, Scroll-Position und so weiter. Davon fertigt Firefox alle 15 Sekunden eine Momentaufnahme an, denn wir möchten die Daten ja auch dann wiederhaben, wenn Firefox unfreiwillig beendet worden ist.

Dazu schreibt Firefox den Inhalt der aktuellen Sitzung regelmäßig in die Datei sessionstore-backups/recovery.js. Zunächst wird der vorherige Inhalt dieser Datei in die Datei sessionstore-backups/recovery.bak geschrieben, sofern es sich dabei um eine gültige Datei zur Sitzungswiederherstellung handelt. In den meisten Fällen handelt es sich bei beiden Dateien um gültige Dateien mit einer Momentaufnahme von Firefox, die weniger als 15 Sekunden respektive weniger als 30 Sekunden im Falle der .bak-Datei alt ist. Beim Beenden von Firefox wird die Sitzung in der Datei sessionstore.js gespeichert. Wird Firefox dann wieder gestartet, schreibt Firefox diesen Inhalt nach sessionstore-backups/previous.js. Existiert diese Datei, dann handelt es sich dabei in jedem Fall um eine gültige Datei zur Sitzungswiederherstellung mit dem Status von Firefox beim letzten sauberen Beenden. Beim ersten Starten nach einem Update kopiert Firefox den Inhalt der Datei sessionstore.js, sofern verfügbar und valide, nach sessionstore-backups/upgrade.js-[build-id].

Zusammengefasst noch einmal der Inhalt der Dateien zur Sitzungswiederherstellung:

  • sessionstore.js: Sitzung vor dem letzten sauberen Beenden von Firefox. Nicht nach einem Absturz.
  • sessionstore-backups/recovery.js: Sitzung etwa 15 Sekunden vor dem Beenden oder Absturz von Firefox. Die Datei existiert nicht nach einem sauberen Beenden, wenn die Privatsphäre-Einstellungen von Firefox ein Löschen der Chronik beim Beenden vorsehen.
  • sessionstore-backups/recovery.bak: Sitzung etwa 30 Sekunden vor dem Beenden oder Absturz von Firefox. Die Datei existiert nicht nach einem sauberen Beenden, wenn die Privatsphäre-Einstellungen von Firefox ein Löschen der Chronik beim Beenden vorsehen.
  • sessionstore-backups/previous.js:  Sitzung vor dem vorletzten sauberen Beenden von Firefox.
  • sessionstore-backups/upgrade.js-[build-id]: Sitzung nach dem letzten Firefox-Update.

Bei der Wiederherstellung einer Sitzung geht Firefox nun wie folgt vor:

  • In den meisten Fällen existiert eine gültige Datei sessionstore.js, welche Firefox wiederherstellt.
  • Existiert diese Datei nicht oder ist diese nicht gültig, versucht Firefox die Datei sessionstore-backups/recovery.js.
  • Existiert diese Datei nicht oder ist diese nicht gültig, versucht Firefox die Datei sessionstore-backups/recovery.bak.
  • Existiert diese Datei nicht oder ist diese nicht gültig, versucht Firefox die Datei sessionstore-backups/previous.js.
  • Existiert diese Datei nicht oder ist diese nicht gültig, versucht Firefox die Datei sessionstore-backups/upgrade.js-[build-id].

via: Ghacks

Am Freitag ist die neue Ausgabe des englischsprachigen Magazins Full Circle Magazine erschienen. Themen der 86. Ausgabe sind unter anderem

  • Git Server & Branches
  • Python-Programmierung – Teil 55
  • Libre Office – Teil 38: Inhaltsverzeichnis und Index
  • Grub2 und Multibooting – Teil 2
  • Blender-Tutorial – Teil 11c
  • Inkscape-Tutorial – Teil 24
  • Arduino
  • Linux Lab: Verlorene Daten wiederherstellen
  • Ubuntu Games: Steam-Konto verschieben
  • News, Leserbriefe und mehr

Links: Webseite, Forum und Wiki

Der Wochenrückblick lässt das Geschehen der vergangenen Woche rund um Ubuntu, Linux und Open Source Revue passieren.

Rund um Ubuntu

Erste Alpha von Ubuntu 14.10 veröffentlicht

Für die Ubuntu-Derivate Kubuntu, Lubuntu, Ubuntu GNOME, UbuntuKylin und Ubuntu Cloud wurden die erste Alpha-Versionen des kommenden Ubuntu 14.10 „Utopic Unicorn“ veröffentlicht. Es handelt sich dabei aber um einen Version für Entwickler und Tester und sollte nicht für den Produktivbetrieb eingesetzt werden.

Quellen: Pro-Linux, OMG!Ubuntu!, Ubuntu Fridge

Unity 8 und Mir vs. GTK+-Programme

Bisher unterstützt Unity 8 und der Canonical-eigene Display-Server Mir nur native Anwendungen. Dies ist eine große Einschränkungen für die Verwendungen außerhalb von Ubuntu Touch, z.B. auf dem Deskop. Das Entwicklerteam von Ubuntu arbeitet daher an der Möglichkeit, auch GTK+-Programme laufen zu lassen. Eine experimentelle Version steht schon zum Testen bereit.

Quelle: Golem, OMG!Ubuntu!

Umstieg auf systemd

Auf dem Ubuntu Online Summit hat das Ubuntu-Server-Team auch den Umstieg auf systemd diskutiert. Wahrscheinlich wird aber erst Ubuntu 16.10 in zwei Jahren komplett von Upstart umgestellt sein.

Quelle: Golem

Ubuntu-One-Downloader-Skript

Canonical hat ein Skript veröffentlicht, das es ermöglicht, seine kompletten Daten vom Online-Speicher Ubuntu One herunterzuladen. Der Dienst wurde von Canonical Anfang April eingestellt. Alle Anwender haben nur noch bis zum 31. Juli 2014 Zeit, ihre Daten zu sichern.

Quelle: OMG!Ubuntu!

Support für Ubuntu 13.10 endet bald

Am 17. Juli 2014 endet der Unterstützungszeitraum für Ubuntu 13.10 „Saucy Salamander“. Wer diese Distribution noch einsetzt, sollte sobald wie möglich auf den Nachfolger Ubuntu 14.04 „Trusty Tahr” aktualisieren. Trusty ist auch eine LTS-Version, die noch bis April 2019 mit Sicherheitsupdates versorgt wird.

Quelle: Ubuntu Fridge

Ubuntu Touch Core App Hack Days

Vom 30. Juni bis zum 4. Juli 2014 stehen wieder die Ubuntu Touch Core App Hack Days an, bei denen interessierte Entwickler sich auf das Erweitern oder Fertigstellen der Kernanwendungen für Ubuntu Touch konzentrieren. Neu ist, dass diesmal auch Ubuntu-App-Entwickler von Nicht-Kernanwendungen ihre Programme einbringen können, denen dann Unterstützung zugesagt wird.

Quelle: Ubuntu Developer Blog

Full Circle Magazine #86 erschienen

Diese Woche ist die neue Ausgabe des englischsprachigen Magazins Full Circle Magazine erschienen. Themen der 86. Ausgabe sind unter anderem Python, LibreOffice, GRUB2, Blender, Inkscape und Arduino.

Quelle: Full Circle Magazine

Neues rund um Linux

TeX Live 2014 erschienen

Es ist schon etwas her, aber TeX Live 2014 ist vorletzte Woche erschienen. Es hat sich zwar viel getan, für den einfacher TeX- bzw. LaTeX-Anwender aber ändert sich kaum etwas. Die ganzen Updates der CTAN-Pakete sind natürlich enthalten. Ob diese alle voll kompatibel sind zu früheren Versionen, ist mir nicht bekannt. In der Regel sind sie es leider nicht.

Quelle: TeXwelt

Spielen unter Linux

XCOM: Enemy Unknown veröffentlicht

Mitte Juni haben Fireaxis und Feral Interactive ihr Spiel XCOM: Enemy Unknown für Linux veröffentlicht. Das Strategiespiel wurde bereits 2012 für Windows veröffentlicht und folgt nun zwei Jahre später auch für Linux. Derzeit ist das Spiel bei Steam noch für kurze Zeit im Angebot.

Quellen: LinuxGames, Pro-Linux, OMG!Ubuntu!

Hardware und Mobiles

Vivaldi und Improv eingestellt

Das KDE-Tablet Vivaldi, was im Juli 2013 noch in der Testphase war, wurde laut offiziellen Berichten eingestellt. Aus dem Tablet, das von KDE-Entwickler Aaron Seigo erdacht wurde, ging auch die Idee für den Platinenrechner Improv hervor. Dieser sollte ebenfalls MerOS als Betriebssystem einsetzen. Aber auch Improv wurde wegen der geringen Vorbestellungen eingestellt.

Quelle: Pro-Linux

Ich hab seit meinem ersten eigenen Rechner (ein Medion Titanium MD 8080 XL aus dem Aldi :D) eine Infrarot-Fernbedienung herumliegen.
[Oh je, das ist auch schon wieder ueber 11 Jahre her ... Krass.]

Meine alte Infrarot-Fernbedienung mit Empfaenger

Nun ist sie mir wieder in die Haende gefallen und ich hab ein bisschen damit herumgespielt. Das hatte ich auch schonmal gemacht, aber frueher hat das irgendwie nicht so geklappt mit Linux und ich war wahrscheinlich auch nicht so dahinter ;)
Nun klappt das mit LIRC (Linux Infrared Remote Control) ganz hervorragend, d.h. ich kann nun noch fauler sein und vom Bett aus z.B. Filme starten ;)

Ich beschreibe hier mal, wie ich das alles zum Laufen gebracht habe und wie ein paar Programme damit gesteuert werden koennen.
Tipp: Mit dwm zusammen ist das Steuern einfach nur awesome :D

Uebersicht

Das Wiki von Arch Linux beschreibt hier ganz gut, wie LIRC (Linux Infrared Remote Control) funktioniert und welche Konfigurationsdateien wo und wie benoetigt werden.
Dem habe ich nichts hinzuzufuegen ;)

Installation

Dazu reicht ein einfaches:

# pacman -S lirc lirc-utils

Konfiguration

Wie hier beschrieben wird, bringt mir die normale Konfiguration von LIRC leider recht wenig, da die vorhandenen Konfigurationsdateien nicht fuer dieses Geraet geeignet sind und eine eigene Konfigurationsdatei zu aufwendig zu erstellen ist. Also folgen wir einfach der Anleitung Setup a HID device with LIRC ;)

Erstmal mussen wir das passende Event unterhalb von /dev/input herausfinden. Dazu folgen wir diesem Link (und dann jeweils den anderen Links):

$ ls -l /sys/class/rc/rc0
lrwxrwxrwx 1 root root 0 Jun 29 11:53 /sys/class/rc/rc0 -> ../../devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.4/1-1.5.4:1.0/rc/rc0/

$ ls -l /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.4/1-1.5.4:1.0/rc/rc0
[..]
drwxr-xr-x 6 root root    0 Jun 29 11:53 input67/
[..]

$ ls -l /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.4/1-1.5.4:1.0/rc/rc0/input67
[..]
drwxr-xr-x 3 root root    0 Jun 29 11:53 event19/
[..]

Also ist in diesem Fall das Event event19, womit wir mit dem folgenden Befehl die ID von dem USB-Geraet herausfinden koennen:

$ ls -l /dev/input/by-id
[..]
lrwxrwxrwx 1 root root 10 Jun 29 11:53 usb-X10_Wireless_Technology_Inc_USB_Receiver-event-if00 -> ../event19
[..]

In diesem Fall ist nun die richtige ID usb-X10_Wireless_Technology_Inc_USB_Receiver-event-if00.
Die tragen wir nun als LIRC_DEVICE in die /etc/conf.d/lircd.conf ein:

LIRC_DEVICE="/dev/input/by-id/usb-X10_Wireless_Technology_Inc_USB_Receiver-event-if00"
LIRC_DRIVER="devinput"
LIRC_EXTRAOPS=""
LIRC_CONFIGFILE="/etc/lirc/lircd.conf"

Die Konfigurationsdatei /etc/lirc/lircd.conf muessen bzw. koennen wir zum Glueck nicht selbst erstellen, also laden wir uns einfach diese hier aus dem Netz herunter:

# mv /etc/lirc/lirc.conf /etc/lirc/lirc.conf.orig
# wget http://sourceforge.net/p/lirc/git/ci/master/tree/remotes/devinput/lircd.conf.devinput?format=raw -O /etc/lirc/lircd.conf

Wenn noch nicht geschehen, sollte noch das Kernelmodul evdev geladen werden:

# modprobe evdev

Unter systemd muessen wir nun die lirc.service-Datei anpassen (Quelle):

# cd /usr/lib/systemd/system
# mv lirc.service lirc.service.bak

Nun eine neue Datei lirc.service erstellen, mit folgendem Inhalt:

[Unit]
Description=LIRC Daemon
After=network.target

[Service]
Type=forking
EnvironmentFile=/etc/conf.d/lircd.conf
PIDFile=/run/lirc/lircd.pid
ExecStartPre=/bin/mkdir -p /run/lirc
ExecStartPre=/bin/rm -f /dev/lircd
ExecStartPre=/bin/rm -f /run/lirc/lircd
ExecStartPre=/bin/ln -s /run/lirc/lircd /dev/lircd

ExecStart=/usr/sbin/lircd -d $LIRC_DEVICE -P /run/lirc/lircd.pid -H $LIRC_DRIVER $LIRC_CONFIGFILE
ExecStopPost=/bin/rm -f /dev/lircd
ExecStopPost=/bin/rm -fR /run/lirc
ExecStartPost=/usr/bin/ir-keytable --protocol=LIRC

[Install]
WantedBy=multi-user.target

Die Datei sollte nun in /etc/systemd/system/multi-user.target.wants richtig verlinkt sein:

# ls -l /etc/systemd/system/multi-user.target.wants
[..]
lrwxrwxrwx 1 root root 36 2014-06-21 16:26:21 lirc.service -> /usr/lib/systemd/system/lirc.service
[..]

Nun testen wir noch, ob die Fernbedienung auch erkannt wurde:

# ir-keytable -v
Found device /sys/class/rc/rc0/
Input sysfs node is /sys/class/rc/rc0/input67/
Event sysfs node is /sys/class/rc/rc0/input67/event19/
Parsing uevent /sys/class/rc/rc0/input67/event19/uevent
/sys/class/rc/rc0/input67/event19/uevent uevent MAJOR=13
/sys/class/rc/rc0/input67/event19/uevent uevent MINOR=83
/sys/class/rc/rc0/input67/event19/uevent uevent DEVNAME=input/event19
Parsing uevent /sys/class/rc/rc0/uevent
/sys/class/rc/rc0/uevent uevent NAME=rc-medion-x10
/sys/class/rc/rc0/uevent uevent DRV_NAME=ati_remote
input device is /dev/input/event19
/sys/class/rc/rc0/protocols protocol other (disabled)
Found /sys/class/rc/rc0/ (/dev/input/event19) with:
        Driver ati_remote, table rc-medion-x10
        Supported protocols: other 
        Enabled protocols: 
        Extra capabilities: <access denied>

Ja, passt :)
Und noch ein Test, ob die Tasten auch funktionieren, wenn auch LIRC noch nicht laeuft:

# ir-keytable -t
Testing events. Please, press CTRL-C to abort.
1404045071.911565: event type EV_MSC(0x04): scancode = 0x33
1404045071.911565: event type EV_KEY(0x01) key_down: KEY_GREEN(0x0001)
1404045071.911565: event type EV_SYN(0x00).
1404045071.911589: event type EV_KEY(0x01) key_up: KEY_GREEN(0x0001)
1404045071.911589: event type EV_SYN(0x00).

Ok, super, auch das klappt :)
Nun koennen wir LIRC starten:

# systemctl enable lirc.service
# systemctl start lirc.service

Und testen nun nur noch, ob der Service auch richtig laeuft:

# systemctl status lirc.service
● lirc.service - LIRC Daemon
   Loaded: loaded (/usr/lib/systemd/system/lirc.service; enabled)
   Active: active (running) since Sun 2014-06-29 14:32:24 CEST; 44s ago
  Process: 19703 ExecStartPost=/usr/bin/ir-keytable --protocol=LIRC (code=exited, status=0/SUCCESS)
  Process: 19701 ExecStart=/usr/sbin/lircd -d $LIRC_DEVICE -P /run/lirc/lircd.pid -H $LIRC_DRIVER $LIRC_CONFIGFILE (code=exited, status=0/SUCCESS)
  Process: 19698 ExecStartPre=/bin/ln -s /run/lirc/lircd /dev/lircd (code=exited, status=0/SUCCESS)
  Process: 19695 ExecStartPre=/bin/rm -f /run/lirc/lircd (code=exited, status=0/SUCCESS)
  Process: 19692 ExecStartPre=/bin/rm -f /dev/lircd (code=exited, status=0/SUCCESS)
  Process: 19689 ExecStartPre=/bin/mkdir -p /run/lirc (code=exited, status=0/SUCCESS)
 Main PID: 19702 (lircd)
   CGroup: /system.slice/lirc.service
           └─19702 /usr/sbin/lircd -d /dev/input/by-id/usb-X10_Wireless_Technology_Inc_USB_Receiver-event-if00 -P /run/lirc/lircd.pid -H devinput /etc/lirc/...

Jun 29 14:32:23 yavanna ir-keytable[19703]: Protocols changed to LIRC
Jun 29 14:32:24 yavanna systemd[1]: Started LIRC Daemon.

Ok, auch der Dienst laeuft :)
Ab jetzt koennen wir als normale*r Nutzer*in weitermachen (sprich: ohne root).
Dazu testen wir noch einmal, ob auch die Tasten ohne root und diesmal mit LIRC funktionieren:

$ irw
000000008001018f 00 KEY_GREEN devinput

Ok, das klappt :)

Sollte das nicht geklappt haben, liegt noch irgendwo ein Fehler vor, der vorher behoben sein sollte.

Wenn alles laeuft, geht es mit der Einrichtung weiter.

Einrichtung

Um mal eben schnell zu zeigen, dass LIRC auch wirklich funktioniert, erstellen wir uns eine Beispieldatei. Dazu muss ein Ordner .lirc im $HOME erstellt werden, der dann die einzelnen Konfigurationsdateien fuer verschiedene Ordner enthaelt und eine Datei .lircrc im $HOME, die diese Konfigurationsdateien inkludiert.

$ mkdir ~/.lirc
$ touch ~/.lircrc
$ touch ~/.lirc/test

In der Datei test fuegen wir nun einfach mal folgendes ein:

begin
    prog = irexec
    config = echo "yeah"
    button = KEY_1
end

Um das nun aktiv werden zu lassen, muss das Programm laufen, was bei prog steht, in diesem Fall also irexec (wir starten irexec direkt mit der test-Datei, da der Pfad ja noch nicht in der ~/.lircrc definiert wurde).

$ irexec ~/.lirc/test

Druecken wir nun auf die Taste 1 auf der Fernbedienung, sollte in der Konsole yeah ausgegeben werden :)

Eine Konfiguration fuer vlc und mpv sowie fuer Funktionen von dwm und sogar eine Maussteuerung liefere ich gleich, allerdings hier noch einige Kommentare:

  • Beim Testen muss jedesmal irexec die Konfigurationsdateien neu laden, daher entweder immer irexec ~/.lirc/datei nutzen.
  • irexec kann auch als Daemon gestartet werden (irexec -d), der dann mit jeder Aenderung wieder mit killall irexec beendet werden sollte.
  • Dieser Daemon kann z.B. beim Starten von X gestartet werden, indem irexec -d in die ~/.xinitrc aufgenommen wird.
  • Wenn eine neue Datei unterhalb von ~/.lirc erstellt wird, nicht vergessen, diese in der ~/.lircrc zu erwaehnen (gilt auch fuer Umbenennung ;))
  • Es klappt mit dieser Konfiguration nicht, dass Tasten nur innerhalb des gewuenschten Programmes ausgefuehrt werden. Also wenn ich z.B. die Lautstaerke verringern will, wird bei dwm und der laufenden VLC-Instanz die Lautstaerke verringert. Dies zu aendern ist etwas schwieriger (lircrcd), daher hab ich es gelassen ..
  • Die einzelnen Programme muessen LIRC-Support haben (offensichtlich), bei VLC laesst sich der z.B. so aktivieren: "Tools" - "Preferences", dann bei "Show settings" "All" aktivieren und dann unter "Interfaces" - "Control interfaces" ein Haekchen setzen bei "Infrared remote control interface". Danach absichern (Quelle).
    Kontrolliert werden kann das mit: vlc -l | grep lirc (sollte dann da auftauchen).
  • lsusb liefert mir fuer meine Fernbedienung:

    Bus 001 Device 051: ID 0bc7:0006 X10 Wireless Technology, Inc. Wireless Transceiver (ACPI-compliant)
    

Ok, damit nun hier ein paar Beispieldateien.

Erstmal die ~/.lircrc, in der die anderen Dateien genannt werden:

begin vlc
        include "~/.lirc/vlc"
end vlc

begin mpv
        include "~/.lirc/mpv"
end mpv

begin irexec
        include "~/.lirc/maus"
        include "~/.lirc/dwm"
end irexec

Die Konfiguration von VLC (stark hier abgeguckt, wobei einige Belegungen anders heissen):

begin
    prog = vlc
    button = KEY_PLAY
    config = key-play
end

begin
    prog = vlc
    button = KEY_PAUSE
    config = key-play-pause
end

begin
    prog = vlc
    button = KEY_STOP
    config = key-stop
end

begin
    prog = vlc
    button = KEY_MUTE
    config = key-vol-mute
end

begin
    prog = vlc
    button = KEY_VOLUMEDOWN
    config = key-vol-down
    repeat = 2
    delay = 10
end

begin
    prog = vlc
    button = KEY_VOLUMEUP
    config = key-vol-up
    repeat = 2
    delay = 10
end

begin
    prog = vlc
    button = KEY_NEXT
    config = key-next
end

begin
    prog = vlc
    button = KEY_PREVIOUS
    config = key-prev
end

begin
    prog = vlc
    button = KEY_SWITCHVIDEOMODE
    config = key-toggle-fullscreen
end

begin
    prog = vlc
    button = KEY_REWIND
    config = key-slower
end

begin
    prog = vlc
    button = KEY_FORWARD
    config = key-faster
end

# Navigation im DVD-Menue
begin
    prog = vlc
    button = KEY_LEFT
    config = key-nav-left
end

begin
    prog = vlc
    button = KEY_DOWN
    config = key-nav-down
end

begin
    prog = vlc
    button = KEY_UP
    config = key-nav-up
end

begin
    prog = vlc
    button = KEY_RIGHT
    config = key-nav-right
end

begin
    prog = vlc
    button = KEY_OK
    config = key-nav-activate
end

begin
    prog = vlc
    button = KEY_MENU
    config = key-disc-menu
end

begin
    prog = vlc
    button = KEY_POWER
    config = key-quit
end

Die Konfiguration von MPV, die Befehle habe ich mit man 1 mpv herausgefunden:

begin
    prog = mpv
    button = KEY_PLAY
    config = cycle pause
end

begin
    prog = mpv
    button = KEY_PAUSE
    config = cycle pause
end

begin
    prog = mpv
    button = KEY_STOP
    config = quit
end

begin
    prog = mpv
    button = KEY_MUTE
    config = cycle mute
end

begin
    prog = mpv
    button = KEY_VOLUMEDOWN
    config = add volume -10
    repeat = 2
    delay = 10
end

begin
    prog = mpv
    button = KEY_VOLUMEUP
    config = add volume 10
    repeat = 2
    delay = 10
end

begin
    prog = mpv
    button = KEY_NEXT
    config = playlist_next
end

begin
    prog = mpv
    button = KEY_PREVIOUS
    config = playlist_prev
end

begin
    prog = mpv
    button = KEY_SWITCHVIDEOMODE
    config = cycle fullscreen
end

begin
    prog = mpv
    button = KEY_REWIND
    config = seek -60
end

begin
    prog = mpv
    button = KEY_FORWARD
    config = seek 60
end

begin
    prog = mpv
    button = KEY_POWER
    config = quit
end

Die Konfiguration von dwm (0xffeb entspricht Super_L und wurde mit xev herausgefunden; das Paket fuer xte heisst xautomation):

# desktops
begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 1' 'keyup 0xffeb' 'keyup 1'
    button = KEY_KEYBOARD
    button = KEY_1
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 2' 'keyup 0xffeb' 'keyup 2'
    button = KEY_KEYBOARD
    button = KEY_2
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 3' 'keyup 0xffeb' 'keyup 3'
    button = KEY_KEYBOARD
    button = KEY_3
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 4' 'keyup 0xffeb' 'keyup 4'
    button = KEY_KEYBOARD
    button = KEY_4
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 5' 'keyup 0xffeb' 'keyup 5'
    button = KEY_KEYBOARD
    button = KEY_5
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 6' 'keyup 0xffeb' 'keyup 6'
    button = KEY_KEYBOARD
    button = KEY_6
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 7' 'keyup 0xffeb' 'keyup 7'
    button = KEY_KEYBOARD
    button = KEY_7
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 8' 'keyup 0xffeb' 'keyup 8'
    button = KEY_KEYBOARD
    button = KEY_8
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 9' 'keyup 0xffeb' 'keyup 9'
    button = KEY_KEYBOARD
    button = KEY_9
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown 0' 'keyup 0xffeb' 'keyup 0'
    button = KEY_KEYBOARD
    button = KEY_0
end

begin
    prog = irexec
    config = xte 'keydown 0xffeb' 'keydown Tab' 'keyup 0xffeb' 'keyup Tab'
    button = KEY_KEYBOARD
    button = KEY_DELETE
end

# music
# siehe dazu meine dwm-config:
# https://github.com/tohn/dwm/blob/master/config.h
# und die entsprechende Datei dwm_music.sh hier:
# https://github.com/tohn/bin/blob/master/dwm_music.sh
begin
    prog = irexec
    config = /home/benjo/repos/bin/dwm_music.sh -n
    button = KEY_KEYBOARD
    button = KEY_NEXT
end

begin
    prog = irexec
    config = /home/benjo/repos/bin/dwm_music.sh -v
    button = KEY_KEYBOARD
    button = KEY_PREVIOUS
end

begin
    prog = irexec
    config = /home/benjo/repos/bin/dwm_music.sh -p
    button = KEY_KEYBOARD
    button = KEY_PLAY
end

begin
    prog = irexec
    config = /home/benjo/repos/bin/dwm_music.sh -p
    button = KEY_KEYBOARD
    button = KEY_PAUSE
end

# volume
begin
    prog = irexec
    config = amixer set Master toggle
    button = KEY_MUTE
end

begin
    prog = irexec
    config = amixer -c 0 set Master 10%+
    button = KEY_VOLUMEUP
end

begin
    prog = irexec
    config = amixer -c 0 set Master 10%-
    button = KEY_VOLUMEDOWN
end

Und zuletzt die Konfiguration zur Steuerung der Maus (Quelle):

# Maussteuerung per xte
begin
    prog = irexec
    button = KEY_2
    config = xte  'mousermove 0 -15'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_3
    config = xte  'mousermove 15 -15'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_1
    config = xte  'mousermove -15 -15'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_8
    config = xte  'mousermove 0 15'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_7
    config = xte  'mousermove -15 15'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_9
    config = xte  'mousermove 15 15'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_4
    config = xte  'mousermove -15 0'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_6
    config = xte  'mousermove 15 0'
    repeat = 1
end

begin
    prog = irexec
    button = KEY_5
    config = xte  'mouseclick 1'
end

begin
    prog = irexec
    button = KEY_0
    config = xte  'mouseclick 2'
end

Moegliche TODOs:

  • Modes bzw. nur ein Modi, der von allen Programmen beachtet wird (dann wuerde sich keine Konfiguration mehr ueberschneiden).
  • Eine rudimentaere Maus kann mit LIRC nachgebastelt werden, schoen waere aber auch eine Tastatur ;)

Quellen

Spriting mit Compass

Allgemein

Ich gehe ganz kurz auf die Basics ein: Spriting ist eine Technik, welche viele kleine Bilder zu einem großem Bild zusammenfasst. Diese Technik spart nicht nur ein paar KB bei der Dateigröße, sondern hat den Vorteil, dass nicht zu viele Verbindungen zum Server aufgebaut werden müssen.

PS: Ich habe darüber bereits vor einiges Zeit im Zusammenhang mit „Webseiten Komprimierung“ geschrieben.

Kommen wir jetzt jedoch zum interessanten Teil. Wie setzt man dies ein, ohne bei jeder kleinen Bildveränderung / Hinzufügung Mehraufwand zu generieren.  Und die Lösung heißt „compass„. Dies ist ein Framework, welches auf Sass aufsetzt und dieses um einige nützliche Features ergänzt.

Installation / Konfiguration

Hier ist ein kleines Bash-Skript, welches in meinen „.dotfiles“ beinhaltet ist und die erforderlichen Programme (ruby, sass, compass, oily_png) installiert.

github.com/voku/dotfiles/blob/master/firstInstall.sh

Es folgt eine Beispiel-Konfiguration für compass, woraus sich bereits die Order für Bilder, Scss, css und js hervorgehen:

github.com/voku/twig-wrapper-example/blob/master/config.rb

 

Beispiel

icons icons_new

URL: moelleken.org/tpl_imageSprites.php

SCSS:

Ich habe die für das Sprite relevanten Zeilen rot gekennzeichnet. Außerdem sollte man erwähnen, dass der Verzeichnis-Name „**/spritesTest/“ sich in der „include“-Anweisung wiederfinden muss. Die Bilder selber lassen sich anschließend über den Dateinamen im CSS referenzieren, so dass man möglichst einfache / eindeutige Dateinamen verwenden sollte.

PS: hier findet du das entsprechende CSS, welches diese paar Zeilen SCSS generieren

// compass
@import "compass/css3";
@import "compass/utilities/sprites";

/*
 *  - - - - - - - - - -
 * some icons for testing
 *  - - - - - - - - - -
 */

@import "../images/spritesTest/*.png";
@include all-spritesTest-sprites;
#spritesOverview span {
  width: 32px;
  height: 32px;
  display: block;
  transition: all 0.2s ease-in;
  &:hover {
    @include transform(scale(1.8));
    transition: all 0.4s ease-out;
  }
}

@for $i from 1 through 20 {
  .step#{$i} {
    animation: movement 1500ms ease (75ms * $i) infinite alternate;
  }
}

@keyframes movement {
  from {
    @include transform(scale(1.0) translateY(0px) rotateX(0deg));
    box-shadow: 0 0 0 rgba(0,0,0,0);
  }
  to {
    @include transform(scale(1.5) translateY(-25px) rotateX(45deg));
    box-shadow: 0 25px 25px rgba(0,0,0,0.2);
  }
}

 

PHP:

Die paar Zeilen PHP habe ich nur hinzugefügt, da ich keine Lust hatte alle Dateinamen in ein großes Array zu kopieren und diese Datei direkte von der Festplatte auslese.

<?php
use cms\Path;
use cms\twig\TwigWrapper;

require_once 'inc_globals.php';

$fileArray = file_list(Path::getPathDirTheme() . '/images/spritesTest', 'png');

$icons = array();
foreach ($fileArray as $file) {
  $file = str_replace(Path::getPathDirTheme() . '/images/spritesTest/', '', $file);
  $file = str_replace('emblem-', '', $file);
  $file = str_replace('.png', '', $file);

  $icons[] = $file;
}

// DEBUG
//dump($icons);
// #############################################################################
// # TwigWrapper | templating
// #############################################################################
$twigWrapper = new TwigWrapper('tpl_imageSprites.twig');

$iconsArray = array();
for ($i = 1 ; $i <= 20 ; $i++) {
  shuffle($icons);
  $iconsArray[] = $icons;
}

$twigWrapper->assign('iconsArray', $iconsArray);

echo $twigWrapper->render();

 

Twig:

Zum Schluss noch ein paar HTML-Tags im Twig hinzugefügt und schon können wir die Icons bewundern. ;)

{% extends "tpl_base.twig" %}

{% block head_css %}
  {{ parent() }}
  <link rel="stylesheet" href="{{ urlTheme }}/css-min/sprites.css" />
{% endblock %}

{% block content %}
  {{ breadcrumb | raw }}

  <article id="spritesOverview">

    {% for i in 1..20 %}

      <div class="row step{{ loop.index }}">
        {% for icon in iconsArray[i] %}
          {% if loop.index <= 6 %}
            <div class="medium-2 columns"><span class="spritesTest-emblem-{{ icon }}"></span></div>
          {% endif %}
        {% endfor %}
      </div>

    {% endfor %}

  </article>
{% endblock %}

 

Links:

compass-style.org/reference/compass/helpers/sprites/
Compass Tutorials #6 – Sprites In Compass

V-Server Problem bei Strato

Mein Virtueller Server von Strato hat diese Woche erhebliche Probleme. Angefangen hat dies bereites letzte Woche, daher habe ich am 22.06.2014 eine Support-Anfrage mit der Bitte um Prüfung geschrieben, jedoch bisher nur die Antwort erhalten, dass ein überlastetet Hostsystem ggf. zu den Problemen führt und dass dies momentan geprüft wird.

– Server-„Load“: > 10
– CPU-Auslastung : ~ 0%
– I/O-Auslastung: ~ 0%

——————————————

Reaktionszeit: 1/2 Min. für den SSH-Login  :-(

Daher kann es zwischenzeitlich auf dieser Webseite noch zu erheblichen Ladezeiten kommen, ich bitte dies zu entschuldigen. Wenn jemand einen guten Tipp für einen neuen Hoster hat oder andere Schlüsse aus den folgenden Screenshots ziehen kann, schreibt mir dies bitte per E-Mail „lars (at) moelleken.org“ oder einfach direkt hier als Kommentar, vielen dank! Mfg Lars

 

server_vmstat

server_iotop

server_top

 

Falls jemand ebenfalls Performance-Probleme mit seinem Linux-Server hat, sollte man sich einmal folgenden aktualisierten Blog-Post anschauen:

-> Server-Analyse: http://suckup.de/linux/linux-server-analysieren/

 

UPDATE: 02.07.2014 15:59

Sehr geehrter Herr Moelleken,

ich möchte Sie mit dieser E-Mail über den Bearbeitungsstand Ihres Troubleticket informieren.

Sie hatten von Beeinträchtigungen bezüglich der Performance Ihres STRATO Virtual Server Linux berichtet.
Vorab bitte ich die Ihnen dadurch entstandenen Unannehmlichkeiten zu entschuldigen.

Erfreulicherweise kann ich Ihnen nun mitteilen, dass die Einschränkungen an Ihrem Server mittlerweile vollständig behoben wurden. Ihr Server ist damit wieder in vollständigem Umfang und mit gewohnter Performance zu erreichen.

Ich wünsche Ihnen weiterhin viel Erfolg mit Ihrem STRATO Server und stehe auch weiterhin bei Rückfragen für Sie bereit.

 

Ich musste kürzlich wieder ein paar kleine Graphen zeichnen, normalerweise mache ich das in 1-2 Minuten auf dem Papier, das reicht aus. Nun wollte ich mal schauen, ob ich das auch zügig mit Linux erledigen kann, ohne lange nach Software suchen und mich einarbeiten zu müssen. Zwei Voraussetzungen hatte ich: Erstens will ich für Installation und Einlesen nicht viel Zeit verschwenden und zweitens soll das Programm in den Fedora Paketquellen enthalten und möglichst schlank sein.

Schon bei der ersten Suche bin ich auch Graphviz gestoßen, mit dem man unter Benutzung der z.B. DOT Sprache schnell Graphen und Digraphen zeichnen kann. Graphviz kennt noch weitere Sprachen, mit denen eine Vielzahl an Graphen gezeichnet werden können, das interessiert mich später vielleicht. Graphviz ist glücklicherweise in den Paketquellen vieler Distributionen enthalten, also habe ich das Paket 

graphviz
  installiert, mir eine kurze Anleitung angesehen und folgende DOT Datei erstellt:
graph Tourenplanung {
   nodesep=0.25
   ranksep=0.25
   graph [rankdir=BT]
   D [color=red, label="Depot"]
   1 [label="1 (20)"]
   2 [label="2 (10)"]
   3 [label="3 (25)"]
   4 [label="4 (15)"]
   5 [label="5 (20)"]
   D -- 1 [label="4"]
   D -- 2 [label="10"]
   D -- 3 [label="5"]
   D -- 4 [label="6"]
   1 -- 2 [label="8"]
   1 -- 4 [label="8"]
   2 -- 3 [label="4"]
   2 -- 5 [label="5"]
   3 -- 4 [label="7"]
   3 -- 5 [label="6"]
   4 -- 5 [label="14"]
}

Aus dieser Datei lässt sich dann mit folgendem Befehl eine PNG Datei erzeugen:

dot -Tpng graph.dot -O

Anstelle von png lässt sich auch svg verwenden. Der Parameter 

-O
  erzeugt eine Ausgabedatei mit gleichem Namen wie die DOT Datei, die Endung .png wird angehängt. Mit einem kleinen 
-o
  lässt sich der Dateiname aber auch explizit angeben. Folgender Graph wurde nun erstellt:

graphMit Graphviz lässt sich noch viel mehr anstellen, mir ging es aber nur darum, möglichst schnell einen Graphen zu erstellen. Alternativ hätte ich wieder zum Bleistift gegriffen.

28. Juni 2014

Es ist beinah drei Jahre her, dass ich die Osnabrücker Band One Dice empfohlen habe. Vor kurzer Zeit ist ihr neues, zweites Album Alone erschienen.

Das Album zeigt die letzten 2,5 Jahre im Leben der Band. Neben einem bekannten Lied („Wake up Sleeper“) sind nur neue Tracks auf dem Album zu finden. Der Kostenpunkt bei Bandcamp beträgt gerade einmal 1,99 Euro für den digitalen Download des Albums – natürlich darf man auch mehr geben.

Mir selbst gefällt die Musik natürlich sehr gut, sonst würde ich das Album nicht empfehlen. Der Stil ist diesmal etwas Elektro-lastiger, hat aber immer noch sehr ruhige Gothic-Klänge. Vor allem der Titel I die today hat mich sofort beim ersten Hören begeistert, auch oder vor allem weil der Anfang sehr an ein Stück von Yann Tiersen aus Amélie erinnert.

Wie auch schon das erste Album Heartbroken steht auch „Alone“ unter einer freien Lizenz. Alle Titel können unter Creative-Commons-Lizenz CC-BY-NC-SA-3.0 frei weitergegeben und sogar verändert werden, solange man One Dice als Urheber nennt und das Material nicht verkauft.

27. Juni 2014

Gerade habe ich mich mit dem Fehler

„ubuntu dovecot: lmtp(8255, user@server.de): Error: User user@server.de doesn’t have home dir set, disabling duplicate database”

beschäftigt, die in meinen Mailserver Errorlogs erschien. Der Grund für die Warnung ist, dass ich in meiner Mailserver Konfiguration die Option „mail_home” nicht gesetzt habe. Das ist zwar bei einem sehr einfachen Mailserver egal, aber sobald z.B. Sieve eingesetzt wird, spuckt Dovecot diesen Fehler aus, denn Sieve kann von dieser Einstellung Gebrauch machen (Siehe auch hier: Dovecot VirtualUsers Home). Meine Anleitung zu Sieve hat das nicht beeinträchtigt, weil ich dort die Pfade zu den Userscripts sowieso nochmal explizit angegeben habe, dennoch sollte die Einstellung „mail_home” eigentlich gesetzt sein.

Aus diesem Grund habe ich mein Konzept zum Verzeichnisbaum für die Mailkonten überarbeitet und angepasst:

  • Pfad zu den Mailboxen bisher: /var/vmail/%d/%n
  • Neuer Pfad zu den Mailboxen: /var/vmail/%d/%n/mail

… es wurde als ein „mail” angehängt. Der alte Pfad ist nun das „mail_home” und die Mailbox befindet sich nun darin. Damit bin ich der Empfehlung in den Dovecot Docs gefolgt.

Alle User, die meine Mailserver Anleitungen befolgt haben, sollten diese Änderung ebenfalls durchführen. Meine Hauptanleitung wurde bereits angepasst. Konkret ist folgendes zu tun:

Dovecot beenden:

service dovecot stop

Die Konfigurationsdatei „/etc/dovecot/conf.d/10-mail.conf” öffnen und statt

mail_location = maildir:/var/vmail/%d/%n:LAYOUT=fs

das eintragen:

mail_home = /var/vmail/%d/%n
mail_location = maildir:~/mail:LAYOUT=fs

Bevor die neue Konfiguration aktiv werden darf und Dovecot wieder gestartet werden kann, müssen jetzt noch unbedingt die Mailboxen der User verschoben werden – sonst stehen sie vor leeren Postfächern! Da ich bisher nur wenige User auf meinem Server betreue, konnte ich die Verschiebung per Hand machen. Bei größeren Installationen empfiehlt sich die Verwendung eines Scripts, das die Arbeit automatisch erledigt. Leider kann ich euch kein solches Script bereitstellen, aber vielleicht findet sich ja ein Leser, der entsprechende Kenntnisse hat :)

Bei mir hat die Prozedur folgendermaßen ausgesehen:

cd /var/vmail/domain/

mv user1/ mail
mkdir user1
chmod 770 user1/
chown vmail:vmail user1/
mv mail/ user1/

… diese Befehlsfolge wurde für alle User (user2, user3, etc) wiederholt.

Dovecot wieder starten:

service dovecot restart

In meinem Fall beschwerte dich Dovecot daraufhin mit „… corrupted indexes” o.Ä. in seinen Errorlogs. Nach einem weiteren Neustart war dann aber Ruhe ;)

Wie bereits geschrieben – am besten führt ihr die Änderungen an eurem Server auch durch, das ist einfach sauberer ;) Wer nicht verschieben will, kann auch einen alternativen Ort für die User Homes anlegen. Schaut euch am besten diese Seite dazu an, dort werden die Möglichkeiten nochmals gezeigt.

Update: Fuchsi hat dieses Script vorgeschlagen (ungetestet! Backup machen!):

cd /var/vmail/domain/

for user in $(ls); do
    mv "$user/" mail
    mkdir "$user"
    chmod 770 "$user/"
    chown vmail:vmail "$user/"
    mv mail/ "$user/"
done