Pi Hole: “Disable Blocking” funktioniert nicht

Ich habe meinen Pi Hole auf einem bereits aufgesetztem Apache installiert (für meinen Slow Movie Player). Das ist laut How-To möglich:

  1. Run the Pi-hole install. When you get to “Do you wish to install the web server” select “Off”.
  2. Finish the Pi-hole installation process. Do not panic.
  3. Run “sudo usermod -a -G pihole www-data”
  4. Install “sudo apt install php-sqlite3”
  5. At a minimum, restart Apache “sudo service apache2 restart” or reboot the Pi.
  6. Enjoy.

und das ist auch so – aber 🙂 Wenn man das Pi Hole aktualisiert, muss man Schritt 5 wiederholen, sonst funktioniert irritierenderweise das temporär disablen nicht. Kein Fehler in der Konsole, keine Fehlermeldung, nur ein Error im Debug Log, dass der lighttpd nicht läuft.

WiX 4 in Vagrant Maschine installieren

WiX 4 benötigt .NET SDK 6 oder höher. Das .NET SDK per Shell Provisioner zu installieren ist aber nicht ganz offensichtlich, was primär an zweierlei liegt:

MS möchte .NET gerne per winget installieren, was eine AppStore-App ist (heißt das so?), die per Provisioner selbst nach der abenteuerlichen Installation der Dependencies nicht verfügbar ist:

Program ‘winget.exe’ failed to run: The file cannot be accessed by the systemAt C:\tmp\vagrant-shell.ps1:1 char:1

– vermutlich liegt der Grund irgendwo hier, hier oder hier. Keine Ahnung, Windows halt 🤷🏼‍♂️

