Fryboyter

I/O Scheduler automatisch einstellen

Mit einem I/O Scheduler wird die zeitliche Abfolge von Lese- und Schreibvorgänge bei Speichermedien koordiniert. Je nachdem ob es sich um eine normale HDD, eine SSD oder eine NVMe handelt, können unterschiedliche Scheduler sinnvoll sein. Oft nutzen Distributionen allerdings den gleichen Scheduler für alle Speichermedien.

Bei einem normalen Rechner eines durchschnittlichen Benutzers fällt dies meist nicht ins Gewicht. Optimal ist es trotzdem nicht. Also sollte man sein System entsprechend konfigurieren.

Nun ist es so, dass ich in meinem Hauptrechner sowohl HDD, SSD als auch NVMe verbaut habe und regelmäßig zusätzliche Speichermedien temporär anschließe. Somit möchte ich den Scheduler automatisch zuweisen lassen. Dies lässt sich mit einer udev Regel umsetzen. Hierfür erstellt man die Datei /etc/udev/rules.d/60-ioschedulers.rules und füllt diese mit folgendem Inhalt.

# Scheduler für HDD
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
# Scheduler für SSD
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# Scheduler für NVMe
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"

Hiermit wird normalen HDD der Scheduler bfq zugeordnet. Bei SSD kommt der Scheduler mq-deadline zum Einsatz. Und im Falle von NVMe wird meist none eingestellt, da bei diesen Speichermedien ein anderer Scheduler oft keinen Vorteil bringt. Wer will, kann natürlich etwas anderes einstellen.

Anschließend liest man mit Root-Rechten mittels udevadm trigger die angeschlossene Hardware neu ein damit die Regeln genutzt werden. Alternativ kann man auch einfach den Rechner neu starten.

