Skip to content

SSD tauschen ...

Ich habe nicht bereut, mich bei meinem aktuellen Notebook im Februar letzten Jahres für ein Dell Latitude E7450 entschieden zu haben. Am Sonntag habe ich innerhalb von ein paar Minuten die neue SSD eingebaut und Fedora installiert. Arbeitsbereit war ich in deutlich unter zwei Stunden ... (selbst Windows 10 wäre da noch dabei gewesen, die Updates zu installieren und Anwendungen wären auch noch nicht drauf).

Wannacry?

Leider muss ich jetzt doch etwas längeres dazu schreiben, weil mich die polemisierenden Nachrichten nerven.

Kurz zusammengefasst:

Ich habe kein Mitleid mit Firmen, die von Wannacry betroffen sind. Mein Mitleid geht an die Menschen, die nichts damit zu tun hattem wie beispielsweise Patienten von Krankenhäusern.

Wannacry hat mit Admins zu tun, die ihre Hausaufgaben nicht gemacht haben; mit Entscheidern, die kein Geld für ein Update bewilligen und mit Anwendern, die auf alles klicken, was klickbar ist und Warnhinweise ignorieren. Es hat nichts mit Windows vs. Linux zu tun. Ein ungepatchtes und nicht supportetes Linuxsystem ist auch ein Sicherheitsproblem.

Längere Version:

Soweit ich verstehe und aus diesem Link mitnehme, läuft die initiale Verbreitung folgendermassen:

Ein Benutzer bekommt per Mail eine Passwort geschützte ZIP-Datei in der ein Dokument ist. Wenn das Dokument geöffnet wird, wird eine unsignierte ausführbare Datei nachgeladen und diese ausführbare Datei enthält alles, was der Wurm braucht, Code zur Infizierung, Vervielfältigung und Verseuchung der Zielsysteme, wobei eine Schwachstelle in SMB ausgenutzt wird. Durch den User erreichbare Dateien (insbesondere Netzwerkshares) werden verschlüsselt.

Der Benutzer muss mehrfach bestätigen, dass er Dinge "wirklich" tun will (Ungeschützte Datei öffnen, Makros ausführen, Datei aus unsicherer Quelle ausführen).

Erste Möglichkeit, es gar nicht erst zu solchem einem Eklat kommen zu lassen, wäre beispielsweise die Schulung der Nutzer.

Für noch im Support befindliche Betriebssysteme, also nicht Windows XP, hat Microsoft bereits Mitte März dieses Jahres einen Patch veröffentlicht.

Zweite Möglichkeit, kritische Patches kurz nach Erscheinen einspielen.

Das hilft nicht, wenn man nur Windows XP hat und die Entscheider kein Geld für neue Lizenzen ausgeben wollen. Hier ist die dreckige Wahrheit: Der Unterhalt einer IT-Infrastruktur kostet Geld für Hardware, Softwarelizenzen und Support-Personal. Es liegen vier aktuell supportete Versionen zwischen XP und heute (Windows Vista, Windows 7, Windows 8 und Windows 10). Selbst, wenn man sich entscheiden würde, nur jede zweite oder dritte Inkarnation von Windows einzusetzen, hätte es mit dem rechtzeitig veröffentlichten Patch keine Probleme gegeben.

Es geht nicht um "XP ist Mist", es geht in diesem Fall um abgelaufenen Herstellersupport.

Von einem Oldtimer würde man auch nicht erwarten, dass er einen Airbag hat ...

Um in der Analogie zu bleiben: Windows XP hat 2001 das Licht der Welt erblickt, das ist vor 16 Jahren. Wie viele Geschäftsführer fahren 16 Jahre alte Autos? Ich kenne keinen. Geld für ein neues Auto wäre also da, aber nicht für Softwarelizenzen. Das passt nicht.

Dazu gibt es noch mehrere Möglichkeiten, technisch dem Problem beizukommen, gekapseltes E-Mail-System, Paketfilter, ... aber die sind meiner Meinung nach nicht mit vertretbarem Aufwand handhabbar.

Fazit:

