Technik

Perl setzt bei regulären Ausdrücken Treffer-Variablen nicht zurück

14. September 2022 · Programmierung · andreas · Kein Kommentar

Werden z.B. innerhalb einer Schleife verschiedene Elemente mit Hilfe eines regulären Ausdrucks ausgewertet, so werden im Falle eines Nicht-Treffers die Treffer-Variablen nicht zurückgesetzt.

test.pl
use strict; use warnings; my @albums = ( 'The Phantom Agony', 'Design Your Universe', 'The Holographic Principle' ); foreach my $album (@albums) { $album =~ /(Universe)/; if (defined $1) { print "match: $1 -> '$album'\n"; } }

Auf den ersten Blick wäre zu erwarten, daß lediglich eine Zeile als Ergebnis ausgegeben wird, tatsächlich sind dies aber zwei:

match: Universe -> 'Design Your Universe' match: Universe -> 'The Holographic Principle'

Die Ursache liegt in der überhaupt nicht durchgeführten Überprüfung des Ergebnisses des regulären Ausdrucks, die korrekt so aussehen muss:

test.pl
use strict; use warnings; my @albums = ( 'The Phantom Agony', 'Design Your Universe', 'The Holographic Principle' ); foreach my $album (@albums) { if ($album =~ /(Universe)/) { print "match: $1 -> '$album'\n"; } }

Dann erscheint auch - wie ursprünglich erwartet - als Ergebnis nur eine Zeile:

match: Universe -> 'Design Your Universe'

Notiz an mich selbst: eine korrekte Behandlung von Abfrageergebnissen erspart eine aufwendige Fehlersuche.


WordPress-Wartungsmodus manuell aktivieren

08. September 2022 · Anwendungen · andreas · Kein Kommentar

Bei einer Aktualiserung schaltet WordPress die Website automatisch in den Wartungsmodus, ein Mechanismus, den man auch für manuelle Wartungen aktivieren kann.

Zum Aktivieren wird eine Datei “.maintenance” mit folgendem Inhalt im Hauptverzeichnis der WordPress-Installation angelegt, welche den Wartungsmodus bis zum Entfernen (oder Umbenennen der Datei) aktiviert.

<?php $upgrading = time(); >

Die Erklärung der Funktionsweise findet sich im WordPress-Quellcode innerhalb der Datei load.php

... 303 function wp_is_maintenance_mode() { 304 global $upgrading; 305 306 if ( ! file_exists( ABSPATH . '.maintenance' ) || wp_installing() ) { 307 return false; 308 } 309 310 require ABSPATH . '.maintenance'; 311 // If the $upgrading timestamp is older than 10 minutes, consider maintenance over. 312 if ( ( time() - $upgrading ) >= 10 * MINUTE_IN_SECONDS ) { 313 return false; 314 } ...

Im ersten Schritt wird das Vorhandensein einer Datei “.maintenance” im Hauptverzeichnis der WordPress-Installation geprüft. Ist diese vorhanden, so wird vom aktuellen Zeitstempel der Wert der Variablen “$upgrading” subtrahiert. Ist der Rest größer oder gleich 10 Minuten, so wird der Wartungsmodus deaktiviert.

Durch das Setzen der Variable “$upgrading” auf den aktuellen Zeitstempel bleibt die Differenz immer 0, die 10 Minuten werden nie überschritten und der Wartungsmodus kann manuell gesteuert werden.


Intel Grafik, Mesa und CPU-Auslastung

25. August 2022 · Spiele · andreas · Kein Kommentar
Dieser Beitrag bezieht sich auf Debian 11 “Bullseye”.
Mit Debian 12 “Bookworm” ist das Setzen der Umgebungsvariable nicht mehr erforderlich.

Normalerweise sollte ein Intel Core i5-7300U mit eingebauter HD-Grafik 620 problemlos in der Lage sein, ein 2D-Spiel wie Space Haven darzustellen, trotzdem sorgte bereits kurz nach dem Start der Lüfter des Notebooks für eine beeindruckende Geräuschkulisse, denn die CPU-Auslastung war bei rund 300%:

Direkt beim Start von Space Haven wurden auch einige Fehler angezeigt, welche auf ein Problem mit der Graphik bzw. deren Nichterkennen hinwiesen:

com.badlogic.gdx.utils.GdxRuntimeException: OpenGL 2.0 or higher with the FBO extension is required. OpenGL version: 1.3 Mesa 20.3.5 Type: OpenGL Version: 1:3:0 Vendor: Intel Open Source Technology Center Renderer: Mesa DRI Unknown Intel Chipset

Abhilfe fand sich schließlich im archlinux Wiki, welches darauf hinweist, daß unter archlinux ab Mesa 20.0 ein neuer Treiber für neuere GPUs als Standard verwendet wird.

In Mesa 20.0, a new OpenGL driver, Iris, is promoted to be the default for Gen8+. Certain applications run faster with it. You may disable it and revert to use the old i965 driver by setting the MESA_LOADER_DRIVER_OVERRIDE=i965 environment variable before starting any OpenGL application. [Quelle]

Zwar ist der verbaute i5-7300U aus der 7. Generation, aber Debian ist auch kein archlinux und ein kurzer Test mit der vorgeschlagenen Umgebungsvariable ließ die CPU-Auslastung im normalen Rahmen und den Lüfter nach Start des Spiels unhörbar bleiben:

Leider hilft ein Blick in die Mesa 3D Dokumenation zum Verständnis nicht sonderlich viel weiter, so daß die Behebung der Symptome wohl so akzeptiert werden muss.

Die Ursache ist wahrscheinlich die Meldung “Mesa DRI Unknown Intel Chipset” dokumentiert, so daß erst mit dem über Umgebungsvariable vorgegebenem Treiber eine korrekte Initialisierung möglich ist.


Nextcloud Geräte & Sitzungen aufräumen

13. August 2022 · Anwendungen · andreas · 2 Kommentare

Im Bereich “Geräte & Sitzungen” der Nextcloud-Sicherheitseinstellungen sammeln sich im Laufe der Zeit jede Menge Einträge, auch von Geräten oder Sitzungen, die schon lange nicht mehr im Einsatz sind.

Zwar kann man einzelne Einträge durch Klick auf die drei Punkte und “Widerrufen” manuell entfernen, eine Möglichkeit zum gleichzeitigen Löschen mehrerer veralteter Einträge ist aber nicht vorgesehen.

Was über die Oberfläche nicht funktioniert, kann aber oft an der Anwendung vorbei über eine direkte Änderung der Datenbank erledigt werden. Zum Aufräumen reicht ein

DELETE FROM oc_authtoken WHERE last_activity <= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));

