Chat: die GIF-Kiste des Rudels -- und eine Luecke in der Sicherung
Filipe: "dan will ich auch dass man im chat auch sprachnachrichten und
gifts reinschicken kann. also nur die modis rechte linke hand und
dogfather."
ICH LESE "gifts" ALS GIFs -- die bewegten Bildchen -- und sage das
ausdruecklich, statt es stillschweigend anzunehmen. Im Zusammenhang
("im chat reinschicken", direkt neben Sprachnachrichten) passt nichts
anderes. Sollte er Geschenke gemeint haben, sagt er es, und dann baue
ich das.
EINE EIGENE KISTE STATT GIPHY ODER TENOR
----------------------------------------
Beide brauchen ein Konto und einen Schluessel und bekommen bei jedem
Tastendruck mit, wonach hier gesucht wird -- an eine fremde Firma, aus
einem Arbeitsplatz heraus, in dem sonst nichts nach aussen geht. Dazu
kosten sie ab einer Menge Geld. Beides steht quer zu dem, wie dieses
Haus gebaut ist.
Die Kiste laeuft auf demselben Server wie alles andere, kostet nichts
und wird mit der Zeit besser statt schlechter: Was darin liegt, hat das
Team ausgesucht. Zehn gute GIFs, die alle kennen, sind im Alltag mehr
wert als zehn Millionen fremde -- ein Katalog mit allem ist nicht mehr
Auswahl, sondern weniger.
HABEN WIR DAS SCHON? WIRD AM INHALT BEANTWORTET
-----------------------------------------------
Der Schluessel ist der SHA-256 der Datei. Ueber den NAMEN zu
vergleichen waere die naheliegende Abkuerzung -- und sie versagt genau
dort, wo Dateien "giphy.gif", "giphy(1).gif" und "download.gif"
heissen, also fast immer. Dasselbe Bild waere dreimal dieselbe Kachel.
Dasselbe GIF zweimal hineinzulegen ist deshalb KEIN Fehler: Es ist
drin, und genau das wollte man. Eine Absage waere formal richtig und im
Erleben falsch.
DAS WICHTIGSTE STUECK: ES WIRD KOPIERT, NICHT VERWIESEN
-------------------------------------------------------
Eine Nachricht zurueckzunehmen entfernt ihre Datei von der Platte. Laege
ein Kachel-GIF in demselben Ordner und mehrere Nachrichten zeigten
darauf, naehme das Zuruecknehmen EINER Nachricht das GIF fuer alle
anderen mit -- und in drei Gespraechen stuende ab da ein kaputtes Bild.
Das ist die Sorte Fehler, die erst Wochen spaeter auffaellt und dann
nicht mehr zu reparieren ist.
Deshalb liegt die Kiste in einem eigenen Ordner (chat-gifs/), und beim
Verschicken wird kopiert. Danach ist es ein ganz normaler Anhang: im
Verlauf, in der Suche, zuruecknehmbar, unter derselben Nachtruhe. Keine
zweite Sorte Nachricht mit eigenen Rechten und eigenem Loeschen.
Geprueft wird genau das: GIF hineinlegen, verschicken, aus der Kiste
nehmen -- und danach steht das verschickte immer noch im Gespraech.
"ALSO NUR" GILT AUCH HIER
-------------------------
Ansehen, hineinlegen, verschicken: alle drei nur fuer Team Dogi und
DogFather (istTeamDogi). Der Satz stand im selben Atemzug wie die
Sprachnachrichten; es gibt keinen Grund, warum er fuer das eine gelten
sollte und fuer das andere nicht. Gemessen auch am Knopf vorbei:
403/403/403.
AUGENSCHONEND -- HIER EINE ECHTE FRAGE, KEINE FORMSACHE
--------------------------------------------------------
Zwoelf gleichzeitig laufende Bildchen sind das Gegenteil von ruhig. Wer
"Bewegung reduzieren" gesetzt hat, bekommt deshalb STEHENDE Bilder: das
erste Einzelbild, im Browser auf eine Zeichenflaeche gemalt (kostet
keine zweite Datei), und es laeuft erst, wenn man es anfasst oder mit
der Tastatur darauf steht.
Fuer alle anderen laufen sie. Eine GIF-Auswahl, in der sich nichts
bewegt, ist eine, in der man nicht sieht, was man verschickt -- deshalb
steht dazu eine Gegenprobe in der Pruefung.
NEBENBEFUND, UND ER WIEGT SCHWERER ALS DIE GIFS
-----------------------------------------------
Weil die Kiste einen neuen Datenordner braucht, lief
tools/wiederherstellung-proben.mjs -- und meldete, dass der Ordner
"material" seit dem 22.09. NICHT gesichert wird. 2,4 MB
Materialbibliothek auf dem Server, nach einem Plattenausfall weg, ohne
dass die taegliche Meldung je etwas gesagt haette. Genau die Luecke,
wegen der diese Probe ueberhaupt gebaut wurde -- und sie hat sie
gefunden, weil sie die Ordner aus dem QUELLTEXT liest statt aus einer
gepflegten Liste.
Eingetragen. Danach frisch geholt und zurueckgespielt: 18 von 18 gruen,
"DIE SICHERUNG LAESST SICH ZURUECKSPIELEN" (vorher 3 Fehler).
Dabei war die Gegenprobe daneben selbst kaputt: Sie prueft, ob ein
erfundener Ordner als fehlend erkannt wird, und verlangte dafuer
`=== 1`. Das setzt voraus, dass sonst nichts fehlt. An dem Tag, an dem
wirklich etwas fehlte, wurde sie rot und zeigte damit auf sich selbst
statt auf den Fund -- zwei Meldungen, eine Ursache, und die zweite
lenkt von der ersten ab. Jetzt zaehlt sie die Differenz.
GEPRUEFT
--------
pruef-chat-anhaenge: 109 Pruefungen, 0 Fehler (vorher 86, davor 60).
pruef-chat, pruef-chat-aufloesen (126), pruef-chat-optik: gruen.
tools/wiederherstellung-proben: 18 von 18.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -60,11 +60,33 @@ scp -q dogfather-server:/home/dogiweb/workspace-daten/sicherungen/*.db "$ZIEL/"
|
||||
# Zug eingetragen -- nicht spaeter, wenn es auffaellt: Genau so ist die
|
||||
# Luecke bei den Profilbildern entstanden.
|
||||
#
|
||||
# MATERIAL FEHLTE -- GEFUNDEN AM 23.09.2026, NICHT BEMERKT SEIT DEM
|
||||
# 22.09.
|
||||
#
|
||||
# server/workspace-material.js legt seit dem 22.09. einen Ordner
|
||||
# "material" an (2,4 MB auf dem Server). Er stand hier nicht. Nach
|
||||
# einem Plattenausfall waere die Materialbibliothek weg gewesen, ohne
|
||||
# dass die taegliche Meldung je etwas gesagt haette -- genau die
|
||||
# Luecke, wegen der diese Probe ueberhaupt gebaut wurde.
|
||||
#
|
||||
# Gefunden hat es nicht das Lesen, sondern tools/wiederherstellung-
|
||||
# proben.mjs: Sie liest die Ordner aus dem Quelltext (join(DATEN_ORDNER,
|
||||
# "...")) und vergleicht sie mit dieser Zeile. Das ist der Unterschied
|
||||
# zwischen einer Liste, die jemand pflegen muss, und einer, die
|
||||
# nachgezaehlt wird.
|
||||
#
|
||||
# DIE GIF-KISTE GEHOERT DAZU (ergaenzt 23.09.2026, im selben Zug wie
|
||||
# die Funktion -- nicht spaeter, wenn es auffaellt). Sie liegt in
|
||||
# chat-gifs/ und ist das einzige, was NUR dort liegt: Verschickte GIFs
|
||||
# sind Kopien in chat-anhaenge/, die Kiste selbst nicht. Ginge die
|
||||
# Platte kaputt, waere ohne diesen Eintrag die gesammelte Auswahl des
|
||||
# Teams weg, und die Nachrichten damit auch nicht mehr nachlegbar.
|
||||
#
|
||||
# Wer hier einen Ordner ergaenzt, traegt ihn auch in ORDNER unten ein;
|
||||
# die Probe vergleicht die Liste gegen die Ordner, die der Server
|
||||
# wirklich benutzt, und schlaegt bei einem vergessenen an.
|
||||
echo "Hole hochgeladene Dateien, Bilder, Anhaenge und die Bibliothek ..."
|
||||
ORDNER="dateien wissen profilbilder chat-anhaenge"
|
||||
ORDNER="dateien wissen profilbilder chat-anhaenge chat-gifs material"
|
||||
for o in $ORDNER; do
|
||||
mkdir -p "$ZIEL/$o"
|
||||
scp -qr "dogfather-server:/home/dogiweb/workspace-daten/$o/." "$ZIEL/$o/" 2>/dev/null || true
|
||||
|
||||
@@ -212,9 +212,22 @@ ok(dateienZahl > 0,
|
||||
: `alle ${benutzt.size} holt tools/sicherung-holen.sh (${geholt.join(", ")})`);
|
||||
|
||||
/* GEGENPROBE: Erkennt der Vergleich einen fehlenden Ordner ueberhaupt?
|
||||
Ohne sie bewiese "nichts fehlt" nur, dass die Suche nichts findet. */
|
||||
ok([...benutzt, "erfundenerordner"].filter((o) => !geholt.includes(o)).length === 1,
|
||||
"Gegenprobe: ein erfundener Ordner WIRD als fehlend erkannt");
|
||||
Ohne sie bewiese "nichts fehlt" nur, dass die Suche nichts findet.
|
||||
|
||||
GEZAEHLT WIRD DIE DIFFERENZ, NICHT DIE SUMME (berichtigt am
|
||||
23.09.2026). Hier stand `=== 1` -- und das setzte voraus, dass
|
||||
sonst nichts fehlt. An dem Tag, an dem wirklich etwas fehlte
|
||||
(material), wurde die Gegenprobe rot und zeigte damit auf sich
|
||||
selbst statt auf den Fund: zwei Meldungen, eine Ursache, und die
|
||||
zweite lenkt von der ersten ab.
|
||||
|
||||
Eine Gegenprobe soll beweisen, dass der Vergleich REAGIERT. Das
|
||||
tut sie, wenn ein zusaetzlicher Ordner die Zahl um genau eins
|
||||
erhoeht -- unabhaengig davon, wie sie vorher stand. */
|
||||
const fehlendJetzt = fehlend.length;
|
||||
ok([...benutzt, "erfundenerordner"].filter((o) => !geholt.includes(o)).length
|
||||
=== fehlendJetzt + 1,
|
||||
`Gegenprobe: ein erfundener Ordner WIRD als fehlend erkannt (${fehlendJetzt} -> ${fehlendJetzt + 1})`);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user