Es führt nichts, gar nichts daran vorbei Anwender zu schulen. Selbst, wenn das zu Grunde liegende System von Windows auf irgendetwas anderes wechselt, hilft die Schulung, dass die gleichen Fehler nicht auf den neuen Systemen gemacht werden.

Ebenfalls ist es nötig, zeitnah kritische Patches einzuspielen. Selbst Unternehmen mit sehr konservativen Patchzyklen (ein Mal pro Jahr) kennen "Emergency-Patching".

Egal, welches System eingesetzt wird, es muss durch den Hersteller oder die Community unterstützt sein (ich kenne reichlich Menschen, die ein lange nicht mehr gewartetes Debian einsetzen).
  • Wem die Supportzyklen zu kurz sind, muss auf etwas mit längeren Supportzyklen wechseln.
  • Wer lizenzpflichtige Betriebssysteme (oder auch andere Software) einsetzt, muss diesen Kostenpunkt dringend in seinem Budget einplanen.

GNU time ...

In den "Core Utilities" der meisten Linuxdistributionen findet sich das Tool GNU time (ja, die Homepage ist ein bisschen, nun, ..., nichtssagend).

Das time-Kommando als eingebautes Kommando der Bash (oder anderer Shells) kennen viele, auch die charakteristische Ausgabe:

$ time bash
$ exit

real    0m2.608s
user    0m0.137s
sys     0m0.326s


Ein wenig gesprächiger ist GNU time:

$ /usr/bin/time bash
$ exit
0.18user 0.37system 0:04.17elapsed 13%CPU (0avgtext+0avgdata 3736maxresident)k
0inputs+80outputs (0major+96587minor)pagefaults 0swaps


Im "verbose-Modus" kann man dann aber schon richtig ordentlich Informationen abgreifen:

$ /usr/bin/time -v bash
$ exit
        Command being timed: "bash"
        User time (seconds): 0.11
        System time (seconds): 0.30
        Percent of CPU this job got: 12%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.36
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 3732
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 96806
        Voluntary context switches: 713
        Involuntary context switches: 155
        Swaps: 0
        File system inputs: 0
        File system outputs: 80
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0


Die manpage gibt noch weitere Optionen an.

Pipe Viewer ...

In den letzten Jahren habei sich reichlich viele tar.bz2-Archive mit zum Teil über 100 Gigabytes bei mir angesammelt. Die mussten einmal dringend aufgeräumt werden.

Bei Aufräumen war mir Pipe Viewer eine grosse Hilfe. Na, ja, Hilfe ist vielleicht übertrieben, aber "subjektive Zeitverkürzung" hat auch ihren Wert.

Pipe Viewer macht genau das, was der Name vermuten lässt, es zeigt - unter anderem - den Fortschritt von Pipes an.

$ pv --progress --eta downloads.tar.bz2 | tar xjf -
[>                                                  ]  2% ETA 0:04:02


Der umgekehrte Weg ist komplexer, weil die Grösse der Daten an das Kommando übergeben werden muss.

$ tar cf - Downloads \
| pv --progress --eta --size $(du -bs Downloads | awk '{print $1}') \
| bzip2 -9 > downloads.tar.bz2
[==============>                                    ] 31% ETA 0:08:42


Weitere sehr gute Beispiele finden sich auf der verlinkten Homepage.

FLOSS-Perlen ...

Ich bin immer auf der Suche nach FLOSS-Perlen.

Wenn Ihr also FLOSS-Perlen findet, wäre ich sehr froh, wenn Ihr Eure Fundstücke in den Kommentaren oder besser noch in eigenen Blog-Artikeln beschreibt und hier verlinkt.

Wichtig! Ich suche nicht nach dem x-ten Artikel, der eine Software beschreibt, die eh schon jeder kennt, es sei denn sie bietet etwas so besonderes, dass sich die Erwähnung lohnt.


Dabei schreibe ich ganz bewusst FLOSS, weil ich die Streitigkeiten zwischen der Free-Software-Definition und der Open-Source-Definition nicht mitmachen möchte.

Grundlegend wollen beide Gruppierungen das gleiche und ich fühle mich eher zur "Open Source" als zur dogmatischeren "Free Software" hingezogen. Ich bin der Meinung, dass der Streit "unserer Bewegung" eher schadet als nützt.

