Nicht-Binäre Nullen //1961

Hat sich jemand gewundert, warum ich nicht schon viel früher die aktuelle Quartalsstatistik über die Kommentare auf diesem Blog veröffentlicht habe?
Normalerweise lade ich am letzten Tag eines Quartals oder am ersten Tag des darauffolgenden Quartals (je nach dem, wie es mir zeitlich am besten passt) eine WordPress-Exportdatei herunter mit den Beiträgen samt Kommentaren der letzten drei Monate.
Ich habe mir dann so ein Programmchen geschrieben, das muss ich nur über die Datei drüberlaufen lassen, dann spuckt es die sortierten und verlinkten Daten über die Kommentatoren und die Anzahl ihrer Kommentare aus. Diese Daten muss ich dann nur noch im Wesentlichen in einen Blogentwurf pasten.
So hatte ich dies auch beim letzten Quartalswechsel vorgesehen. Es klappte auch scheinbar alles. Dass deutlich weniger Kommentare als das letzte Mal gezählt wurden, schob ich darauf, dass es im betrachteten Zeitraum auch weniger Kommentare gegeben hatte. Ich hatte ja urlaubsbedingt im August weniger gebloggt, und zeitweise war auch wirklich nur wenig losgewesen.

Dann jedoch fiel mir beim Plausibilitätscheck auf, dass ein bestimmter Kommentator, der gerade in den letzten Tagen vorher viel kommentiert hatte, in meiner Liste völlig fehlte.
Ich schaute mit einem Editor in die Exportdatei, suchte den Namen dieses Kommentators, und fand ihn auch mehrfach. Nur mein Programm fand ihn partout nicht. Ich verglich die Formatierung und die Tokens. Alles schien zu passen.
Da dieses Problem nur niedrige Priorität hatte, konnte ich nicht länger am Stück daran arbeiten, sondern musste immer wieder unterbrechen.
Ich erspare euch die Fehlschläge in meiner Fehlersuche. Insgesamt hat mich das einiges an Zeit gekostet. Beispielsweise dumpte ich eine Liste unsortiert mit allen Kommentatornamen heraus, samt der Position, an der sie in der Datei standen.
Ursprünglich hatte ich vermutet, dass irgendeine Besonderheit bei diesem Kommentator (und noch bei zwei oder drei anderen) sei, die es verhinderte, dass mein Algorithmus seinen Namen fand. Die Positionsangabe in der Dump-Datei brachte mich dann schließlich auf die Lösung:
Die Positionsangaben endeten bei etwas über einer Million. Die Datei war aber 1.9 Megabyte groß. Irgendwie passte das nicht zusammen (zumal ich in einem Texteditor durchaus Kommentare ganz unten erkennen konnte). Einige weitere Checks deuteten daraufhin, dass die Datei nach der guten Hälfte einfach abgeschnitten wurde.
Wie kann das sein? Eine XML-Datei ist im Grunde genommen eine Text-Datei, in diesem Fall UTF-8 kodiert. Ich öffnete sie mit einem Hex-Editor und suchte nach einer binären 0. Bingo!
Bei der ersten 0 (es gab mehrere) wurde die Zeichenkette abgeschnitten.
Wie kommt WordPress dazu, in eine XML-Datei Nullen reinzuschreiben?
Nach meiner Einschätzung waren die früher heruntergeladenen Exportdateien korrekt (ich habe aber nur die vom 2. Quartal 2018 noch mal überprüft).

OK. Nachdem das Problem jetzt identifiziert war, war der nächste Schritt die Suche nach einer Lösung.
Obwohl alles andere als elegant und auch denkbar langsam, entschloss ich mich, die ganze Datei in einen Stream zu laden, Byte für Byte einzulesen, und es durch eine 32 (die um die Anzahl meiner Finger erniedrigte Antwort) zu ersetzen, wenn es eine 0 war.
Nachdem ich diese Funktion implementiert hatte, lief das Programm wieder, und liefert – soweit ich das beurteilen kann – korrekte Ergebnisse.
Was das mit den Nullen sollte, weiß ich immer noch nicht. Ich machte mir nicht die Mühe, das herauszufinden.

Über Anne Nühm (breakpoint)

Die Programmierschlampe.
Dieser Beitrag wurde unter Uncategorized abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

8 Antworten zu Nicht-Binäre Nullen //1961

  1. ednong schreibt:

    D. h., die haben da NULL reingeschrieben? Und wir haben jetzt alle 5 Kommentare weniger als wir eigentlich hätten? Uijuijui.

    Like

  2. Engywuck schreibt:

    binäre Null in einem String mit UTF8 geht ja gar nicht – außer, da wäre eine „echte“ binäre Null zu enkodieren. Hat da jemand mit seltsamen Zeichen im Kommentartext oder Namen rumgespielt? Mojibake?

    Den größten Sündenfall empfinde ich aber immer noch, das Zeichenkettenende in C-artigen Sprachen in-stream zu kodieren anstatt mit anständiger expliziter Längenangabe. Solange man reine Sprache verarbeitet geht das ja noch, aber für beliebige Zeichenketten gibt das nur Probleme – nicht nur, weil zu oft das Ende-Zeichen bei der Speicherreservierung vergessen wird.
    Aber ich bin ja auch ein Fan von expliziter Typkonvertierung 🙂

    Like

    • Die Nullen waren in einem CDATA-Abschnitt (sind aber AFAIK sogar dort verboten). Ich weiß trotzdem nicht, was die darin verloren haben. Beim Export ging es nur um Blogtexte und Kommentare.
      Es handelte sich wohl um Daten für das „Request_Utility_CaseInsensitiveDictionary“ – frag mich nicht, was das soll.

      Mit dem Abspeichern von Zeichenketten, bzw. Wiedereinlesen, habe ich auch schon so einiges erlebt .. 🙄 .. so dass mich das hier nicht wirklich erstaunt oder schockiert.

      Like

  3. Pingback: 1000 binäre Jahre //2156 | breakpoint

  4. Pingback: Oktobrige Tweets //2157 | breakpoint

Hinterlasse einen Kommentar