At last ein modernisiertes last

Debian hat mit einem Upgrade von util-linux das Kommando last ausgelagert in das Paket wtmpdb. Das wtmp-Log (in dem Logins, Logouts, Reboots und Shutdowns aufgezeichnet werden) wird in der Datei /var/lib/wtmpdb/wtmp.db, einer SQLite-Datenbank, geführt. Installiert man wtmpdb nicht (nachträglich von Hand), gibt es auch kein last-Kommando.

Das Kommando lastb ist ganz entfallen. Fehlerhafte Login-Versuche, die es aufgelistet hatte, werden in anderen Logdateien (syslog / journal) protokolliert.

Vergleich verschiedener Konsol-Fonts

Ein Blog-Artikel vergleicht verschiedene Konsol-Fonts. Nützlich ist der im Artikel enthaltene (und downloadbare) Probetext, der besonders auf die Unterscheidbarkeit ähnlicher Zeichen, auf Ligaturen und (Pseudo-) Grafikzeichen abhebt. Man kann ihn gut verwenden, um weitere Fonts, die hier nicht erwähnt sind, auf ihre Geeignetheit zu überprüfen.

Python 3.13: ein neuer REPL

Die nächste Python-Version (3.13) ist jetzt auch als Debian-Paket (in unstable bzw. testing) verfügbar.

Die auffallendste Neuerung: Es gibt einen neuen REPL (read-eval-process loop, also das interaktive Kommandozeilen-Interface). Er ist ipython ähnlicher geworden – schön bunt, bessere Vervollständigung, bessere Fehlerdiagnose. Und noch eine gravierende Verbesserung: Man kann ihn jetzt auch mit quit beenden!

RSS-Feeds für GitHub

RSS ist immer noch (IMNSHO) das beste Format, um Nachrichtenquellen zu abonnieren – man muss nicht regelmäßig die Webseiten durchflöhen, der Browser oder die Handy-Oberfläche wird nicht mit nervigen Push-Nachrichten belastet, die Mailbox wird nicht mit relativ unwichtigen Mitteilungen geflutet. Und mit akregator steht ein komfortables Leseprogramm zur Verfügung (natürlich gibt es auch andere, für fast jeden Geschmack ist eins dabei).

Auch diese Blog-Einträge können als RSS-Feed abonniert werden (siehe Seitenkopf).

Auch neue Releases einer auf GitHub gehosteten Software kann man – schon seit langem, aber ich habe es erst kürzlich herausgefunden – per RSS-Feed abonnieren. Interessant sind beispielsweise die Mitteilungen über

  • Releases: https://github.com/:owner/:repo/releases.atom

  • Commits: https://github.com/:owner/:repo/commits.atom

In diesen URLs sind natürlich :owner durch den Repo-Eigentümer und :repo durch den Namen des Repos (wie auch in den anderen zugehörigen URLs) zu ersetzen.

glances, ein Monitoring-Tool für die Konsole

glances (verfügbar als gleichnamiges Debian-Paket) ist ein curses-basiertes Monitoring-Tool, ähnlich wie top und Konsorten; es zeigt zahlreiche wichtige Messwerte auf einen Blick.

Es ist in Python geschrieben, bietet Abfrage- und Exportschnittstellen und auf Wunsch auch ein Web-UI.

Welches NAS-Protokoll in Linux-Umgebungen?

Welches NAS-Protokoll sollte man in Linux-Umgebungen benutzen?

Kurzfassung der Antwort: Wenn man (im Heimnetz) unverschlüsselt arbeiten kann, ist NFS4 am besten; mit Verschlüsselung wird (vor allem wegen des einfacheren Setups) zu sshfs geraten.

Die Kommentare empfehlen, auf jeden Fall NFS in der Version 4.2 zu verwenden, die deutlich schneller sei als die 4.0.

Beispiel für die NFS-Optionen: (rw,async,all_squash,anonuid=1000,anongid=1000)

Beispiel für die mount-Optionen: mount -o vers=4.2 ….

Custom querysets als Bausteine verwenden

Ein Artikel plädiert dafür, Django Custom Querysets zu definieren, so dass sie als atomare Bausteine für andere Abfragen dienen können.

Auch wenn im Beispiel CBVs verwendet werden, eignet sich diese Technik genauso für FBVs.

Leider fehlt der Hinweis darauf, wo man denn diese Querysets nun definieren soll. Nach der Django-Doku empfiehlt sich dies:

class AuthorManager(models.Manager):
    # hier Methoden des Managers definieren, die nicht an Querysets angekettet werden können,
    # z.B. solche, die Querysets „aus dem Nichts erzeugen“

    def get_by_natural_key(self, name: str) -> "Author":
        return self.get(name=name)

class AuthorQuerySet(models.QuerySet):
    def scifi(self) -> models.QuerySet:
        return self.filter(genre="scifi")

class Author(models.Model):
    objects = AuthorManager.from_queryset(AuthorQuerySet)()
    name = models.CharField(max_length=30)
    genre = models.CharField(max_length=10)
    …

In diesem Beispiel lässt sich scifi() sowohl als Manager- als auch als Queryset-Methode verwenden.