Einträge über Code & Zahlen

Recht früh habe ich begonnen mit Computern zu beschäftigen, die Physik kam dann auch dazu. Im Physikstudium habe ich mich auf die Schnittmenge spezialisiert, die Computerphysik. Viele Dinge nehme ich nun mit dem Blick eines Naturwissenschaflers und Softwareentwicklers wahr. Entsprechend sind die Artikel in dieser Kategorie über Programmiersprachen, von mir geschriebene oder genutzte Software, Physik, quantitative Untersuchungen von Finanzthemen und weitere Dinge dieser Art.

Meinen Code findet man auf GitHub, meine dummen Fragen auf Stack Overflow. Auf Physics Stack Exchange habe ich auch einige Fragen gestellt und beantwortet.

Meine wissenschaftlichen Artikel aus der Studienzeit findet man auf arXiv und ORCID.


Einstieg in JavaScript

Als ich so 15 war, habe ich mit PHP angefangen interaktive Webseiten zu bauen. Dabei habe ich dann auch HTML und CSS genutzt, um die Inhalte hübsch zu präsentieren. Mit JavaScript bin ich aber nie wirklich warm geworden. Ich habe die Interaktivität immer nur im Backend gemacht, mein Frontend war immer eher langweilig. Irgendwann bin ich vom Web-Stack dann weg, und habe Desktopanwendungen in Java und später nur noch Kommandozeilenprogramme in Python geschrieben. Dazu kam, dass ich JavaScript verachtet hatte: Langsam, ineffizient, und voller super merkwürdiger Kuriositäten durch das schwache und implizite Typsystem.

JavaScript wurde jedoch immer populärer. Es kam das Electron-Framework, in dem diverse sehr nützliche Programme wie Spotify, Slack oder Obsidian geschrieben wurden. Ich sehnte mich nach einer Realität, in der sich C++ und Qt durchgesetzt hatten, aber in der lebte ich einfach nicht. Und so habe ich diese Ressourcenfresser einfach nur noch passiv verachtet.

Gerade auch durch die Erfahrungen bezüglich Zielgruppe beim Vigilant-Crypto-Snatch-Projekt habe ich angefangen anders über JavaScript nachzudenken. Es ist halt die eine Sprache, die wir im Browser zur Verfügung haben. Wenn ich damit entwickele, kann ich Dinge direkt im Blog verfügbar haben. Und so habe ich inzwischen die interaktive Karte mit Blogartikeln hier auf der Seite. Und ich habe diverse interaktive Grafiken, die mit Altair erstellt und dann von Vega dargestellt werden. Gerade auch weil dieser Blog kein Backend auf dem Server hat, bleibt nur JavaScript für interaktive Dinge.

Weiterlesen…

Verstopfter DHCP-Server in FRITZ!Box

Wie wahrscheinlich viele Privatnutzer haben wir eine FRITZ!Box als Modemrouter. Das funktionierte auch wunderbar, bis man irgendwann nicht mehr per LAN oder zweitem WLAN verbinden konnte. Die Verbindung blieb immer bei »Beziehe IP-Adresse« hängen.

Das ist ein Symptom, wenn der DHCP-Server nicht korrekt funktioniert. Aber es gibt keinen Grund, warum das plötzlich der Fall gewesen sein sollte. Eine Recherche in diversen Computerforen brachte gemischte Ergebnisse. In diesem Thread haben sie irgendwie den Pool der Adressen erhöht. In einem anderen Thread haben sie dann statische IP-Adressen vergeben. Die Hilfe vom Hersteller AVM stellte sich auch als komplett nutzlos heraus.

Weiterlesen…

Neue Slugs

Jeder Blogeintrag hat einen Titel, zum Beispiel »Maximilianstraße nun Fußgängerzone«. Das möchte ich so aber nicht als Ordnernamen im Dateisystem nutzen, weil die Leerzeichen manche Dinge aus dem Tritt bringen. Also habe ich das alles in Kleinbuchstaben konvertiert und dann die Leerzeichen durch Bindestriche ersetzt. Heraus kommt dann maximilianstraße-nun-fußgängerzone. Das ist soweit auch total okay. Kopiert man das aber aus dem Browser heraus, so wird daraus dann die URL-kodierte Variante maximilianstra%C3%9Fe-nun-fu%C3%9Fg%C3%A4ngerzone, die einfach hässlich aussieht.

