Im Rahmen meiner jährlichen Steuererstattung kaufe ich mir meist etwas, was ich normalerweise nicht kaufen würde. Dieses Jahr bin ich etwas früher dran als sonst. Es ist ein Trackball geworden. Ich möchte aber auch meine Maus angeschlossen lassen und immer nur das gewünschte Gerät aktivieren, das ich nutzen will.
Gleich vorweg, diese Lösung funktioniert nur unter Plasma mit KWin und Wayland. Weiterhin werden busctl (systemd) und qdbus6 (qt6-tools) verwendet.
#!/usr/bin/env bash
# SPDX-License-Identifier: AGPL-3.0-or-later# Copyright (C) 2026 <Dein Name>## Maus/Trackball umschalten unter KDE Plasma 6 (Wayland).# Lizenz: AGPL-3.0 oder später, https://www.gnu.org/licenses/agpl-3.0.html## Braucht bash >= 4.4, qdbus6 (oder qdbus-qt6) und busctl.## Gerätenamen unten anpassen oder per Umgebung setzen:# MAUS='...' TRACKBALL='...' ./geraete-umschalten.sh [maus|trackball|beide|toggle]## Namen der eigenen Geräte:# for d in $(qdbus6 org.kde.KWin /org/kde/KWin/InputDevice \# org.kde.KWin.InputDeviceManager.devicesSysNames); do# echo "$d: $(qdbus6 org.kde.KWin /org/kde/KWin/InputDevice/$d \# org.freedesktop.DBus.Properties.Get org.kde.KWin.InputDevice name)"# doneset -euo pipefail
MAUS=${MAUS:-'Kingsis Peripherals ZOWIE Gaming mouse'}TRACKBALL=${TRACKBALL:-'HUGE PLUS HUGE PLUS'}die(){echo"Fehler: $*" >&2;exit 1;}(( BASH_VERSINFO[0] > 4||(BASH_VERSINFO[0]==4&& BASH_VERSINFO[1] >= 4)))\
|| die "bash >= 4.4 benötigt"case${1:-toggle} in
maus|mouse)mode=maus ;; beide|both)mode=beide ;; trackball|toggle)mode=${1:-toggle};; *)echo"Verwendung: ${0##*/} [maus|trackball|beide|toggle]" >&2;exit2;;esacqdbus=$(command -v qdbus6 ||command -v qdbus-qt6)|| die "qdbus nicht gefunden"command -v busctl >/dev/null || die "busctl nicht gefunden"path=/org/kde/KWin/InputDevice
prop(){"$qdbus" org.kde.KWin "$path/$1" org.freedesktop.DBus.Properties.Get \
org.kde.KWin.InputDevice "$2"}set_enabled(){localstate=$1 dev
shiftfor dev;do busctl --user set-property org.kde.KWin "$path/$dev"\
org.kde.KWin.InputDevice enabled b "$state"\
|| die "$dev konnte nicht umgeschaltet werden"done}devs=$("$qdbus" org.kde.KWin "$path" org.kde.KWin.InputDeviceManager.devicesSysNames)\
|| die "KWin-InputDevice-Schnittstelle nicht erreichbar"maus=()trackball=()whileread -r dev;do[[$dev]]||continuename=$(prop "$dev" name 2>/dev/null)||continue# evtl. gerade abgestecktcase$name in
"$MAUS")maus+=("$dev");;"$TRACKBALL")trackball+=("$dev");;esacdone<<<"$devs"if[[$mode== toggle ]];thenif((${#maus[@]}&&${#trackball[@]}))&&[[$(prop "${maus[0]}" enabled)==true]];thenmode=trackball
elif((${#maus[@]}));thenmode=maus
elsemode=trackball
fificase$mode in
maus)((${#maus[@]}))|| die "Maus ($MAUS) nicht gefunden" set_enabled true"${maus[@]}" set_enabled false"${trackball[@]}"if((${#trackball[@]}));thenecho"Maus aktiviert, Trackball deaktiviert."elseecho"Maus aktiviert, kein Trackball gefunden."fi;; trackball)((${#trackball[@]}))|| die "Trackball ($TRACKBALL) nicht gefunden" set_enabled true"${trackball[@]}" set_enabled false"${maus[@]}"if((${#maus[@]}));thenecho"Trackball aktiviert, Maus deaktiviert."elseecho"Trackball aktiviert, keine Maus gefunden."fi;; beide)((${#maus[@]} + ${#trackball[@]}))|| die "weder Maus noch Trackball gefunden" set_enabled true"${maus[@]}""${trackball[@]}"echo"Alle gefundenen Geräte aktiviert.";;esac
Wer Verbesserungen am Script beizutragen hat, kann gerne auf https://codeberg.org/Fryboyter/rumpelkammer einen Pull Request erstellen oder mich per E-Mail oder Mastodon kontaktieren.
Am 09.10.26 hat der Kernel-Entwickler Sasha Levin einen Patch veröffentlicht der in der Dokumentation die Verpflichtung entfernt, dass man einen Hinweis erstellen muss, wenn man LLM zum Erstellen eines Patches verwendet hat. Daraus hat sich natürlich eine Diskussion entwickelt, an der sich auch Linus Torvalds beteiligt hat.
Torvalds ist ja dafür bekannt, dass er seine Meinung unmissverständlich wiedergibt. So auch in diesem Fall.
What this is about is setting our expectations, telling what we want and
what we don’t want.
No. What you are about is something entirely different. It has nothing
to do with “expectations”, and it has everything to do with your
hangups.
I don’t understand this whole idiotic concept of “don’t use AI for X”.
Here’s a new rule just for you: don’t use compilers for any of your
kernel submissions.
Because if you can’t show that you really understand what the machine
is actually doing by writing your code in assembler, then I don’t want
to see your code contribution. You clearly aren’t competent if you
can’t write it that way.
And btw, you had better not use an editor to write that commit message either.
Because I need you to show me that you can actually write a good
commit message without using tools that make it easy to backspace and
hide the mistakes you made while typing.
Ok?
Because otherwise those tool-assisted commits of yours clearly aren’t
showing that you know what you are doing.
Do you not see how UTTERLY STUPID those kinds of rules would be?
So no. We’re not going to make stupid rules that say “you can’t use
tools for X”.
The kind of expectations I have is that people do their best and I
expect people to understand what they are doing.
But that understanding has very little to do with what tools they use.
And quite honestly, in my experience, the people I respect and call
intelligent are not the ones that shy away from using new and
interesting tools.
Linus
Und irgendwie hat er meiner Meinung nach recht.
LLM sind Werkzeuge. Und Werkzeuge sind nicht generell gut oder schlecht. Es kommt immer auf den jeweiligen Nutzer an. Ja mit LLM wird viel Mist gebaut. Oder sollte ich sagen erstellt? Aber eben nicht nur. Hugo und Leafwiki wären beispielsweise zwei Projekte, die ich selbst nutze und die trotz der Verwendung von LLM gut funktionieren. Genauso wie ich Tools nutze die keine LLM nutzen und mir schon Probleme bereitet haben.
Ja, aber was ist mit der Lizenz? Vor dieser Gefahr wird schon seit es LLM gibt, gewarnt. Ja was ist damit? Welchen Unterschied macht es, wenn jemand einen Pull Request mit einem LLM erstellt hat oder wenn diese Person einen Pull Request erstellt hat und in diesem Code von beispielsweise Stack Overflow übernommen hat, ohne die Lizenz zu kennen oder diese zu berücksichtigen? Aus meiner Sicht keinen. In beiden Fällen ist derjenige der den Pull Request erstellt hat verantwortlich. Genauso wie er dafür verantwortlich ist, dass sein Beitrag zu einem Projekt funktioniert.
Um mich über neue Programmversionen bei beispielsweise Github auf dem Laufendem zu halten, verwende ich meist RSS-Feeds. Inzwischen sind das aber so viele geworden, dass ich langsam den Überblick verliere, welche Projekte ist beobachte. Ich habe daher einfach mal geschaut, ob es Tools gibt, die mir eine bessere allgemeine Übersicht liefern können. Und ja, die gibt es.
Argus wäre solch ein Programm. Es ist in Golang geschrieben und daher auch leicht auf einen Server installierbar. Ich habe es eben auf meinen Server im LAN installiert und mittels reverse Proxy (Caddy) im Internet erreichbar gemacht.
Argus bietet im Grunde genommen eine grafische Übersicht über den Browser welche Projekte man beobachtet und bei welchen es eine neue Version gibt. Zudem besteht die Möglichkeit, dass man im Falle einer neuen Version beispielsweise ein Script ausführt, welches die eigene Installation aktualisiert. Diese Funktion ist aber optional und man kann diese in der grafischen Oberfläche bei Bedarf bei einzelnen Versionen auch ablehnen.
Weiterhin kann man über diverse Dienste wie Matrix, E-Mail oder Discord eine Benachrichtigung erhalten, wenn es eine neue Version gibt.
Unter https://release-argus.io/demo haben die Entwickler eine Demo-Version installiert, sodass man sich einen ersten Eindruck verschaffen kann. Das Repository des Projekts, welches unter der Apache 2.0 Lizenz veröffentlicht wird, findet man unter https://github.com/release-argus/Argus
Braucht man Argus? Vermutlich nicht. Aber ich finde die Anzeige recht nett. Ob ich allerdings tatsächlich zu Argus wechsle oder weiterhin bei RSS-Feeds bleibe, ist noch abzuwarten.
Vor längerem habe ich diverse lokale Kalenderprogramme getestet. Unter anderem Kalendar und Merkuro. Damit soll per CalDAV auf einen Nextcloud-Kalender zugegriffen werden. Nach einigen Tests und irgendwelchen Änderungen konnte ich irgendwann unter Merkuro keine neuen Termine mehr anlegen. Jeder Versuch hat zur Fehlermeldung “Invalid parent collection” geführt. Alle Lösungen, die ich über eine Suchmaschine gefunden habe, hatten nicht funktioniert. Die Lösung in meinem Fall hat mich einige Zeit gekostet und war “interessant”.
Was ich alles probiert hatte was nicht funktioniert hat, werde ich nicht erzählen. Zum einen, weil es zu viel wäre. Aber auch, weil ich mich nicht mehr an alles erinnern kann. Ich werde daher nur beschreiben was schlussendlich zur Lösung geführt hat.
Erst mal habe ich mir die Konfigurationsdatei von Merkuro angesehen.
Nicht besonders aussagekräftig aber auf den ersten Blick auch nicht fehlerhaft. Irgendwann bin ich dann auf die Idee gekommen, mir die Konfigurationsdatei von Kalendar anzusehen, weil damit das Anlegen von Terminen funktioniert.
Hierbei ist mir aufgefallen, dass die Nummer der Selection bzw. Collection in den beiden Konfigurationsdateien unterschiedlich ist. Da mir nichts mehr eingefallen ist, wollte ich die Nummer aus der Konfigurationsdatei von Merkuro löschen. Allerdings habe ich versehentlich die falsche Konfigurationsdatei erwischt und lastUsedEventCollection=41 gelöscht. Als ich dann unter Merkuro einen neuen Termin anlegen wollte, habe ich keine Fehlermeldung mehr erhalten. Der Termin wurde aber nicht eingetragen, da scheinbar der Button “Eintragen” nun klickbar aber funktionslos war. Als ich meinen Irrtum bemerkt hatte und die Zeile wieder in die Konfigurationsdatei ~/.config/kalendarrc eingetragen hatte, hat der Button wieder funktioniert und besagte Fehlermeldung erzeugt. Was zur Hölle? Warum wirkt sich ein Eintrag in der Konfigurationsdatei von Kalendar auf Merkuro aus?
Mehrere vergebliche Versuche später.
Ich war inzwischen so weit, mir die Datenbank von Akonadi direkt anzusehen. Weil mir die unterschiedlichen Nummern immer noch keine Ruhe lassen. Was mich schlussendlich zur Lösung geführt hat.
mariadb \
--socket=/run/user/$(id -u)/akonadi/mysql.socket \
-D akonadi \
-e 'SELECT * FROM resourcetable;'+----+---------------------------------+-----------+
| id | name | isVirtual |+----+---------------------------------+-----------+
|1| akonadi_search_resource |1||3| akonadi_maildir_resource_0 |0||4| akonadi_contacts_resource_0 |0||11| akonadi_davgroupware_resource_4 |0|+----+---------------------------------+-----------+
Mit dieser Datenbankabfrage habe ich mir den Namen der vorhandenen Ressourcen in der Akonadi-Datenbank anzeigen lassen. In meinem Fall betrifft es die Ressource mit der id 11.
mariadb --auto-vertical-output --socket=/run/user/$(id -u)/akonadi/mysql.socket -D akonadi -e "
SELECT
c.id,
c.name,
c.parentId,
c.resourceId,
c.remoteId,
r.name AS resource
FROM collectiontable c
LEFT JOIN resourcetable r ON r.id = c.resourceId
WHERE r.name = 'akonadi_davgroupware_resource_4'
ORDER BY c.id;
"*************************** 1. row ***************************
id: 49 name: akonadi_davgroupware_resource_4
parentId: NULL
resourceId: 11 remoteId: akonadi_davgroupware_resource_4
resource: akonadi_davgroupware_resource_4
*************************** 2. row ***************************
id: 50 name: https://example.com/remote.php/dav/calendars/Fryboyter/Kalendername/
parentId: 49resourceId: 11 remoteId: https://example.com/remote.php/dav/calendars/Fryboyter/Kalendername/
resource: akonadi_davgroupware_resource_4
Mit diesem Befehl habe ich mir anzeigen lassen, was alles mit dieser Ressource verknüpft ist. Was in dem Fall mein Nextcloud-Kalender mit der id 50 ist. Die Konfigurationsdatei von Merkuro müsste also korrekt sein. Was ist aber Collection 41 die in der anderen Konfigurationsdatei genannt wird?
mariadb \
--socket=/run/user/$(id -u)/akonadi/mysql.socket \
-D akonadi \
-e "
SELECT
id,
name,
parentId,
resourceId,
remoteId
FROM collectiontable
WHERE id = 41;
"
Der Befehl zeigt nichts an. Es gibt keine Collection mit der id 41.
Da ich nichts zu verlieren habe, habe ich in der Datei ~/.config/kalendarrc die Zeile lastUsedEventCollection=41 auf lastUsedEventCollection=50 geändert.
Und schon konnte ich wieder neue Termine in Merkuro anlegen.
Wie es zu den unterschiedlichen ID-Nummern gekommen ist, kann ich nicht sagen. Warum Merkuro scheinbar auch, zumindest teilweise, die Konfigurationsdatei von Kalendar berücksichtigt, entzieht sich auch meiner Kenntnis. Allerdings vermute ich, dass es damit zusammenhängt, dass Merkuro auf Kalendar basiert.
Wer auf fryboyter.de aktuell die Suchfunktion verwendet, lädt erst einmal eine JSON-Datei herunter. An sich eine feine Sache, da die Suche somit lokal erfolgt. Allerdings wird diese Index-Datei immer größer. Aktuell über einem Megabyte.
Ich habe mich daher schon vor längerer Zeit überlegt eine andere Lösung zu nutzen. Schlussendlich bin ich bei Pagefind gelandet. Der damit erzeugte Index besteht nicht aus einer großen Datei, sondern aus mehreren kleinen Dateien von denen nur die geladen werden die für die jeweilige Suche benötigt werden. Es spart also Bandbreite für den jeweiligen Nutzer.
Mit Pagefind gab es bei meinen bisherigen Tests allerdings ein Problem. Die Artikelüberschrift wurde zweimal genannt. Einmal als Titel des Suchergebnisses in Form eines Links. Und einmal sozusagen im angezeigten Artikeltest. Also beispielsweise so.
Neuer Betreuer für das Hugo-Theme Ananke gesucht
Betreuer für das Hugo-Theme Ananke gesucht. Blablabla. Veröffentlicht am 16. September 2024|
Das ist jetzt nicht unbedingt schlimm aber es ist irgendwie nervig. Eine Lösung hatte ich bisher nicht gefunden. Was aber an mir und nicht an Pagefind lag. Im Grunde ist die Lösung ziemlich einfach. Bisher sieht die Datei single.html, mit der die einzelnen Artikel angezeigt werden, wie folgt aus.
Entscheidend ist hierbei in dem Fall hauptsächlich, dass man der Artikelüberschrift data-pagefind-meta=“title” zuweist und erhält dann beispielsweise folgende Anzeige.
Neuer Betreuer für das Hugo-Theme Ananke gesucht
der MIT-Lizenz) für den statischen Website-Generator Hugo. Für dieses Theme wird nun
Einige werden sich nun fragen, warum der Artikeltext im Suchergebnis mit “der MIT-Lizenz)” anfängt. Pagefind zeigt in der Standardkonfiguration die Zeile an, in der der Suchbegriff das erste Mal erscheint. Ich bin mir nicht sicher, ob mir das so gefällt.
Alternativ könnte man auch das anzeigen, was im Tag <meta name="description"> steht. Was ich für wesentlich besser halte. Nur habe ich diesen Eintrag bisher nie erstellt. Also seit 2009. Das nachzuholen würde einige hundert Artikel betreffen. Worauf ich manuell keine Lust habe. Daher bin ich aktuell dabei eine Lösung zu testen die mir anhand zweier lokaler LLM eine sinnvolle Beschreibung liefert. Welche ich aber selbstverständlich prüfen werde, falls ich diese Lösung nutzen werde. Aber das ist Stoff für einen anderen Artikel. Vielleicht.