Die MZLA Technologies Corporation hat mit Thunderbird 78.8.1 ein Update für seinen Open Source E-Mail-Client veröffentlicht.
Neuerungen von Thunderbird 78.8.1
Mit Thunderbird 78.8.1 hat die MZLA Technologies Corporation ein Update für seinen E-Mail-Client veröffentlicht. Dieses beinhaltet diverse Fehlerbehebungen. Eine vollständige Liste der Änderungen gibt es in den Release Notes (engl.).
Unter dem Namen Proton arbeitet Mozilla an einem neuen Design für Firefox, welches Mitte Mai Premiere feiern wird. Dieser Artikel gibt ein Update zum aktuellen Stand der Entwicklung.
Proton ist das neue Firefox-Design
Unter dem internen Projektnamen Proton arbeitet Mozilla an einem neuen Design seines Desktop-Browsers, welches mit Firefox 89 das Licht der Welt erblicken soll. Über Proton wurde auf diesem Blog weltweit als erstes berichtet.
Die Veröffentlichung von Firefox 89 ist derzeit für den 18. Mai 2021 geplant.
Neue Optionen seit dem letzten Update
In den fast drei Wochen seit dem letzten Update auf diesem Blog zum kommenden Proton-Design sind bereits eine ganze Reihe von Änderungen in der Nightly-Version von Firefox gelandet. Da sich das neue Design mitten in der Implementierung befindet, wäre es für eine ausführliche Vorstellung des neuen Designs noch zu früh. Stattdessen legt dieser Artikel den Fokus auf die aktuellen Optionen zum Testen des aktuellen Stands. Denn das neue Design wird hinter verschiedenen Optionen entwickelt, ehe es für alle Nutzer standardmäßig aktiviert wird.
Mit browser.proton.appmenu.enabled gibt es den ersten Schalter schon nicht mehr. Dahinter wurde das neue Hauptmenü entwickelt. Dieses wird jetzt über die Haupteinstellung browser.proton.enabled aktiviert. Zwar ist auch dieses noch nicht ganz fertig, wie man an den Zoom-Buttons sieht, aber die Arbeiten daran sind nun so weit fortgeschritten, dass es nun einfacher zugänglich gemacht wird.
Dafür gibt es mit browser.proton.places-tooltip.enabled wieder eine neue Einstellung, hinter welcher die neuen Tooltips für die Tabs und Lesezeichen entwickelt werden.
Für die Arbeiten an der hellen sowie dunklen Farbvariante hat Mozilla zwei neue Theme eingeführt, welche auf die Namen „Proton Light“ respektive „Proton Dark“ hören. Dabei handelt es sich derzeit noch um jeweils eine exakte Kopie des aktuellen Themes, welches im Laufe der kommenden Wochen optische Anpassungen erhalten wird, ehe daraus dann am Ende der Designentwicklung das reguläre Theme werden wird.
Proton in Firefox Nightly aktivieren
Damit ergeben sich nach aktuellem Stand die folgenden Optionen zur vollständigen Aktivierung aller Baustellen im Rahmen von Proton. Voraussetzung hierfür ist die Verwendung einer Nightly-Version von Firefox.
Update 01.04.2021: An dieser Stelle gab es eine Übersicht über alle Optionen. Stattdessen sei hier nun auf einen aktualisierten Artikel hingewiesen, welcher alle Optionen nach heutigem Stand beinhaltet.
Feedback an Mozilla geben
Natürlich darf an dieser Stelle nicht der obligatorische Hinweis fehlen: Der aktuelle Stand repräsentiert noch nicht das fertige Design. In den nächsten Wochen und Monaten wird sich hinter den genannten (und möglicherweise noch weiteren neuen Schaltern) noch einiges tun. Und dass die meisten Schalter nicht nur standardmäßig deaktiviert sind, sondern vom Nutzer sogar selbst erst angelegt werden müssen, unterstreicht das frühe Stadium der Entwicklung.
Wer dennoch Feedback an Mozilla geben möchte, hat dazu mehrere Möglichkeiten wie den Raum #Proton auf chat.mozilla.org oder ein Thema im offiziellen Nightly-Forum von Mozilla zu eröffnen. In beiden Fällen erfolgt die Kommunikation natürlich in englischer Sprache.
Cookies und Tracking sind inzwischen zwei Seiten derselben Medaille. Das Thema ist so bekannt, viele Schutzmechanismen wurden etabliert und die DSGVO zeigt auch Wirkung. Also verabschiedet sich Google vom sinkenden Schiff. Man braucht es auch nicht mehr. Man kontrolliert schließlich den Browser.
Dabei ist eher das Gegenteil richtig. Google verabschiedet sich von einer immer weniger funktionierenden Technik, weil es bessere Möglichkeiten gefunden hat, Werbung zielgerichtet an den Verbraucher zu bringen. Cookies waren einfach kein adäquates Mittel mehr. Jeder halbwegs interessierte Verbraucher wusste durch die Berichterstattung der vergangenen Jahre, wie Tracking per Cookie funktioniert. Immer mehr Browser sperrten Drittanbieter-Cookies als Standard, Addons räumten hinter den Nutzern her und im wichtigen europäischen Raum (China ist für Google schließlich tabu als Wachstumsmarkt) geht ohne informierte Einwilligung rechtlich eigentlich gar nichts. DSGVO sei Dank!
Stattdessen bemüht man in Zukunft die mächtigste Waffe zur Kontrolle der Nutzer, über die der Konzern verfügt: Den Browser. Zwei Drittel der Internetnutzer nehmen dafür Chrome. Den ach so schnellen, komfortablen und im Kern doch quelloffenen Browser des Suchmaschinen-Anbieters. Wie netzpolitik.org zu berichten weiß, möchte Google in Zukunft die Anwender in kleine Gruppen sortieren, die dann nicht individualisiert, aber auf Basis der Gruppe mit Werbung bedacht werden.
Ein heikles Unterfangen, denn wenn die Gruppe klein genug ist, wird es mit der Anonymität schwer. Google behauptet natürlich, dass man diese wahren möchte, aber hierzu empfehle ich euch den kürzlich von Mike Kuketz veröffentlichten Artikel zu Tracking. Jeder, der schon mal im großen Stil mit Datenverarbeitung und -auswertung befasst war, weiß, wie schwer konsequente und wirkungsvolle Anonymisierung ist. Selbst wenn man wirklich vorhat, konsequent und sauber zu anonymisieren, passieren da leicht Fehler.
Vermutlich bräuchte der Konzern nicht mal die neuen Funktionen in Chrome. Durch unzählige Dienste von Crashlytics bis Google Fonts hat sich der Konzern mit dem Internet verwoben und bekommt dadurch unzählige Daten. Nicht zuletzt von den Android-Smartphones, die quasi permanent Daten an Google übermitteln.
Das ist so weit auch überhaupt nicht überraschend. Google ist ein Werbekonzern. Es ist nahezu das einzige funktionierende Geschäftsmodell des Konzerns. Seit Jahren gelingt es Google nicht, neue erfolgreiche Dienste zu launchen. Die letzten Erfolge waren eigentlich Android und YouTube, die beide eigentlich Zukäufe waren. Die Cloud-Sparte wächst zwar, aber hier hat man mit Amazon AWS und Microsofts Azure starke Mitbewerber.
Man muss es so deutlich sagen: Kein Mensch, der nur ein wenig Wert auf seine Privatsphäre und seine Daten legt, nutzt Google Chrome als Browser! Unsere Internetaktivitäten sagen unglaublich viel über uns aus und diesen Raum mit dem Werkzeug eines Werbekonzerns zu besuchen ist an Absurdität kaum zu überbieten. Wenn man Chrome oder andere Google-Dienste nutzt, kann man eigentlich auch gleich auf alle anderen Schutzmaßnahmen verzichten.
Leider ist es immer schwieriger, dem Konzern aus dem Weg zu gehen. Mangels eines funktionierenden Geschäftsmodells hat sich die Open Source-Gemeinschaft bereitwillig dem Konzern als Finanzier an den Hals geschmissen. Finanzierung der Mozilla Foundation, GSoC, Project Zero, direkt angestellte Entwickler. Und eben nicht zuletzt die Chromium-Engine. Nahezu alle freien Browser basieren inzwischen darauf und über so schöne Sachen wie Qt-Webengine noch viel mehr. Keinem dieser Projekte ist es gelungen, die engen Anbindungen an Google komplett zu kappen. Diese vielfältigen Abhängigkeiten sollte man sich vergegenwärtigen, wenn man glaubt mit Open Source und Linux pauschal auf der sicheren Seite zu sein.
Hier zeigen sich die Nachteile einer weltweiten Gemeinschaft. Außerhalb Deutschlands und Europas hat Datenschutz einen viel geringeren Stellenwert. Nicht umsonst ist eine Einbindung des Google-Kontos oft die erste Funktion für Webkonten, Mail & Co in KDE und GNOME.
Aber noch gibt es wirklich freie Alternativen, die nicht nur eine andere Oberfläche über die gleiche Basis legen. Noch gibt es Firefox. Ein Browser, der bei allen problematischen Entwicklungen der letzten Jahre im Großen und Ganzen ein datenschutzfreundliches Werkzeug bleibt. Funktional und von der Geschwindigkeit ist er schon lange konkurrenzfähig zu Chrome.
Nachtrag vom 05.03.2021
Ich möchte noch auf den Artikel bei Dr. Datenschutz hinweisen. Insbesondere auf den Aspekt, dass Google diese Veränderung möglicherweise in Angriff nimmt um seine dominierende Stellung auf dem Werbemarkt gegen die Konkurrenz zu behaupten. Ein riskanter Zug angesichts der laufenden Verfahren in den USA und bei der EU.
Linux Mint (bzw. seine Benutzer haben) nicht unbedingt überall einen sehr guten Ruf. Das liegt in Ubuntuforen natürlich daran, dass es augenscheinlich wohl heißt “Linux Mint basiert auf Ubuntu, also Linux Mint == Ubuntu”. Das dies nicht unbedingt stimmt merkt man an Linux Mints Updatesystem. Gerade habe ich diesen Blogbeitrag auf dem OSBN gelesen. Und dazu muss ich jetzt meinen Senf geben.
Linux Mint hat sicherlich seine Vorzüge, allerdings ist besonders das Updatesystem Linux Mints, der Punkt der Linux Mint immer wieder zum Verhängnis wird und enorm den Ruf schädigt.
Eine Distribution die langjährig Updates zurückhält (Quelle) möchte ich nicht nutzen. Und augenscheinlich viele andere auch. Dass dadurch Sicherheitslücken entstehen können. Das selbe Schicksal widerfuhr auch dem sogenannten Arch-Derivat Manjaro. Click! Manjaro verbesserte sein System 2014 und Linux Mint tat dies im Sommer 2018; der Ruf bleibt allerdings und sorgt nicht überall für ein tolles Image. Ausgerechnet Linux Mint, die Distribution, die Benutzern Updates vorenthielt, meint jetzt seinen Updatemechanismus zu erweitern und auch an vergessene Updates zu erinnern. Vielleicht erscheint das nicht nur mir etwas ironisch.
Noch hat Linux Mint keine Updatepflicht und wird sie wahrscheinlich auch nicht in der nächsten Version haben. Sollte es allerdings irgendwann(tm) eine Updatepflicht geben, gehe ich jetzt schon davon aus, dass es sehr viele negatvie Reaktionen geben wird, weil Benutzer dann wieder in eine - wenn auch sinnvolle - Zwangsjacke gesteckt werden und denken, sie hätten ein Windows 10. Dann würde nur noch fehlen, dass die Updates automatisch eingespielt werden und der Computer danach plötzlich selbst neustartet. (Willkommen bei Windows!!)
Deshalb mein Fazit (an alle):
Spielt Updates ein!
Was daran so schwer ist verstehe ich immmernoch nicht. Man muss es ja nicht täglich machen, aber einmal in der Woche einen Terminal öffnen und folgenden Befehl einfügen und bestätigen dürfte doch eigentlich nicht so schwer sein:
Beim Aufruf von fcd mit bin als Zielordner erlebte m-bostaurus, dass nur 1 Verzeichnis gefunden wurde. Meine erste Vermutung, es könne daran liegen, dass zu viele Treffer gefunden werden, und die Parameterliste zu lang ist, bewahrheitete sich zwar nicht, aber mit dem Umbau, der das Problem beheben sollte, war es behoben.
Ich verwende jetzt `mapfile`, um die Suchergebnisse in ein Array zu packen.
Hier der neue Code:
#!/bin/bash
#
# fcd.sh:
#
# Fast change directory. Should be sourced from ~/.bashrc file, since it is and
# needs to be a function.
#
# Update Ver.1.1, 2021-03-03
# Bugfix for missing results when fast changing to "bin", thanks to m_bostaurus.
# Update Ver.1.0, 2021-02-07
# changed from egrep to mapfile, see code. Handles blanks in paths now flawlessly.
# Update Ver.0.9, 2013-08-21, comments, publication
#
# Prototyp 2010
#
# This program depends on locate/updatedb, which aren't always installed/activated.
# If you use the shell on a regular basis, you should have them installed, though.
#
# (c) GPLv3 (2010, 2021)
#
fcd ()
{
suchdirname=$1
# list=$(locate $1 | egrep "/$1$"); # Version 1
# update 12.02.2021
# mapfile -d '' list < <(locate -b -0 -r "$suchdirname$")
# update 19.02.2021
mapfile -d '' list < <(locate -b -0 -r "^$suchdirname$")
# count=$(echo $list | wc -w );
# update 19.02.2021
count=${#list[@]}
case $count in
0)
echo "unknown directory: "$1 && return
# could search for partial matches Doc => Documentation
;;
1)
if [[ -d "${list[0]}" ]]; then
echo "1) match: $list";
cd "$list";
else
echo "not a directory: $1";
fi
;;
*)
select directory in "${list[@]}" "/exit/";
do
if [[ "$directory" = "/exit/" ]]; then
break;
fi;
if [[ -d "$directory" ]]; then
echo "multi) $directory";
cd "$directory";
break;
else
echo "not a directory: "$1;
fi;
done
;;
esac
}
Der neue Code ist jetzt 2 Wochen bei mir im Einsatz, und funktioniert tadellos.
Wenn aber doch jmd. noch Fehler findet – immer her damit!
Beim Aufruf von fcd mit bin als Zielordner erlebte m-bostaurus, dass nur 1 Verzeichnis gefunden wurde. Meine erste Vermutung, es könne daran liegen, dass zu viele Treffer gefunden werden, und die Parameterliste zu lang ist, bewahrheitete sich zwar nicht, aber mit dem Umbau, der das Problem beheben sollte, war es behoben.
Ich verwende jetzt `mapfile`, um die Suchergebnisse in ein Array zu packen.
Hier der neue Code:
#!/bin/bash
#
# fcd.sh:
#
# Fast change directory. Should be sourced from ~/.bashrc file, since it is and
# needs to be a function.
#
# Update Ver.1.1, 2021-03-03
# Bugfix for missing results when fast changing to "bin", thanks to m_bostaurus.
# Update Ver.1.0, 2021-02-07
# changed from egrep to mapfile, see code. Handles blanks in paths now flawlessly.
# Update Ver.0.9, 2013-08-21, comments, publication
#
# Prototyp 2010
#
# This program depends on locate/updatedb, which aren't always installed/activated.
# If you use the shell on a regular basis, you should have them installed, though.
#
# (c) GPLv3 (2010, 2021)
#
fcd ()
{
suchdirname=$1
# list=$(locate $1 | egrep "/$1$"); # Version 1
# update 12.02.2021
# mapfile -d '' list < <(locate -b -0 -r "$suchdirname$")
# update 19.02.2021
mapfile -d '' list < <(locate -b -0 -r "^$suchdirname$")
# count=$(echo $list | wc -w );
# update 19.02.2021
count=${#list[@]}
case $count in
0)
echo "unknown directory: "$1 && return
# could search for partial matches Doc => Documentation
;;
1)
if [[ -d "${list[0]}" ]]; then
echo "1) match: $list";
cd "$list";
else
echo "not a directory: $1";
fi
;;
*)
select directory in "${list[@]}" "/exit/";
do
if [[ "$directory" = "/exit/" ]]; then
break;
fi;
if [[ -d "$directory" ]]; then
echo "multi) $directory";
cd "$directory";
break;
else
echo "not a directory: "$1;
fi;
done
;;
esac
}
Der neue Code ist jetzt 2 Wochen bei mir im Einsatz, und funktioniert tadellos.
Wenn aber doch jmd. noch Fehler findet – immer her damit!
Bei ubuntuusers.de kann man viel “Abbonieren” und erhält dann E-Mail-Benachrichtigungen. Ansonsten kann man auch Atom-Feeds in seinen Feedreader der Wahl importieren. Diese Feedurls sind logisch aufgebaut.
Einen Überblick über die Feeds kann man auch hier bekommen.
Forum
Das ganze Forum
Wenn man das ganze Forum abbonieren will, benutzt man folgende URL:
https://forum.ubuntuusers.de/feeds/WAS/ANZAHL/
Das “ANZAHL” kann man mit einer entsprechenden Zahl ersetzen. Das ist eigentlich nebensächlich, ich habe da meistens 10 oder 20 eingetragen. Für “WAS” gibt es drei Optionen:
short - nur die Einleitung
full - ganzer Beitrag
title- nur der Titel
Unterforum
Auch Unterforen (z.B. das Wikiforum) können per Feed abboniert werden.
“WAS” und “ANZAHL” sind die selben Optionen wie oben. “FORENSLUG” legt das Forum fest. Das Wikiforum hat die URL https://forum.ubuntuusers.de/forum/wiki/, FORENSLUG ist also mit wiki zu ersetzen.
Wiki
Die letzten Änderungen im Wiki sind über folgende Feed-URL erreichbar:
https://wiki.ubuntuusers.de/_feed/10/
Bei Feeds für einzelne Artikel scheint es aktuell einen Fehler zu geben.
[Update 22.3.21]
Bei den Feeds für einzelne Artikel gab es nicht wirklich einen Bug, der lag unter https://ubuntuusers.de/feeds/ und wird beim nächsten Inyoka-Release korrigiert. :) Die Feeds für einen einzelnen Artikel funktionieren wie folgt:
https://wiki.ubuntuusers.de/SEITE/a/feed/ANZAHL/
Auch dieser Link dürfte verständlich sein.
[Update 29.03.21]
Gestern war das Webteam so nett und hat Inyoka 0.26.0 auf die Server geschoben, dass den Fehler unter ubuntuusers.de/feeds behoben hat.
Mein liebster Feedreader ist eigentlich Newsbeuter. Dieser wird aber nicht mehr weiterentwickelt und ist deshalb auch für Ubuntu 20.04 nicht mehr in den Paketquellen. Schade…
Die gute Nachricht: Newsbeuter hat einen aktiv weiterentwickelten Fork - Newsboat. Und Newsboat ist sogar in den Paketquellen. Deshalb kann man das Programm mit folgendem Kommando installieren:
sudo apt-get install newsboat
Die Feeds werden in der Datei ~/.newsboat/urls abgespeichert. Hier schreibt man einfach eine URL in jede Zeile und startet danach Newsboat neu - alternativ benutzt man die Tastenkombination [Strg] + [R].
Das bewirkt das beim Drücken von [o] der Artikel in Lariza geöffnet wird. Würde man hier firefox eintragen, würde der Artikel in Firefox geöffnet werden. Die zweite und dritte Zeile sorgt dafür, dass die Feeds alle 10 Minuten neu eingelesen werden und die letzte Zeile ist der User-Agent, mit dem sich newsboat beim Abrufen der Feeds ausgibt, in meinem Fall also der User-Agent Lynx’. Die Konfigurationen und die Feed-Liste können 1:1 von newsbeuter übernommen werden.
~/.bashrc
[...]
alias newsboat='newsboat -r'
[...]
Beim Öffnen von Newsboat werden die Feeds neueingelesen.
Einer der ersten Vorteile, der einem bei Linux immer am Anfang erzählt wird, ist sicherlich, dass Linux Open Source ist und man deshalb ja den Quellcode einsehen kann und verändern kann (wie viel Benutzer das tatsächlich machen, sei mal dahingestellt).
Tatsächlich ist das gar nicht schlecht und auch einer der Gründe für Linux für mich. Viele behaupten deshalb pauschal, Linux ist ein sog. “freies Betriebssystem”.
Wenn man sich mit Linux zumindest etwas beschäftigt hat, müssen einem die Namen “Richard Stallman” sowie GNU, das man ja bekanntermaßen nicht Unix ist 😉, über den Weg laufen. Wenn es nach Richard Stallman geht, ist Linux kein freies System und vor allem folgt es nicht dem GNU-Prinzip (“One tool, one job”). In Linux wird nämlich nicht per se gegen proprietäre Software vorgegangen.
Also gab es schlaue Entwickler, die den Linux-Kernel (also das eigentliche “Linux”) von allem proprietären Kram befreit haben und das ganze als “Linux Libre” zur Verfügung stellen. Aber wieso nimmt man nicht einfach das Betriebssystem, das durch Richard Stallman in die Welt gerufen wurde: GNU.
Tja, da gibt es ein winziges Problem, der Betriebssystemkernel von GNU, GNU Hurd, ist ziemlich instabil und es will wohl keiner damit arbeiten.
Das GNU-Projekt und die “Free Software Foundation”, die von dem selben Herrn gegründet wurde, setzt sich radikal gegen proprietäre Software ein und entwickelt dabei eine Reihe von eigenen Programmen, darunter:
Mailman - Programm zum Verwalten von Mailinglisten
wget - Downloadmanager
bazaar - Versionsverwaltung
coreutils - ohne das kann man die meisten Linux-Distris vergessen
Linux-Libre - siehe oben
bc - Taschenrechner für die Konsole
GNOME - eine Desktopumgebung
GnuPG - muss man das erklären…
u.v.m.
Man kann sogar seine eigenen Programme dem GNU-Projekt vorschlagen, vielleicht wird man ja aufgenommen. Vorraussetzung ist natürlich, dass die Programme frei sind. Aufgrund der Tatsache, dass Linux in vielen Punkten von GNU-Software abhängt, wird es auch GNU/Linux genannt.
Aus diesen vielen Programmen kann man dann sogar theoretisch ein echtes GNU basteln, mit Hurd als Kernel. Viel Spaß! (von Debian gibt es sogar eine Variante mit Hurd).
Was bräuchte es dafür (lose Gedankensammlung):
Hurd als Kernel
IceCat als Webbrowser
coreutils
bash als Shell
GNOME als Desktopumgebung (vielleicht sollte mal jemand(tm) eine leichtgewichtige Desktopumgebung schreiben, unter die GPL stellen und GNU vorschlagen)
GRUB als Bootmanager
durchgängig GTK+-Programme (Qt ist böse 😈 )
Guix als Paketmanager
wget als Downloadmanager
etc.
Dann hätte man ein echtes GNU als Betriebssystem. Es ist ja nicht so, dass sowas schon gemacht wurde: GNU Guix System (nicht mit dem Paketmanager verwechseln!!)
*
Ein kurzer Blick in den TIOBE-Index zeigt: auch wenn Go und Rust als die Systemsprachen der Zukunft gelten, ist C weiterhin omnipräsent. Eine gute Gelegenheit, ein interessantes Thema aufzugreifen: die Strict Aliasing Rule.
Wer mit C programmiert, dirigiert Speicher – genauer gesagt Arbeitsspeicher. C wird gerne als portable Assemblersprache betrachtet, diese stellt den Speicher allerdings besonders in den Vordergrund. Der Kontakt mit Speicher tritt einerseits bei der dynamischen Speicherverwaltung mit malloc() und free() auf, erfolgt allerdings bereits mit der Verwendung von Datentypen. Ich umschreibe Datentypen gerne als „Schablone“ bzw. „Maske“ für Speicher. Der kleinste Datentyp ist der char, er umfasst 1 Byte. Hiernach folgt der short, der 2 Byte groß ist. Für besonders große Zahlen gibt es long mit 4 Byte. Spielt die Anzahl der Bytes keine Rolle, kann man den int nehmen, der mindestens 2 Byte groß sein soll, ich habe also keine Garantie, dass ein int immer wie unter Linux 4 Byte umfasst, wenn ich meinen Code auf eine andere Maschine zum Laufen bringen will. Im Zweifel muss ich ihn also portieren.
Obenstehende Abbildung zeigt, wie zwei Zahlen im Speicher liegen: im einfachsten Fall in Binärdarstellung, dicht an dicht. Haben wir zwei zusammenliegende Speicherstellen, die als char markiert sind, können wir in Versuchung kommen, diesen Speicher umzuinterpretieren. Was passiert, wenn wir diese 2 Bytes nicht als zwei chars, sondern als ein short betrachten? C gilt als schwach typisiert, weil wir genau das tun können. Und das geht so:
Das ist der Grund, warum ich bei C an Programmierung mit Typenschablonen als Sicht auf den Speicher denke. Rechnen wir jetzt alles zusammen, müsste das Programm uns 1324 ausgeben – tut es aber nicht. Auf einem aktuellen 64-bit Linux-System wird stattdessen 11269 ausgegeben. Wir haben trotzdem fast alles richtig gedacht, nur müssen wir uns ins Gedächtnis rufen, dass x86-CPUs mit Little Endian arbeiten und wir deshalb die Bytes verdreht denken müssen. Dieser Fallstrick soll uns aber ein Gefühl dafür geben, wie oft bei C-Programmierung die lockere Standardisierung sowie die lokalen (i. S. v. Architektur) Gegebenheiten Herausforderungen bescheren.
Structs in C
Informationen kommen selten einzeln daher. Um sie sinnvoll im Code und im Speicher zu strukturieren, bietet C die structs, die eine Reihe von Mitgliedern (ähnlich wie Variablen) organisieren. Ein Beispiel:
struct country {
char *name;
char iso3166[3];
unsigned short formation;
char *capital;
};
Im Speicher können wir uns das so vorstellen, auch wenn wir ein entscheidendes Detail noch im Laufe des Beitrags kennenlernen werden:
Diese Vorstellung hilft zwar an der einen oder anderen Stelle, kann allerdings auch zu Missverständnissen führen, wenn wir uns zu sehr auf diese Speicherdarstellung verlassen.
Wir könnten zum Beispiel denken, dass wir vereinfacht die Werte verdrehen können:
Bei structs kommt es vor allem auf die Reihenfolge und die Datentypen an – allerdings kann man nicht darauf vertrauen.
Objektorientierung in C
Im voherigen Beispiel konnten wir eindrucksvoll sehen, dass wir besonders einfach Pointer auf structs umcasten – und somit uminterpretieren – können. Diese Technik ist als type punning bekannt, wurde schon vor knapp 40 Jahren bei den Berkley sockets (vgl. struct sockaddr_in) eingesetzt und lässt sich nun für viele verschiedene Zwecke einsetzen: zum Beispiel für Vererbung oder Bäume – oder die Kombination aus beidem.
Zur Veranschaulichung möchte ich einen Baum aus der Verwaltungsgliederung heranziehen: hier gibt es den Staat, die Bundesländer und die Landkreise, die jeweils unterschiedliche Informationen besitzen.
Ziel ist es, jeden Knoten am Baum aufzuhängen. Allerdings ist die Struktur komplex: so hilft es nicht, den Typen anhand der Ebene festzulegen, weil sonst Landkreise und kreisfreie Städte nicht unterschieden werden können. Die Lösung wäre, ein Unterscheidungsfeld am Anfang eines jeden Knotens festzulegen. Bei der Implementierung müssen wir bedenken, dass natürlich technsiche Informationen zur Baumimplementierung mitgegeben werden sollen:
struct country {
char type;
void *child;
void *sibling;
// data
char *name;
char *capital;
//...
};
struct state {
char type;
void *child;
void *sibling;
// data
char *name;
//...
};
struct district {
char type;
void *child;
void *sibling;
// data
char *name;
//...
};
Strict Aliasing Rule
Doch halt! Wir dürfen bei C nicht vergessen, dass wir im Zweifel alles hinterfragen müssen. Unser Ziel ist es, dass die ersten drei Felder immer an der gleichen Stelle im Speicher liegen, sodass wir unabhängig von der Wahl der drei structs immer die gleichen Member an der gleichen Stelle erreichen können. Doch können wir uns darauf verlassen? Die Antwort ist im C-Standard zu finden und hier gibt der C99-Standard unter der Sektion „6.7.2.1 Structureand union specifiers“, Punkt 13 Aufschluss. Dieser Punkt beschreibt, dass bei structs die Reihenfolge der Members im Speicher unverändert sein und das erste Element auch am Anfang beginnen muss – er erlaubt aber auch Freiraum zwischen den Feldern, die der Compiler in Verbindung mit seinem Optimierungssystem selber bestimmen darf.
Für den Compiler hat dies Vorteile – für uns als Programmierer wird dies allerdings eine Herausforderung. Wir können uns also nur sicher sein, dass die Adresse des ersten Elements mit der Adresse des Structs selber übereinstimmt. Die Strict Aliasing Rule ist eine Folge aus diesem Umstand und sagt aus, dass wir nur dann standardkonform einen Pointer dereferenzieren können, wenn dessen Typ kompatibel zu dem Typ ist, der für die Speicherstelle festgelegt wurde.
Die Lösung
Wie können wir denn aber nun effizient unseren Baum umsetzen? Indem wir den Umstand ausnutzen und den gemeinsamen Anfang auslagern:
struct node_base {
char type;
void *child;
void *sibling;
};
struct country {
struct node_base base;
// data
char *name;
char *capital;
//...
};
struct state {
struct node_base base;
// data
char *name;
//...
};
struct district {
struct node_base base;
// data
char *name;
//...
};
Hierdurch erreichen wir, dass das (erste) Element garantiert an der gleichen Stelle (d. h. am Anfang) liegt und wir auf zusätzliche Indirektionen / Pointer oder Abstraktionen verzichten können.
Fazit
C ist weiterhin eine sehr effiziente und systemnahe Sprache, die einen unverblümten Blick auf das wichtigste Material eines Programmiers gibt, mit dem dieser seine Programme formt: den Speicher. Mit zunehmendem Optimierungswunsch gibt es jedoch seit knapp 20 Jahren eine Regel, die nur wenige kennen, aber große Auswirkungen besonders dem Portieren hat: die Strict Aliasing Rule. Es gibt noch weitere Anwendungsfälle für sie, ein wichtiger Anwendungsfall wurde in diesem Artikel besprochen. Dieser Fall tritt besonders dann auf, wenn Strukturen aus der Objektorientierten Programmierung (OOP) in C nachgebildet werden sollen.
Dass diese Regel eher unbekannt ist, lässt sich auch daran erkennen, dass die Referenzimplementierung von Python, CPython, noch bis zur Version 2.7 gegen diese Regel verstieß – was allerdings dank PEP 3123 mit CPython 3.0 gelöst wurde.
Strict Aliasing lässt sich übrigens in den meisten Compilern ausschalten, wer allerdings plattform- und compilerübergreifenden Code schreiben will, sollte die Regel allerdings beachten.
Android ohne Google IX – Mehr Kontrolle mit NetGuard
Smartphones befinden sich naturgemäß nicht immer hinter einem Filter wie pi-hole und nicht allen Apps vertraut man uneingeschränkt. Diese Lücke kann NetGuard schließen.
Es gibt verschiedene Möglichkeiten, den Netzwerkverkehr eines Android-Smartphones zu filtern. AFWall+ ist sicherlich eine sehr mächtige Lösung, benötigt aber root-Rechte. Ich roote meine Smartphones aus Sicherheitserwägungen grundsätzlich nicht. Außerdem macht man sich das Leben mit einem gerooteten Smartphone auch nicht unbedingt leichter. Eine weitere Möglichkeit sind Apps, die ein virtuelles lokales VPN betreiben und den Netzwerk verkehr über diesen Umweg filtern. In diese Kategorie fallen Blokada und NetGuard.
Blokada ist, was die Bedienung betrifft, definitiv die einfachere Lösung. Der gesamte Traffic wird durch ein VPN geleitetet, der Anwender wählt aus verschiedenen Blocking-Listen aus und entsprechend dieser Listen filtert Blokada. Vor allem wenn man nicht viel Konfigurationsaufwand betreiben möchte, ist Blokada eine tolle Lösung. NetGuard hat darüber hinaus noch weitergehende Möglichkeiten, da man damit einzelne Apps komplett vom Zugriff auf WLAN und/oder mobile Daten ausschließen kann. Der Preis dafür ist ein ungleich höherer Konfigurationsaufwand und geringere Übersichtlichkeit.
NetGuard installieren
Es gibt NetGuard in verschiedenen Ausführungen:
Im Play Store gibt es eine funktional abgespeckte Version, die den Google-Richtlinien entspricht. Schließlich möchte der Werbekonzern Google keine Apps zulassen, die potenziell Werbung filtern können.
Weil Android aber eine offeneres Betriebssystem als z. B. iOS ist, kann man via GitHub auch eine APK herunterladen und manuell installieren.
Eine weitere Version lässt sich über den F-Droid Store beziehen.
Diese Anleitung basierte auf der F-Droid Variante und sollte auch mit der GitHub-Variante funktionieren. Die Play Store-Ausführung ist ungeeignet, da sie funktional zu beschnitten ist.
Der Entwickler von NetGuard, Marcel Bokhorst, ist auch für die beliebte Mail-App FairEmail verantwortlich. Ähnlich wie bei FairEmail sind einige Pro-Funktionen als „Premium“ markiert und setzen eine Spende voraus. Spendet man mehr als 5€ kann man NetGuard auf allen eigenen Geräten aktivieren. Eine solch schmale Spende sollte selbstverständlich sein, wenn man eine App nutzt!
Die Pro-Funktionen umfassen die Möglichkeit, den Netzwerk-Verkehr zu filtern und das Filter-Protokoll. Für diese Anleitung setze ich die Pro-Funktionen voraus.
Der Spendenprozess ist etwas kompliziert, weil F-Droid kein integriertes Bezahlsystem hat, funktioniert aber zuverlässig. Zur Auswahl stehen aktuell PayPal, Bitcoin oder Monero.
NetGuard einrichten
Nach dem Start muss man erst einmal die Einrichtung der VPN Verbindung zulassen. Diese ist Grundvoraussetzung für den Betrieb der App.
Nach dem Start ist die App dennoch deaktiviert. Der Schieberegler oben Links zeigt den Betriebszustand an. Über die drei Punkte oben rechts erreicht man – wie bei Android üblich – die Menüs.
In den Einstellungen ruft man zuerst die Standard-Einstellungen auf. Hier muss man wählen zwischen einem Backlist- und einem Whitelist-Ansatz. Bei einem Whitelist-Ansatz wählt man WLAN und Mobilfunk blockieren, wodurch alle Apps automatisch keinen Netzzugriff haben und dieser manuell freigeschaltet werden muss.
Man kann dies auch umgekehrt machen und von Haus aus allen Apps Netzzugriff gewähren und nur einzelne Apps blockieren. Das hängt stark von eurem Nutzungsprofil und den genutzten Apps ab. Ich mag dieses „mehr“ an Kontrolle und verfolge einen Blacklist-Ansatz. Den Schalter für „Wenn Bildschirm an“ Regeln anwenden habe ich deaktiviert. Hierdurch kann man Apps bei aktiviertem Screen den Zugriff erlauben und würde dadurch primär unerwünschten Traffic im Hintergrund verhindern.
Anschließend benötigt man eine Blocking-Liste, die sich über den Einstellungspunkt Sicherung laden lässt.
NetGuard nimmt dazu die Liste von Steven Black. Es lassen sich auch andere Listen nutzen, aber da mir die Liste von Steven Black genügt, habe ich das nicht getestet. Soweit ich das sehe, aktualisiert NetGuard die Host-Datei nicht automatisch, man sollte also von Zeit zu Zeit die Option Host-Datei herunterladen anklicken.
Danach ruft man die Erweiterten Optionen auf. Hier kann man entscheiden, ob man die Regeln auch für System-Apps anwenden möchte. Ich nutze ein sehr reduziertes Custom ROM, weshalb ich auf den zusätzlichen Konfigurationsaufwand verzichte. Arbeitet man mit einem Stock ROM, muss man sich ggf. diese Mühe machen. Die Option Datenverkehr filtern ist essenziell, da dadurch erst die Blocking-Liste zum Einsatz kommt. Die Optionen Internetzugriff protokollieren und Bei Internetzugriff benachrichtigen sind für den Anfang bei einem Blacklist-Szenario sehr hilfreich, da dadurch Benachrichtigungen bei einem Internetzugriff erscheinen. Ansonsten würden die Apps einfach stillschweigen blockiert werden. Nach einiger Zeit kann man diese Optionen aber zugunsten des Batterieverbrauchs deaktivieren, da dann jede App konfiguriert sein dürfte.
NetGuard im Betrieb
Hat man alle Einstellungen vorgenommen, schaltet man NetGuard scharf.
Entweder konfiguriert man nun in der App-Liste schon mal prophylaktisch für die Apps die jeweiligen Berechtigungen oder wartet auf die jeweilige Benachrichtigung. Über die drei Menüpunkte kann man im Betrieb das Protokoll aufrufen (muss ggf. erst angeschaltet werden) und damit lässt sich verfolgen, was die Apps so aufrufen. Das Protokoll ist ausführlicher, aber auch unübersichtlicher als bei Blokada.
Seine Stärke spielt NetGuard also weniger als Adblocker aus, sondern mehr im Bereich der Kontrolle. Apps, denen man keinen Zugriff auf das Netz oder z. B. nur im WLAN Zugriff gestatten möchte, lassen sich so effektiv steuern. Für reines Adblocking nutze ich zusätzlich Fennec mit uBlock.
Bewertung
Wenn man ein seriöses Custom ROM nutzt und nur Apps aus F-Droid installiert, braucht weder Blokada, noch NetGuard. Sobald man aber Apps aus dem Play Store (oder eben Aurora) oder Hersteller-Apps via APK installiert, betritt man quasi das Reich des Bösen. Manche Apps haben mehr Tracker als Funktionen integriert und nicht auf alle Apps kann man verzichten. Hier ist dann je nach Bedarf Blokada oder NetGuard erforderlich.
Es ist schon fast ein running gag. Bei jeder neuen Plasma-Version wird vollmundig ein noch besserer Wayland-Support versprochen. Benutzbar ist es trotzdem nicht – jedenfalls nicht, wenn man so exotische KDE Applications wie Kontact nutzt.
Bei der jüngsten Veröffentlichung von KDE Plasma 5.21 wurde wieder vollmundig Wayland-Support versprochen:
KDE is pushing to have first class support for Wayland, and Plasma 5.21 makes massive progress towards reaching that goal.
https://kde.org/announcements/plasma/5/5.21.0/
Viele Leser werfen mir ja meine „Meckerei“ vor, aber wenn mir zum wiederholten Mal massiver Fortschritt hin zu einer erstklassigen Unterstützung versprochen wird, erwarte ich doch schon ein wenig Benutzbarkeit.
Meine Hardware ist das hier vorgestellte HP EliteBook. Ich habe also eine Intel Onboard Grafik (Comet Lake) und damit alles andere als irgendwas Exotisches oder gar proprietäre Treiber.
Nachdem Plasma 5.21 nun für Arch Linux ausgerollt wurde, habe ich heute die Gelegenheit ergriffen und mal ein Update gemacht und auch mal wieder die Wayland Session gestartet.
Das Experiment dauerte keine 5 Minuten. Der Desktop startet zwar, aber KMail ist unbenutzbar. Grafik-Artefakte, keine Größenveränderung des Fensters möglich – Ende des Experiments.
Für mich war KDE mal eine hochgradig integrierte Software-Sammlung – das war die Stärke von KDE gegenüber z. B. einer losen Zusammenstellung von MATE, Thunderbird & Co. KDE scheint mit seiner Markenstrategie auch die Verantwortung für die Applications abgeben zu wollen. Was echt nett ist, weil es außer Kontact keine PIM-Suite für KDE gibt. Oder hat jemand mal Kube in freier Wildbahn gesehen?
Rein Marken-technisch haben die Entwickler vielleicht recht, wenn sie ihre Ankündigungen nur auf bestimmte Produkte beziehen – also von Wayland-Support reden und wirklich nur den Plasma-Desktop meinen. Helfen wird es ihnen in der Öffentlichkeit nicht. Die schreibt nämlich immer noch erstaunlich oft von KDE 5 und meint damit mehr als nur den Desktop.
Nebenbei gelang es mir auch nicht einen Hauptmonitor zu definieren, aber da ich sowieso nicht vorhatte, die Wayland-Session weiter zu nutzen (ohne E-Mail Programme und PIM Suite bringt das ja nichts) bin ich da nicht weiter ins Detail gegangen.
Mal sehen, wie oft man noch in Ankündigungen enorme Fortschritte hin zu erstklassigem Wayland-Support lesen darf, bevor man das wirklich nutzen kann.
Ansonsten ist das neue Startmenü nett und das Farbschema wurde auch hübsch angepasst. Der neue Systemmonitor nimmt zwar den halben Screen ein und versteckte die Informationen in zig Untermenüs aber sieht auch nett aus. Hier hat man sich scheinbar vom Windows 10-Task Manager inspirieren lassen. Wirklich toll ist die Abkehr von den uralten Startscripten und der Wechsel auf systemd zum Starten der Plasma-Session. Diese Funktion hätte es mehr verdient, ins Schaufenster gestellt zu werden, als ein nicht funktionierender Wayland-Support.
Firefox hat scheinbar die Kurve gekriegt und rollt wieder interessante Funktionen aus, nachdem man einige Zeit lang vor allem durch so etwas wie Pocket und Screenshots glänzte. In der aktuellen Version 86 führt man einen neuen Cookie-Schutz ein.
Ich hatte kürzlich ja bereits berichtet, dass ich mich von der dauernden Cookie-Löscherei verabschiedet habe. Eine Grundvoraussetzung hierfür war die First Party Isolation. Nun ersetzt Mozilla das System quasi durch eine erweiterte Netzwerk-Partitionierung.
Nicht nur die Cookies werden nun zwischen den Webseiten isoliert, sondern alle gespeicherten Daten. Also auch Cache, Session-IDs & Co. Damit möchte man die immer beliebter werdenden Tracking-Mechanismen jenseits von Cookies adressieren.
Bei neuen Profilen ist die Netzwerk-Partitionierung seit Firefox 85 aktiviert und „Total Cookie Protection„-Funktion wird aktiviert, wenn man den „Verbesserten Schutz vor Aktivitätenverfolgung“ in den Einstellungen auf „Streng“ setzt.
Bei bestehenden Profilen muss ggf. erst einmal die First Party Isolation deaktiviert werden. Entweder indem man das entsprechende Addon deinstalliert oder – sofern man die Anpassung manuell vorgenommen hat – indem man in about:config den entsprechenden Schalter wieder umlegt.
privacy.firstparty.isolate = false
Danach ist noch zu prüfen, ob die Netzwerk-Partitionierung aktiv ist:
privacy.partition.network_state = true
Möchte man nicht pauschal die Richtlinie zur Aktivitätenverfolgung auf „Streng“ setzen, kann man den neuen Cookie-Schutz auch manuell einschalten. Die Cookie-Partitonierung mittesl „Total Cookie Protection“ aktiviert folgende Anpassung:
network.cookie.cookieBehavior = 5
Eine schöne neue Funktion und sollte von allen umgesetzt werden. Firefox ist unverzichtbar wenn man auch nur ein bisschen Wert auf digitale Privatsphäre legt. Leider setzt sich der Abwärtstrend unvermindert fort und es steht zu befürchten, dass wir bald nur noch die Wahl zwischen dem einen oder anderen Chrome-Fork haben.
Die MZLA Technologies Corporation hat mit Thunderbird 78.8 ein planmäßiges Update für seinen Open Source E-Mail-Client veröffentlicht.
Neuerungen von Thunderbird 78.8
Mit dem Update auf Thunderbird 78.8 hat die MZLA Technologies Corporation ein planmäßiges Update für seinen Open Source E-Mail-Client veröffentlicht. Die neue Version bringt mehrere Fehlerbehebungen, welche sich in den Release Notes (engl.) nachlesen lassen, und schließt darüber hinaus auch mehrere Sicherheitslücken.
Mozilla hat Firefox 86 für Windows, Apple macOS und Linux veröffentlicht. Dieser Artikel fasst die wichtigsten Neuerungen zusammen – wie immer auf diesem Blog weit ausführlicher als auf anderen Websites.
Als Mozilla vor vier Wochen Firefox 85 veröffentlicht hat, wurde mit der Einführung der sogenannten Netzwerk-Partitionierung, nebenbei bemerkt dem umfangreichsten Partitionierungs-System aller Browser, ein großer Schritt in Richtung eines noch besseren Schutzes der Privatsphäre der Nutzer gemacht. Gleichzeitig wurde für Nutzer, welche den strengen Schutz aktiviert haben, die „Level 2“-Liste aktiviert, welche noch mehr Tracker blockiert.
Mit Firefox 86 geht Mozilla den nächsten großen Schritt für all jene Nutzer, welche in den Datenschutz-Einstellungen den strengen Schutz einschalten.
Damit wird nämlich eine zusätzliche Maßnahme aktiviert, welche Mozilla als „vollständigen Cookie-Schutz“ bezeichnet. Vereinfacht gesagt bedeutet dies, dass die Cookies jeder Domain in einem separaten Cookie-Container gespeichert werden – seitenübergreifendes Tracking über Cookies ist so nicht mehr möglich.
Neue Drucken-Oberfläche
Die Verbesserung der Drucken-Funktion war ein großer Schwerpunkt von Mozilla in den letzten Monaten. Dies schließt zum einen Verbesserungen der Druckausgabe in vorherigen Updates ein und wird mit Firefox 86 auch direkt sichtbar, in Form eines komplett neuen und plattformübergreifend konsistenten Drucken-Dialogs anstelle der bisherigen vom jeweiligen System bereitgestellten Drucken-Oberfläche.
Seite als PDF-Datei speichern
Ein komplett neues Feature, welches Mozilla im Rahmen der neuen Drucken-Oberfläche implementiert hat, ist die Möglichkeit, eine Webseite als PDF-Datei zu speichern. Diese Funktion kann über den neuen Drucken-Dialog genutzt werden, ähnlich wie eine solche Funktion in der Vergangenheit durch virtuelle „PDF-Drucker“ auf System-Ebene bereitgestellt werden konnte.
Bild-in-Bild für mehrere Videos gleichzeitig
Ein Video ansehen und gleichzeitig etwas anderes am Computer machen – mit Firefox kein Problem. Bei Klick auf die entsprechende Schaltfläche wird das jeweilige Video vom Tab losgelöst und erscheint in einem eigenständigen kleinen Fenster. Dieses liegt über allen Anwendungen, d.h. Firefox muss sich nicht im Vordergrund befinden, um das Video zu sehen. Der Benutzer kann beispielsweise seine E-Mails in Thunderbird abrufen und gleichzeitig ein Video auf YouTube ansehen.
Bisher war diese Funktion auf ein Video limitiert. Multitasking-Experten dürfen sich freuen, denn ab sofort ist es möglich, mehr als ein Video gleichzeitig vom Hauptfenster losgelöst zu haben und so mehrere Videos parallel sehen zu können, während gleichzeitig andere Aufgaben erledigt werden.
Leseansicht auch für lokale Dateien
Per Klick auf das Buch-Symbol in der Adressleiste erscheinen Artikel im Web so aufbereitet, dass sie störungsfrei gelesen werden können. Konkret bedeutet dies eine angenehme Farbgebung und Schriftgestaltung sowie keine störenden Elemente wie Werbung. Der Nutzer hat hierbei auch diverse Anpassungsmöglichkeiten und kann sich die Artikel sogar vorlesen lassen.
Dabei gab es bislang eine Einschränkung: Es musste sich um Artikel im Web handeln, welche über https:// respektive http:// aufgerufen werden. Für lokal gespeicherte Dateien hat die Leseansicht bisher also nicht funktioniert. Ab sofort steht die Leseansicht auch für lokal gespeicherte Dokumente zur Verfügung, welche via file:// aufgerufen werden.
Dark-Mode für Text-Dokumente
Heute bietet praktisch jedes System einen sogenannten Dark-Mode, in welchem dunkle Farben verwendet werden, was (abhängig von der Bildschirmtechnologie) nicht nur die Akkulaufzeit verbessern kann, sondern gerade in dunkler Umgebung auch für die Augen angenehmer sein kann. Auch Firefox besitzt ein dunkles Theme, welches standardmäßig automatisch aktiviert wird, wenn der Dark-Mode des Betriebssystems aktiv ist.
Beim Betrachten von Text-Dokumenten in Firefox hatte man bislang jedoch nicht viel von diesem dunklen Theme, denn hier war der Hintergrund weiterhin Weiß und der Natur eines Text-Dokumentes gemäß gab es von dieser Weißfläche sehr viel.
Ab Firefox 86 werden auch für Text-Dokumente im Dark-Mode dunkle Farben benutzt.
Verbesserungen der Webplattform und Entwicklerwerkzeuge
Firefox unterstützt nun die CSS Pseudoklasse :autofill. Experimentell dazu kommt eine erste Unterstützung der CSS-Funktion image-set() für responsive Bilder in CSS. Die Unterstüzung dafür muss in Firefox 86 allerdings noch via about:config aktiviert werden (layout.css.image-set.enabled).
Auf JavaScript-Seite erwähnenswert ist die Unterstützung von Intl.DisplayNames.
Bei Verwendung von margin oder padding für interne table-Elemente zeigt Firefox jetzt eine Warnung an, dass diese Eigenschaft keine Wirkung hat. Ähnliche Warnungen für „inaktives CSS“ zeigt Firefox bereits seit längerem für viele weitere Dinge an.
Gibt es auf einer Seite Script-Fehler zeigen die Entwickler-Werkzeuge die Fehleranzahl nun direkt in der Werkzeugleiste an, auch wenn das Konsolen-Werkzeug selbst nicht geöffnet ist.
Bei Seiten mit iFrames erlaubt ein neues Auswahlwerkzeug nun die Auswahl des entsprechenden iFrames. Inspektor, Konsole und Debugger beziehen sich dann auf das jeweilige iFrame statt auf die gesamte Seite.
Ausführliche Informationen zu Verbesserungen der Webplattform in Firefox 86 finden sich auf hacks.mozilla.org sowie in den MDN web docs.
Geschlossene Sicherheitslücken und andere Sicherheits-Verbesserungen
Wie immer hat Mozilla auch in Firefox 86 wieder mehrere Sicherheitslücken geschlossen. Alleine aus Gründen der Sicherheit ist ein Update auf Firefox 86 daher für alle Nutzer dringend empfohlen.
Das Decoding von Videos findet ab sofort in einem separaten Firefox-Prozess („RDD“) statt.
Auf Linux wurde ein Schutz aktiviert, um vor der sogenannten Stack Clash-Attacke zu schützen. Und für WebRTC-Kommunikation ist DTLS 1.0 nicht länger ausreichend, DTLS 1.2 wird ab sofort vorausgesetzt.
Sonstige Neuerungen in Firefox 86
Auf Apple macOS 11 und höher zeigt Firefox in der Menüleiste nun an, wenn Medien wie beispielsweise ein Video auf YouTube wiedergegeben werden.
Für Nutzer mit aktiviertem Hauptpasswort wird auf about:logins fünf Minuten nach der Entsperrung eine erneute Eingabe erzwungen, wenn der Nutzer die Passwörter erneut im Klartext sichtbar machen möchte.
Wurde der CSV-Import von Zugangsdaten aktiviert (signon.management.page.fileImport.enabled in about:config) erscheint nun nach dem Import ein Dialog, welcher zusammenfasst, wie viele Datensätze importiert worden sind und ob es ggfs. Fehler gab.
Für Nutzer von Firefox in Kanada wurde das Feature ausgerollt, Kreditkarten-Daten in Firefox speichern und Formulare automatisch entsprechend ausfüllen zu können. Bisher stand dieses Feature nur für Nutzer in den USA zur Verfügung. Pläne für die Deutschland, Österreich und die Schweiz sind zu diesem Zeitpunkt nicht bekannt.
Die Auslagerung vom Canvas- und WebGL-Zeichnen in den GPU-Prozess auf Windows sowie Apple macOS soll eine spürbar verbesserte Performance und Stabilität in bestimmten Situationen bringen.
Auch für WebExtension-Entwickler gab es wieder ein paar Verbesserungen, welche sich hier nachlesen lassen. Unter anderem benötigen Erweiterungen nicht länger die umfangreiche „tabs“-Berechtigung, um auf die Tab-URL, den Titel sowie die Favicon-URL zuzugreifen, wenn eine entsprechende Host-Berechtigung existiert.
Natürlich kam auch in Firefox 86 die Unterstützung weiterer Unternehmensrichtlinien sowie weitere Verbesserungen der Barrierefreiheit, Fehlerbehebungen und sonstige Verbesserungen unter der Haube dazu.
Synology betreibt seine bekannten NAS Systeme mit einem eigenen Betriebssystem – dem DiskStation Manager – das letztlich ein Linux ist. Doch ein reichlich altes Linux und Updates kommen nur selten.
Die Synology DiskStation 218 war eine meiner besten Kaufentscheidungen im IT-Bereich vergangenen Jahre. Das System ist vielseitig, stabil und wartungsarm. Ich konnte damit viel mehr Dinge realisieren, als vorher auf meinem Linux Home-Server liefen und habe gleichzeitig viel weniger Scherereien.
Mit dieser Entscheidung bin ich nicht alleine. Zusammen mit QNAP dürfte Synology einen Gutteil des deutschen Marktes unter sich aufteilen und ich weiß, dass Synology auch bei vielen IT-technisch versierten Nutzern beliebt ist, wenn sie etwas Wartungsarmes brauchen.
Selbst einem unkritischen Nutzer fällt aber die geringe Update-Frequenz auf. Die Version 7 des DSM ist massiv verspätet und bisher im Betatest. Die Produktivsysteme laufen auf DSM 6, zuletzt auf Version 6.2.4-25554 aktualisiert. Updates kommen sehr selten, die letzte Aktualisierung kam am 16.12.2020 und davor sogar 16.07.2020. Die Updatefrequenz für Pakete wie PHP, MySQL, Perl & Co ist nicht wesentlich besser.
Die Basis ist das, was im Linux-Jargon gerne als „gut abgehangen“ bezeichnet wird. Ich hatte dazu hier mal ein bisschen was geschrieben. Auch mit dem jüngsten Update hat sich da an den Versionen wenig getan. Der Kernel basiert weiter auf 4.4.59+, PostgreSQL ist nun bei 9.3.25, nginx ist jetzt bei 1.16.1. Was mit Version 7 mitgeliefert wird, konnte ich bisher noch nicht testen.
Nun sind Versionen natürlich nicht alles, man kann schließlich sicherheitsrelevante Fehler auch patchen, ohne die Version zu verändern. Hier macht die geringe Updatefrequenz aber Sorgen.
Es handelt sich immerhin um Geräte, die potenziell direkt aus dem Netz erreichbar sind und viel mehr Angriffsfläche als ein normales Desktopsystem bieten.
Wie würdet ihr das beurteilen? Bin ich zu kritisch? Gibt es wirklich so wenige sicherheitskritische Probleme bei den Basispaketen?
Da ich unter Linux Musik produziere gibt es hier und da Möglichkeiten, wie man das System etwas tunen kann. Eines der Dinge ist, dass man sich einen Low Latency Kernel installiert, wenn man an die Grenzen des Rechners stößt. Allerdings hat dieser dann eventuell so den einen oder anderen Nachteil, wenn man den Rechner noch für Alltagsarbeiten nutzt. Daher arbeite ich mit dem ganz normalen Kernel von Kubuntu 20.04 LTS der auch wunderbar seinen Dienst verrichtet.
Es gibt da aber dennoch die eine oder andere Kleinigkeit, die man machen kann, um das System zu optimieren. Quasi zu Fokussieren. Erik Rigtorp hat hier einen Low Latency Tuning Guide geschrieben, der ein paar sehr eigentlich selbstverständliche und ein paar interessante Vorschläge enthält.
Aktuell teste ich gerade recht zufriedenstellend, das Abschalten des Hyperthreadings.
Kurz gesagt: In meinem Rechner arbeitet ein Intel mit 4 CPU Cores, die virtuell jeweils nochmal aufgeteilt werden. In meinem System werden dadurch 8 CPUs angezeigt, die jeweils eigene Prozesse abarbeiten können. Das so eine Multiparallelität nicht immer von Vorteil ist, wenn man eine Sache benutzen möchte, kennt man ja schon aus der realen Welt, bzw auch von anderen Betriebsystemen.
Es gibt verschiedene Wege das Hyperthreading abzuschalten, ich habe mich im Moment für die Konsole entschieden und gegen das BIOS, so kann ich das immer recht spontan an und wieder ausschalten.
Daher habe ich mir folgendes kleines Script namens cpu_disable_hyperthreading.sh angelegt, um den Parameter komfortabel umschalten zu können. Das Skript muss mit root Rechten bzw sudo ausgeführt werden !
#!/bin/bash # Titel: Hyperthreading ausschalten # Autor: hoergen # Datum: 12.02.2021 # # Zum Ausführen des Scriptes muss man root sein # # Quelle: https://rigtorp.se/low-latency-guide/ # #
while [ -n "$1" ]; do
case "$1" in
-h) echo -e "\n\nOhne Parameter wird das Hyperthreading ausgeschaltet" echo " und der aktuelle Status wird angezeigt" echo " -h zeigt diese Hilfe an" echo -e " -a aktiviert das Hyperthreading wieder.\n\n";; -a) echo "\n\nSchalte Hyperthreading aus. Ausgeschaltet=0" echo on > /sys/devices/system/cpu/smt/control;;
*) echo "\n\nOhne Parameter wird das Hyperthreading ausgeschaltet" echo "Schalte Hyperthreading an. Angeschaltet=1" echo off > /sys/devices/system/cpu/smt/control;; esac shift done
# Disable Hyperthreading #echo "Schalte Hyperthreading aus. Ausgeschaltet=0" #echo off > /sys/devices/system/cpu/smt/control hyperStatus=$(cat /sys/devices/system/cpu/smt/active) echo -e "\n\nHyperthreading ist aus:0 / an:1 = $hyperStatus"
# Check if turbo boost is enabled enabled = 0 turboBoost=$(cat /sys/devices/system/cpu/intel_pstate/no_turbo) echo -e "Turbo Boost ist an:0 / aus:1 = $turboBoost\n\n"
Linux ist kein Betriebssystem, sondern ein Kernel. Den Spruch kriegen Anwender seit Jahren zu hören. Das was auf den Geräten installiert wird, kommt meist in Form einer Linux-Distribution, also einer Zusammenstellung, zum Anwender. Doch welche Bedeutung haben sie nach Jahren der Nivellierung?
Wie der Name schon sagt, sorgen Distributionen für die Verteilung der Software an den Anwender. Man kann Linux nicht ohne Distribution nutzen, man kann sich höchstens selbst eine Distribution mit Linux from Scratch bauen. Dirk Deimeke hat kürzlich in seinem Blog über die zukünftige Rolle von Distributionen geschrieben. Die Perspektive auf das Problem rührte primär von den neuen Formen her Applikationen auszurollen. Seien es Container oder neue Formate. Ich denke die Ursache für den sukzessiven Bedeutungsverlust liegt noch tiefer.
Linux-Distributionen sind ein interessantes Phänomen, wenn man sich den Unterschied von Selbst- und Fremdwahrnehmung angucken möchte. In der Community sind sie identitätsstiftend und die Community formiert sich noch immer primär um die einzelnen Distributionen. Sie sind hier möglicherweise sogar noch wichtiger als die Desktopumgebungen. Das steht in einem interessanten Spannungsverhältnis zur Fremdwahrnehmung, die meist von „dem Linux“ spricht und damit oft die führenden Distributionen meint. Doch steht die Selbstwahrnehmung auch in einem Spannungsverhältnis zur Realität?
Die neuen Formate mit zentralen Verteilungsmechanismen für Applikationen – seien es Docker-Container, Flatpaks oder Snaps – beschleunigen sicher einen Trend, aber sie verursachen ihn meiner Meinung nach nicht. Linux-Distributionen sind seit Jahren einer starken Nivellierung ausgesetzt.
Um zu erklären, was ich damit meine, muss ich ein wenig in Erinnerungen schwelgen. Damals, 2007 oder so, als ich meine ersten nachhaltigen Gehversuche mit Linux machte, gab es massive Unterschiede zwischen den Distributionen. Es ging hier um so grundlegende Fragen wie das Init-System. Upstart, SysV-Init oder BSD-Like Kreationen wie bei Arch Linux. Ob eine Distribution länger an HAL festhielt oder früh auf den neuen Ansatz DeviceKit wechselte, war nichts was der Anwender bestimmen konnte. Das gleiche bei dem Gegensatz richtiger root-Account versus sudo, der Endlosdiskussionen auslöste. Konfigurationswerkzeuge konnten ganz unterschiedlich sein. Man erinnere sich an das Mandriva Control Center (MCC) oder YaST. Unter der Oberfläche waren die Unterschiede noch gewaltiger. Obwohl Linux ein unixoides System ist, regelt das nicht bis ins letzte Detail wo Systemdateien und Bibliotheken liegen müssen.
Bei der Paketverwaltung gab es himmelweite Unterschiede, die weit über den Gegensatz RPM versus DEB hinausgingen. Es machte in der praktischen Bedienung durchaus einen Unterschied, ob man das komplexe Toolkit von Debian verwenden durfte oder die quälend langsamen Routinen von openSUSE oder Fedora. Letztere konnten lange Zeit nicht mal nicht mehr benötigte Abhängigkeiten entfernen und die Abhängigkeitshölle mit totaler Blockade des Systems ist kein Märchen, sondern war traurige Realität.
Auch die Software-Auswahl war eine bewusste Entscheidung der Distributions-Entwickler. Die Beispiele entstammen jetzt dem KDE-Bereich, weil ich damit am meisten gearbeitet habe, aber sie lassen sich sicher auf andere Desktopumgebungen übertragen. Die Entscheidungen für KDE bei 3.5 zu bleiben, wie Debian sie entgegen dem allgemeinen Trend bei „Lenny“ traf, waren individuelle Entscheidung der Entwickler. Nur wenige mögen sich erinnern, aber Kubuntu lieferte bereits mit KDE 3.5 Dolphin als Dateimanager aus. Oder wenn eine Distribution eine bestimmte Software wie KDEPIM in einer anderen Version nutzte, als den Rest des Ökosystems und so den Wechsel auf Akonadi hinauszögerte. Die Wahl des Displaymanagers auf LightDM, wie sie bis vor Kurzem das Ubuntu-Universum prägte, hatte Folgen für die Anwender. Die Upstream-Entwickler haben das gehasst, weil die Wechselwirkungen unvorhersehbar waren und so manches Problem verursachten.
Der Anwender entschied sich somit nicht nur für eine Distribution als Marke, sondern kaufte damit im übertragenen Sinne auch ein Set an Werkzeugen und Systemdesign-Entscheidungen ein, die sein Anwendungserlebnis massiv prägten.
Das hat sich in den letzten Jahren sukzessive gewandelt. In einem allgemeinen Trend haben die meisten Distributionen sich für systemd und damit verbundene Dienste entschieden. Das gleiche gilt für PolicyKit, udev, upower usw. Der Trend, alles in /usr abzulegen vereinheitlicht die Dateistrukturen der Distributionen. freedesktop-Standards spielen heute eine zentrale Rolle und werden verbreitet befolgt. Heute kommen sogar Debian und Fedora mit Administratorrechten via sudo und die Distributionen, die beim klassischen root-Konzept geblieben sind, blockieren einen direkten Anwendungsstart damit. Die Entwicklung ausgereifter grafischer Konfigurationswerkzeuge für die Desktopumgebungen hat Eigenlösungen der Distributionen abgelöst (außer bei openSUSE). Software ist komplexer geworden, weshalb die meisten Distributionen upstream nur noch wie vorgesehen paketieren.
Sogar vor den Installationsroutinen hat die Nivellierung nicht halt gemacht. Sehr viele Distributionen verwenden heute Calamares als Installer. Das Spektrum reicht hier von Debian bis Manjaro. Daneben pflegen viele Distributionen zwar noch ihre Eigenentwicklungen, aber der Trend ist deutlich zu sehen.
Die Unterschiede zwischen den meisten Distributionen haben sich also stark nivelliert. Wer das nicht wahrhaben möchte, sollte mal versuchen, ein aktuelles BSD aufzusetzen. Natürlich gibt es noch die Spezialfälle wie Slackware, Vault Linux oder Devuan aber diese sind eine winzige Minderheit. Sowohl was die Nutzerzahlen betrifft, als auch gemessen an der Gesamtzahl der Distributionen. Die meisten Distributionen haben inzwischen ein stark vereinheitlichtes Ökosystem mit lediglich graduellen Unterschieden. Man kann Systeme und Arbeitsweisen meist sehr schnell auf einen neuen Unterbau umziehen.
Das gilt sogar für die Releasezyklen. Entweder es gibt keinen Zyklus und die ganze Distribution wird rollend weiter entwickelt oder es gibt fixe Zyklen mit relativ langen Supportzeiträumen. Es ist fertig, wenn es fertig ist, was z. B. lange Debian von Ubuntu abhob, gilt schon lange nicht mehr. Faktisch wird irgendwann alle zwei Jahre im Frühjahr ein Release veröffentlicht um den groben Zyklus einzuhalten.
Noch lustiger wird es, wenn man auf die Ebene der Maintainer guckt. Zwischen Debian und Ubuntu gibt es inzwischen so viele „Personalunionen“, wo der gleiche Entwickler die selben Pakete für beide Distributionen betreut, dass man schon fast Debuntu als Distribution sprechen kann.
Diese Nivellierung sehe ich überhaupt nicht negativ. Qualitativ hat Linux als System massiv vom Wechsel Quantität zu Qualität profitiert. Niemand, der beispielsweise mit openSUSE 10.2 arbeiten durfte will ernsthaft in diese Zeit zurück.
Auf diese stark vereinheitlichte Basis treffen nun neue Paketierungsformate für Desktopsysteme und der Trend zu Virtualisierung und Containern im professionellen Bereich. Der Trend zur Vereinheitlichung wird sich dadurch eher beschleunigen, da zentrale Anwendungen aus den gleichen Bezugsquellen dann einfach auf die Distributionsbasis gelegt werden.
Angesichts der Nivellierung stellt sich aber schon die Frage, warum es diesen Zoo an Distributionen gibt. Im Grunde genommen ist meiner Meinung nach vor allem Tradition und Identitätsbildung für die Community. Zusätzlich noch ein paar dicke Entwickler-Egos, denn warum sollte man gerade das eigene Projekt zugunsten der Konkurrenz einstellen.
Denn faktisch ist Linux längst ein Betriebssystem. Linux ist der Kernel plus zentrale Bestandteile, die nahezu alle Distributionen teilen und die sie von anderen freien Systemen wie BSD-Varianten oder Android abheben.
Mit „Kanboard im Container…“ hat mein Ausflug ins Containerland begonnen. Mittlerweile läuft mein Pod bereits eine Weile und ich nutze die Anwendung regelmäßig. Jedoch musste ich nach jedem Neustart des Hosts den Pod kanboardpod manuell starten. Ich hatte mir daher vorgenommen, hierfür eine Systemd-Service-Unit zu erstellen, welche diesen Task automatisiert. Doch habe ich mit Freude festgestellt, dass podman-generate-systemd(1) mir diese Arbeit abnehmen kann.
Also starte ich einen ersten Versuch und erzeuge entsprechende Service-Unit-Dateien in meinem HOME-Verzeichnis. Die Option „--name“ sorgt dafür, dass in den Service-Unit-Dateien die Namen des Pods bzw. der Container verwendet werden, anstatt der UUIDs. Die Option „--files“ sorgt dafür, dass die Ausgabe in Dateien und nicht auf die Standard-Ausgabe geschrieben wird.
Um die generierten Service-Units zu installieren und zukünftig als derjenige User auszuführen, welcher den Pod und die Container erzeugt hat, verschiebe ich sie in das zu erstellende Verzeichnis ~/.config/systemd/user. Anschließend werden die neuen Units in die Systemd-Konfiguration eingelesen und aktiviert.
Nachdem ich die Service-Units an die richtige Stelle verschoben und aktiviert hatte, habe ich meine laufende Pod-Instanz gestoppt und über die entsprechende Service-Unit gestartet.
Ich wähnte mich nun bereits am Ziel. Doch nach einem Neustart des Hosts war die Anwendung wieder nicht verfügbar. Die Service-Unit war nicht gestartet worden. Podman kann hier nichts dafür, denn es ist systemd, welcher dafür sorgt, dass im User-Kontext laufende Services beendet werden, wenn sich der entsprechende User ausloggt und diese erst startet, wenn der User sich einloggt.
Valentin Rothberg von Red Hat gab mir den entscheidenden Tipp, um dieses Problem zu lösen. Die Lösung versteckt sich in der Manpage zu podman-generate-systemd(1):
The systemd user instance is killed after the last session for the user is closed. The systemd user instance can be kept running ever after the user logs out by enabling lingering using
$ loginctl enable-linger <username>
Manual page podman-generate-systemd(1)
@Valentin: Thanks a lot, that solved my issue!
Fazit
Ich bin ehrlich gesagt hoch erfreut, dass die Entwickler hier eine Möglichkeit vorgesehen haben, um aus bestehenden Pods bzw. Container-Instanzen Systemd-Service-Units generieren zu können. Dies ermöglicht es, Container-Instanzen und Pods mit den gewohnten Werkzeugen zu starten, zu stoppen und deren Status zu kontrollieren.
So besteht die Möglichkeit, die rootless-Podman-Container auch als unprivilegierte Dienste laufen zu lassen. Das gefällt mir.
Als Cloud noch primär für ausgelagerten Festplattenspeicherplatz stand und als Thema insgesamt noch neu war, schossen die Verschlüsselungslösungen nur so aus dem Boden. Doch was ist jetzt noch aktuell?
Ich habe heute die Übersichtsseite zur Cloud und zu Verschlüsselungslösungen für die Cloud aktualisiert. Die Liste umfasst immer noch den Dreiklang aus Boxcryptor (proprietär), Cryptomator (Open Source) und EncFS (unsicher, aber immer noch verbreitet). Hinzu kommt noch SimpleumSafe für macOS-Anwender.
Daneben gibt es noch ein paar Nischenlösungen. Anwender von KDE Plasma können mit Plasma Vault arbeiten, das aber funktional noch immer nicht den Kinderschuhen entwachsen ist und es gibt hacky Oberflächen wie Sirikali oder zulucrypt.
Bei der Überarbeitung habe ich festgestellt, dass ich mich schon lange nicht mehr intensiv mit dem Thema befasst habe, weil ich es kaum noch benötige. Gleichwohl scheint sich auf dem Gebiet auch nicht viel getan zu haben.
Cloud betreibe ich entweder in Eigenregie mit Nextcloud oder nutze meine Synology NAS als Cloud-Speicher. In meinem Umfeld habe ich den Eindruck, dass dieser Weg verbreitet ist. Wer für das Thema Cloud-Verschlüsselung sensibilisiert ist, hat irgendwann den Weg zur eigenen Cloud genommen.
Greife ich abgesehen davon auf einen Cloud-Speicher zurück, dann um Dateien zu teilen und gemeinsam zu bearbeiten. Verschlüsselung ist dann keine Funktion, die ich benötige, weil eine gemeinsame Bearbeitung von Dateien mit Ende-zu-Ende-Verschlüsselung quasi nicht möglich ist. Es soll da Lösungen geben, aber eine wirklich Funktionierende ist mir bisher nicht unter gekommen.
Darum würde mich interessieren, womit ihr so arbeitet. Nutzt ihr Cloud-Verschlüsselung überhaupt noch oder betreibt ihr eure eigene Cloud? Sofern ihr noch verschlüsselt, welche Lösung verwendet ihr? Welche Beschränkungen und Probleme gibt es?
Openbox ist ein toller Fenstermanager und für mich in Kombination mit dem Panel Xfces ein guter Ersatz für komplette Desktopumgebungen. Auf meinem Laptop habe ich parallel zu Openbox noch Xfce.
Das Whiskermenu im Xfce-Panel hat als Standardbefehl zum Abmelden xfce4-session-logout gesetzt. Das funktioniert unter Xfce natürlich super, unter Openbox gibt es hier aber eine Fehlermeldung, da ja keine Xfce-Session läuft.
Ein entsprechendes Pentant für Openbox gibt es im Rootmenu (REchtsklick auf den Desktop) unter “Exit”. Alternativ mit mehr Auswahlmöglichkeiten gibt es den Befehl obsession-logout.
Theoretisch könnte man jetzt also den Befehl xfce4-session-logoutdurch obsession-logout ersetzen. Dann könnte ich die Schaltfläche aber nicht einfach unter Xfce einsetzen. Also muss eine Lösung her - z.B. ein Skript.
Der Aufbau ist eigentlich denkbar einfach: Ein Skript überprüft, ob gerade Xfce oder Openbox läuft. Wenn Xfce verwendet wird wird der Befehl xfce4-session-logout aufgerufen und unter Openbox der andere Befehl. Theoretisch wäre dieses Skript dann beliebig erweiterbar (Habe ich aber nicht probiert).
Welche Desktopumgebung man verwendet kann man mit folgendem Befehl herausfinden:
printenv XDG_SESSION_DESKTOP
herausfinden.
Ein Skript (nennen wir es z.B. obxfceausloggen) sähe z.B. so aus:
#!/bin/bash
desktop=$(printenv XDG_SESSION_DESKTOP)
if [ "$desktop" == "openbox" ]
then
obsession-logout
elif [ "$desktop" == "xfce" ]
then
xfce4-session-logout
else
echo "Desktopumgebung nicht unterstützt. Beende."
exit 1
fi
Das kann man jetzt zum Beispiel unter ~/bin abspeichern und (das Folgende setzt voraus, dass ~/bin Teil des “Paths” ist) im Whiskermenu als Befehl beim Abmelden obxfceausloggen eintragen. Die Einstellungsmöglichkeit dazu findet man wie folgt:
Rechtsklick auf das Whiskermenu –> “Eigenschaften” –> “Befehle” –> “Abmelden”. Dort kann man dann das Skript als Befehl eintragen.
Die Konfiguration des YubiKeys erfolgt über Open Source-Software. Hier gibt es parallele Lösungen, die sich unterschiedlich bedienen. Sofern verfügbar ist der YubiKey-Manager zu bevorzugen.
Recherchiert man zum YubiKey stößt man oft auf das Personalization-Tool, für das auch eine GUI gibt. Diese GUI ist so grausam (Screenshots hier), dass ich hier immer die entsprechenden Befehle für die Kommandozeile angegeben habe. Die Entwicklung des Personalization-Tools hat YubiKey aber zugunsten einer neuen Lösung eingestellt.
Neu ist der YubiKey-Manager, für den es ebenfalls eine optionale GUI gibt.
Windows und macOS-Anwender können sich die Software einfach bei Yubico herunterladen. Für Linux empfiehlt Yubico auf der Webseite das AppImage aber ich finde AppImages von allen drei modernen Formaten (Flatpak, Snap, AppImage) als unhandlichste Variante.
In den Paketquellen herrscht bei vielen Distributionen aber leider ein ganz schöner Wildwuchs mit vielen Abhängigkeiten. Bei Arch Linux zieht der neue Manager das alte Tool als Abhängigkeit mit, bei Debian scheint dies nicht notwendig zu sein, das gleiche gilt für openSUSE. Debian und Ubuntu liefern allerdings nur die CLI und nicht die GUI. Hier bietet Yubico selbst ein PPA an. Im Gegenzug zum alten Tool ist das neue Werkzeug in aktiver Entwicklung. Je nach Distribution und Releasemodell sollte also auf die Versionsnummer geachtet werden. Sternstunden der Linux-Paketierung eben.
Um den neuen Manager zu nutzen muss der pcscd Service laufen.
# systemctl start pcscd
Die GUI erlaubt es übersichtlich die Slots zu konfigurieren, aber auch Funktionen wie NFC bei Bedarf abzuschalten. Vor allem Letzteres ist sinnvoll, wenn man nur ausgewählte Funktionen verwendet.
Wer sich also sicherer mit einer GUI fühlt sollte zur neuen Variante greifen. Eine gute GUI ersetzt nämlich durchaus in vielen Fällen die Kommandozeile.
Der Passwortmanager ist ein ebenso notwendiger wie neuralgischer Punkt. Er ermöglicht komplizierte und vielfältige Passwörter, aber ist gleichzeitig der Schlüssel zu unserer gesamten digitalen Identität. Hier kann man mit YubiKey für mehr Sicherheit sorgen.
KeePassXC ist eine der wenigen Erfolgsgeschichten aus einem Fork. Durch die Abspaltung von KeePassX hat die Entwicklung wieder so richtig Fahrt aufgenommen und viele tolle Funktionen wurden implementiert.
Ein Passwortmanager sollte nie nur mit einem starken Passwort geschützt sein, sondern immer noch mit einem zweiten Faktor, der sich in eurem Besitz befinden muss. Insbesondere wenn die Passwortdatenbank über einen Cloud-Speicher synchronisiert wird.
Für den niedrigschwelligen Einstieg bietet KeePassXC hier die Möglichkeit, eine Schlüsseldatei zu erzeugen. Zum Entsperren der Datenbank benötigt man dann Passphrase und Schlüsseldatei. Die Kombination von Wissen und Besitz sozusagen. Diese Schlüsseldatei bewahrt man natürlich getrennt von der Passwortdatenbank auf. Die Datenbank kann über einen Cloud-Speicher synchronisiert werden, die Schlüsseldatei sollte hingegen nie ins Internet geraten, sondern über ein Kabel oder im Heimnetz auf das Gerät übertragen werden. Da sich die Schlüsseldatei nie oder selten ändert, ist das auch kein Komfortproblem.
Mehr Sicherheit bietet hier natürlich der YubiKey, denn eine Schlüsseldatei ist schließlich auch nur eine Datei und kann theoretisch bei einem Angriff auf eurer System gestohlen werden. Der YubiKey befindet sich dagegen auch physisch in eurem Besitz.
KeePassXC mit YubiKey absichern
Legt ein Backup der Datenbank an bevor die Sicherheitseinstellungen verändert werden. Ansonsten verliert ihr bei Problemen Zugriff auf die gesamte Datenbank.
Unter Datenbank / Datenbank-Sicherheit lassen sich die verschiedenen Sicherheitsmaßnahmen konfigurieren.
KeePassXC verweist hier bereits auf die Notwendigkeit, das HMAC-SHA1 Challenge-Response Verfahren zu nutzen. Solltet ihr den YubiKey bereits für LUKS nutzen, ist Slot 2 bereits passend konfiguriert.
Über den Button YubiKey Challenge-Response hinzufügen startet die Einrichtung, die sehr einfach ist. KeePassXC erkennt den YubiKey, man bestätigt mit einem Tipp auf den Key und danach ist die Datenbank mit dem YubiKey verbunden.
Abschließend schließt ihr die Datenbank und öffnet sie erneut, um zu prüfen, ob die Entsperrung mit YubiKey klappt. Ggf. muss der Hardwareschlüssel im Aufklappmenü noch ausgewählt werden. Anschließend gibt man das Kennwort ein und klickt auf OK. In einem zweiten Schritt erfordert KeePassXC die physische Betätigung des YubiKeys.
Im Alltagsbetrieb
Die Zusammenarbeit mit YubiKey klappt fehlerfrei. Je nach Häufigkeit der Entsperrung dürfte man aber den YubiKey im Betrieb kaum noch vom Gerät abziehen.
Ein Problem ist die Synchronisation. Der KeePass-Client auf Android KeePassDX kann gegenwärtig noch nicht mit YubiKey umgehen, weshalb die Datenbank nur auf Desktop-Clients mit KeePassXC genutzt werden kann. Wie so oft sind iPhone-Anwender hier, was die Sicherheit betrifft, im Vorteil. Da ich auf meinem Android-Smartphone sowieso nur eine abgespeckte Variante der Datenbank nutze, ist das für mich kein so großes Problem.
Durch Zufall bin ich auf restic gekommen, es ist ein Backup Programm, welches sehr ähnlich zu borg Backup funktioniert, aber von Grund auf neu geschrieben wurde und eine andere Syntax benutzt. Der Original Autor ist Alexander “fd0” Neumann, er hat das Programm in go geschrieben.
Für mich sind die herausragenden Eigenschaften:
Verschlüsselung der Daten (auch die Struktur ist ohne Passphrase nicht einsehbar)
Deduplizierung (ist im Video von 2016³ endlich mal gut erklärt)
immer Vollbackups
man kann Snapshots auch per z.B.: SFTP Storage lokal mounten (Stichwort FUSE)
sehr schnell
Verifizierung der Daten mit Hashsummen
leicht zu konfigurieren
integrierte Update Funktion
Hier soll es um das Backup Programm im praktischen Einsatz gehen.
Gesichert werden 2 Laptops und ein Server (später) auf meinem Storage bei Hetzner. Mein Artikel soll kein selber lesen der Dokumentation ersetzen oder ersparen, sondern ein Leitfaden für mich und Leute sein, die eine ähnliche Situation haben. Es ist also ein Notizblock, um schnell das setup zu verstehen und als Hilfe gedacht, wenn nach Monaten mal ein Problem auftritt und ich wissen möchte, wie hatte ich mir das gedacht.
Ich benutze derzeit restic nur als user zum sichern von Bildern und persönlichen Dokumenten. Natürlich würde es auch für die komplette Installation der Laptops gehen, das brauche ich aber momentan nicht.
Voraussetzungen
Hetzner hat die Besonderheit, dass der Storage über Port 22 und 23 erreichbar ist. Hinweis: Bei Hetzner ist user@name durch eure Kennung z.B. u0815@u0815 zu ersetzen, ich wollte hier nicht meinen realen Account offenbaren.
Hat man den Public_Key auf dem Storage unter .ssh/authorized_keys hinterlegt, ist der Zugriff über Port 23 für Backup Programme ohne Passwort möglich.
Einloggen per ssh ist unterbunden.
Bevor man sich einen Wolf sucht, bitte entweder mit
lftp -p 23 sftp://user@name.your-storagebox.de
oder
sftp -P 23 user@name.your-storagebox.de
testen. Es sollte nun ohne Passwortabfrage eine Verbindung zum Storageserver hergestellt werden.
Warum lftp?
Nun es geht auch mit sftp, das ist ja standardmäßig bereits installiert, allerdings ist lftp der klare Sieger, wenn man rekursiv mal etwas löschen muss, was bei mir der Fall war, das beschreibe ich weiter unten. Ansonsten ist die Verwendung weitgehend identisch. Bei sftp gibt man den Port mit großem -P an und es versteht df -h, lftp dafür du -hs (Achtung u.U. langsam).
Eine Merkwürdigkeit ist bei lftp, dass man trotz ssh Key eine Passwort Aufforderung bekommt, wo man einfach nur <ENTER> drücken muß.
Ein Workaround um die Passwort Abfrage zu umgehen, ist der Trick, einen eigentlich unnötigen Platzhalter "platz" zu verwenden:
Mit dem alias back erspare ich mir die Angabe des Repositories und des Passwords. Man könnte natürlich auch mit Environment Variablen arbeiten, das finde ich aber unsicherer, weil die für Angreifer leichter auslesbar wären. Ich denke z.B. aber auch an die .bash_history. Der Nachteil des Alias ist, dass man die Autocompletion von bash verliert, wenn man allerdings als alias restic verwendet, fällt dieser Nachteil weg, man handelt sich dann ggfs. andere Nachteile ein. Zum Beispiel, wenn man mit mehreren Repositories arbeiten will.
#In restic_pw ist das lange Password des Repositories abgelegt, es darf nur für den User lesbar sein
~/.ssh/restic_pw
chmod 600 ~/.ssh/restic_pw
In den weiteren Beschreibungen verwende ich den Alias back und nicht restic, um Verwirrungen beim Leser zu vermeiden.
Anlegen des Repository
Vorher auf dem sftp Server nachschauen, welche Verzeichnisstruktur bereits vorhanden ist. Das Verzeichnis des Repositories wird angelegt, es muss nicht existieren! Bei mir z.B. /home/privat/bernd. wobei das /home nicht mit angegeben wird! Im obigen Beispiel ist dies bereits berücksichtigt und deshalt reicht ein einfaches
back init
created restic repository e5f00e22 at sftp://user@name.your-storagebox.de:23/privat/bernd/T500
(...)
Damit ist in kurzer Zeit die notwendige Datenstruktur auf dem Storage angelegt und bereit für ein erstes Backup
Erstes Backup erstellen
Ich habe als erstes mal meine Dokumente gesichert.
Hier das Protokoll des dritten Aufrufes, das erst Backup lief ca. 40 Minuten
back backup Dokumente
repository e5f00e22 opened successfully, password is correct
using parent snapshot 3504f0f6
Files: 0 new, 0 changed, 139 unmodified
Dirs: 0 new, 0 changed, 12 unmodified
Added to the repo: 0 B
processed 139 files, 2.634 GiB in 0:00
snapshot b982a7d0 saved
Backup auflisten
back snapshots
repository e5f00e22 opened successfully, password is correct
ID Time Host Tags Paths
--------------------------------------------------------------------------
99494f33 2021-02-18 19:01:31 T500 /home/bed/Dokumente
3504f0f6 2021-02-19 19:42:50 T500 /home/bed/Dokumente
b982a7d0 2021-02-19 21:10:30 T500 /home/bed/Dokumente
--------------------------------------------------------------------------
3 snapshots
Backup Dateien auflisten
#back ls b982a7d0 # oder das aktuellste mit latest
back ls latest
(...)
/Dokumente/SchaubLorenz_Golf100.pdf
/Dokumente/Toshiba_TLG373.pdf
(...)
Das Ergebnis ist mit pipe weiter verarbeitbar. Zum Beipiel
back ls latest|grep -i toshiba
/Dokumente/Toshiba_TLG373.pdf
Backup Dateien suchen
restic bietet auch eine Suchfunktion
back find toshiba* --ignore-case
repository e5f00e22 opened successfully, password is correct
Found matching entries in snapshot 3504f0f6 from 2021-02-19 09:42:50
/Dokumente/Toshiba_TLG373.pdf
Found matching entries in snapshot 99494f33 from 2021-02-18 09:01:31
/home/bed/Dokumente/Toshiba_TLG373.pdf
Found matching entries in snapshot b982a7d0 from 2021-02-19 13:10:30
/Dokumente/Toshiba_TLG373.pdf
Backup checken
Ein Hilite von restic ist die check Funktion, hier wird die Struktur auf Integrität geprüft.
Sie testet das Repository auf Fehler und meldet gefundene Fehler. Sie kann auch verwendet werden, um alle Daten zu lesen und somit eine Wiederherstellung zu simulieren.
Standardmäßig lädt der "check"-Befehl immer alle Daten direkt aus dem Repository und verwendet keinen lokalen Cache.
Die 2 Beispiele sind nicht vom T500, sondern vom Tuxedo, dort läuft durch den moderneren Prozessor auch die Hardware decryption, was natürlich dem Vorgang den Marsch bläst.
back check
time back check
using temporary cache in /tmp/restic-check-cache-775446915
repository cfa22dd6 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-775446915
create exclusive lock for repository
load indexes
check all packs
check snapshots, trees and blobs
[0:01] 100.00% 3 / 3 snapshots
no errors were found
real 0m31,592s
user 0m1,660s
sys 0m0,359s
Nicht schlecht, oder? nach gerade mal 32 Sekunden weiß ich, dass mein Backup in Ordnung ist. Doch was ist wirklich los, simulieren wir doch einen kompletten Restore... des 55GiB großen Repo (ok, Download Speed nicht mit einberechnet)
back check --read-data
time back check --read-data
using temporary cache in /tmp/restic-check-cache-410215478
repository cfa22dd6 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-410215478
create exclusive lock for repository
load indexes
check all packs
check snapshots, trees and blobs
read all data 2 / 3 snapshots
[0:01] 100.00% 3 / 3 snapshots
[1:12:32] 100.00% 9019 / 9019 packs
no errors were found
real 72m58,199s
user 12m50,579s
sys 4m16,768s
Repository Password ändern
Beim ausprobieren und einrichten ist mir ein Fehler unterlaufen. Ich wollte eigentlich ein password file benutzen, habe es aber ich der command line nicht angegeben. Damit wurde als Password File der Private Key genommen, wahrscheinlich keine gute Idee
Das merkte ich aber erst, als das erste Backup lief.
Da es hier aber ein größeres Backup war, wollte ich es nicht neu machen, sonder habe mich nach der sehr guten Dokumentation gerichtet und einfach einen neuen Key angelegt, dann meinen Aufruf korrigiert und den nun nicht mehr notwendigen Key gelöscht. Fertig.
Weil hier der Alias back benutzt wird, besonders darauf achten, dass das hinterlegte password auch händisch im
~/.ssh/restic_pw
angepasst wird, sonst könnte es böse Überraschungen geben
Also:
Auflisten aller Keys
back key list
password ändern
back key passwd
Key hinzufügen
back key add
Key löschen
back key delete
Restore
Ich komme nun zum eigentlichen Zweck eines Backup Programms, dem zurückholen von einzelnen Dateien oder des gesamten gesicherten Bestands.
Zuerst feststellen was alles, wann gesichert wurde:
back snapshots
repository cfa22dd6 opened successfully, password is correct
ID Time Host Tags Paths
--------------------------------------------------------------------------
00fbbd64 2021-02-18 19:01:26 Bullseye /home/bed/Bilder
84e0f2bc 2021-02-19 12:17:52 Bullseye /home/bed/Dokumente
c3d0c516 2021-02-19 17:16:48 Bullseye /home/bed/Dokumente
7d2d6547 2021-02-19 20:07:09 Bullseye /home/bed/Bilder
--------------------------------------------------------------------------
4 snapshots
Ich möchte die Bilder im Ordner usb-warzen zurück sichern, Witzigerweise sind die nicht im gesicherten Ordner Bilder, sondern in Dokumente.
back ls latest listet alle Dateien auf, die gesichert worden, kann prima mit pipe und den unix tools verarbeitet werden.
z.B.
back ls latest|grep usb-warzen
Kein Treffer
Aber Achtung!latest listet also nur den aktuellen snapshot, wenn man nach Bildern sucht passt das hier zufällig, wenn man Dokumente finden will, muss in diesem Fall die korrekte snapshotid verwendet werden.
Oder das Kommando find nutzen Achtung Case sensitiv!
Vorteil gegenüber der ersten Methode, es sucht in allen snapshots...
back find usb-warzen*
repository cfa22dd6 opened successfully, password is correct
Found matching entries in snapshot 84e0f2bc from 2021-02-19 12:17:52
/Dokumente/usb-warzen
/Dokumente/usb-warzen/1.png
/Dokumente/usb-warzen/1.png_max_200kb.jpg
/Dokumente/usb-warzen/10.png
/Dokumente/usb-warzen/10.png_max_200kb.jpg
/Dokumente/usb-warzen/11.png
/Dokumente/usb-warzen/11.png_max_200kb.jpg
/Dokumente/usb-warzen/2.png
/Dokumente/usb-warzen/2.png_max_200kb.jpg
/Dokumente/usb-warzen/3.png
/Dokumente/usb-warzen/3.png_max_200kb.jpg
/Dokumente/usb-warzen/4.png
/Dokumente/usb-warzen/4.png_max_200kb.jpg
/Dokumente/usb-warzen/5.png
/Dokumente/usb-warzen/5.png_max_200kb.jpg
/Dokumente/usb-warzen/6.png
/Dokumente/usb-warzen/6.png_max_200kb.jpg
/Dokumente/usb-warzen/7.png
/Dokumente/usb-warzen/7.png_max_200kb.jpg
/Dokumente/usb-warzen/8.png
/Dokumente/usb-warzen/8.png_max_200kb.jpg
/Dokumente/usb-warzen/9.png
/Dokumente/usb-warzen/9.png_max_200kb.jpg
Found matching entries in snapshot c3d0c516 from 2021-02-19 17:16:48
/Dokumente/usb-warzen/1.png
/Dokumente/usb-warzen/1.png_max_200kb.jpg
/Dokumente/usb-warzen/10.png
/Dokumente/usb-warzen/10.png_max_200kb.jpg
/Dokumente/usb-warzen/11.png
/Dokumente/usb-warzen/11.png_max_200kb.jpg
/Dokumente/usb-warzen/2.png
/Dokumente/usb-warzen/2.png_max_200kb.jpg
/Dokumente/usb-warzen/3.png
/Dokumente/usb-warzen/3.png_max_200kb.jpg
/Dokumente/usb-warzen/4.png
/Dokumente/usb-warzen/4.png_max_200kb.jpg
/Dokumente/usb-warzen/5.png
/Dokumente/usb-warzen/5.png_max_200kb.jpg
/Dokumente/usb-warzen/6.png
/Dokumente/usb-warzen/6.png_max_200kb.jpg
/Dokumente/usb-warzen/7.png
/Dokumente/usb-warzen/7.png_max_200kb.jpg
/Dokumente/usb-warzen/8.png
/Dokumente/usb-warzen/8.png_max_200kb.jpg
/Dokumente/usb-warzen/9.png
/Dokumente/usb-warzen/9.png_max_200kb.jpg
Angenommen, ich möchte das Verzeichnis /Dokumente/usb-warzen/ wieder herstellen, es aber, weil ich unsicher bin vorerst in /tmp speichern:
time back restore c3d0c516 -i /Dokumente/usb-warzen/ --target /tmp
repository cfa22dd6 opened successfully, password is correct
restoring <Snapshot c3d0c516 of [/home/bed/Dokumente] at 2021-02-19 17:16:48.706292257 +0100 CET by bed@Bullseye> to /tmp
real 0m17,422s
user 0m1,095s
sys 0m0,399s
bed@Bullseye:~$ ls -ltr /tmp/Dokumente/usb-warzen/
insgesamt 24392
-rw-r--r-- 1 bed bed 1851594 11. Nov 19:28 7.png
-rw-r--r-- 1 bed bed 1484032 11. Nov 19:28 2.png
-rw-r--r-- 1 bed bed 1573462 11. Nov 19:28 1.png
-rw-r--r-- 1 bed bed 1877277 11. Nov 19:28 6.png
-rw-r--r-- 1 bed bed 1629634 11. Nov 19:28 5.png
-rw-r--r-- 1 bed bed 600155 11. Nov 19:28 4.png
-rw-r--r-- 1 bed bed 4588086 11. Nov 19:28 3.png
-rw-r--r-- 1 bed bed 1615798 11. Nov 19:28 9.png
-rw-r--r-- 1 bed bed 1986633 11. Nov 19:28 8.png
-rw-r--r-- 1 bed bed 2383447 11. Nov 19:28 10.png
-rw-r--r-- 1 bed bed 168904 11. Nov 19:28 9.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 187365 11. Nov 19:28 8.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 188381 11. Nov 19:28 7.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 191964 11. Nov 19:28 6.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 188648 11. Nov 19:28 5.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 166986 11. Nov 19:28 4.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 198799 11. Nov 19:28 3.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 198531 11. Nov 19:28 2.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 180148 11. Nov 19:28 1.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 199263 11. Nov 19:28 11.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 3276158 11. Nov 19:28 11.png
-rw-r--r-- 1 bed bed 197313 11. Nov 19:28 10.png_max_200kb.jpg
Wie lösche ich auf dem sftp Server rekursiv?
Das hat zwar direkt nichts mit restic zu tun, aber da ich es beim experimentieren brauchte ....
Weil ich mich beim Testen im Pfad geirrt hatte, war der Wunsch nach einem rekursiven Löschen vorhanden.
lftp bietet das und erspart damit u.U. eine Menge Tipparbeit (Bei Debian apt install lftp)
Bei lftp gibt man einfach rm -r Directory ein, dann rattert es im Karton und man kann derweil in einem anderen Tab weiterarbeiten.
Wenn ich überhaupt mäkeln wollte, dann ist es der name "restic" Wie bitte? Weiß jemand wie dieser Name zu Stande kam? Ich habe gefragt, ein Namengenerator war schuld Aber mittlerweile kann ich restic fehlerfrei tippen, alles gut.
Eine gute Idee ist immer back command --help. (oder eben restic command --help)
Damit komme ich gut zurecht.
Ps: Ich musste den Quellcode editieren, werde wohl auch noch etwas dran schrauben, also ab- und zu mal schauen, wen es denn interessiert ...
Es geht bergauf und es ist nicht schön. Jetzt hatten wir wochenlang Teillockdown und die Diskussionen gingen gerade los, wer zuerst aufmachen darf, mit Frisören und Schulen in Reihe eins, und dann sowas!
Für Mo., Di., Mi. und Do. zeigt der Wochentagsgraph (basierend auf den Daten von worldometers) hinten einen kleinen Anstieg – allerdings nicht für Fr. (gestern).
Woher sind die Grapen? Nun, mit einem Script selbst generiert. Der schleichende Durchschnitt hat auch seine Berechtigung – zumindest der über 7 Tage, in dem über 3 Tage sehe ich keinen Sinn, und die Haifischzähne im Wochenverlauf scheinen ein globales Phänomen zu sein.
Ich fürchte, dass während die Zahlen maßnahmenbedingt zurückgingen stiegen gleichzeitig die Zahlen durch die Mutanten im Untergrund an, und jetzt haben sich die beiden Trends gekreuzt. Ich bin da aber natürlich Laie, wie viele andere auch.
Das Basteln der ersten Graphen war noch viel Handarbeit, aber dann wurde es von mir teilautomatisiert, so dass das Script die Daten jeden Tag neu runterlädt.
#!/bin/bash
#
# Coronadaten von worldometers nach Wochentag getrennt anzeigen
#
# @DONE: Lines einfärben nach Wochentag
# @DONE: Automatisieren.
#
# Lizenz: GPLv3
#
yvals=($(wget -O - https://www.worldometers.info/coronavirus/country/germany/ 2>/dev/null | sed -ne "s/,/ /g; /name: 'Daily Cases'/,/]/ {s/data: \[null//; s/].*}//p}"))
ny=${#yvals[@]}
for i in $(seq 0 $((ny-1)))
do
echo -e "$i\t${yvals[$i]}"
done > xy.dat
tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)
max () {
echo $@ | tr " " "\n" | sort -n | tail -n 1
}
maxy=$(max ${yvals[@]})
zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top
# leeren
echo > plot7.plt
# In 7-Tagesschritten von Sa. bis Fr. (weil Sa. 1. Meßpunkt ist, Sa:=1) durchlaufen, getrennte Dateien erzeugen
for i in {1..7}; do sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv ; done
# Gnuplot-Datei erzeugen
for i in {1..7}; do
echo "
set term qt
set xrange [0:$((ny*105/100))]
set yrange [0:$top]
set title \"${tag[$i]}\"
plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
set output \"wotag-$i-${tag[$i]}.png\"
set term png
replot"
done >> plot7.plt
gnuplot -p plot7.plt
# eog: Eye-of-Gnome Bildbetrachter.
eog wotag-[1-7]-*.png
(Update 22.2.’21 Das Ausgabeformat habe ich nachträglich auf png geändert (set term png; set output ….png) und den Bildbetrachteraufruf eog am Ende angefügt.)
Anfangs speicherte ich die Seite vom Browser aus im Modus „Seitenquelltext anzeigen“. Er liefert keine fertige Bilddatei aus, sondern die Daten und generiert aus diesen die Grafik on the fly. So kommt man also einfach an die Daten.
Zu Beginn zeigt das Script einen Shebang, der dem Kernel sagt, wie das Programm auszuführen ist. Es folgen Kommentare mit der Gnu-Public-Lizence.
Dann der Code, um das HTML als Datei runterzuladen, dafür nimmt man wget.
Mit -O gibt man den Outputort an, meist einen Dateinamen, aber wie viele Shellwerkzeuge, kann auch wget ein isoliertes Minuszeichen übergeben werden, dann wird die Ausgabe auf Stdout, den Bildschirm, ausgegeben.
Aber wget ist geschwätzig und zeigt mit großem Brimborium an, wieviel Prozent schon runtergeladen wurden, Datum, Uhrzeit, Url, IP-Adresse und weiß der Teufel – den Müll kann man mit 2>/dev/null ins Nirwana umleiten.
Der restliche Output wird mit einer Pipe an Sed geleitet, den Stream-Editor, spezialisiert für solche Jobs und mit einer konzentrierten Syntax ausgestattet, um die Ausgabe zu schneiden, umzuformen, zu ergänzen, zu manipulieren.
Mit sed wandel ich alle Kommas in Leerzeichen um. Ich will alles in ein großes Array schreiben, und die Syntax sieht so aus:
yvals=(3 4 2 1 9)
Aber die Quelle liefert
data: [3,4,2,1,9]
Auch interessiert mich nur der Abschnitt „Daily Cases“ und darin nur die Zeile „data“. Die nächste, kryptisch wirkende Zeile, ermittelt die Arraygröße.
Die folgende Forschleife läuft durch alle Werte, und gibt Zeilenweise die Indexnummer und die Anzahl bestätigter Neuinfektionen aus. Die Umlenkung hinter der Schleife lenkt all das in eine Datei xy.dat.
ny=${#yvals[@]}
for i in $(seq 0 $((ny-1)))
do
echo -e "$i\t${yvals[$i]}"
done > xy.dat
Die Beispieldaten oben sähen damit etwa so aus:
0 3
1 4
2 2
3 1
4 9
Dann folgen zwei Arrays mit Namen für die Wochentage – da die Shell ab 0 zählt, aber ich ab 1, habe ich einen dummy für die 0 eingefügt. Ähnlich für die Farben des Graphen.
tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)
max () {
echo $@ | tr " " "\n" | sort -n | tail -n 1
}
Dann sehen wir eine max-Funktion. Sie übergibt alle Argumente des Arrays, die mit Leerzeichen getrennt sind, und ersetzt die Leerzeichen mit tr, dem Zeichentranslator, mit Zeilenumbrüchen. Die Zeilen werden mit sort sortiert und tail -n1 nimmt vom Ende eine Zeile, da steht nach Adam Riese das Maximum drin.
Die nächste Zeile ruft die max-Funktion mit unserem Array auf.
maxy=$(max ${yvals[@]})
zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top
Dann folgt eine komplexe Häßlichkeit, die einen Wert wie 31554 nimmt, die 31 vorne abschneidet, zu 32 hochrechnet, und 000 hinten anhängt aber auch mit Werten zwischen 100 und 99999999 zurechtkommen sollte.
Sie dient dazu dem Plotprogramm zu sagen, wie groß der y-Wert werden darf, aber einen aufgerundeten Wert zu verwenden mit etwas Luft nach oben. Da die Werte je nach Wochentag gehörig schwanken führt die automatische Range-auswertung von gnuplot sonst dazu, dass der Achsenmaßstab von Tag zu Tag schwankt.
# leeren
echo > plot7.plt
Dies löscht die plot7.plt-Datei von gestern oder neulich. Dann schreibe ich, wieder mit sed, das ein Kommando dafür hat, jede 7. Zeile in eine Datei, und das für 7 unterschiedliche Startwerte, sprich Wochentage, in 7 unterschiedliche Zieldateien (.csv).
for i in {1..7}
do
sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv
done
Dann werden je Wochentag ca. 8 Befehle in die Plotdatei geschrieben.
# Gnuplot-Datei erzeugen
for i in {1..7}; do
echo "
set term qt
set xrange [0:$((ny*105/100))]
set yrange [0:$top]
set title \"${tag[$i]}\"
plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
set output \"wotag-$i-${tag[$i]}.png\"
set term png
replot"
done >> plot7.plt
Das set term qt setzt die Ausgabe auf den Grafikfenstermodus. QT ist eine Firma, QT-Trolltech o.ä., die eine bekannte, plattformübergreifende Grafikbibliothek für C++ geschrieben hat, ähnlich wie GTK (C) oder Swing (Java).
Mit set xrange [von:bis]` legt man die x-Achse fest. Auch hier lasse ich etwas Luft.
Das `set title XY` bringt die Wochentage von oben ins Bild. Man will nicht im Kopf behalten müssen, dass die Datenerfassung an einem Freitag begann – oder war es Samstag?
Dann wird verklausuliert gesagt, dass die Daten von – Beispielsweise wotag-3-Mo.csv zu plotten sind. Dann ist So=2 und Sa=1, also doch Sa! Using 1:2 sind die Spalten der Datei, mehr gibt’s eh nicht, und linespoint verbindet die Datenpunkte, hebt sie aber auch vor. `lc N` setzt die linecolor, falls das wer manipulieren will. Für jeden Tag gebe ich dann einen Dateinamen an, in den das Ergebnis geschieben werden soll. Man könnte auch png, jpg, pdf usw. wählen.
Mit set term png sage ich dem Programm, dass das Format png sein soll; das extrapoliert gnuplot nicht aus dem Namen.
Oben wurde schon mal plot aufgerufen. Hier reicht ein `replot`, wenn man keinen Parameter ändern will. Das eine zeigt am Schirm in einem Fenster an, das andere schreibt in eine Datei.
Die Befehle werden aber nicht unmittelbar ausgeführt, sondern in eine Datei geschrieben und am Ende wird gnuplot aufgerufen, um die Aktionen durchzuführen.
Dabei wird die Bildschirmausgabe aber so schnell durchlaufen, dass man außer dem letzten Bild nichts sieht. Zur Kontrolle, ob nichts schiefläuft, sollte das reichen.
Alle Dateien landen im aktuellen Verzeichnis, also empfiehlt es sich dafür ein neues Verzeichnis anzulegen.
Zusammengefügt habe ich ursprünglich 7 svg-Dateien von Hand.
Das habe nun zu PNG geändert, denn die lassen sich mit einem Betrachter wie eog leicht alle ansehen, oder als Referenzen in ein SVG laden, das sich dann automatisch aktualisiert, wenn die Dateien mit altem Namen und neuen Daten überschrieben werden.
Die CSV-Dateien sind z.Zt. kl. als 500 Bytes, die PNGs < 6kb, je.
Das Datum aus den xValues zu extrahieren ist möglich, aber eine lesbare Ausgabe daraus zu bauen ist mir zu viel Gefummel.
So sieht die fertige Plotdatei aus (hier noch mit SVGs):
set term qt
set xrange [0:388]
set yrange [0:32000]
set title "Sa"
plot "wotag-1-Sa.csv" using 1:2 with linespoint lc "black"
set output "wotag-1-Sa.svg"
set term svg
replot
set term qt
set xrange [0:388]
set yrange [0:32000]
set title "So"
plot "wotag-2-So.csv" using 1:2 with linespoint lc "blue"
set output "wotag-2-So.svg"
set term svg
replot
set term qt
set xrange [0:388]
set yrange [0:32000]
set title "Mo"
plot "wotag-3-Mo.csv" using 1:2 with linespoint lc "olive"
set output "wotag-3-Mo.svg"
set term svg
replot
set term qt
set xrange [0:388]
set yrange [0:32000]
set title "Di"
plot "wotag-4-Di.csv" using 1:2 with linespoint lc "red"
set output "wotag-4-Di.svg"
set term svg
replot
set term qt
set xrange [0:388]
set yrange [0:32000]
set title "Mi"
plot "wotag-5-Mi.csv" using 1:2 with linespoint lc "dark-grey"
set output "wotag-5-Mi.svg"
set term svg
replot
set term qt
set xrange [0:388]
set yrange [0:32000]
set title "Do"
plot "wotag-6-Do.csv" using 1:2 with linespoint lc "grey"
set output "wotag-6-Do.svg"
set term svg
replot
set term qt
set xrange [0:388]
set yrange [0:32000]
set title "Fr"
plot "wotag-7-Fr.csv" using 1:2 with linespoint lc "web-green"
set output "wotag-7-Fr.svg"
set term svg
replot
Diese Ranges könnte man vor den Rest rausziehen, aber das ist mehr Arbeit als Nutzen. Fragen zum Script beantworte ich gerne.
Man benötigt Linux, bei dem die meisten Tools mit an Bord sind (tr, bash, sed, sort, tail) oder leicht nachinstalliert werden können (gnuplot, wget). Unter Windows ist es für jemanden, der nicht schon Erfahrungen mit Scripten hat, mühsam, alles zu installieren und einzurichten, aber möglich. Macs haben ja ein Open-BSD als Basis, inklusive Bash, da sollte es fast so leicht sein wie unter Linux.