Definition von "Freie Software" nach Wikipedia:
  • Die Freiheit, das Programm auszuführen, wie man möchte, für jeden Zweck.
  • Die Freiheit, die Funktionsweise des Programms zu untersuchen und eigenen Bedürfnissen der Datenverarbeitung anzupassen.
  • Die Freiheit, das Programm weiterzuverbreiten und damit seinen Mitmenschen zu helfen.
  • Die Freiheit, das Programm zu verbessern und diese Verbesserungen der Öffentlichkeit freizugeben, damit die gesamte Gemeinschaft davon profitiert.


Definition von "Open Source" nach Wikipedia:
  • Die Software (das heisst der Quelltext) liegt in einer für den Menschen lesbaren und verständlichen Form vor.
  • Die Software darf beliebig kopiert, verbreitet und genutzt werden.
  • Die Software darf verändert und in der veränderten Form weitergegeben werden.

E-Mail, Kontakte und Kalender ...

Lange Jahre war ich mit Claws-Mail als Mailclient mehr als zufrieden und bin es heute noch. Die Filter- und anderen Konfigurationsmöglichkeiten sind unerreicht. Leider ist er nicht mehr auf der Höhe der Zeit.

Es gibt immer mehr HTML-Mails (die ich auch als HTML sehen möchte) und die meine Anforderungen über Mail hinaus sind gestiegen.

Ich bin auf der Suche nach einem "Personal Information Manager", der die folgenden Aufgaben in einer integrierten Oberfläche bereitstellt und soll unter KDE auf Linux laufen:
  • Pflicht: E-Mail (klar, oder?)
  • Pflicht: Anzeige von HTML-Nachrichten ohne Verrenkungen, gerne mit einmaliger (!) Nachfrage pro Kontakt ob Content nachgeladen werden darf.
  • Pflicht: Sollte nicht in die Knie gehen bei meinem Mailaufkommen (derzeit drei "echte Mailaccounts" via IMAP und zahlreiche Weiterleitungen) mit einigen hunderttausend gespeicherten Nachrichten.
  • Pflicht: Nutzung verschiedener Identitäten pro Mailaccount.
  • Pflicht: Filterung von eingehenden Mails, gerne auch mit Frontend für Sieve.
  • Pflicht: Verwaltung und Einbindung von Kontakten aus den externen Quellen ownCloud und Google Contacts.
  • Pflicht: Gleiches - ownCloud und Google Calendar - gilt für Kalender, hier kommen aber noch öffentliche ICS-Dateien dazu.
  • Kür: Speicherung von Antworten im gleichen Ordner wie die Mail, die auf die geantwortet wird.
  • Kür: Vergabe von Verarbeitungsregeln für Ordner wie beispielsweise "Verschiebe alle Nachrichten, die älter sind als 365 Tage in den Archivordner (der in einem anderen Mailaccount zu finden ist)" oder "Lösche alle Nachrichten aus dem Gesendet-Ordner, die an Mailinglisten gingen".
  • Kür: Usenet-Client


Die "Kür-Anforderungen" resultieren aus Funktionen, die ich Claws-Mail genutzt habe.

Getestet habe ich die integrierten KDE-Anwendungen KMail, KOrganizer, KAddressbook und KNode, aber die waren für die Anzahl der verwalteten Mails zu langsam und mit intensivem Filtern unbenutzbar. Der Featureset hat ansonsten dem entsprochen, was ich mir vorstelle.

Momentan teste ich Mozilla Thunderbird.

daterem.py vs. daterem.pl ...

Ich muss bzw. darf mich mit der Programmiersprache Python auseinandersetzen. Was liegt da näher, ein selbstgeschriebenes Perl-Skript nach Python zu migrieren? Nichts. Also habe ich es getan.

Die Ergebnisse lassen sich auf GitHub sehen.

Kritik ist ausdrücklich erwünscht, ich kann davon nur lernen.

Diesen Artikel wollte ich nicht Python vs. Perl nennen, weil beide Programmiersprachen ihre Berechtigung haben und es gibt ja nicht wirklich einen Streit zwischen beiden, nur unterschiedliche Philosophien. Einer von vielen Gründen ist, dass Perl von einem Linguisten - Larry Wall - entwickelt wurde und Python von einem Mathematiker - Guido van Rossum.