Es gibt das Python-Paket Unidecode, das Unicode-Zeichen durch ihr nächstes ASCII-Äquivalent ersetzt. Somit kommt man dann bei maximilianstrasse-nun-fussgangerzone heraus. Das ist etwas merkwürdig zu lesen, weil wir »ä« eher mit »ae« umschreiben würden. Allerdings ist es so allgemeiner und klappt auch mit dem dänischen »ø« oder chinesischen Schriftzeichen, die dann durch Pinyin ersetzt werden.

Weiterlesen…

Kleine Momente Teilen

Gerne teile ich Momente aus meinem Leben, zum Beispiel Fotos von einer Radtour. Gerade durch die Pandemie habe ich wenig von anderen Leuten mitbekommen, man lebte einfach so parallel vor sich hin. Das ist schade, und erst so langsam trifft man sich wieder regelmäßig. Ich versuche noch einen Weg zu finden, mehr diese Teilnahme an alltäglichen Situationen zu ermöglichen.

Für Fotos gibt es natürlich eine offensichtliche Plattform: Instagram. Dort könnte ich die Fotos hochladen, es würden wahrscheinlich auch ein paar Menschen im Internet diese Fotos finden. Jedoch haben die Menschen, die mir wichtig sind, in der Regel kein Konto bei Instagram. Und die Leute, die ich auf Instagram erreichen kann, reagieren höchstwahrscheinlich eher nur oberflächlich darauf. Es ist einfach kein Medium für gleichberechtigten Austausch, es ist einfach nur ein »schaut her«.

Ich könnte die Fotos so in einer Bildergalerie im 2000er Stil auf meiner Webseite haben, aber wer schaut sich das denn wirklich an? Wer würde wirklich schauen, was es da neues gibt? Man könnte das zwar per RSS abonnieren, das nutzen aber auch die wenigsten. Was ich tatsächlich mache sind Blogartikel zu Radtouren, da kann ich dann auch noch ein bisschen mehr Kontext liefern. Das ist dann für die Leser:innen meines Blogs, aber nicht so sehr für meine Freunde und Familie. Manche Momente sind aber auch nicht wirklich dafür geeignet, für immer festgehalten zu werden. Wenn zum Beispiel eine Pflanze hier eine neue Blüte hat, dann ist das nur in dem Moment relevant, falls überhaupt.

Weiterlesen…

Perspectives for Vigilant Crypto Snatch

I have been working on the Vigilant Crypto Snatch program for a while now. It has started as a command line utility and eventually got extended with a Streamlit web interface for simulation. Recently I added a GUI with the Qt framework. The user experience is now scattered over three different interfaces. After talking to product managers at my company about our company's product, I learned to view programs in a new angle. So far I would see it from a programming perspective, and with technical boundary conditions. But they view it completely differently. One of their view angles are jobs to be done. And this made me reflect over my hobby project.

Initially, there was just one user, Chris. Eventually I started to use it myself, but not as enthusiastic. Features were driven by his ideas, and I would implement them in a way that made sense. He uses it on a Raspberry Pi miniature computer that runs 24/7, and just with a command line. This made certain choices pretty clear: There was no point in making a graphical user interface, and it would be an expert system where editing a configuration file was just fine.

Over time, a flock of a few users has formed. They were all technically skilled, and therefore the command line was fine. A few more ideas came up, eventually a simulator was requested. But the NumPy library that I used doesn't work on 32 bit ARM, because the NumPy team doesn't supply packages for that particular architecture. So I deployed that to the Streamlit cloud. But people started to like the web user interface, and asked to have it for the main program as well.

Weiterlesen…

JSON vs. YAML vs. TOML

There are a bunch of data formats which can store structured data. The most popular seem to be JSON and YAML. A relatively new one is TOML, which is gaining traction in the Python ecosystem. For most of my projects I just use YAML files, but I have tried out the TOML language as well.

Here I will show the same data in the three formats and write a bit about the positive and negative sides of each. The data is the configuration for a smartphone synchronization script that copies images and downloaded files from the device to my laptop, and also copies planned routes and my password file to the device. Because I want to change the files and paths without having to change the script, I made it a configuration file.

