Passwort für Batocera im Terminal setzen

Die Retro-Gaming-Distribution Batocera ist nicht auf Sicherheit getrimmt. So wird der Account root, standardmäßig mit dem Passwort linux ausgeliefert. Wer sich per SSH mit einer Batocera-Installation verbindet, wird feststellen das eine Änderung über passwd nicht möglich ist:

[root@BATOCERA ~]# passwd
-bash: passwd: Kommando nicht gefunden.

Stattdessen muss hier anders vorgegangen werden. Im ersten Schritt muss die Option Enforce Security aktiviert werden. Dazu muss die entsprechende Konfigurationsdatei bearbeitet werden:

nano /userdata/system/batocera.conf

Dort muss der Security-Block aktiviert werden:

## Security
## Enable this to enforce security, requiring a password to access the network share.
system.security.enabled=1

Anschließend kann das Passwort gesetzt werden:

batocera-config setRootPassword secret123

Auch hier fällt wieder auf, dass die Sicherheitseinstellungen der Distribution zu wünschen übrig lassen:

*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.

Das neu gesetzte Passwort gilt immer nur nach einem Neustart, sodass dieser ebenfalls durchgeführt werden muss:

reboot

Anschließend kann sich mit dem neuen Passwort, z. B. per SSH, verbunden werden. Das Passwort kann daneben in den Systemeinstellungen der Batocera-Oberfläche unter Sicherheit eingesehen werden.

Gelöschte Dateien im Git-Log finden

Ab und an kommt es vor, dass eine Datei in einem Git-Projekt verschwunden ist. Besonders in größeren Repositorys oder bei längerer Historie stellt sich dann die Frage, wann wurde sie gelöscht und von wem?

Mit folgendem Befehl lassen sich gezielt alle Löschungen in der Git-Historie anzeigen:

git log --diff-filter=D --name-only

In der Ausgabe sind dann die einzelnen Commits, mit entsprechenden Löschungen zu sehen:

commit e14e40f43551902b1934635a9af6674d329df440
Author: seeseekey 
Date:   Sun Dec 21 19:37:19 2025 +0100

    Remove set item command.

src/main/java/org/example/commands/SetCommand.java

commit 879fbec47cdaf7e788d2b78e385e89db65acb81d36
Author: seeseekey 
Date:   Fri Nov 28 19:55:22 2025 +0100

    Restructure City generator.

src/main/java/org/example/commands/CityCommand.java

Damit lässt sich auf einen Blick nachvollziehen, wann, von wem und welche Dateien im Repository gelöscht wurden.

Das PAN-Stipendium

In dieser Episode von Deus ex machina rede ich mit Anna Lisa über das PAN-Stipendium. Wir sprechen über das Stipendium, die Struktur und Arbeit des Netzwerks, den Bewerbungsprozess und die Vergabekriterien sowie viele weitere Aspekte rund um Förderung und das Schreiben. Den besagten Exposé-Kurs von Anna Lisa findet ihr auf Udemy und Bücherklang auf Tone H.

Falls noch nicht geschehen, könnt ihr Deus ex machina in eurem Podcatcher abonnieren oder eine Bewertung auf Apple Podcasts hinterlassen. Daneben ist die Unterstützung über Tone H möglich.

Web-Clipper für Apple Notes

Wer Apple Notes für Notizen unter macOS nutzt, wird relativ schnell feststellen das kein offizieller Web-Clipper für Firefox oder Chrome existiert.

Web Clipper to Apple Notes
Preis: Kostenlos

Abhilfe schaffen hier die Web-Clipper von AVRHut, welche über den jeweiligen Browser in den Erweiterungen installiert werden können.

Der Web-Clipper im Firefox

Da allerdings keine sinnvolle Schnittstelle in Apple Notes für diesen Anwendungsfall existiert, muss zusätzlich auf dem Gerät noch eine Bridge-App installiert werden, welche die Web-Inhalte schlussendlich in Apple Notes überträgt.

Ollama unter Ubuntu 24.04 installieren

Ollama, ein Werkzeug um Large Language Models lokal auszuführen, kann auch auf einem Server z. B. unter Ubuntu 24.04 genutzt werden. Zur Installation wird das Installationsskript auf dem Server ausgeführt:

curl -fsSL https://ollama.com/install.sh | sh

Dieses Skript legt einen Nutzer ollama auf dem System an und installiert Ollama:

curl -fsSL https://ollama.com/install.sh | sh
>>> Installing ollama to /usr/local
>>> Downloading ollama-linux-amd64.tar.zst
######################################################################## 100.0%
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.

Anschließend kann Ollama über das Kommando ollama gesteuert werden. Ein erstes Modell könnte mittels:

ollama run gpt-oss

heruntergeladen und ausgeführt werden. Soll das Modell wieder gestoppt werden, so kann der Befehl:

ollama stop gpt-oss

genutzt werden. Soll ein Modell nur heruntergeladen werden, kann hierfür das Subkommando pull genutzt werden:

ollama pull gpt-oss

Die Daten von Ollama werden im Ordner /usr/share/ollama/ gespeichert. Dort finden sich auch die Modelle im Unterordner .ollama/models. Wer die aktuell laufenden Modelle sehen möchte, kann dies mit dem Befehl:

ollama ps

bewerkstelligen. Das Kommando:

ollama list

hingegen listet alle installierten Modelle auf. Ollama selbst stellt unter 127.0.0.1:11434 eine API bereit, die bei einem sinnvoll konfigurierten Server allerdings nicht von außen erreichbar sein sollte.

Wer diese API von außen erreichbar machen möchte, kann Nginx als Reverse Proxy nutzen. Dazu muss die Datei /etc/systemd/system/ollama.service angepasst und dort kann das Interface auf welchen gehört werden soll, sowie die erlaubten Origins konfiguriert werden:

Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"

Danach muss die SystemdUnit neu gestartet werden:

systemctl daemon-reexec
systemctl daemon-reload
systemctl restart ollama

Anschließend kann die eigentliche Nginx-Konfiguration erstellt werden:

map $http_authorization $allow_ollama {
  default 0;
  "Bearer secret123" 1;
  "Bearer secret345" 1;
}

server {

  server_name api.example.org;

  ...

  # Ollama
  location ^~ /ollama/ {

    # Auth
    if ($allow_ollama = 0) { return 401; }

    # Proxy pass
    proxy_pass http://localhost:11434/;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 60s;  # Upstream TCP connect timeout
    proxy_send_timeout    60s;  # Upstream request send timeout
    proxy_read_timeout    300s; # Upstream response read timeout
    send_timeout          60s;  # Client response send timeout

    # Do not forward the token to the backend
    proxy_set_header Authorization "";
  }
}

In dieser wird eine Map mit Bearern definiert, die der Authentifizierung dienen und die API wird über eine ReverseProxy-Konfiguration nach außen gegeben. Ein Beispiel-Aufruf könnte dann wie folgt aussehen:

curl https://api.example.org/ollama/api/chat \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer secret123" \
  -d '{
    "model": "gpt-oss",
    "messages": [
      { "role": "user", "content": "Schreibe einen Haiku über den Frühling." }
    ],
    "stream": false
  }'

Und schon läutet das Ergebnis den Frühling ein:

Frühling ruft leise,
Bäume wachen, Sonne lacht,
Träume fliegen hoch.