So, hier kommen die Dinge, die mir beim Umschreiben aufgefallen sind. Achtung! Ich bin kein Programmierer, sondern eher ein Skripter ...

Die folgenden Punkte kann meiner Ansicht nach Python besser:
  • Datumshandling mit mitgelieferten Bibliotheken: das Modul time ist doch deutlich komfortabler als das Perl-Pendant Time::local (zum Wert für Monat muss 1 und zum Wert von Jahr muss 1900 addiert werden).
  • Struktur: Da Bei Python die Einrückungen eine Rolle spielen, kann auf geschweifte Klammern für Codeblöcke verzichtet werden, das gefällt mir richtig gut.
  • Listen: Der Umgang mit Listen gefällt mir auch besser als bei Perl, aber ich gebe zu, dass das Geschmackssache sein könnte.


Aber auch Perl hat seine Stärken:
  • Reguläre Ausdrücke, nun, was soll ich schreiben, reguläre Ausrücke gehen direkt und wesentlich unkomplizierter als bei Python, wo sie per Modul nachgerüstet werden müssen. Es hat einen Grund, dass es einen Namen gibt "PRE - Perl Regular Expressions".
  • Variablenhandling: Ich habe mich daran gewöhnt, dass ich eine Variable sowohl als String wie auch als Zahl verwenden kann, ohne umwandeln zu müssen. Gut, Python ist schwach typisiert, aber wenn der Typ feststeht, muss man konvertieren.
  • Assoziative Arrays gefallen mir deutlich besser als Dictionaries, das ist wieder einmal Geschmackssache.
  • Nachgestelles "if" print $a if ($a == $b) ist wirklich hübscher als ein Mehrzeiler.


Es gibt gute Gründe, die zu den Entscheidungen in den Programmiersprachen geführt haben. Ich möchte auch nicht in "besser" oder "schlechter" einteilen, das ist doof. Alles, was man mit der einen Programmiersprache erledigen kann, kann man auch mit der anderen tun.

Hashes in der Bash ...

Weil ich es gerade für einen Kollegen gebraucht habe.

Ein eher selten genutztes Feature in der Bash sind assoziative Arrays (Hashes). Ab Bash Version 4 geht das ganz ohne Hilfskonstrukte.

#!/bin/bash

declare -A dns=(
    [mond]=192.168.0.1
    [erde]=192.168.2.3
    [saturn]=192.168.7.8
)

echo "Alle Keys:   ${!dns[@]}"
echo "Alle Values: ${dns[@]}"
echo

for host in ${!dns[@]}; do
    ip=${dns[${host}]}
    echo "${host} hat die IP-Adresse ${ip}"
done


Schlüssel und Werte dürfen "natürlich" auch Leerzeichen enthalten. Dann müssen diese allerdings - wie bekannt - in Anführungszeichen stehen.

Ergebnis des Skriptes:

Alle Keys:   erde saturn mond
Alle Values: 192.168.2.3 192.168.7.8 192.168.0.1

erde hat die IP-Adresse 192.168.2.3
saturn hat die IP-Adresse 192.168.7.8
mond hat die IP-Adresse 192.168.0.1

Programmiersprachen Ranglisten ...

Letzte Woche gingen die aktuelle RedMonk Programmiersprachen Rangliste durch die Blogs. Ich kannte die Rangliste tatsächlich noch nicht und habe vorher immer den Tiobe Index zu Rate gezogen. Im Zuge der Recherche zu diesem Artikel habe ich auch noch den Popularity of Programming Language Index gefunden.

Die Ergebnisse sind sehr interessant, weil sie drei verschiedene Messmethoden anwenden, um die gefragtesten Programmiersprachen zu finden.

Der RedMonk Index erscheint alle zwei Jahre und benutzt GitHub und Stack Overflow, um die Rangliste zu erstellen. Damit wird erhofft, die Benutzung (gemessen in Codezeilen) und die Diskussion (Anzahl der Beiträge) in einen Gesamtwert einfliessen zu lassen. Mir persönlich fehlt die Einschränkung auf einen Zeitraum (GitHub: Alle neuen oder alle aktiven Projekte der letzten zwei Jahre beispielsweise). Die für mich interessanten Sprachen finden sich auf folgenden Plätzen:
3 PHP
4 Python
5 Ruby
11 Perl
13 R