Wenn man .NET dann anders installiert, werden die Umgebungsvariablen nicht mit gesetzt m( Na ja, long story short:

Mit dotnet-install.ps1 von hier; zum Einsatz kommt StefanScherer/windows_10. Der Reboot am Ende sollte imho nicht notwendig sein, aber ohne findet er weder wix.exe, noch dotnet.exe. Windows halt 🤷🏼‍♂️

Synology: Dateisystem im laufenden Betrieb ändern

Ich habe meine DS213j (lies: Ein 2-Bay-NAS der kleinsten (“j”-) Reihe von Synology in der Version von 2013) gegen die aktuelle Version DS223j getauscht. Das geht, was die Hardware angeht, erstaunlich einfach: Platten raus aus der 213, in derselben Reihenfolge rein in die 223, dem Wizard folgen, fertig ✨

meine Beweggründe waren initial:

  • USB 3.x, denn 3TB über USB 2 zu backupen macht keinen Spaß.
  • Gigabit Netzwerk. Vollformat RAW-Fotos über 100MBit macht nämlich auch keinen Spaß. Außerdem ist es kontraproduktiv, wenn die Internetverbindung schneller ist (hier 300 MBit) als die Netzwerkschnittstelle des NAS 🤓

Inzwischen habe ich dann gelernt, dass die DS223j die erste DiskStation der “j”-Reihe ist, die Btrfs unterstützt. Sprich: Snapshots, Kompression, Prüfsummen, … Das will ich, und sei es nur für besagte Fotos!

Nun sagt Synology, dafür müsse man alle Daten extern zwischenspeichern, die Platten platt machen und als Btrfs neu aufsetzen – btrfs-convert scheint hier unbekannt. Es gibt allerdings einen Weg, das “live” zu tun 😎 Das Folgende basiert stark auf diesem Post, der aber für ein 4-bay-NAS geschrieben wurde, auch ansonsten sehr zu detailliert ist, und dabei trotzdem einige nützliche Details vermissen lässt:

Einschub: Es wird am Ende ein “Synology Hybrid Raid” (SHR) mit “One-Drive Fault Tolerance” sein, was RAID 1 entspricht. Der – dann einzige – Speicherpool wird “Speicherpool 2” heißen, das – dann einzige – Volume wird “Volume 2” heißen.

  1. Mach genug Backups, um Dich angesichts der Gefahr eines kompletten Datenverlusts auf dem NAS an sich “wohlzufühlen”.
    • PS: Die NAS-Konfiguration wird inzwischen zwar automatisch in der Cloud gespeichert, aber unter Systemsteuerung > Aktualisieren & Wiederherst. > Konfigurationssicherung kann man sie selber auch noch mal exportieren
  2. Prüfe alle Backups – das ist wichtig, bei mir schlug eine Prüfung fehl!
    • Tipp: Man kann auch mal eine Datei aus einem Backup öffnen, das scheint mir insbesondere bei datenbankbasierter Speicherung ratsam
  3. Prüfe alle Platten auf Integrität
    • PS: “Datenbereinigung” ist nur verfügbar auf Btrfs, sowie SHR mit mindestens drei Laufwerken. Nicht in meinem Szenario, will ich sagen.
  4. Jetzt wird Platte 2 (!) deaktiviert: Speicher Manager > HDD/SSD > Rechtsklick auf Laufwerk 2 > Laufwerk deaktivieren
    • Nun wird das NAS wild piepen, das kann man stummschalten unter Systemsteuerung > Hardware & Energie > Signaltonsteuerung > Stummschalten
  5. Hier sagt der verlinkte Post, man müsse/könne/solle Platte 2 ausbauen und an einem anderen Rechner formatieren. Das wollte ich auch tun, aber mein SATA-USB-Adapter ging irgendwie nicht. Ich habe die Platte unverändert wieder eingebaut, wo das Folgende dann trotzdem problemlos möglich war.
  6. Neuen Speicherpool im Speicher-Manager anlegen. Neues Volume darin anlegen (maximale Größe, Btrfs natürlich)
  7. Dann kann die Migration losgehen. Dafür gibt es zwei Möglichkeiten:
    1. Systemsteuerung > Freigegebener Ordner > Rechtsklick auf jeden Ordner > Bearbeiten > “Ort” ändern. Wichtig: Außerdem unter “Erweitert” die “Daten-Prüfsumme”, denn das kann man nachträglich nicht mehr!
      • Vorteile: Sehr einfach, die Zuordnung zu Backup-Tasks bleibt rudimentär erhalten
      • Nachteil: Kann nach beliebiger Zeit schiefgehen! Dann hat man den Platz auf Volume 2 bereits belegt, die Dateien werden aber in der File Station nicht angezeigt! Lösung ist, sich per SSH einzuloggen (Aktivierung unter Systemsteuerung > Terminal & SNMP), Dateien unter /volume2/@tmp/ manuell löschen (du half mir). Die Zeit ist natürlich trotzdem verloren
    2. Unter Systemsteuerung > Freigegebener Ordner neue Ordner anlegen, und die Daten dann manuell rüberschieben
      • Nachteil: Aufwändiger
      • Vorteile: Flexibler, schlägt früher fehl
      • PS: Das ist auch ein praktikabler Weg, um nachträglich Prüfsummen einzuschalten
  8. Irgendwann ist Platte 1 “leer” (1.4GB waren bei mir trotzdem noch belegt; laut SSH für DSM, nginx, etc.) und kann selbst im Speicher-Manager entfernt werden – DSM wird dann warnen, dass eine gewisse Menge Apps davon betroffen sind. Diese Apps sollt man idealerweise manuell deinstallieren, bevor man Platte 1 wirklich entfernt! Gute Gelegenheit, auch hier mal aufzuräumen. PS: Man kann pro App entscheiden, ob Settings erhalten bleiben sollen.
  9. Jetzt wird Platte 1 wirklich entfernt (dauert kurz), danach der Speicherpool 1 an sich.
  10. Unter Speicherpool 2 kann man via “Laufwerk hinzufügen” Platte 1 hinzufügen – Achtung, der Prozess dauert eine ganze Weile, denn hier werden die Daten ja erneut gespiegelt. Bei mir mit 1.4 belegten TB von insgesamt 2.7 TB (“3” TB) dauert es gut 7 Stunden.
  11. Nun kann man Aufräumen, Apps neu installieren, Datenbereinigung ausführen, und – wenn man unter Punkt 7.2. umsortiert hat – direkt ein neues Backup anlegen. Spätestens damit sollte dann aber alles fein sein.
    • PS: Man erschreckt erst ein wenig, weil Volume 1 weg ist, aber ein Klick auf Speicherpool 2 oder Volume 2 zeigt, dass nun beide Laufwerke diesem zugeordnet sind. Nein, Stand heute kann man die nicht umbenennen 🤷🏼‍♂️

 

Was habe ich nun gelernt?

  • Datenbankbasierte Backups sind stuhl.
    • ich habe erst heute gelernt, dass eines meiner Backups defekt war. Mit immerhin drei Dateiversionen der fraglichen defekten Datei darin. Sie war noch nie korrekt gespeichert worden, was Hyper Backup aber offenbar nie aufgefallen ist, auch nicht beim (wieder fehlerhaften!) Überschreiben.
    • Man kann das auch nicht reparieren! Schon gar nicht punktuell die eine defekte Datei. Man kann noch aus dem Backup lesen, aber es nicht mehr beschreiben – man muss es komplett neu erstellen dafür (oder man versucht dies)
  • kleinere “Freigegebene Ordner” sind besser!
    • sie sind leichter umzuziehen, siehe Punkt 7
    • sie sind schneller zu backupen, siehe vorheriger Punkt
    • sie sind auch feingranularer freizugeben und/oder zu verschlüsseln und/oder zu komprimieren und/oder mit Prüfsummen zu versehen
  • Man kann (und vermutlich: sollte) seine Daten ein wenig pflegen:
    • Defragmentierung: Ja, das geht! Vielleicht nicht das Schlechteste, nachdem man die Daten gerade 1x auf links gedreht hat.
    • einen SMART-Test haben wir ja gerade durchgeführt, aber man kann den auch planen
    • Apropos planen: Für den Speicherpool kann man eine “Datenbereinigung planen” (Knopf oben) oder – erstmalig – “Jetzt ausführen” (Knopf ca. mittig). Meine ist eben erfolgreich durch 🙂
    • ggf. geplante Integritätsprüfungen für (geplante!?) Backups
    • ggf. regelmäßige Snapshots erstellen, wozu es allerdings einer weiteren App bedarf, siehe auch Details hier

Hm: Nun ist auch dieser Eintrag ziemlich lang geworden 🙂

hth!

Bluetooth Soundausgabe auf Raspberry Pi 3B (nicht 3B+)

Es ist 1 wenig tricky, Soundausgabe via Bluetooth auf einem pi3b (b, nicht b+!) ans Laufen zu bekommen. Und ich spreche hier von “auf der Kommandozeile”, auf dem Desktop habe ich das imho irgendwann mal recht schnell zusammengeklickt.

Warum ist das so knifflig? Erstens: Weil Raspberry Pi OS für den 3B, Stand heute, auf Debian 11/”Bullseye” basiert – was weder bei Release des 3B so war (da war es 8/”Jessie”, immerhin 3 Major Versions zurück!), noch die aktuellste Version ist (das wäre dann 12/”Bookworm”). Wikipedia behauptet zwar, auch 12/”Bookworm” wäre kompatibel, aber der Raspberry Pi Imager bietet für den 3B nur 11/”Bullseye” an. Es gibt auch kein “Tested image” von 12/”Bookworm” für den 3B, und meiner bootet dann auch mit keinem der dort angebotenen (oder findet vielleicht auch nur das WLAN nicht, was in meinem Fall auf dasselbe rauskommt).

(Diese UNSITTE, eingängige Nummerierung durch völlig willkürliche Strings zu ersetzen 😡 Looking at you, macOS. Apropos Macs, auch schön: Auf meinem, zugegebenermaßen knapp 13 Jahre alten MacBook kann ich den Raspberry Pi Imager nicht mehr nutzen! Weil gegen eine inkompatible Version von qt kompiliert, wenn ich das richtig verstehe. Aber ich schweife ab.)

Man findet also drölf Tutorials, aber keines davon passt (es gibt sogar Stimmen, die sagen, das geht auf dem 3B gar nicht). Also schreibe ich halt noch eines 🙂 Und zwar explizit für Debian 11/”Bullseye”, bzw. “Raspberry Pi OS (Legacy, 32-bit) Lite (Veröffentlicht: 2023-12-05)”, wie es im Imager genannt wird – was laut lsb_release -a aber dasselbe ist. Achtung: Das System nicht upgraden (everybody says that)! Update: Da hatte ich in einem der Foren gelesen, und auch selber den Eindruck, dass ich nach einem apt upgrade keine Verbindung mehr bekam – jetzt wollte ich noch dieses Detail debuggen und lösen, da tritt es nicht mehr auf. Keine Ahnung.

Zuerst probiere ich stumpf, ob es vielleicht schon geht (ich überspringe hier der Übersichtlichkeit halber Scanning, Trusting, Pairing):

Das Internet ist voll von entsprechenden Meldungen mit n+1 Ursachen. Es hilft zur Eingrenzung, in einem zweiten Fenster btmon zu starten (erfordert sudo). Dort sehe ich:

= bluetoothd: src/service.c:btd_service_connect() a2dp-sink profile connect failed for FC:58:FA:3D:32:12: Protocol… 5.320743

“a2dp”? 🤔 Ist quasi Audio-über-Bluetooth. Was Sinn ergibt, denn FC:58:FA:3D:32:12 ist ein Lautsprecher, ein “sink” von Audio. Wie bekommt man so ein “sink profile”? Über die Installation von PulseAudio oder PipeWire. Quasi das zweite Problem, denn beide haben ihre eigene Fan-Base (bzw. ihre eigenen Probleme, aus Sicht des jeweils anderen Lagers) und ihre eigenen Tutorials. Wie auch immer, die oben verlinkte Seite sagt, man solle PulseAudio verwenden:

PulseAudio is the default audio server in Debian. Unless you know what you’re doing, you probably want to follow these instructions

, und dieser Post sagt das auch. Also:

Und: Geht 🥳

Die auf im Post genannten Module benötige ich nicht. Kurzer Test:

Auch das tut (haha: “tut”! Wie in “Sound”! TUUT TUUT!? Ich finde alleine raus …)

PS, das o.g. zusammenzustellen, hat mich einige Versuche mit frischen Images gekostet. Hier einige weitere Learnings aus diesen Versuchen:

  • Bei einem der Versuche hat dann der Lautsprecher angefangen, eine dritte Dimension von Problemen zu machen: Er wollte einen PIN haben 🙂 Zu sehen war das aber auch nur in btmon. Jedes Gerät kann hier seinen eigenen Unsinn veranstalten. Es kann dann helfen (wie gesagt, inzwischen benötige ich es nicht mehr), bluetoothctl mit einem anderen Agent zu starten. Die Idee ist, dem Gegenüber zu sagen, dass man keinen PIN eingeben kann, um in einen anderen Pairing-Modus zu gehen. Oder dass man einen eingeben kann, um den entsprechenden Prompt zu triggern. Bei mir half bluetoothctl --agent KeyboardDisplay, was zwar überhaupt nichts triggerte, aber dann ging es. Hier alle Agents.
  • service bluetooth status zeigt den aktuellen Status; dabei ist “active (running)” (in grün) gut, etwaige Fehlermeldungen (in Rot), wie bspw. “Sap driver initialization failed” oder “Failed to set privacy: Rejected” sind irrelevant. Mein Speaker tut (…) trotz dieser Meldungen.
  • busctl tree org.bluez zeigt die Devices:

(die beiden untersten Zeilen sieht man nur, wenn das Gerät verbunden ist; es können also sowohl bekannte, wie auch verbundene Devices angezeigt werden)

HTH!

Dazn Fehlercode 51-132-403

Wer auch immer die Webseite von DAZN programmiert hat, …

Erstens: Sechs Zeichen, Sonderzeichen explizit nicht erlaubt, das ist nicht direkt State of the Art.

Zweitens: “Fehlercode 51-132-403” ist nicht unbedingt sprechend. Internet sagt

Bitte stelle sicher, dass du noch nicht bei uns registriert bist, da es sich hierbei um einen häufigen Grund für diesen Fehler handelt.

, aber ich habe noch kein Konto da. Stellt sich raus, drittens: Pi Hole (/Ad-Blocking) aus, dann geht es. m(

WordPress: onclick

Es gibt eine neue Unterseite: tools. Darin ist noch fast nichts, nur ein Link, der mir ein “breitenloses Leerzeichen” in die Zwischenablage kopiert. Gut zu gebrauchen auf Mastodon, um bspw. das Plural-S von #hashtags abzutrennen. Aber das ist nicht der Grund, warum ich das poste.

Der Grund, warum ich das poste, ist dass es nicht offensichtlich ist, wie man WordPress einen JS-Link beibringt. onclick wird (offenbar?!) rausgefiltert, das altmodische href="javascript:" ebenfalls. Wie folgt geht es:

Das macht sich Gutenberg-Syntax zunutze, was aber auch im Classic-Editor erhalten bleibt.

Gradle: Gezippte Dependency verwenden

via, und/bzw.

Darauf zugreifen kann man dann bspw. in anderen Tasks mittels

PS: Mir ist bewusst, dass ${buildDir} deprecated ist, aber ${layout.buildDirectory} ging aus irgendeinem Grund nicht.

Gradle: Task mit bestimmtem JRE ausführen

Edit zur Erklärung: Gradle benötigt Java, und bspw. ein installiertes JDK 17 kann natürlich Language Level 8 kompilieren. Aber es ist trotzdem ein JDK 17 und enthält bspw. kein JAXB mehr. Die Aufgabe ist hier, einen Gradle-Task unabhängig von meiner Java Version mit einem 8er JRE auszuführen. Das verwendete Plugin lädt alles dafür benötigte herunter.

Original Post below:

settings.gradle:

build.gradle:

via, und, Danke Nils!

Mastodon in WordPress Menü

Whoop whoop 🥳 Nachdem Elmo Twitter kaputt gemacht hatte, war ich letzten November endgültig zu Mastodon gewechselt. Das Widget im Menü hier hatte ich gelöscht. Nun habe ich in neues gefunden, das analog für Mastodon funktioniert: include-mastodon-feed.

Folgender Shortcode kommt zum Einsatz (might change):

include-mastodon-feed instance=”troet.cafe” account=”109371466136964927″ limit=”1″ excludeBoosts=”true” excludeReplies=”true” excludeConversationStarters=”true” linkTarget=”_blank” showPreviewCards=”false” text-permalinkPre=”am” date-locale=”de-DE” date-options=”{year:undefined, month:’long’, day:’numeric’, hour:’numeric’, minute:’numeric’}” text-permalinkPost=”:”

Ergänzt um etwas css: