Auf meinem Rechner befindet sich ein Verzeichnis "Archiv". Dort schlummern alte Dateien, die für mich keinen aktuellen Nutzen mehr haben und meist nur noch aus Nostalgiegründen nicht gelöscht wurden: Texte die heute ganz schnell über Google gefunden werden könnten, schlecht geschriebener Programmcode, Studienarbeiten, Spiele, die nicht mehr laufen.
Das Stöbern in diesen Ordnern hat etwas arschlogisches. Manches ist thematisch einsortiert, manches chronologisch, manches geschichtet: Ein Ordner enthält die Dateien meines letzten Rechners, der ein Archiv des vorletzten Rechners bis zurück (oder hinunter) zu meinem ersten PC (Ordnername "p75").
Dort liegt auch ein Ordner "tageneu" und Dateien mit Namen wie 1996011120 und folgendem Inhalt:
FEBEBEMMJ \yëêy }çê gâééêu{B
Von Verschlüsselung kann hier keine Rede sein, aber es reichte aus, um ein versehentliches Lesen von anderen Computernutzern zu verhindern. Außerdem verhindert die Codierung heute, dass ich es mal ebenso lesen kann.
Ich schrieb die Tagebucheinträge in einem Pascalprogramm, zu dem ich von der Fernsehserie "Doogie Howser, M.D." inspiriert wurde.
Später übernahm dann ein Delphi-Programm.
Der erste Eintrag ist aus 1996, der letzte aus 2000. Nach 20 Jahren wollte ich doch gerne wieder lesen, was mich damals so bewegt hat. Außerdem war es ein guter Anlass um ein kleines Progrämmchen zu schreiben:
import os def main(): file_paths = get_sorted_file_paths('/ganz/geheimer/lokaler/pfad/') diary_entries = read_all_diary_entries(file_paths) print_diary_entries(diary_entries) def get_sorted_file_paths(directory_path): return sorted([os.path.join(directory_path, f) for f in os.listdir(directory_path)]) def read_all_diary_entries(file_paths): return [read_diary_entry(file_path) for file_path in file_paths] def read_diary_entry(file_path): encoded_byte_stream = read_file_byte_stream(file_path) text = decode(encoded_byte_stream) header = build_diary_header_text(file_path) return f"{header}\n{text}" def read_file_byte_stream(file_path): with open(file_path, "rb") as f: return f.read() def decode(encoded_content): rotated_bytes = rotate_non_whitespace_bytes(encoded_content) return rotated_bytes.decode('CP437').strip() #return rotated_bytes.decode('Latin-1').strip() def rotate_non_whitespace_bytes(values): return bytes([rotate_non_whitespace_byte(c) for c in values]) def rotate_non_whitespace_byte(value): return (value - 20) if value > 32 else value def build_diary_header_text(file_path): name = os.path.basename(file_path) return f"----- {name[6:8]}.{name[4:6]}.{name[0:4]}, {name[8:]} Uhr -----" def print_diary_entries(diary_entries): print("\n".join(diary_entries)) if __name__ == "__main__": main()
Als nervigstes Problem hat sich die Suche nach dem richtigen Encoding gestaltet. Zuerst hatte ich die Funktion
Daraufhin machte ich mich dann auf die Suche, nach der richtigen Codepage. Das dauerte jedoch, bis ich merkte dass die Dateien mit zwei verschiedenen Codepages geschrieben wurden. Das Pascalprogramm nutzte CP437 (MS DOS), das Delphiprogramm dann Latin-1 (Windows). Ich habe noch keine Lösung gefunden, wie das Skript nun selbsts herausfindet, welche Codepage die momentan richtige wäre.
chr()
verwendet. Diese nutzt aber Unicode und hat damit die Umlaute und das ß verschluckt.Daraufhin machte ich mich dann auf die Suche, nach der richtigen Codepage. Das dauerte jedoch, bis ich merkte dass die Dateien mit zwei verschiedenen Codepages geschrieben wurden. Das Pascalprogramm nutzte CP437 (MS DOS), das Delphiprogramm dann Latin-1 (Windows). Ich habe noch keine Lösung gefunden, wie das Skript nun selbsts herausfindet, welche Codepage die momentan richtige wäre.
Und was kam nun inhaltlich dabei heraus? Das behalte ich natürlich für mich. Aber drei Dinge können verraten werden:
- Ich hatte meine damaligen schulischen Leistungen teilweise falsch in Erinnerung.
- Ein angefangenes Point & Click Adventure harrt seit nun bald einem Virteljahrhundert auf Fertigstellung.
- Ich habe damals definitiv zu wenig getanzt. Das kann mit diesem Lied aus dem Jahr 1996 ein wenig nachgeholt werden:
Das automatische Auswählen der richtigen Codepage ist NP-vollständig :-) Ich glaube, es gibt nur heuristische Verfahren. Du könntest den Text dekodieren und dann schauen, ob du häufig verwendete Worte findest, etwa "und", "der" und "ich".
AntwortenLöschen