Weiterlesen…

Explorer Tile Video

Seit einiger Zeit nutze ich die Explorer Tiles, um systematisch mehr von der Umgebung zu erkunden. Mit meinen heruntergeladenen Daten von Strava kann ich nun weitere Dinge erzeugen. Komplett Strava nachbauen möchte ich gar nicht, das ist viel zu viel Aufwand. Aber ein Ding, was so nicht angeboten wird, ist ein Video mit der Erkundung der Kacheln. Wie in einem Echtzeit-Strategiespiel (RTS), bei dem die Karte zuerst unentdeckt und schwarz oder dunkel ist, möchte ich zeigen, wie ich so langsam die Umgebung erkundet habe.

Dazu brauche ich erst einmal die zeitliche Abfolge der Erkundung. Die habe ich bereits, das ist ein Data Frame mit Zeit und Kachel X und Y. Daraus kann ich nun ein Video bauen. Ein Bestandteil ist das Herunterladen der Kacheln von der Open Street Map, damit ich daraus Bilder für ein Video bauen kann, dafür habe ich auch schon ein bisschen Code. Zuletzt muss ich die Einzelbilder für das Video zusammensetzen. Und da braucht es einen Plan, wie ich das am sinnvollsten mache.

Weiterlesen…

Qt GUI für Blogeinträge

Weil es meist relativ lange dauert, bis Behörden antworten, habe ich eine lange Liste mit Entwürfen im Blog. Um da nicht den Überblick zu verlieren, habe ich ein Kanban-Board gebaut. Das ist ein Python-Skript, das die Markdown-Dateien der Blogartikel einliest und den YAML-Header verarbeitet. Für diesen Artikel sieht der so aus:

title: Qt GUI für Blogeinträge
date: 2022-07-17
category: Code & Zahlen
tags: "Sprache: Deutsch, Software: Qt, Programmiersprache: Python"
previewimage: gui-1.png
status: draft
board: In Bearbeitung

Daraus erzeugt das Skript dann HTML, das zu dieser Ansicht im Browser wird:

Das ist ganz nett, jedoch muss ich die immer neu erzeugen lassen. Außerdem erlaubt sie keine Interaktivität, weil man vom Browser sinnigerweise nicht auf das Dateisystem zugreifen kann. Daher habe ich mir eine interne GUI mit Qt gebaut.

Weiterlesen…

Primitive Obsession

On the Refactoring Guru website, there is one anti-pattern called “primitive obsession”, which is about the obsession with primitive types. In Python I would define “primitive types” as “jsonable types”, the ones that can be represented in JSON. This is a pattern that I have observed a couple of times, and I want to show a little example from my own code.

I have a bunch of Python scripts to handle my blog posts. And naturally I have a class which represents a blog post:

@dataclasses.dataclass()
class Post:
    meta: Dict[str, Any]
    text: str
    path: str
    auxiliary_files: List[str]
    tags: List[str]

This data class would be called struct in C and C++, POD in Java, list in R. Such data structures seem rather nice. They can easily be serialized into JSON (just use json.dumps(post.__dict__)) or YAML. And they can easily be restored (use Post(**json.loads(s)). And if new fields are added, they are automatically taken care of. Also one can easily print the state of the program everywhere with a print, and one can just export JSON from the debugger, if needed. What's not to love about this?

Weiterlesen…

Messschieber zeigt halbe Länge

Immer wieder einmal hatte ich Bedarf nach einem Messschieber, und habe mir dann einen billigen gekauft. Ich hatte keine Lust einen analogen mit Nonius selbst abzulesen, daher habe ich einen digitalen gekauft. Der hat auch ganz brauchbar funktioniert. Irgendwann zeigte er dann aber exakt die Hälfte der Länge an:

Hier sind 10 mm ausgezogen, aber es werden nur 5 mm angezeigt. Also habe ich mich an den Verkäufer gewandt. Der schrieb mir dann in schlechtem Deutsch, die Firma hat zwar eine Niederlassung in Hamburg, aber der Mitarbeiter hat einen chinesischen Namen. Wahrscheinlich ist da in der Sprache einiges verloren gegangen.

Weiterlesen…