Die Berechnung des Tiobe Index ist ein wenig undurchsichtiger, dafür erscheint er aber auch jeden Monat. :-) Die Macher sprechen von einem Popularitätsindex. Die Rangliste wird auf Basis der Ergebnisse in den Suchmaschinen Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube und Baidu ausgerechnet und soll die Anzahl der erfahrenen Ingenieure, Kurse und Drittanbieter berücksichtigen. Wenn man vor der Wahl einer neuen Programmiersprache steht, kann man sich anschauen, was momentan der Trend ist.
6 Python
8 PHP
12 Perl
13 R
16 Ruby

Der letzte im Bunde PYPLI nutzt einzig Google Trends und berücksichtigt nur die Suchen nach Tutorials der Programmiersprachen.
2 PHP
3 Python
10 R
12 Ruby
15 Perl

Interessant ist, dass die Ergebnisse zwar die gleichen Sprachen enthalten, aber in deutlich unterschiedlichen Reihenfolgen.

RedMonk spiegelt die aktive Entwicklung von Open-Source-Projekten wieder, Tiobe zeigt das, was momentan im Markt aktuell ist und PYPLI was gerade gelernt wird. Spannend.

Auch spannend ist, es, sich die Anzahl der registrierten Projekte auf Ohloh anzeigen und nach Sprache auswerten zu lassen.

Globales gitignore ...

Wenn man Dateien aus der Versionskontrolle mit git ausschliessen möchte, kann man im Repository eine Datei .gitignore anlegen. Das ist sinnvoll, wenn es Dateien gibt, die in nur einem Repository ausgeschlossen werden sollen.

Anders ist es, wenn man Backupdateien des Editors ausschliessen möchte. Da in der Regel mehrere Menschen an einem Projekt arbeiten und vielleicht sogar jeder einen anderen Editor benutzt, ist es sinnvoller, dass jeder die Dateien ausschliesst, die seinem Editor entsprechen.

Dazu kann mit dem folgenden Kommando die globale Variable core.excludesfile gesetzt werden, die einen Dateinamen beinhaltet, in der die globalen Ausschlusskriterien zu finden sind.
git config --global core.excludesfile ~/.gitignore_global


Bei mir enthält sie derzeit nur:
*~
Das sind die Backupdateien von vim.

Performanceuntersuchungen ...

Aus aktuellem Anlass muss ich noch einmal auf Bandbreite und Latenz herumreiten und vielleicht noch hinzufügen, dass auch die Anzahl der Anfragen durchaus eine Rolle bei Performance-Betrachtungen spielt.

Wir hatten hier auf einem System massive Performance-Probleme und ich habe relativ schnell herausgefunden, dass ein bestimmter User und von diesem ein bestimmter Prozess für einen grossen Teil der Festplattenlast verantwortlich ist.

Der Applikationsbetreuer war der Meinung, dass das nicht sein könne, da der Teil der Applikation kaum bzw. nur sehr wenig schreibt. Das stimmt, er hat wirklich nicht viel geschrieben, aber dafür wenige Bytes und diese sehr häufig. Das hat die IO-Queue gefüllt und weitere Zugriffe blockiert.

Einige Zeit später hat der Betreuer einfach mal den Prozess beendet und siehe da, die Performance der übrigen Komponenten war sehr hoch.

Lehre, die man daraus ziehen sollte: Glaubt keinem Applikationsbetreuer!

Nein, im Ernst: Es ist wichtig, dass man genau weiss, was eine Applikation tut und noch wichtiger ist es, Performance nicht alleine am Durchsatz fest zu machen. Latenz und Anzahl der Requests spielen ebenfalls eine Rolle.

Cloudprovider ...

Nach meinen wirklich sehr guten Erfahrungen mit DigitalOcean, interessiert mich, welche bezahlbaren Cloudprovider Ihr kennt und womit Ihr Erfahrung habt. Mich interessiert vor allem IaaS (Infrastructure as a service).

