Direkt zum Hauptbereich

Tagebuch

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 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:

Kommentare

  1. 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

Kommentar veröffentlichen

Beliebte Posts aus diesem Blog

Avatar - mit Glatze bitte!

Vor einigen Monaten kamen zwei neue Mitarbeiter in unser Team. Da einer von ihnen auch Martin hieß, führte das oft zu Verwechslungen und der Nachfrage „welcher jetzt?“ – vor allem in der Remote-Kommunikation. Beschreibungen wie „der zweite Martin“ oder „der andere Martin“ hielt ich für unpassend. Also schlug ich vor, dass ich von nun an einfach einen anderen Rufnamen erhalte und wählte: „Guybrush“. Damit das auch immer präsent ist, ersetzte ich auch mein Profilbild an allen mir möglichen Orten durch ein Pixelbild von Gybrush aus Monkey Island 2 : Wie erwartet, setzte sich das sehr schnell durch. Vor einigen Tagen wollte ich dieses Bild jedoch durch eine etwas auflösungsstärkere Variante ersetzen. Die gefundenen Bilder machten jedoch sehr deutlich, dass es doch erheblich an Ähnlichkeit mangelte. Vor allem die Haare entsprachen so gar nicht meiner Frisur. Also beschloss ich, dass dies doch mal ein guter Einsatz für einen AI-Bildgenerator wäre. Die zwei mit denen ich bisher gearbeitet h...

Utopie gesucht

In den 90er Jahren gab es meiner Meinung nach eine positive Zukunftssicht. Das sah man u.a. in der Serie Star Trek The next generation. Heute dagegen scheint es nur noch pessimistische Blicke auf die Zukunft zu geben. Auch die aktuellen Star Trek Serien stellen eine düsterere Welt dar. Dies könnte zu einer selbst erfüllenden Prophezeiung werden. Gibt es in der aktuellen Popkultur noch Utopien?

Dienst am Staat schadet der Gemeinschaft

Mit seinem letzten Beitrag hat Steinchen mir ja geradezu den Fehdehandschuh hingeworfen :-). Er macht den Vorschlag, den bestehenden staatlichen Arbeitszwang nicht abzuschaffen, sondern ihn nur von seiner militärischen Komponente zu befreien. Mit diesem Vorschlag (wie mit vielen anderen auch) kann man sich auf zwei Arten auseinandersetzen. Zum einen ethisch: Wie ist der Vorschlag nach allgemein anerkannten ethischen Prinzipien zu bewerten? Hier müssen jedoch zuerst diese allgemein anerkannten (wenigstens unter den beiden Diskutanten) Prinzipien gefunden werden. Zum anderen kann der Vorschlag ökonomisch untersucht werden. Hier lautet zunächst die Frage, welche subjektiven Ziele nach Ansicht des Autors mit der vorgeschlagenen Maßnahme erreicht werden sollen. Darauf aufbauend kann dann untersucht werden, ob das vorgeschlagene Mittel geeignet ist, diese Ziele zu erreichen. Beide Wege bieten genug Stoff um etliche Blogeinträge zu füllen und die eine oder andere wissenschaftliche Arbeit auf...