Berechnen und darstellen der VorgÀnge in der Natur.
Mein Einstieg in die Wissenschaftskommunikation mit Linux, Typst, Lua, Julia und Pluto.jl statt Python und LaTeX.
Ne sorry, aber WissKomm (Wissenschaftskommunikation) funktioniert anders. Richtig, weil sie sich den Geldgebern, den UniversitĂ€ten (Stichwort âPublish or Perishâ) und der Politik unterordnen muss. Wir erinnern uns, die Politik will, dass Ăsterreich und auch Europa in der Spitzenforschung wieder mitspielt nur, wir investieren zu wenige Geld in Grundlagenforschung und uns laufen die FachkrĂ€fte weg weil wir zu viele Regeln haben und, Bildung panische Angst vor Gentechnik, GVO (Genetisch verĂ€nderten Organismen) und KI LLMs/Checkpoints schĂŒrt statt dessen Potentiale zu nutzen. Die Blattlinie meines Blogs lautet âEigenstĂ€ndige Dokumentation von NaturphĂ€nomenen.â weil ich in einem freien Land lebe in dem ich sagen und schreiben darf was ich denke, daher passe ich ohnehin nicht in eine traditionelle 9-to-5 WissKomm Rolle. Aber ja, ich habe die Geopolitik und die politischen UmbrĂŒche die in den nĂ€chsten Jahren zu erwarten sind mit einkalkuliert.
A-a-a-aber Python ist der de-facto Industriestandard!
Ja und? Das sagt man auch vom dominierenden Betriebssystem der Firma aus Redmond und dessen Verzeichnisdienst â und beides ist unter der Haube endlos kaputtgeflickt. Nicht falsch verstehen, Python und LaTeX bieten tolle eigene Ăkosysteme nur, beide sind nicht gerade schnell und, wenn etwas kaputt ist, ist es richtig kaputt.
Das Kernproblem der modernen IT: Da aus Angst vor BrĂŒchen immer nur neuer Code oben draufgeklatscht wird, statt Altes grundlegend neu zu schreiben, wird das Fundament mit der Zeit immer instabiler. Man erinnere sich nur an den OpenSSL-Bug âHeartbleedâ (CVE-2014-0160) oder die cURL-Schwachstelle (CVE-2023-38545). Beide hatten zwar nichts mit Python zu tun, zeigen aber das Problem historischer Altlasten.
Ein echter gravierender Python Bug aus dem Jahr 2019 im Bereich der organischen Chemie und NMR-Spektroskopie ging als âWilloughby-Hoye-Bugâ in die Geschichte ein. Die Entwickler hatten schlicht vergessen, ein simples â.sort()â auf die eingelesenen Dateien anzuwenden. Weil verschiedene Betriebssysteme Dateilisten unterschiedlich sortieren, lief das Skript unter Linux perfekt, spuckte unter anderen Betriebssystemen aber komplett falsche wissenschaftliche Ergebnisse aus. Das fĂŒhrte zu einem massiven Vertrauensverlust in unzĂ€hlige bereits veröffentlichte Studien. Wenn man bedenkt, wie verbissen der Wissenschaftsbetrieb auf das Publizieren um jeden Preis fokussiert ist, bleibt fĂŒr saubere QualitĂ€tskontrolle oft schlicht keine Zeit.
Je gröĂer Softwareprojekte werden und je mehr historischer Ballast blind mitgeschleift wird, desto fehleranfĂ€lliger werden sie. Dass es auch radikal anders geht, bewies das OpenBSD-Projekt mit seinem LibreSSL Fork, bei dem Entwickler Ted Unangst fĂŒr sein rigoroses, tonnenweises Herausschneiden von ungenutztem Altheiten-Code gefeiert wurde. Alles geht, wenn man nur will.
Die Hardware und das Betriebssystem.
Ich verwende ein consumer Notebook, genauer gesagt ein ASUS Vivobook-S-Flip TN3604YA mit AMD Ryzen 7 7730U mit integrierter GPU und 16 GB Arbeitsspeicher. Als Betriebssystem, CachyOS Linux (momentan Kernel-Version 7.1.3-2) mit KDE-Plasma.
Die weiteren Tools.
- Typst: Der moderne Nachfolger von LaTeX. Perfekt, um statische Texte und Grafiken in wunderschöne PDFs zu gieĂen.
- Lua: Eine extrem schlanke Skriptsprache, die ursprĂŒnglich fĂŒr die Geologie entwickelt wurde, um Datenstrukturen zu verarbeiten.
- Julia & Pluto.jl: Julia wurde speziell fĂŒr numerisches und wissenschaftliches Rechnen entwickelt. Pluto.jl bietet Notebooks die reaktive und interaktiv sind.
- LLM/Checkpoints: Google, Ollama mit dolphin3 und deepseek-r1 je 8b Modelle, sd-cli .cpp mit Juggernaut XL Ragnarok. Ja, letzteres lÀuft selbst mit f32 auch wenn es zeitweise 12,5 GB RAM braucht - wenn man den Speicher richtig konfiguriert.
Julia und Pluto.jl im Terminal installieren.
# Der offizielle Julia Installer
curl -fsSL https://install.julialang.org | sh
# Den Pfad zur Fish-Shell hinzufĂŒgen
fish_add_path ~/.juliaup/bin
# ĂberprĂŒfen, ob alles geklappt hat
julia --version
# julia version 1.12.6
# Julia-REPL starten
julia
# Den Paketmanager öffnen mit der Taste "]" (Alt Gr + 9)
(@v1.12) pkg> add Pluto
# Pluto lÀdt Pakete automatisch, sobald sie im Notebook aufgerufen werden
# Mit der Backspace-Taste (nach links löschen) die Paket-Ebene wieder verlassen
julia> import Pluto
â Info:
â Welcome to Pluto v1.0.3 đ
â Start a notebook server using:
â
â julia> Pluto.run()
â
â
julia> Pluto.run()
[ Info: Loading...
â Info:
â Opening http://localhost:1234/?secret=P5zfX2N5 in your default browser... ~ have fun!
â
â Info:
â Press Ctrl+C in this terminal to stop Pluto
â
# Alternativ-Quickstart direkt ohne Julia-REPL:
julia -e "import Pluto; Pluto.run()"
# Wichtig: Das Terminalfenster im Hintergrund
# einfach offen lassen! Da wir uns nur lokal
# verbinden, benötigen wir kein https. Der Token
# nach dem "=" wird bei jedem Start neu generiert.
# Zum Beenden im Terminal einfach "Ctrl + c" drĂŒcken:
^C
â Info:
â Closing Pluto... Restart Julia for a fresh session.
â
â Have a nice day! đ
â
# Um die Julia-Konsole ganz zu verlassen "Ctrl + d" drĂŒcken.
Im Browser eigene Notebooks erstellen.
Auf â+ Ein neues Notebook erstellenâ klicken. In einem neuen Fenster sieht man anschlieĂend in der Mitte eine leere Zeile. Links davon ein Augensymbol um den Code aus oder ein zu blenden. Darunter ein + um eine neue leere Zeile einzufĂŒgen (alternativ "Ctrl Enter"). Am rechten Rand der Zeile 3 Punkte in einem Kreis unter dem sich ein MenĂŒ mit weiteren Optionen verbirgt. Um den Code in der jeweiligen Zeile auszufĂŒhren "Shift Enter" drĂŒcken.
Notebook 1, H2O in 3D.
# Zeile 1:
using Plots
# Zeile 2:
using PlutoUI
# Zeile 3:
md"Kamera Drehung (°): $(@bind winkel_drehung Slider(0:360, default=45))"
# Zeile 4:
let
bindungs_winkel = deg2rad(104.5)
abstand = 0.9584
o = [0.0, 0.0, 0.0]
h1 = [abstand * sin(bindungs_winkel/2), abstand * cos(bindungs_winkel/2), 0.0]
h2 = [-abstand * sin(bindungs_winkel/2), abstand * cos(bindungs_winkel/2), 0.0]
scatter([o[1]], [o[2]], [o[3]], color=:red, markersize=18, label="Sauerstoff (O)",
xlims=(-1.2, 1.2), ylims=(-0.5, 1.5), zlims=(-1.2, 1.2),
camera=(winkel_drehung, 30), legend=:topleft, aspect_ratio=:equal, title="H2O Dipol-MolekĂŒl")
scatter!([h1[1], h2[1]], [h1[2], h2[2]], [h1[3], h2[3]], color=:blue, markersize=10, label="Wasserstoff (H)")
plot!([o[1], h1[1]], [o[2], h1[2]], [o[3], h1[3]], color=:gray, linewidth=4, label=false)
plot!([o[1], h2[1]], [o[2], h2[2]], [o[3], h2[3]], color=:gray, linewidth=4, label=false)
end
Slider nach rechts und links bewegen. Oben in der Mitte einen Namen eingeben und rechts daneben auf den Knopf klicken. Danach auf das Pluto.jl Logo klicken um zur Ăbersicht zurĂŒck zu gelangen.
Notebook 2, 24h des Kosmos.
# Zeile 1:
using Plots
# Zeile 2:
begin
# Unsere Meilensteine als Array von Named Tuples
events = [
(time="00:00", name="Urknall", color=:gold),
(time="09:16", name="Sonnensystem", color=:orange),
(time="09:54", name="Ur-Meer & DNA", color=:blue),
(time="13:50", name="Sauerstoff-Katastrophe", color=:green),
(time="22:20", name="Perm-Aussterben", color=:darkred),
(time="23:14", name="Dino-Aussterben", color=:red),
(time="23:59", name="Menschheit (Homo Sapiens)", color=:magenta)
]
# Funktion zur Umrechnung von HH:MM in den mathematischen Winkel
function zeit_zu_winkel(zeit_str)
teile = split(zeit_str, ":")
# teile[1] = Stunden, teile[2] = Minuten
stunden = parse(Float64, teile[1]) + parse(Float64, teile[2]) / 60.0
# 00:00 Uhr soll oben bei 90° starten und im Uhrzeigersinn (Minus) laufen
return deg2rad(90.0 - (stunden / 24.0 * 360.0))
end
end
# Zeile 3:
let
# Kreis fĂŒr das Ziffernblatt generieren
t = range(0, 2*pi, length=100)
plot(cos.(t), sin.(t), color=:black, linewidth=2, fill=(0, 0.05, :gray),
aspect_ratio=:equal, legend=:outerright, size=(700, 500),
xticks=false, yticks=false, showaxis=false, title="Die 24-Stunden-Uhr des Kosmos")
# Stundenmarkierungen hinzufĂŒgen (12, 6, 18, 24/0 Uhr)
annotate!([(0.0, 1.1, text("00:00 / 24:00", 10, :bold, :center)),
(1.1, 0.0, text("06:00", 10, :bold, :left)),
(0.0, -1.1, text("12:00", 10, :bold, :center)),
(-1.1, 0.0, text("18:00", 10, :bold, :right))])
# Events als Zeiger und Punkte einzeichnen
for ev in events
w = zeit_zu_winkel(ev.time)
# Zeiger vom Mittelpunkt (0,0) zum berechneten Punkt auf dem Kreis zeichnen
plot!([0.0, cos(w)], [0.0, sin(w)], color=ev.color, linewidth=1.5, label=false)
# Den Event-Punkt auf dem Kreis markieren
scatter!([cos(w)], [sin(w)], color=ev.color, markersize=6, label="$(ev.time) - $(ev.name)")
end
plot!() # Den fertigen Plot im Browser ausgeben
end