Für die einzelnen Begrifflichkeiten verweise ich auf diesen Artikel hier oder den Cloud-Computing-Artikel in der Wikipedia.

Amazon EC2
DigitalOcean
Google Compute
JiffyBox (in Deutschland)
Linode
Microsoft Azure
Rackspace
teutoStack (in Deutschland)

Tiny Tiny RSS update daemon und systemd ...

Um den update daemon von Tiny Tiny RSS unter systemd (CentOS 7) auch bei einem Serverneustart direkt verfügbar zu haben, habe ich das unten stehende Unitfile geschrieben, vielleicht hilft es auch Euch.

Man kann von systemd halten, was man möchte, ich finde es aber deutlich eleganter als System V Initskripte.

[Unit]
Description=Tiny Tiny RSS update daemon
After=network.target mariadb.service
Requires=mariadb.service

[Service]
User=apache
Group=apache
WorkingDirectory=/⁠var/⁠www/⁠html/⁠ttr
Type=simple
StandardOutput=null
StandardError=syslog
ExecStart=/⁠usr/⁠bin/⁠php ./⁠update_daemon2.php
PrivateTmp=true
InaccessibleDirectories=/⁠home /⁠root /⁠boot /⁠opt /⁠mnt /⁠media
ReadOnlyDirectories=/⁠etc /⁠usr

[Install]
WantedBy=multi-⁠user.target


Einfach nach /lib/systemd/system/ttrss-update.service kopieren und mittels systemctl daemon-reload einlesen (den Befehl muss man auch ausführen, wenn man das Skript manuell ändert).

Testen mit
systemctl start ttrss-update
systemctl status ttrss-update


und, wenn alles erfolgreich war mit dem folgenden Befehl aktivieren:
systemctl enable ttrss-update

Git swapped beim Packen ...

Von Zeit zu Zeit lohnt es sich Git-Repositories neu zu packen oder den Müll weg zu bringen (mittels "garbage collection, der Befehl ist git gc).

Auch beim Auschecken oder Klonen von grossen Repositories packt Git neu.

Da ich mit den Standard-Einstellungen regelmässig ware Swap-Orgien erlebt habe, lohnt es sich, die Ressourcen für Git zu begrenzen.

In der Standard-Einstellung benutzt Git pro Core und Hyper-Threading je einen Thread. Da Hyperthreading keinen "echten Prozessor" zur Basis hat, steht aufgrund vieler Kontextwechsel das System nahezu still. Ein System mit zwei Kernen und Hyperthreading wird von Git mit vier Threads konfiguriert und jedem Thread steht im Standard der komplette Arbeitsspeicher zur Verfügung.

Das ist ein bisschen viel. Und die folgenden Konfigurationsoptionen begrenzen das ein wenig.

git config --global pack.threads 2
git config --global pack.windowMemory 1073741824

git config --global pack.depth 250
git config --global pack.window 250


Die genaue Beschreibung der einzelnen Optionen lassen sich auf der git-config-Manpage nachlesen.

Das Repack-Skript auf der oben verlinkten Webseite hat sich damit natürlich auch verändert.

#!/bin/bash

case $(uname) in
    "Linux")
        renice -n 19 -p $$
        ionice -c 2 -n 7 -p $$
        ;;
    "SunOS")
        renice -n 19 -p $$
        ;;
esac

start_directory=$PWD
for i in $(find ${start_directory} -name '.git' -type d); do
    du -hs ${i}/..
    cd ${i}/..

    git gc
    git repack -a -d

    du -hs ${i}/..
    echo
done


Dieses Skript ist Teil meines littlehelpers-Repositories auf GitHub.

Feedly Theme für Tiny Tiny RSS ...

Einer der grössten Kritikpunkte an Tiny Tiny RSS - neben der Tatsache, dass der Hauptentwickler ein Arctrl-wctrl-ww sozial schwierig ist - ist das Aussehen.

Christian Grube hat mich bei Google+ schon vor Monaten auf dieses wirklich hervorragende Theme für Tiny Tiny RSS hingewiesen, ich kann es nur empfehlen:

Das Feedly-Theme für Tiny Tiny RSS.



Der Screenshot ist aus diesem Forenthread.