alias cd..="cd .."
macOS 10.13 User Avatar speichern
Ich habe kürzlich meinen iOS-Avatar geändert, eher aus Langeweile. Nun will ich zurück zum vorherigen, der mein Avatar aus macOS (hier: 10.13, mein Macbook ist halt alt) war und dort auch immer noch ist. Wo ist die zugehörige Datei also gespeichert? Unklar. Aber
1 |
dscl . -read /Users/`id -un` JPEGPhoto | tail -1 | xxd -r -p > ~/Desktop/pic.jpg |
extrahiert es (Quelle).
Baldur’s Gate 3 Foren
Es gibt ein auf den ersten Blick etwas unterwältigendes Forum auf GOG, ein OKes auf Steam (siehe auch Unterforen rechts), sowie das offizielle (?!) auf larian.com.
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:
- Run the Pi-hole install. When you get to “Do you wish to install the web server” select “Off”.
- Finish the Pi-hole installation process. Do not panic.
- Run “sudo usermod -a -G pihole www-data”
- Install “sudo apt install php-sqlite3”
- At a minimum, restart Apache “sudo service apache2 restart” or reboot the Pi.
- 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:
1 2 3 4 5 6 7 |
# install .NET: config.vm.provision "shell", path: "dotnet-install.ps1", name: "install .NET" config.vm.provision "shell", inline: "[Environment]::SetEnvironmentVariable(\"DOTNET_ROOT\",\"$HOME\\AppData\\Local\\Microsoft\\dotnet\\\", \"Machine\")", name: "Set DOTNET_ROOT" config.vm.provision "shell", inline: "[Environment]::SetEnvironmentVariable(\"Path\", $env:Path + \";$HOME\\AppData\\Local\\Microsoft\\dotnet\\\", \"Machine\")", name: "Set Path" # install wix: config.vm.provision "shell", inline: "dotnet tool install --global wix", name: "install WiX", reboot: true |
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.
- 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
- 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
- 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.
- 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
- 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.
- Neuen Speicherpool im Speicher-Manager anlegen. Neues Volume darin anlegen (maximale Größe, Btrfs natürlich)
- Dann kann die Migration losgehen. Dafür gibt es zwei Möglichkeiten:
- 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
- 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
- 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!
- 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.
- Jetzt wird Platte 1 wirklich entfernt (dauert kurz), danach der Speicherpool 1 an sich.
- 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.
- 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):
1 2 3 4 5 6 |
pi@hifiberry:~ $ bluetoothctl [bluetooth]# devices Device FC:58:FA:3D:32:12 BT 214 [bluetooth]# connect FC:58:FA:3D:32:12 Attempting to connect to FC:58:FA:3D:32:12 Failed to connect: org.bluez.Error.Failed |
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:
1 2 |
sudo apt install pulseaudio-module-bluetooth # reboot nicht vergessen! |
Und: Geht 🥳
1 2 3 4 5 6 7 |
pi@hifiberry:~ $ bluetoothctl [bluetooth]# connect FC:58:FA:3D:32:12 Attempting to connect to FC:58:FA:3D:32:12 [CHG] Device FC:58:FA:3D:32:12 Connected: yes Connection successful [CHG] Device FC:58:FA:3D:32:12 ServicesResolved: yes [BT 214]# |
Die auf im Post genannten Module benötige ich nicht. Kurzer Test:
1 |
speaker-test -t wav -c 6 |
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 halfbluetoothctl --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:
1 2 3 4 5 6 7 8 9 |
<p><a id="zeroWidthSpaceLink" style="cursor:pointer;">Klick mich!</a></p> <!-- wp:html --> <script type="text/javascript"> document.getElementById("zeroWidthSpaceLink").onclick = function() { navigator.clipboard.writeText(""); }; </script> <!-- /wp:html --> |
Das macht sich Gutenberg-Syntax zunutze, was aber auch im Classic-Editor erhalten bleibt.
Gradle: Gezippte Dependency verwenden
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
repositories { ivy { url 'https://repository.example.com/' patternLayout { // adapt as needed: artifact '/foo/[organisation]/bar/[module]/[revision]/[module]-[revision].[ext]' } // Required in Gradle 6.0+ as metadata file (ivy.xml) is mandatory: metadataSources { artifact() } } } configurations { zipped } dependencies { // "crusy" maps to "organisation", "MyZipFile" to "module", // "1.3" to "revision", "zip" to "ext" in above patternLayout: zipped 'crusy:MyZipFile:1.3@zip' } tasks.register('unzip', Copy) { dependsOn configurations.zipped from { configurations.zipped.collect { zipTree(it) } } into "${buildDir}/dependencies" include '**/*.jar' // or whatever you want/don't want } build.dependsOn tasks.unzip |
Darauf zugreifen kann man dann bspw. in anderen Tasks mittels
1 |
files("${buildDir}/dependencies/SomeFancyJar.jar") |
PS: Mir ist bewusst, dass ${buildDir}
deprecated ist, aber ${layout.buildDirectory}
ging aus irgendeinem Grund nicht.