Danach sollte je nach Speichermedium der entsprechende Scheduler aktiv sind. Überprüfen lässt sich dies mit dem Befehl grep "" /sys/block/*/queue/scheduler. Der jeweils verwendete Scheduler wird in eckigen Klammern angezeigt.

OSBN | Linux

PDFsam - Grafisches Tool zum Bearbeiten von PDF-Dateien

Ich musste heute diverse PDF-Dateien splitten und aus unterschiedlichen einzelnen Dateien wieder neue PDF-Dateien erstellen. Darauf, dies mit Befehlen im Terminal Emulator zu erledigen, hatte ich aber keine Lust. Also habe ich mir spontan PDFsam installiert.

Bei PDFsam handelt es sich um ein Tool mit grafischer Oberfläche, mit dem man PDF-Dateien bearbeiten kann. Die Basic-Version, die unter der AGPL-3.0 Lizenz veröffentlicht ist und die kostenlos nutzbar ist, unterstützt das Teilen (Seitenzahl, Lesezeichen und Größe), Zusammenführen, Extrahieren, Mischen und Drehen von PDF-Dateien. Die kostenpflichtigen Versionen wie PDFsam Enhanced oder PDFsam Visual bieten noch zusätzliche Funktionen. Allerdings werden diese nur im Abo-Modell angeboten und sind meiner Meinung nach ziemlich teuer. Was alle Versionen gemeinsam haben ist, dass es sich um Java-Programme handelt. Was in meinem Fall kein Problem ist, da ich bereits Java wegen eines anderen Tools installiert habe.

pdfsam

Der Screenshot zeigt die Oberfläche für das Zusammenführen von PDF-Dateien. Meiner Meinung nach ist diese, wie auch die der anderen Funktionen, aufgeräumt und selbsterklärend. Das Tool an sich arbeitet schnell und meiner bisherigen Erfahrung nach zuverlässig. Wer also mal keine Lust hat PDF-Dateien im Terminal Emulator zu bearbeiten, sollte sich das Programm zumindest einmal ansehen.

OSBN

JavaScript - If-Anweisung mit mehreren Bedingungen

Vor ein paar Tagen habe ich den Artikel Feedreader mit Filterfunktion veröffentlicht, bei dem es um einen Feedreader geht, der eine auf JavaScript basierende Filterfunktion nutzt. Zwischenzeitlich habe ich mehrere Anfragen erhalten wie man Beiträge mehrerer Autoren entfernen kann.

Mein ursprüngliches Beispiel war Folgendes und hat sich nur auf einen Autor bezogen.

function filterMessage() {
  if (msg.author == "soeren-hentzschel.at") {
    return MessageObject.Ignore;
  }
}

Da ich von JavaScript so gut wie keine Ahnung habe, wollte ich schon vorschlagen, dass man bei Bedarf einfach mehrere Filter anlegt. Wenn man nur wenige Filter insgesamt hat, mag das funktionieren. Mir wäre aber ein Filter lieber der alle Einträge bestimmter Autoren auf einmal ausblendet, damit die Filterliste übersichtlicher bleibt. Die Lösung hierfür ist der Logik-Operator ||.

Will man obiges Beispiel also erweitern würde dieser Code funktionieren:

function filterMessage() {
  if (msg.author == "soeren-hentzschel.at" || msg.author == "fryboyter.de") {
    return MessageObject.Ignore;
  }
}

Der Operator || steht in diesem Fall für “oder”. Somit wird abgefragt, ob der Autor soeren-hentzschel.at oder fryboyter.de ist. Und wenn ja, wird der Beitrag entfernt. Will man nun Beiträge eines weiteren Autoren löschen, dann fügt man einfach ein weiteres || msg.author == mit entsprechender Bedingung ein.

OSBN

Feedreader mit Filterfunktion

Neben vielen anderen Feeds habe ich den Feed von beispielsweise osbn.de oder planet.ubuntuusers.de aboniert. Manche Blogs veröffentlichen darüber Artikel die mich in keinster Weise interessieren. Diese möchte ich daher möglichst nicht einmal in meinem Feedreader angezeigt bekommen.

Da ich seit einiger Zeit lokale Feedreader bevorzuge, habe ich in letzter Zeit QuiteRSS genutzt, da dies einer der wenigen Clients ist, die überhaupt eine Filterfunktion anbieten. Die letzte Version von QuiteRSS ist allerdings von 2020 und die Entwicklung ist ziemlich eingeschlafen. Wenn man sich Issues wie https://github.com/QuiteRSS/quiterss/issues/1470 oder https://github.com/QuiteRSS/quiterss/issues/1519 durchliest, könnte das Programm wohl in absehbarer Zeit auch aus den Paketquellen diverser Distributionen verschwinden. Ich habe mich daher einmal umgesehen was es für Alternativen gibt, die derzeit aktiv weiterentwickelt werden. Erschreckend wenig, wenn man eine halbwegs gute Filterfunktion will. Ist das so ein ungewöhnlicher Anwendungsfall? Oder habe ich nur die falschen Programme angesehen?

Wie auch immer. Aktuell teste ich RSS Guard. Dessen Filterfunktion ist zwar nicht so einfach nutzbar, dafür aber deutlich mächtiger als die von QuiteRSS. Was daran liegt, dass diese auf Javascript basiert. Ein Filter der beispielsweise alle Artikel eines bestimmten Authors automatisch löscht, würde beispielsweise wie folgt aussehen.

function filterMessage() {
  if (msg.author == "soeren-hentzschel.at") {
    return MessageObject.Ignore;
  }
}

Ein Vorteil der Filterfunktion von RSS Guard ist, dass man den Filter erst einmal testen kann ohne das tatsächlich Änderungen vorgenommen werden und dass die betroffenen Artikel farblich markiert werden. Neben Linux wird das Programm übrigens auch für Windows und macOS angeboten.

Abschließend noch eine Anmerkung zum Schluss. Nicht, dass es böses Blut gibt. Nur weil bestimmte Artikel bestimmter Seiten für mich nicht von Interesse sind, sagt das weder etwas über deren Qualität aus noch möchte ich, dass diese Seiten mit der Veröffentlichung dieser Artikel aufhören. Ich will die Artikel einfach nicht angezeigt bekommen und auch nicht lesen. Genauso wie vermutlich einige Nutzer meine Artikel nicht lesen wollen.

OSBN

Mercurial - Lokale Änderungen in zweites lokales Repository übertragen

Ab und zu beginne ich damit, Änderungen in einem lokalen Mercurial Repository durchzuführen und werde damit nicht fertig. In der Regel mache ich dann später einfach weiter und nutze dafür den gleichen Rechner. Ab und zu möchte ich aber lieber mit einem anderen Rechner weiterarbeiten. Zum Beispiel mit meinem Notebook auf dem Sofa.

Wie nun am besten die lokalen Änderungen von Rechner A auf Rechner B übertragen?

Am einfachsten wäre es wohl, einen Commit über die unfertigen Änderungen zu erstellen, diesen bei beispielsweise Github hochzuladen und dann auf Rechner B das Arbeitsverzeichnis dammit zu aktualisieren. Ich vermeide aber möglichst solche Work in Progress Commits.

Das Repository mit Tools wie Syncthing von einem Rechner auf den anderen übertragen? Das klappt bei Repositories wohl in der Regel. Aber es gibt auch schon einige negativen Erfahrungen. Wohl hauptsächlich mit den Verzeichnissen wie .git oder .hg in denen unter anderem die Historie gespeichert ist. Ein zusätzliches bare Repository zu nutzen wäre vermutlich eine Alternative.

Da ich den Anwendungsfall aber nur sehr habe, habe ich mich für eine andere Lösung entschieden. Im Arbeitsverzeichnis des Repositories in dem ich mit den Änderungen begonnen habe, erstelle ich mittels hg diff > patch.diff einen Patch über die vorhandenen Änderungen. Diesen Patch spiele ich dann im zweiten Repository mittels hg import –no-commit patch.diff ein. Wichtig ist hierbei den Parameter –no-commit zu nutzen, da sonst für die Änderungen ein Commit erstellt wird, was ich ja erst einmal vermeiden will bis ich wirklich fertig bin.

Das mag nun nicht die beste Lösung sein. Und vielleicht kann man es mit einer anderen Versionsverwaltung (die ich nicht nutzen will) einfacher lösen. Aber für mich ist es erst einmal ausreichend.

OSBN | VCS