welches z.B. alle Einträge löscht, deren letzer Zugriff länger als 60 Tage her ist.


Kernel aus Backports installieren

21. Juli 2022 · Betriebssysteme · andreas · Kein Kommentar

Je nach verwendeter Hardware fehlt mit ein bißchen Pech im Kernel der Debian-Stable-Version altersbedingt die Unterstützung für einige Hardware-Komponenten.

Das aktuelle Debian Bullseye verwendet standardmäßig den Kernel 5.10

$ uname -a Linux *** 5.10.0-16-amd64 #1 SMP Debian 5.10.127-1 (2022-06-30) x86_64 GNU/Linux

Glücklicherweise gibt es als einfache und Distributions-konforme Lösung für solche Fälle das Backports-Repository:

Backports are packages taken from the next Debian release (called “testing”), adjusted and recompiled for usage on Debian stable. Because the package is also present in the next Debian release, you can easily upgrade your stable+backports system once the next Debian release comes out. [Quelle]

Die Backports bieten die Möglichkeit, mit Hilfe der gewohnten Paketverwaltung - sofern bereitgestellt - auf eine neuere Version eines Pakets zu aktualisieren, ohne dabei ein Franken-Debian zu erschaffen.

Als erstes müssen, sofern dies nicht bei der Installation des Systems bereits angewählt wurde, die Backports in der Datei “/etc/apt/sources.list” ergänzt werden:

# bullseye-backports, previously on backports.debian.org deb http://deb.debian.org/debian/ bullseye-backports main contrib non-free deb-src http://deb.debian.org/debian/ bullseye-backports main contrib non-free

Dann kann man sich nach einem “apt update” auf die Suche nach einem passenden Kernel machen:

$ sudo apt search linux-image Sortierung… Fertig Volltextsuche… Fertig ... linux-image-5.10.0-11-amd64/stable-security 5.10.92-2 amd64 Linux 5.10 for 64-bit PCs (signed) ... linux-image-5.18.0-0.bpo.1-amd64/bullseye-backports 5.18.2-1~bpo11+1 amd64 Linux 5.18 for 64-bit PCs (signed) ...

In der Liste werden alle Kernel-Versionen angezeigt, die installiert werden können, i.d.R. ist die Version mit möglichst wenigen Zusätzen im Namen die richtige:

$ sudo apt install linux-image-5.18.0-0.bpo.1-amd64/bullseye-backports ... Version »5.18.2-1~bpo11+1« (Debian Backports:bullseye-backports [amd64]) für »linux-image-5.18.0-0.bpo.1-amd64« gewählt. ... Die folgenden NEUEN Pakete werden installiert: linux-image-5.18.0-0.bpo.1-amd64 0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.

Nach erfolgreicher Installation reicht ein Neustart, um mit dem aktualisierten Kernel zu starten.

$ uname -a Linux *** 5.18.0-0.bpo.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.2-1~bpo11+1 (2022-06-14) x86_64 GNU/Linux

Im GRUB-Menü kann jederzeit wieder der bisher verwendete Kernel gestartet werden und falls der neue Kernel wieder entfernt werden soll, reicht ein einfaches “sudo apt purge …”, um die Installation rückgängig zu machen.