<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.metawops.de/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.metawops.de/" rel="alternate" type="text/html" /><updated>2026-01-13T11:28:59+00:00</updated><id>https://blog.metawops.de/feed.xml</id><title type="html">👨‍💻 Stefans Logbuch</title><subtitle>Ausgespeichertes Wissen und Fragen rund um Technik</subtitle><author><name>Stefan Wolfrum</name></author><entry><title type="html">Typst ist mega</title><link href="https://blog.metawops.de/tools/Typst/" rel="alternate" type="text/html" title="Typst ist mega" /><published>2025-12-15T00:00:00+00:00</published><updated>2026-01-13T00:00:00+00:00</updated><id>https://blog.metawops.de/tools/Typst</id><content type="html" xml:base="https://blog.metawops.de/tools/Typst/"><![CDATA[<p><img src="/assets/images/typst-2560x1024.png" alt="Typst Logo" /></p>

<p>Ich habe <a href="https://typst.app">Typst</a> vor ca. zwei Wochen für mich entdeckt – und bin total schockverliebt! 😍</p>

<h2 id="was-ist-typst">Was ist Typst?</h2>

<p>Typst ist ein Satzsystem und noch so viel mehr. Der eine oder die andere kennt vielleicht TeX/LaTeX noch aus Studienzeiten. Das war/ist wohl <em>der</em> defacto Standard fürs Verfassen wissenschaftlicher Arbeiten. Es ist mächtig, aber auch kompliziert. Es gibt unendlich viele Bücher über die Benutzung von TeX/LaTeX. Für Typst gibt es nahezu noch keine Bücher, soweit ich das sehe (Stand Dezember 2025).</p>

<p>Typst wurde von zwei Deutschen in Berlin erfunden, <a href="https://github.com/reknih/">Martin Haug</a> und <a href="https://github.com/laurmaedje/">Laurenz Mädje</a>. Die Software ist <a href="https://github.com/typst/typst">OpenSource</a> und man kann sie kostenlos benutzen.</p>

<h2 id="wie-nutzt-man-typst">Wie nutzt man Typst?</h2>

<p>Da wäre zunächst einmal die Browser basierte Web App unter <a href="https://typst.app/app">https://typst.app/app</a>. Sie bietet auch ein Live Preview, so dass man direkt sieht, was man in der <code class="language-plaintext highlighter-rouge">.typ</code> Datei nebenan verzapft.</p>

<p>Ein anderer Weg ist es, sich den Typst Compiler selbst auf seinem Rechner (in meinem Falle also Macs) zu installieren. Das geht am einfachsten mal wieder über Homebrew mit</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>typst
</code></pre></div></div>

<p>Jetzt kann man im Texteditor seiner Wahl z.B. die Quelldatei <code class="language-plaintext highlighter-rouge">meindokument.typ</code> schreiben und dann mit</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>typst compile meindokument.typ
</code></pre></div></div>
<p>daraus die zugehörige PDF Datei erzeugen.</p>

<p>Typst kann übrigens nicht nur nach PDF exportieren, sondern auch Grafikdateiformate erzeugen. Wenn man also z.B. nur mal eine mathematische Formel in <em>schön</em> als PNG Datei haben möchte, geht das. Oder – wie wir noch sehen werden – eine programmierte Illustration als SVG fürs Web? Geht auch. Man kann sogar nach Markdown exportieren, nach HTML oder nach Text. Wobei der HTML Export derzeit wohl noch in den Anfängen steckt, ich habe ihn noch nicht probiert.</p>

<h2 id="tipp-vscode">Tipp VSCode</h2>

<p>Noch schöner wird das Arbeiten aber, wenn man sowieso schon <a href="https://code.visualstudio.com">Visual Studio Code</a> (VSCode) auf dem Rechner hat. Denn dann installiert man sich die Erweiterung <a href="https://marketplace.visualstudio.com/items?itemName=myriad-dreamin.tinymist">Tinymist Typst</a> und genießt eine integrierte, lokale Entwicklungsumgebung mit fast allen Schikanen &amp; Features, von denen der Live Preview nur <em>ein</em> Highlight ist. Das sieht dann ungefähr so aus:</p>

<figure class=""><a href="/assets/images/typst-vscode-1.png" class="image-popup" title="Screenshot der Arbeitsumgebung mit Typst und der VSCode Erweiterung Tinymist Typst
"><img src="/assets/images/typst-vscode-1.png" alt="Screenshot der Arbeitsumgebung mit Typst und der VSCode Erweiterung Tinymist Typst" /></a><figcaption>
      Screenshot der Arbeitsumgebung mit Typst und der VSCode Erweiterung Tinymist Typst

    </figcaption></figure>

<p>Die Erweiterung <em>Tinymist Typst</em> bringt ihr eigenes Typst binary mit. Wenn man sich also für dieses Setup entscheidet, muss man nicht unbedingt auch selbst über Homebrew Typst lokal installiert haben. Man muss nur wissen, dass die Typst Version, die mit dieser VSCode Erweiterung kommt, nicht immer unbedingt gleichauf mit der zuletzt veröffentlichten Version von Typst ist. Wenn Typst also in einem Update neue Features bringt, auf die man angewiesen ist bzw. die man unbedingt nutzen will, dann bedeutet dieses Szenario unter Umständen erstmal, dass man etwas Geduld haben muss, bis auch die Tinymist Erweiterung auf den neuesten Stand gebracht wurde.</p>

<p>Man kann zwar in den Einstellungen der Erweiterung auch einen Pfad zu seinem eigenen, lokalen Typst konfigurieren, aber gemeint ist hier nicht das Typst Binary (der Compiler) selbst, sondern Tinymist selbst. Das kann man sich nämlich auch über Homebrew installieren (<code class="language-plaintext highlighter-rouge">brew install tinymist</code>). Ich habe darin aber bis jetzt noch keinen Vorteil erkannt und beschränke mich im Moment fürs lokale Arbeiten an Typst Dokumenten auf die Tinymist VSCode Erweiterung.</p>

<h2 id="github">Github</h2>

<p>Es kann Gründe geben, dass man seine Typst Quelldateien (dazu gehören ja ggfs. auch Bilder oder Fonts) in ein Github Repository legt. So können auch andere lernen, sehen, mitverfolgen, wie man Typst Dokumente schreibt und was alles wie darin funktioniert. Sie können sich dann die Quellen herunterladen und selbst weiter experimentieren.</p>

<p>Oder man hat mehrere Geräte, an denen man am selben Dokument arbeiten will und möchte einfach, dass die Dokumente zentral an einem Ort im Internet/in der Cloud liegen. So kann man immer am Ende der Arbeit alles ins Repository hoch pushen und beim Wechsel an ein anderes Gerät sich zu Beginn der Arbeit einmal den letzten Stand holen/pullen. Ein Computer mit VSCode und Internetzugang genügt.</p>

<p>Natürlich bietet das Arbeiten mit Github vor allem dann auch die Möglichkeit, dass mehrere Menschen an ein und dem selben Dokument arbeiten können, das könnte ja z.B. auch ein Buch Projekt sein und aus vielen Dateien bestehen.</p>

<p>Ich habe mein bisher erstes und einziges Typst Dokument, was ich immer weiter schreibe und dabei Typst lerne, in <a href="https://github.com/metawops/typst">dieses Github Repository</a> gelegt. Falls ihr mal schauen wollt.</p>

<h2 id="ein-bisschen-automatisierung">Ein bisschen Automatisierung</h2>

<p>Außerdem bietet Github (oder auch andere, ähnliche Plattformen) natürlich Workflows zum Automatisieren von Aufgaben. Ich habe mir zwei Workflows eingerichtet:</p>

<h3 id="build">Build</h3>
<p>Ein “Build” Workflow, der immer dann zuschlägt, sobald ich eine Änderung ins Repository pushe. Dann wird der Typst Compiler <em>auf Github</em> (also innerhalb des Ubuntu Runners) angeworfen und erzeugt das PDF als Artifact. Damit macht der Workflow aber zunächst nichts weiter. Wenn ich das PDF brauche, kann ich es mir aus dem Ergebnis des Build Workflows bequem herunterladen:</p>

<figure class=""><a href="/assets/images/typst-github-1.png" class="image-popup" title="Screenshot des Ergebnisses des Build Workflows
"><img src="/assets/images/typst-github-1.png" alt="Screenshot des Ergebnisses des Build Workflows" /></a><figcaption>
      Screenshot des Ergebnisses des Build Workflows

    </figcaption></figure>

<h3 id="release">Release</h3>
<p>Das ist mein “Release” Workflow, der immer dann zuschlägt, sobald ich in VSCode ein <em>tag</em> vergebe <strong>und</strong> es eine neuere Version der Datei <code class="language-plaintext highlighter-rouge">CHANGELOG.md</code> gibt, damit ich auch brav Releasenotes pflege.
Es wird dann ein neues Release mit dem vergebenen <em>tag</em> angelegt, welches sowohl die erzeugte PDF Datei enthält, als auch in Form einer ZIP Datei alle zum Erzeugen dieses PDFs notwendigen Quelldateien, also v.a. die <code class="language-plaintext highlighter-rouge">.typ</code> Dateien, aber auch die Fonts und Bilder in ihren jeweiligen Unterordnern.</p>

<figure class=""><a href="/assets/images/typst-github-2.png" class="image-popup" title="Screenshot eines Releases, was der Release Workflow erstellt hat
"><img src="/assets/images/typst-github-2.png" alt="Screenshot eines Releases, was der Release Workflow erstellt hat" /></a><figcaption>
      Screenshot eines Releases, was der Release Workflow erstellt hat

    </figcaption></figure>

<p>Wie diese beiden Workflows, die im Repository unter <code class="language-plaintext highlighter-rouge">.github/workflows</code> als <code class="language-plaintext highlighter-rouge">.yml</code> Datei zu finden sind, gebaut sind, könnt ihr dort selbst nachschauen, denn das Repository ist ja öffentlich. Hier die Direktlinks: <a href="https://github.com/metawops/typst/blob/main/.github/workflows/build-pdf.yml">build-pdf.yml</a> und <a href="https://github.com/metawops/typst/blob/main/.github/workflows/release.yml">release.yml</a>.</p>

<h2 id="typst-als-programmiersprache">Typst als Programmiersprache</h2>

<p>Dazu, was in Typst alles möglich ist – vor allem dann auch mit den <a href="https://typst.app/universe/search/?kind=packages">hunderten 3rd party Erweiterungspaketen</a>! –, könnte man ganze Bücher schreiben. Und es gibt auch schon zahlreiche Tutorials und YouTube Videos von denen man prima lernen kann. Daher will ich in diesem Artikel gar nicht erst versuchen, eine Typst-Einführung zu geben.</p>

<p>Allerdings möchte ich doch <em>einen</em> Aspekt hervorheben: Typst ist nicht nur ein Satzsystem, in dem man ähnlich wie in Markdown oder auch wie mit LaTeX Texte/Dokumente verfassen kann. Typst ist auch Programmiersprache. Und das eröffnet natürlich große Welten! So kann man zum Beispiel Tabellen oder Grafiken direkt im Dokument dynamisch erzeugen.</p>

<h3 id="tabelle-mit-errechneten-zahlen">Tabelle mit errechneten Zahlen</h3>
<p>Als einfaches Beispiel schauen wir uns mal die Fibonaccizahlen an. Möchte man eine Tabelle der ersten 16 Fibonaccizahlen in sein Dokument einbauen, geht das zum Beispiel so:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// Wir definieren eine Funktion, die Fibonaccizahlen errechnen kann:
#let fib(n) = (
  if n &lt;= 2 { 1 }
  else { fib(n - 1) + fib(n - 2) }
)

// Eine Variable für die Anzahl der Fibonaccizahlen in der Tabelle:
#let count = 16

// Eine Variable, die die Zahlen von 1 bis zu count enthält
#let nums = range(1, count + 1)

// Im Fließtext wird an der Stelle von #count der Wert der Variablen count eingesetzt:
Ein gutes Beispiel für sowohl Tabellen, als auch dass man in Typst selbst dynamisch Inhalte erzeugen kann, ist diese Tabelle mit den ersten #count Fibonaccizahlen.

// Jetzt erzeugen wir eine zentrierte Tabelle mit zwei Zeilen und count Spalten:
#align(center,
   table(
      columns: count,
      fill: (_, row) =&gt; if row == 0 { luma(230) } else { none },
      ..nums.map(n =&gt; $F_#n$),
      ..nums.map(n =&gt; text(orange)[#str(fib(n))]),
   )
)
</code></pre></div></div>

<p>Das Ergebnis im PDF sieht dann so aus:</p>

<figure class=""><a href="/assets/images/typst-fibo.png" class="image-popup" title="Screenshot aus dem erzeugten PDF File
"><img src="/assets/images/typst-fibo.png" alt="Screenshot aus dem erzeugten PDF File" /></a><figcaption>
      Screenshot aus dem erzeugten PDF File

    </figcaption></figure>

<p>Der Knackpunkt ist jetzt eben, dass wir lediglich den Wert der Variablen <code class="language-plaintext highlighter-rouge">count</code> ändern müssen, wenn wir mehr oder weniger Spalten und errechnete Fibonaccizahlen haben wollen. Wir müssen niemals selbst die Fibonaccizahlen errechnen und “hard coded” in die Tabelle eintragen! Und selbst im Begleittext darüber, wo wir “… mit den ersten 16 Fibonaccizahlen.” stehen haben, wird die Zahl dynamisch ausgetauscht, wenn wir den Wert der Variablen <code class="language-plaintext highlighter-rouge">count</code> ändern.</p>

<p>Der Informatiker wird bemerkt haben, dass auch Rekursion möglich ist, denn die Funktion <code class="language-plaintext highlighter-rouge">fib(n)</code>, die wir uns programmiert haben, ruft sich selbst wieder auf. Natürlich kann man die Errechnung der Fibonaccizahlen auch nicht-rekursiv machen und wenn man sehr viele davon berechnen lassen will, sollte man das auch so tun. Aber für die wenigen hier im Beispiel ist Rekursion schon okay.</p>

<h3 id="komplexeres-diagramm">Komplexeres Diagramm</h3>

<p>Eins meiner Lieblings-Mathe-Themen ist das Ding mit der $3n+1$ Zahlenfolge, auch bekannt als <a href="https://de.wikipedia.org/wiki/Collatz-Problem">Collatz-Problem</a> oder von Martin Gardner in seinem <a href="https://www.jstor.org/stable/24969271">Scientific American Artikel von 1984</a> als <em>Hailstone Numbers</em> bezeichnet, weil die Zahlen wie Hagelkörner im Sturm ständig auf und ab fallen.</p>

<p>Wenn man in seinem Typst Dokument ein paar Funktionen programmiert, mit deren Hilfe man die Zahlenfolge hübsch visualisieren kann, lockert das den Text prima auf. Dazu dieses Beispiel, welches die Funktionen <code class="language-plaintext highlighter-rouge">collatz_all</code>, <code class="language-plaintext highlighter-rouge">collatz_visualizer_horizontal</code> und <code class="language-plaintext highlighter-rouge">collatz_visualizer</code> benutzt. Mit dem Typst-Quellcode</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#let startzahl = 5
#let periodenlaenge = collatz_all(startzahl).len()
#figure(
   collatz_visualizer_horizontal(startzahl, scale: 1.1),
   caption: [$3n+1$ Folgenglieder für die Startzahl #startzahl mit Periodenlänge #periodenlaenge]
) &lt;collatzdiagramm1&gt;
</code></pre></div></div>

<p>erzeugen wir dynamisch im PDF dieses Diagramm (Screenshot):</p>

<figure class=""><a href="/assets/images/typst-collatz-5.png" class="image-popup" title="Screenshot aus dem erzeugten PDF File
"><img src="/assets/images/typst-collatz-5.png" alt="Screenshot aus dem erzeugten PDF File" /></a><figcaption>
      Screenshot aus dem erzeugten PDF File

    </figcaption></figure>

<p>Man beachte auch im Untertitel der Abbildung die dynamisch eingebauten Zahlen, die die Werte der Variablen <code class="language-plaintext highlighter-rouge">startzahl</code> und <code class="language-plaintext highlighter-rouge">periodenlaenge</code> sind.
Sobald wir im Typst Quellcode diese Werte ändern, wird sofort eine neue, dazu passende Grafik durch die programmierten Funktionen erzeugt.</p>

<p>Die Funktion <code class="language-plaintext highlighter-rouge">collatz_visualizer_horizontal</code> stößt natürlich rein platz-technisch schnell an ihre Grenzen, da die Zahlenfolgen mit größeren Startzahlen dann auch lang werden.</p>

<p>Daher habe ich die generischere Funktion <code class="language-plaintext highlighter-rouge">collatz_visualizer</code> implementiert, die dem Rechnung trägt. Nehmen wir zum Beispiel die Startzahl 11, ergeben sich 15 Folgenglieder, das wird rein horizontal ggfs. schon etwas eng.</p>

<p>Mit der Funktion <code class="language-plaintext highlighter-rouge">collatz_visualizer</code> habe ich die Möglichkeit, die Zahlen untereinander fortlaufen zu lassen und eine maximal Anzahl von Zahlen pro Spalte anzugeben. Hier zum Beispiel sind es 5 Zahlen untereinander, ehe auf die nächste Spalte “umgebrochen” wird:</p>

<figure class=""><a href="/assets/images/typst-collatz-11-5.png" class="image-popup" title="Screenshot aus dem erzeugten PDF File
"><img src="/assets/images/typst-collatz-11-5.png" alt="Screenshot aus dem erzeugten PDF File" /></a><figcaption>
      Screenshot aus dem erzeugten PDF File

    </figcaption></figure>

<p>Wenn ich allerdings vertikalen Platz sparen will, gebe ich als zweiten Parameter statt 5 einfach 3 an und erhalte sofort diese Grafik:</p>

<figure class=""><a href="/assets/images/typst-collatz-11-3.png" class="image-popup" title="Screenshot aus dem erzeugten PDF File
"><img src="/assets/images/typst-collatz-11-3.png" alt="Screenshot aus dem erzeugten PDF File" /></a><figcaption>
      Screenshot aus dem erzeugten PDF File

    </figcaption></figure>

<p>Der Unterschied liegt lediglich am zweiten Parameter der Funktion. Hier das Aufruf-Beispiel im Typst Dokument für den zweiten Fall mit maximal 3 Zahlen untereinander:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#let startzahl = 11
#let diagrammZeilen = 3
#let periodenlaenge = collatz_all(startzahl).len()
#figure(
   collatz_visualizer(startzahl, diagrammZeilen, scale: 1.0),
   caption: [$3n+1$ Folgenglieder für die Startzahl #startzahl mit Periodenlänge #periodenlaenge]
) &lt;collatzdiagramm2&gt;
</code></pre></div></div>

<p>Man beachte den dritten Parameter der Funktion <code class="language-plaintext highlighter-rouge">collatz_visualizer</code>, den Skalierungswert.</p>

<p>Denn berüchtigt und bekannt ist die zunächst harmlos aussehende Startzahl 27. Bei ihr entstehen allerdings 112 Folgenglieder und dann können wir das gesamte Diagramm herunterskalieren, damit es – hier mit 10 Zahlen pro Spalte – noch auf die Seite passt:</p>

<figure class=""><a href="/assets/images/typst-collatz-27-10.png" class="image-popup" title="Screenshot aus dem erzeugten PDF File
"><img src="/assets/images/typst-collatz-27-10.png" alt="Screenshot aus dem erzeugten PDF File" /></a><figcaption>
      Screenshot aus dem erzeugten PDF File

    </figcaption></figure>

<p>Der Vollständigkeit halber dazu noch der Aufruf im Typst Dokument:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#let startzahl = 27
#let diagrammZeilen = 10
#let periodenlaenge = collatz_all(startzahl).len()
#figure(
   collatz_visualizer(startzahl, diagrammZeilen, scale: 0.6),
   caption: [$3n+1$ Folgenglieder für die Startzahl #startzahl mit Periodenlänge #periodenlaenge]
) &lt;collatzdiagramm3&gt;
</code></pre></div></div>

<p>Die Implementierungen der für diese Grafiken notwendigen Funktionen füge ich hier nicht ein, da sie etwas umfangreich sind. Aber auch hier gilt wieder: Mein Repository ist öffentlich, man kann sich die Programmierung (bei der übrigens die K.I. Google Gemini in beeindruckender Weise geholfen hat) dort anschauen. Derzeit sind die Funktionen noch in der Hauptdatei <a href="https://github.com/metawops/typst/blob/main/typst-demo-stefan-1.typ"><code class="language-plaintext highlighter-rouge">typst-demo-stefan-1.typ</code></a> enthalten, das mag sich aber ändern, wenn ich sie noch in meine Bibliotheksdatei <a href="https://github.com/metawops/typst/blob/main/_lib.typ"><code class="language-plaintext highlighter-rouge">_lib.typ</code></a> auslagern sollte.</p>

<h2 id="fazit">Fazit</h2>

<p>Ihr seht, die Möglichkeiten sind schier grenzenlos. Da könnte man jetzt zig Beispiele bringen. Schaut einfach gerne ab und zu in mein Demo-Dokument <a href="https://github.com/metawops/typst">in meinem Repository</a> rein, was ich in den kommenden Tagen/Wochen/Monaten sicher immer weiter ausbauen werde.</p>

<p>Ich bin begeistert von Typst und unterstütze das OpenSource Projekt seit kurzem auch finanziell <a href="https://github.com/sponsors/typst">auf Github als (bescheidener) Sponsor</a>.</p>

<p>Vielleicht konnte ich euch ja anstecken mit meiner Begeisterung und ihr probiert Typst auch mal aus oder entscheidet euch sogar auch, das Projekt zu sponsern. Jeder Betrag hilft!</p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="tools" /><category term="typst" /><category term="typesetting" /><summary type="html"><![CDATA[Meine ersten Erfahrungen mit Typst, insbesondere Programmierung und mit Typst Workflows in Github]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.metawops.de/assets/images/typst-2560x1024-16zu9.png" /><media:content medium="image" url="https://blog.metawops.de/assets/images/typst-2560x1024-16zu9.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">gnuplot mit live preview in VSCode</title><link href="https://blog.metawops.de/tools/gnuplot-in-vscode/" rel="alternate" type="text/html" title="gnuplot mit live preview in VSCode" /><published>2025-10-20T00:00:00+00:00</published><updated>2025-10-20T00:00:00+00:00</updated><id>https://blog.metawops.de/tools/gnuplot-in-vscode</id><content type="html" xml:base="https://blog.metawops.de/tools/gnuplot-in-vscode/"><![CDATA[<p>Bei der Beschäftigung mit meinem kleinen <a href="https://the-analog-thing.org">Analogcomputer “The Analog Thing” (THAT)</a> hatte ich auch einen Arduino (Mega) eingesetzt, um die Lösung der gepatchten Differentialgleichung als Zahlen auslesen zu können. Um sie “in der Hand zu haben”. Denn so eine (z.B.) gedämpfte Schwingung ist ja ganz hübsch am Oszilloskop Bildschirm anzusehen – insbesondere, wenn man sie in Echtzeit manipulieren kann –, aber besonders hochauflösend ist sie da nicht.</p>

<figure class=""><a href="/assets/images/that-oszi.jpeg" class="image-popup" title="The Analog Thing, Oszilloskop. Foto: S. Wolfrum
"><img src="/assets/images/that-oszi.jpeg" alt="The Analog Thing, Oszilloskop. Foto: S. Wolfrum" /></a><figcaption>
      The Analog Thing, Oszilloskop. Foto: S. Wolfrum

    </figcaption></figure>

<p>Das Auslesen der Lösung klappt mit <a href="https://github.com/anabrid/hardware/tree/main/the-analog-thing/arduino_2650_hybrid_controller">Bernd Ulmanns kleinem Arduino Sketch</a> einwandfrei und nun hatte ich auf dem Mac eine CSV Datei, die pro Zeile einen Wert enthielt. Das wollte ich mit gnuplot visualisieren, damit ich auch mal eine PNG Grafik z.B. in einen Blog Post einbetten kann:</p>

<figure class=""><a href="/assets/images/output_plot-02.png" class="image-popup" title="Gedämpfte Schwingung. Grafik erzeugt mit gnuplot, Daten errechnet auf dem THAT.
"><img src="/assets/images/output_plot-02.png" alt="Gedämpfte Schwingung. Grafik erzeugt mit gnuplot, Daten errechnet auf dem THAT." /></a><figcaption>
      Gedämpfte Schwingung. Grafik erzeugt mit gnuplot, Daten errechnet auf dem THAT.

    </figcaption></figure>

<p>Vorneweg für die, die es selbst nachvollziehen wollen, hier die CSV Datei und die gnuplot (.gp) Datei zum Download:</p>

<p><a href="/assets/downloads/hybrid-test-data-02-700ms.csv" download="" class="btn btn--primary">CSV herunterladen</a></p>

<p><a href="/assets/downloads/hybrid-test-data.gp" download="" class="btn btn--primary">gnuplot Datei herunterladen</a></p>

<h3 id="problem">Problem</h3>

<p>Ich war aber seinerzeit absoluter Neuling in Sachen gnuplot und wollte die <code class="language-plaintext highlighter-rouge">.gp</code> Eingabedatei in VSCode bearbeiten und direkt daneben in Echtzeit das Ergebnis des gnuplot runs sehen, also die zugehörige Grafik.</p>

<p>Da gibt es eine VSCode Extension namens “gnuplot preview” – die habe ich aber bis heute nicht ans Laufen gebracht. Obwohl gnuplot bei mir im PATH ist. 🤷‍♂️</p>

<h3 id="lösung">Lösung</h3>

<p>Also musste ich eine Alternative finden. Es gelang über die <a href="https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave">VSCode Extension “Run on Save”</a>. Denn jedesmal, wenn ich nun meine <code class="language-plaintext highlighter-rouge">.gp</code> Datei <strong>speichere</strong>, läuft gnuplot damit los, erzeugt die PNG Datei und diese sehe ich rechts neben meinem Code, weil ich sie mir dort in einem weiteren Tab geöffnet habe:</p>

<figure class=""><a href="/assets/images/gnuplot-vscode.png" class="image-popup" title="Screenshot von VSCode mit gnuplot Datei und Preview der Grafik
"><img src="/assets/images/gnuplot-vscode.png" alt="Screenshot von VSCode mit gnuplot Datei und Preview der Grafik" /></a><figcaption>
      Screenshot von VSCode mit gnuplot Datei und Preview der Grafik

    </figcaption></figure>

<h3 id="konfiguration">Konfiguration</h3>

<p>Nach der Installation der o.g. “Run on Save” Extension muss man die VSCode User Settings JSON Datei anpassen: In VSCode über <code class="language-plaintext keycap highlighter-rouge">⇧</code><code class="language-plaintext keycap highlighter-rouge">⌘</code><code class="language-plaintext keycap highlighter-rouge">P</code> den Command “Preferences: Open User Settings (JSON)” wählen und dann dies hier syntaktisch korrekt einfügen:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"emeraldwalk.runonsave"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"match"</span><span class="p">:</span><span class="w"> </span><span class="s2">"</span><span class="se">\\</span><span class="s2">.gp$"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"gnuplot '${file}'"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Run Gnuplot"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Running gnuplot ..."</span><span class="p">,</span><span class="w">
            </span><span class="nl">"messageAfter"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Finished."</span><span class="p">,</span><span class="w">
            </span><span class="nl">"showElapsed"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Dazu ein paar Anmerkungen:</p>
<ul>
  <li>Wenn ihr eure gnuplot Dateien anders als auf <code class="language-plaintext highlighter-rouge">.gp</code> enden lassen wollt, müsst ihr das natürlich entsprechend anpassen.</li>
  <li>Das <code class="language-plaintext highlighter-rouge">gnuplot</code> Kommando muss über den <code class="language-plaintext highlighter-rouge">PATH</code> findbar sein. Solltet ihr gnuplot über Homebrew installiert haben, liegt das binary wahrscheinlich in <code class="language-plaintext highlighter-rouge">/opt/homebrew/bin</code>. Diesen Pfad also in die <code class="language-plaintext highlighter-rouge">PATH</code> Variable aufnehmen (und am besten ausloggen, einloggen; zumindest aber VSCode beenden und neu starten).</li>
  <li>Den Output der <em>Run on Save</em> Extension kann man sich im Terminalfenster von VSCode anschauen, wenn man im Reiter „OUTPUT“ im Dropdown rechts „Run On Save“ wählt. So sieht man z.B. wie lange der gnuplot Lauf gedauert hat.</li>
</ul>

<h3 id="nachklapp">Nachklapp</h3>

<p>Natürlich wird die erzeugte Grafikdatei nur dann aktualisiert (und daher von VSCode erneut angezeigt), wenn man in VSCode die Änderungen an der <code class="language-plaintext highlighter-rouge">.gp</code> Datei explizit speichert. Aber das finde ich mittlerweile auch gut so, denn sonst gäbe es zu viele gnuplot Fehler, weil man noch nicht zu Ende getippt hat. So kann ich bewusst entscheiden, wann ich ein Update der Grafik sehen will.</p>

<p>Wie man die Quelldaten in der CSV Datei mit dem THAT erzeugt und über den Arduino auf den Rechner bekommt, darum soll es vielleicht ein anderes Mal gehen. – Falls euch das interessiert?! Hinterlasst mir gerne einen Kommentar …</p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="tools" /><category term="gnuplot" /><category term="vscode" /><summary type="html"><![CDATA[Wie man gnuplot Dateien in VSCode bearbeiten und direkt daneben ein (quasi) live Preview der Grafik sehen kann.]]></summary></entry><entry><title type="html">Ich bin Funkamateur!</title><link href="https://blog.metawops.de/amateurfunk/Funkamateur/" rel="alternate" type="text/html" title="Ich bin Funkamateur!" /><published>2025-09-21T00:00:00+00:00</published><updated>2025-09-21T00:00:00+00:00</updated><id>https://blog.metawops.de/amateurfunk/Funkamateur</id><content type="html" xml:base="https://blog.metawops.de/amateurfunk/Funkamateur/"><![CDATA[<p><img src="/assets/images/funkamateur.png" alt="Person bedient Funkgeräte in einem mit Technik und Karten ausgestatteten Hobbyraum, konzentrierte Atmosphäre." /></p>

<p>Am 19. September (2025) habe ich bei der Bundesnetzagentur in Dortmund meine Amateurfunkprüfung abgelegt – mit Erfolg! 🎉</p>

<p>Ich hatte mich für eine Klasse E Lizenz angemeldet und habe diese auch bekommen.</p>

<p>Beim Amateurfunk gibt es <a href="https://50ohm.de/infos.html">drei Klassen: N, E und A</a>. Dabei ist N die (relativ neue) Einstiegsklasse, E die “gute Mittelklasse” (auch wenn sie dann international “Novice” heißt) und A die Klasse, bei der man “alles” darf.
Die Unterschiede liegen vor allem in der Anzahl der Amateurfunkbänder, auf denen man auf Sendung gehen darf und in der Leistung, mit der man senden darf. Daneben gibt es noch ein paar kleinere Unterschiede, z.B. Remote-Stationen, Ausbildungsbetrieb, Funken im Ausland etc.</p>

<p>Reines Zuhören auf den Bändern darf jeder, auch ohne Lizenz. Super interessant ist da zum Beispiel das Abhören von in der Luft befindlichen Flugzeugen! Natürlich darf man <em>nicht</em> die Cockpit Gespräche mithören. Aber jedes Flugzeug sendet daneben auch allerlei Telemetrie- und sonstige Daten und <em>die</em> darf, ja soll man sogar mithören. Je mehr davon protokolliert wird, desto besser kann man ggfs. einen Unfall aufklären. Es ist also nicht verboten und man kann diese selbst empfangenen Daten auch freiwillig im Internet zur Verfügung stellen, z.B. für FlightRadar24, eine der wohl bekanntesten Apps dafür.</p>

<h3 id="telemetriedaten-von-flugzeugen">Telemetriedaten von Flugzeugen</h3>

<p>Man braucht dazu wirklich nicht viel: Ein ca. 40 Euro kostender USB Dongle, etwas Draht für die selbst gebaute Antenne, Adapter, Kabel, kostenlose Software. Fertig ist die Laube.</p>

<p>Der liebe Arthur – Grüße gehen raus! 👋 – vom <a href="https://www.youtube.com/@Funkwelle">YouTube Kanal Funkwelle</a> hat dazu mal ein prima Video gemacht, nach dem ich auch vorgegangen bin:</p>

<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/fZyAyjtr4Qg" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p>Das ist schon etwas anderes, diese <a href="https://de.wikipedia.org/wiki/Automatic_Dependent_Surveillance">ADS-B</a> Daten “faul” und “fertig” aus dem Internet bzw. schlicht von einer App zu bekommen oder sie selbst, quasi eigenhändig zuhause aus der Luft zu empfangen! Versteht man erst, wenn man’s mal selbst gemacht hat.</p>

<h3 id="digitale-betriebsart-ft8">Digitale Betriebsart FT8</h3>

<p>Und dann war ich über dieses “FT8” gestolpert. Amateurfunk bedeutet nicht nur “ältere Herren sitzen im Hobbyraum vorm Mikrofon und sprechen über Modellbau oder das Wetter” – ich hoffe, ich trete niemandem zu nahe hier!</p>

<p>Nein, es gibt da z.B. diesen ultra beliebten <a href="https://de.wikipedia.org/wiki/FT8">FT8 Modus</a>, auf den ich hier jetzt gar nicht weiter eingehen will. Dazu vielleicht mal ein eigener Artikel oder selbst im Web recherchieren.</p>

<p>Ich hatte mir also für den Mac die freie Software “<a href="https://wsjt.sourceforge.io/wsjtx.html">wsjt-x</a>” heruntergeladen – in der für macOS optimierten <a href="https://sourceforge.net/projects/wsjt-x-improved/">“improved” Version</a> – und mein SDR Dongle vom ADS-B Flugzeug-Daten Experiment mit der simplen Doppel-Stabantenne verbunden. Letztere als umgekehrtes V (also auf dem Kopf stehend) drinnen ans Fenster geklemmt und losgelegt.</p>

<p>DAS ist ja interessant, welche Länder man da empfangen kann! Und hinter jedem Anruf (“CQ”) steckt ein Mensch.</p>

<figure class=""><a href="/assets/images/wsjtx1.png" class="image-popup" title="Screenshot der WSJT-X Software mit Wasserfalldiagramm, empfangenen FT8-Rufzeichen, Ländern und Signalstärken
"><img src="/assets/images/wsjtx1.png" alt="Screenshot der WSJT-X Software mit Wasserfalldiagramm, empfangenen FT8-Rufzeichen, Ländern und Signalstärken" /></a><figcaption>
      Screenshot der WSJT-X Software mit Wasserfalldiagramm, empfangenen FT8-Rufzeichen, Ländern und Signalstärken

    </figcaption></figure>

<p>Ich habe mir dann gleich noch die fantastische Logbuch App <a href="https://www.dl2rum.de/rumsoft/RUMLog.html">RUMlogNG</a> installiert und die beiden Tools wsjt-x und RUMlogNG miteinander verbunden. Auch wenn ich noch kein Rufzeichen hatte, was ich eintragen konnte: Die ganzen FT8 CQ Rufe kamen jetzt auch im “DX Spots” Fenster von RUMlogNG an.</p>

<figure class=""><a href="/assets/images/rumlogng1.png" class="image-popup" title="RUMlogNG Fenster mit Logbuchliste, Rufzeichen, Ländern und Signalstärken
"><img src="/assets/images/rumlogng1.png" alt="RUMlogNG Fenster mit Logbuchliste, Rufzeichen, Ländern und Signalstärken" /></a><figcaption>
      RUMlogNG Fenster mit Logbuchliste, Rufzeichen, Ländern und Signalstärken

    </figcaption></figure>

<h3 id="beschluss-zur-prüfung-anmelden">Beschluss: Zur Prüfung anmelden</h3>

<p>Doch spätestens hier hat es mich immer wieder gewurmt, dass ich nicht antworten durfte! Denn das <em>Senden</em> ist ja nur den Funkamateuren erlaubt! Also muss ich auch einer werden. Denn ich hätte so gerne auch mal via FT8 geantwortet, wer ich bin, wo ich bin, wie gut ich die anderen Stationen empfange. Und ich hätte sehr gerne alle diese “Gespräche” (genauer ja: Datenaustausche) im Logbuch (also in der RUMlogNG App) ordnungsgemäß protokolliert. Das geht alles natürlich nur mit einem persönlichen Rufzeichen. Tja und das kommt nur von der Bundesnetzagentur und nur dann, wenn man eine Lizenz hat.</p>

<p>Also: Zur Prüfung angemeldet!</p>

<p>Aber zu welcher denn? N, E oder A?<br />
Ich habe erstmal ganz forsch und mutig A gewählt!</p>

<p>Aber im Laufe der folgenden Wochen habe ich mich nach einem Realismus-Check umentschieden und das auf E geändert. Ich komme zwar aus einem naturwissenschaftlichen Elternhaus, habe Mathematik und Informatik studiert. Aber das ist alles sehr lange her. Und meine Elektronik-Kenntnisse sind wirklich recht “basic”. Nachdem ich die A-Fragen im Fragenkatalog der BNetzA studiert hatte, war mir klar: Dafür zu lernen kommt einem kleinem Elektrotechnik-Studium gleich. Und ich bin keine 20 mehr, sondern 57! Ganz ehrlich: In meinem Alter fällt das Lernen schwer und ich musste erstmal wieder das Lernen lernen.</p>

<p>Mit der Ummeldung auf E fühlte ich mich gut. Und selbst wenn ich nur N schaffe, ist das auch schon toll!</p>

<h3 id="curriculum">Curriculum</h3>

<p>Der zu lernende Stoff teilt sich gut in mehrere Teile: Jeder, der eine Amateurfunkprüfung machen will – egal ob Klasse N, E oder A –, muss auch die beiden Bereiche “Vorschriften” (V) und “Betriebsablauf” (B) lernen und sich darin prüfen lassen.</p>

<p>Die beste und erste Anlaufstelle im Netz ist ganz sicher die <a href="https://www.50ohm.de">50ohm.de Website</a> des D.A.R.C., des Deutschen Amateur-Radio-Clubs e.V.</p>

<p>Hier findet jeder genug Material, Links, Hinweise, Infos rund um die Amateurfunk-Prüfung. – Zumindest für die N Lizenz ist hier alles tippi-toppi. Für E und A sind die Online-Kurse noch nicht auf dem neuesten Stand – aber dennoch hilfreich!</p>

<p>Für die Bereiche B, V und N kann ich aber auch wärmstens den <a href="https://www.youtube.com/watch?v=s1SPp9soRig&amp;list=PLDpWnjHk5ERbcgpLPUaU0iTsD-wrmfENk">kostenlosen Video-Kurs auf YouTube</a> im <a href="https://www.youtube.com/@DL2YMR">Kanal von Michael Reichardt (DL2YMR)</a> empfehlen, der in Zusammenarbeit mit dem D.A.R.C. entstanden und somit ganz offiziell ist! Michael macht das wirklich SUPER, da kommt jeder mit, sehr angenehm! Ich habe mir immer Notizen gemacht, nebenbei, z.B. wenn es um die Q-Gruppen ging.</p>

<p>So einen Kurs gibt es leider aktuell noch nicht für die Klasse E, aber man arbeitet wohl daran.</p>

<p>Aber für den Klasse E Stoff gibt es ebenfalls auf YouTube eine super Playliste: <a href="https://www.youtube.com/watch?v=i86_YT2TlEg&amp;list=PL_JZo16Mzs5XGeN5N81MwQ70dp7478VkM&amp;index=1">Die komplette “Amateurfunk Klasse E” Vorlesung des Wintersemesters 2024/25 von Prof. Dr. Matthias Jung (DL9MJ)</a>.</p>

<p>Und dann gibt es natürlich zahlreiche Webseiten und Apps, mit denen man den Stoff lernen und die Prüfung simulieren kann. Die wichtigsten sind auf 50ohm <a href="https://www.50ohm.de/pruefung.html">hier (rechts unten) verlinkt</a>.
Meine absolute Lieblings-App, mit deren Hilfe ich fast ausschließlich am iPad gelernt habe, ist die kostenlose App “<a href="https://apps.apple.com/de/app/hamfisted/id6470218069?l=en-GB">Hamfisted</a>”. Es gibt sie auch im Google Play Store für Android.</p>

<p>Und letztlich war das noch das super <a href="https://www.rheinwerk-verlag.de/amateurfunk-das-umfassende-handbuch/">Buch “Amateurfunk – Das umfassende Handbuch”</a> des Rheinwerk Verlags aus meiner schönen Heimatstadt Bonn.</p>

<p>Das Lernen habe ich über viele Wochen und Monate gezogen, denn es drängelte ja erstmal niemand. Erst, als ich mich tatsächlich für die Prüfung angemeldet und einen konkreten Termin bekommen hatte, fühlte sich das alles etwas ernster an. Die letzte Woche vor der Prüfung habe ich dann extra Urlaub genommen und von morgens bis abends sehr viel gelernt. Dann fühlte ich mich auch fit.</p>

<h3 id="prüfung-in-dortmund">Prüfung in Dortmund</h3>

<p>Auch wenn die Bundesnetzagentur ihren offiziellen Sitz in Bonn hat und ich in Bonn wohne – die Amateurfunkprüfung kann man leider nicht in Bonn ablegen. Man kann sie in Berlin, Dortmund, Dresden, Erfurt, Eschborn, Göttingen, Hamburg, Hannover, München, Nürnberg und Reutlingen ablegen. Für mich also: Dortmund.</p>

<p>Am Tag der Prüfung, die für 12:30 Uhr angesetzt war, bin ich mit &gt; 1 h Zeitpuffer in Bonn losgefahren. DAS WAR ZU WENIG! Auf dem Weg über die Autobahnen gab es ausgerechnet an dem Tag zahlreiche Unfälle und ausgerechnet auf meiner Strecke. Ich schwitzte also im Auto, ob ich es noch pünktlich schaffe. Zum Glück kam ich zehn Minuten vor Prüfungsbeginn vor Ort an, puh!</p>

<p>Im Prüfungsraum hat jeder seinen eigenen, freistehenden Tisch mit einem vorbereiteten Namensschildchen (auf dem auch die angestrebte Klasse steht), so dass sich die Frage “wo setze ich mich denn hin” gar nicht stellt.</p>

<p>Dann gibt es von den drei anwesenden Prüfern ein paar kurze Hinweise, wie alles abläuft. Die jeweils 25 ausgewählen Fragen aus den Bereichen (bei mir also V; B, N und E) sind in einem Schnellhefter, jedes Blatt ist einseitig bedruckt und in einer Klarsichtfolie. Man kreuzt nichts direkt auf diesen Blättern an. Da stehen nur die Fragen und die jeweils vier Antwortmöglichkeiten, aber keine Kästchen.</p>

<p>Dafür gibt es dann je Bereich ein gesondertes Blatt, auf dem von oben nach unten die Nummern 1 bis 25 und darüber von links nach rechts die vier Buchstaben A, B, C und D gedruckt sind (und noch vorausgefüllte Felder mit dem eigenen Namen etc.). Also eine kleine 4x25 Matrix aus leeren Kästchen und <em>dort</em> macht man seine Kreuze. Sollte man sich mal vertan haben, stehen da auch genaue Anweisungen, wie man seinen Irrtum markieren und korrigieren kann.</p>

<p>Man bekommt auch leere blanko DIN A4 Blätter für eigene Notizen ausgeteilt. Ich habe erst alle Antworten dort notiert, bin dann alle Fragen nochmal durchgegangen, habe meine Antworten nochmal gecheckt und dann erst in den Abgabebogen übertragen.</p>

<p>Zeit ist wirklich mehr als genug. Wenn man sich wochenlang mit dem Stoff beschäftigt hat, kennt man schon viele Fragen sehr gut und schafft die 25 Fragen aus den Bereichen Vorschriften, Betriebsablauf und Technik N in locker unter 10 Minuten. Und 45 Minuten Zeit hat man <em>pro Bereich</em>. (60 Minuten für den Technik A Bereich.)</p>

<p>Den <strong>Taschenrechner</strong> – ich hatte zwei dabei, falls der präferierte streiken sollte – habe ich kaum gebraucht. Entweder kennt man nach so intensiver Beschäftigung mit den Fragen und den zig Prüfungssimulationen schon die richtige Antwort oder – selbst bei den meisten E-Fragen ist das so – man kann es im Kopf rechnen. Denn oft sind die Werte/Zahlen in den Fragen so gewählt, dass sich glatte oder einfache Werte ergeben. Aber manchmal habe ich dann doch – sicherheitshalber – nochmal nachgerechnet auf meinem <a href="https://www.casio.com/intl/scientific-calculators/product.FX-991MS-2/">Casio fx-991MS 2nd ed.</a></p>

<p>Übrigens hat niemand irgendwelche Taschenrechner überprüft bei unserer Prüfungsgruppe (ca. 15 Teilnehmer). Das soll jetzt NICHT heißen, dass ihr einen verbotenen, nämlich programmierbaren Taschenrechner mit lauter Spickzetteln mitnehmen sollt!!! Möglicherweise ist das ja bei anderen Prüfungen anders und es <em>wird</em> kontrolliert!</p>

<p>Jeder kann dann in seinem Tempo arbeiten. Die ersten beiden Schnellhefter für die Bereiche B und V liegen schon auf dem Tisch. Wenn man die abgegeben hat, bekommt man am Abgabetisch (wo die Prüfer sitzen) den Hefter mit den 25 N-Fragen und wenn man den abgegeben hat, bekommt man – je nach dem, für welche Lizenz man sich angemeldet hat – noch E und danach ggfs. A. Man darf auch zwischendurch mal rausgehen, z.B. auf Toilette. Ich habe alle 100 Fragen in einem Rutsch durchgezogen. Während man da sitzt, kontrollieren die vorne sitzenden Prüfer bereits abgegebene Bögen, so dass man sein Ergebnis sehr zeitnah nach Abgabe seines letzten Bogens erfährt, noch im Prüfungsraum, mit gedämpfter Stimme, um die noch Beschäftigten nicht zu sehr zu stören.</p>

<h3 id="wie-geht-es-weiter">Wie geht es weiter?</h3>

<p>Ich erhielt dann einen vorläufigen DIN A5 Zettel, auf dem bestätigt wurde, dass ich die E-Prüfung erfolgreich bestanden hatte. Auf der Rückseite des Zettels steht, wie es weitergeht.</p>

<p>Man erhält dann in den kommenden Tagen per Post sein offizielles Zeugnis und kann dann erst – denn das Zeugnis braucht man dazu – den Antrag auf Teilnahme am Amateurfunkdienst und Zuteilung eines Rufzeichens stellen. Das ist ein PDF Formular, was man ausfüllen und zusammen mit einer Kopie seines Personalausweises und dem Zeugnis per eMail einreichen kann. Ja, bisschen doof, denn das Zeugnis <em>kam</em> ja gerade erst von der BNetzA und jetzt lichtet man es ab und schickt es wieder hin … 🙄 Manchmal möchte man lieber im digital-fortschrittlichen Estland leben … 🤷‍♂️</p>

<p>Das habe ich am 25. September getan und bis heute, dem 3. Oktober habe ich noch keine Post und kein Rufzeichen erhalten. Da heißt es: Geduld haben.</p>

<p>Auf den Amateurfunk Seiten der BNetzA liest man auch derzeit:</p>

<p class="notice--info">Aktuell kommt es zu Verzögerungen in der Antragsbearbeitung. Wir bitten darum, von Nachfragen bezüglich ihres Antragstatus abzusehen. Wir werden ihren Antrag schnellstmöglich bearbeiten.</p>

<p>Na dann. Sobald ich ein Rufzeichen habe, werde ich es hier sicher in geeigneter Form kundtun.</p>

<p>Ich hoffe, der Artikel war nicht <em>zu</em> lang/ausführlich. Mir ging es vor der Prüfung so, dass ich gerne ein paar mehr Details gewusst hätte, wie das da dann genau vor Ort am Tag der Prüfung abläuft. Daher habe ich es mal aufgeschrieben, falls es anderen auch so geht.</p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="amateurfunk" /><category term="afu" /><category term="prüfung" /><category term="lernen" /><category term="bnetza" /><summary type="html"><![CDATA[Ich habe mit Erfolg die Prüfung zum Funkamateur bei der BNetzA abgelegt. Wie es dazu kam und wie das abläuft, darüber lest ihr hier.]]></summary></entry><entry><title type="html">Text Replacements mit Return</title><link href="https://blog.metawops.de/mac-tipps/Text-Replacements-mit-Return/" rel="alternate" type="text/html" title="Text Replacements mit Return" /><published>2025-09-04T00:00:00+00:00</published><updated>2025-09-04T00:00:00+00:00</updated><id>https://blog.metawops.de/mac-tipps/Text-Replacements-mit-Return</id><content type="html" xml:base="https://blog.metawops.de/mac-tipps/Text-Replacements-mit-Return/"><![CDATA[<p>Ob ihr’s glaubt oder nicht: Ja, doch, unter macOS und iOS und iPadOS können die systemseitig konfigurierbaren Textersetzungen (“Text Replacements” heißen sie im englischen Original) auch Zeilenumbrüche enthalten!</p>

<p>Wenn ihr also statt jedesmal am Ende einer eMail “zu Fuß” die Formel …</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Mit freundlichen Grüßen
Stefan Wolfrum
</code></pre></div></div>

<p>tippen wollt und euch stattdessen in macOS über die <code class="language-plaintext highlighter-rouge">Systemeinstellung &gt; Keyboard &gt; Text Replacements</code> dafür ein Kürzel (z.B. <code class="language-plaintext highlighter-rouge">mfg</code>) anlegen wollt, müsst ihr den Zeilenumbruch nach dem Wort <code class="language-plaintext highlighter-rouge">Grüßen</code> einfach mit <code class="language-plaintext keycap highlighter-rouge">⌥</code><code class="language-plaintext keycap highlighter-rouge">⏎</code> (also Option + Return) eingeben!</p>

<p>Das Problem ist dann zwar, dass ihr nach Eingabe dieses speziellen Returns keinen blinkenden Cursor mehr seht, aber es ist dennoch ein Zeilenumbruch entstanden und ihr könnt die zweite Zeile tippen. Wenn ihr mit den Cursortasten im Eingabefeld umherlauft, könnt ihr auch den gesamten Text sehen – aber immer nur mit einem “Sichtfenster” von einer Zeile darauf.</p>

<p><img src="/assets/images/text-replacements.png" alt="" /></p>

<p>Im Screenshot kann man es erahnen, dass oberhalb vom Text “Stefan” noch etwas steht. Apple hat das also nicht vorgesehen, dass Textersetzungen mehr als eine Zeile haben – aber es geht trotzdem!</p>

<h3 id="und-unter-iosipados">Und unter iOS/iPadOS?</h3>

<p>Das geht leider nicht in der Settings App unter iOS bzw. iPadOS, so wie es unter macOS geht! 🙁 Dort springt der Cursor einfach ins nächste Eingabefeld weiter, wenn man <code class="language-plaintext keycap highlighter-rouge">⌥</code><code class="language-plaintext keycap highlighter-rouge">⏎</code> drückt. 🤷‍♂️</p>

<p><strong>Die gute Nachricht ist:</strong> Da diese Text Replacements via iCloud gesynct werden, kann man die auf einem Mac angelegten auch am iPhone / iPad nutzen – inklusive der Zeilenumbrüche.</p>

<p>Man kann sie halt nur leider am iPhone / iPad derzeit (iOS/iPadOS 18.6.2) nicht <em>erzeugen</em>.</p>

<p>Aber, klar, dafür braucht es natürlich einen Mac …</p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="mac-tipps" /><category term="textersetzungen" /><category term="text-replacements" /><category term="automatisierung" /><category term="produktivität" /><summary type="html"><![CDATA[Wir lernen, wie man auch Zeilenumbrüche bei Textersetzungen unter macOS, iOS, iPadOS einbauen kann.]]></summary></entry><entry><title type="html">How to read these posts in English</title><link href="https://blog.metawops.de/blog/How-to-read-in-English/" rel="alternate" type="text/html" title="How to read these posts in English" /><published>2025-08-16T00:00:00+00:00</published><updated>2025-08-16T00:00:00+00:00</updated><id>https://blog.metawops.de/blog/How-to-read-in-English</id><content type="html" xml:base="https://blog.metawops.de/blog/How-to-read-in-English/"><![CDATA[<p>If you want to read my blog posts in English please use your browser’s built-in translation feature.</p>

<h2 id="safari-on-macos">Safari on macOS</h2>

<p><img src="/assets/images/english-safari-macos.png" alt="Screenshot of macOS's Safari that shows how to translate the web page to English" /></p>

<p>In Safari on macOS find the little translation icon at the far right end of your location bar, click on it and select “Translate to English” from the popup menu. Done. ✅</p>

<h2 id="safari-on-ios--ipados">Safari on iOS / iPadOS</h2>

<p><img src="/assets/images/english-safari-ipados.png" alt="Screenshot showing Safari running on iPadOS 26 with instructions for translation to English" /></p>

<p>On iPad tap on the little burger-like (but not quite) icon at the far left of the location bar and select the menu item “Translate to English”. ✅</p>

<h2 id="chrome-on-windows-11">Chrome on Windows 11</h2>

<p><img src="/assets/images/english-chrome-win11.png" alt="Screenshot showing the Chrome browser running on Windows 11" /></p>

<p>In Chrome on Windows 11 the translation dialog popped up automatically after I visited my blog, right beneath the little translation icon at the far right end of the location bar. ✅</p>

<h2 id="chrome-on-macos">Chrome on macOS</h2>

<p><img src="/assets/images/english-chrome-macos.png" alt="Screenshot showing Chrome on macOS with the main menu opened and the translation menu item highlighted" /></p>

<p>In Chrome on macOS the translation feture can be found the browser’s three-dots-menu as seen in the screenshot above. ✅</p>

<p>If a page was translated you get a new icon at the far right end of the location bar. From there you can chose your translation options:</p>

<p><img src="/assets/images/english-chrome-macos-b.png" alt="Screenshot showing Chrome on macOS with the translation icon in the location bar" /></p>

<h2 id="edge-on-windows-11">Edge on Windows 11</h2>

<p><img src="/assets/images/english-edge-win11.jpeg" alt="Screenshot showing the Edge browser on Windows 11 with the context menu showing the translation option" /></p>

<p>When you never translated a web page before just right-click anywhere (but not on an image) on the web page and select the “Translate to English” menu option. Shown above. ✅</p>

<p>When you already did this you get a new icon at the far right of your location bar that you can click and chose your translation options. See screenshot:</p>

<p><img src="/assets/images/english-edge-win11-b.png" alt="Screenshot showing the Edge browser on Windows 11 with the translation icon in the location bar" /></p>

<h2 id="firefox-on-ubuntu">Firefox on Ubuntu</h2>

<p><img src="/assets/images/english-firefox-ubuntu.png" alt="Screenshot of Firefox running on Ubuntu 24.04 LTS" /></p>

<p>Click on the translation icon at the far right of your location bar, make sure that “Translate from German” and “Translate to English” is selected and click on the “Translate” button. ✅</p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="blog" /><category term="english" /><category term="translation" /><summary type="html"><![CDATA[We explain how the blog posts here can easily be read in English.]]></summary></entry><entry><title type="html">VSCode am iPad nutzen</title><link href="https://blog.metawops.de/tools/VSCode-am-iPad-nutzen/" rel="alternate" type="text/html" title="VSCode am iPad nutzen" /><published>2025-08-15T00:00:00+00:00</published><updated>2025-10-20T00:00:00+00:00</updated><id>https://blog.metawops.de/tools/VSCode-am-iPad-nutzen</id><content type="html" xml:base="https://blog.metawops.de/tools/VSCode-am-iPad-nutzen/"><![CDATA[<p><img src="/assets/images/code-server-ipad.jpeg" alt="VSCode läuft in Safari auf einem iPad im Vollbildmodus. Links ist die Dateiliste zu sehen, rechts ein Editorfenster mit Quelltext. Die Oberfläche ist modern und übersichtlich, geeignet für produktives Arbeiten unterwegs." /></p>

<p>Visual Studio Code (VSCode) ist seit Jahren mein go-to-tool für alles, was mit Text tippen zu tun hat. Vor allem natürlich, wenn es ums Programmieren geht, aber auch, um mit CSV Dateien zu arbeiten oder – wie im Falle dieses Blogs – Markdown Textdokumente zu schreiben.</p>

<p>Und so wie VSCode das <em>Tool</em> der Wahl ist, ist ein iPad meist das <em>Device</em> der Wahl. Ganz natürlich also, dass ich die zwei Dinge verheiraten wollte, denn leider gibt es VSCode immer noch nicht als native App für iPadOS.</p>

<h3 id="server-für-code-server">Server für code-server</h3>

<p>Zum Glück gibt es eine Server-Variante von VSCode, genannt <code class="language-plaintext highlighter-rouge">code-server</code>. Man braucht also einen Rechner im heimischen, lokalen Netz, der bestenfalls immer an ist und installiert darauf <code class="language-plaintext highlighter-rouge">code-server</code>. Das kann ein NAS sein oder ein Raspberry Pi oder ein Mini PC, vielleicht sogar mit <a href="https://www.proxmox.com/en/products/proxmox-virtual-environment/overview">ProxMox</a> drauf. Alles möglich. Ich habe mich für einen meiner Mac minis entschieden, der eh immer an ist, weil u.a. <a href="https://jellyfin.org">JellyFin</a> darauf läuft.</p>

<h3 id="prinzip">Prinzip</h3>

<p>Das Funktionsprinzip ist ganz einfach: Auf einem Server im LAN läuft <code class="language-plaintext highlighter-rouge">code-server</code>. Von einem anderen Rechner im LAN, z.B. einem iPad, ruft man im Browser die Adresse des Servers auf und fügt den Port, auf dem <code class="language-plaintext highlighter-rouge">code-server</code> läuft – standardmäßig 8080 – hinzu. Und schon hat man quasi VSCode auf dem iPad. “Quasi”, weil es (natürlich) nicht 100%ig das selbe wie eine native VSCode App ist. Eine Einschränkung ist z.B., dass <a href="https://github.com/coder/code-server/issues/2195">das Syncen der ganzen Settings nicht mit normalen Methoden geht</a>.<br />
Außerdem wollen wir das Ganze über https haben, auch wenn es “nur” eine lokale Verbindung innerhalb des LANs ist. Denn wenn der Browser nur eine http Verbindung hat, weigert er sich, manche Dinge zu tun, z.B. die Zwischenablage zu bedienen. Kurzum: https macht Sinn.</p>

<h3 id="code-server-installieren">code-server installieren</h3>

<p>Um auf einem einigermaßen aktuellen Mac (bei mir ein Mac mini M2 von 2023 mit aktuellstem macOS Sequoia 15.6) <code class="language-plaintext highlighter-rouge">code-server</code> zu installieren, empfehle ich – falls nicht eh schon geschehen – erstmal Homebrew zu installieren. Das erleichtert doch so einiges, auch für die Zukunft. Dazu einfach wie auf der <a href="https://brew.sh">Homebrew Seite</a> beschrieben vorgehen. Kurz – das hier in einem Terminal Fenster eingeben:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/bin/bash <span class="nt">-c</span> <span class="s2">"</span><span class="si">$(</span>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh<span class="si">)</span><span class="s2">"</span>
</code></pre></div></div>

<p>Wenn Homebrew da ist, installiert man den <code class="language-plaintext highlighter-rouge">code-server</code> einfach mit</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>code-server
</code></pre></div></div>

<p>Wir wollen natürlich, dass der <code class="language-plaintext highlighter-rouge">code-server</code> immer im Hintergrund läuft und auch automatisch gestartet wird, falls der Mac mini mal neu gebootet werden muss. Aber bevor wir das einrichten, müssen wir noch ein paar Dinge konfigurieren.</p>

<h3 id="von-überall-erreichbar-sein">Von überall erreichbar sein</h3>

<p>Damit wir von egal welchem lokalen Rechner auf den <code class="language-plaintext highlighter-rouge">code-server</code> zugreifen können, müssen wir die “bind address”, die standardmäßig auf <code class="language-plaintext highlighter-rouge">127.0.0.1</code> steht, auf <code class="language-plaintext highlighter-rouge">0.0.0.0</code> ändern. Das machen wir in der <code class="language-plaintext highlighter-rouge">code-server</code> Konfigurationsdatei, die wir in <code class="language-plaintext highlighter-rouge">~/.config/code-server/</code> finden und die <code class="language-plaintext highlighter-rouge">config.yaml</code> heißt.</p>

<p>Dort gibt es eine Zeile</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bind-addr: 127.0.0.1:8080
</code></pre></div></div>

<p>aus der wir jetzt</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bind-addr: 0.0.0.0:8080
</code></pre></div></div>

<p>machen. Natürlich könnt ihr auch einen anderen Port als 8080 wählen. Nur frei sollte er natürlich sein!</p>

<h3 id="zertifikate">Zertifikate</h3>

<p>Jetzt wollen wir noch dafür sorgen, dass wir später im Browser die Verbindung via https machen können. Das machen wir gleich “ordentlich” in zwei Schritten:</p>
<ol>
  <li>Wir erstellen ein eigenes Root CA Zertifikat</li>
  <li>Wir erstellen ein SSL Zertifikat für unseren <code class="language-plaintext highlighter-rouge">code-server</code></li>
</ol>

<h4 id="root-ca">Root CA</h4>

<p>Und schon rentiert es sich, dass wir oben Homebrew installiert haben. Denn jetzt brauchen wir ein weiteres Tool, <code class="language-plaintext highlighter-rouge">mkcert</code>, was wir ebenfalls leicht via Homebrew installieren können:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>mkcert
</code></pre></div></div>

<p>Unser Plan ist, erstmal ein Root CA Zertifikat zu erzeugen mit dem wir dann unser SSL Zertifikat signieren. Das Root CA Zertifikat übertragen wir dann auf die Rechner (auch iPads), auf denen wir <code class="language-plaintext highlighter-rouge">code-server</code> per https nutzen wollen und vertrauen ihm dort. Beim Aufruf der <code class="language-plaintext highlighter-rouge">code-server</code> URL im Browser wird dann das SSL Zertifikat übertragen und da es von unserem eigenen Root CA Zertifikat ausgestellt wurde und wir diesem vertrauen, wird der Browser auch nicht meckern.</p>

<p>Mit</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkcert <span class="nt">-install</span>
</code></pre></div></div>

<p>erzeugen und installieren wir dieses Root CA Zertifikat.</p>

<p>Mit</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkcert <span class="nt">-CAROOT</span>
</code></pre></div></div>
<p>kann man sich ausgeben lassen, wo das Zertifikat erzeugt bzw. abgelegt wurde. Unter macOS sollte das i.d.R. im Library-Pfad des Users liegen, bei mir liegt es in <code class="language-plaintext highlighter-rouge">~/Library/Application Support/mkcert</code> in Form der zwei Dateien <code class="language-plaintext highlighter-rouge">rootCA.pem</code> (das Zertifikat) und <code class="language-plaintext highlighter-rouge">rootCA-key.pem</code> (der private key – niemals teilen/verlieren!).</p>

<p>Diese <code class="language-plaintext highlighter-rouge">rootCA.pem</code> Datei werden wir später noch brauchen!</p>

<h4 id="ssl-zertifikat">SSL Zertifikat</h4>

<p>In unserem home folder erzeugen wir jetzt das SSL Zertifikat für <code class="language-plaintext highlighter-rouge">code-server</code>. Damit wir später von anderen Rechnern den Server sowohl mit seiner IP Adresse, als auch seinem lokalen Namen erreichen können, geben wir bei der Erzeugung auf der commandline gleich alle Adressen an, unter denen der Server über https erreichbar sein soll. Mein Mac mini hat die IP <code class="language-plaintext highlighter-rouge">192.168.0.61</code> und den lokalen Namen <code class="language-plaintext highlighter-rouge">stefmacminim2.local</code>. Zusätzlich sollte man immer auch <code class="language-plaintext highlighter-rouge">localhost</code> angeben, um auch lokal auf dem Mac mini im Browser den <code class="language-plaintext highlighter-rouge">code-server</code> per https erreichen zu können. Also schreiben wir:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkcert 192.168.0.61 stefmacminim2.local localhost
</code></pre></div></div>

<p>Das erzeugt wieder zwei Dateien, nämlich <code class="language-plaintext highlighter-rouge">192.168.0.61+2.pem</code> (das Zertifikat) und <code class="language-plaintext highlighter-rouge">192.168.0.61+2-key.pem</code> (der priavte key – schützen!).</p>

<p>Diese zwei Dateinamen konfigurieren wir nun in die o.a. <code class="language-plaintext highlighter-rouge">code-server</code> config Datei, die bei mir dann komplett so aussieht:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bind-addr: 0.0.0.0:8080
auth: password
password: c3a115bc21a75a36adb51321
cert: /Users/stefan/192.168.0.61+2.pem
cert-key: /Users/stefan/192.168.0.61+2-key.pem
</code></pre></div></div>

<p>Das 24-stellige Password (von der Redaktion geändert) brauchen wir auch gleich beim ersten Aufruf. Und ihr müsst natürlich den Pfad zu euren beiden SSL Zertifikatsdateien entsprechend anpassen.</p>

<h3 id="server-starten">Server starten</h3>

<p>Jetzt endlich können wir den <code class="language-plaintext highlighter-rouge">code-server</code> als Dienst starten. Das machen wir auch wieder mit Homebrew:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew services start code-server
</code></pre></div></div>

<p>Wer übrigens wissen will, was der <code class="language-plaintext highlighter-rouge">code-server</code> so macht, der findet dessen Logfile unter <code class="language-plaintext highlighter-rouge">/opt/homebrew/var/log/code-server.log</code>.</p>

<h3 id="root-ca-am-ipad-installieren">Root CA am iPad installieren</h3>

<p>Damit gleich Safari nicht die Nase rümpft, wenn wir per https den <code class="language-plaintext highlighter-rouge">code-server</code> aufrufen, müssen wir noch das vorhin erzeugte Root CA Zertifikat auf dem iPad installieren und ihm vertrauen.</p>

<p>Dazu müssen wir die Datei <code class="language-plaintext highlighter-rouge">rootCA.pem</code> auf das iPad bekommen. Da gibt es mindestens drei Wege, von denen wir uns einen aussuchen können:</p>
<ol>
  <li>Per eMail schicken – nicht so dolle, läuft ja übers Internet und unverschlüsselt.</li>
  <li>Per AirDrop schicken</li>
  <li>Auf die iCloud legen</li>
</ol>

<p>Wenn man die Möglichkeit hat, mit seinem iPad neben seinem Mac mini zu sitzen, dann würde ich Nr. 2 empfehlen. Nr. 3 kann man machen, aber dann nicht vergessen, hinterher die Zertifikatsdatei wieder zu löschen. Herumlungern sollte sie da nicht.</p>

<p>Variante 3 würde also so ablaufen: Man kopiert die Datei <code class="language-plaintext highlighter-rouge">rootCA.pem</code> (und <em>nur</em> diese, <em>nicht</em> auch die <code class="language-plaintext highlighter-rouge">rootCA-key.pem</code> Datei!) am Mac z.B. in den iCloud Drive Hauptordner. Da die Datei in einem Unterordner von <code class="language-plaintext highlighter-rouge">~/Library</code> liegt und der Finder normalerweise den <code class="language-plaintext highlighter-rouge">Library</code> User Ordner ausblendet, gibt es (mind.) vier Möglichkeiten:</p>
<ol>
  <li>Ihr tippt mit einem Finder Fenster im Vordergrund einmal <code class="language-plaintext keycap highlighter-rouge">⌘</code><code class="language-plaintext keycap highlighter-rouge">⇧</code><code class="language-plaintext keycap highlighter-rouge">.</code>. Nun zeigen Finder Fenster immer alle Dateien an, auch die versteckten und damit auch den Ordner <code class="language-plaintext highlighter-rouge">Library</code> in eurem Home Folder, so dass ihr bis zu <code class="language-plaintext highlighter-rouge">~/Library/Application Support/mkcert</code> wandern könnt.</li>
  <li>Ihr klickt auf den Finder Menüpunkt <code class="language-plaintext highlighter-rouge">Go</code> und haltet nach Erscheinen des Menüs die <code class="language-plaintext keycap highlighter-rouge">⌥</code>-Taste gedrückt. Daraufhin erscheint ca. in der Mitte ein neuer Eintrag <code class="language-plaintext highlighter-rouge">Library</code>, auf den ihr klickt.</li>
  <li>Ihr drückt die Tastenkombination <code class="language-plaintext keycap highlighter-rouge">⇧</code><code class="language-plaintext keycap highlighter-rouge">⌘</code><code class="language-plaintext keycap highlighter-rouge">L</code>, was euch sofort in euren Library Ordner bringt.</li>
  <li>Ihr tippt die Tastenkombination <code class="language-plaintext keycap highlighter-rouge">⇧</code><code class="language-plaintext keycap highlighter-rouge">⌘</code><code class="language-plaintext keycap highlighter-rouge">G</code> (für “Go”) und gebt im erscheinenden Dialog <code class="language-plaintext highlighter-rouge">~/Library/</code> ein.</li>
</ol>

<p>Nun könnt ihr also im Finder per drag &amp; drop die Datei <code class="language-plaintext highlighter-rouge">rootCA.pem</code> aus dem Ordner <code class="language-plaintext highlighter-rouge">~/Library/Application Support/mkcert/</code> in den iCloud Hauptordner kopieren.</p>

<p>Am iPad öffnet man dann die Files App (auf Deutsch heißt sie “Dateien”), navigiert zum iCloud Drive Hauptordner und tippt die eben dorthin kopierte Datei an.</p>

<p>Auch wenn ihr euch für die einfachere AirDrop Variante entschieden habt, geht es jetzt auf dem iPad so weiter: Es erscheint ein Dialog, der fragt, wo das Zertifikat installiert werden soll. Wir wählen hier natürlich das iPad – ein HomePod macht hier keinen Sinn:</p>

<p><img src="/assets/images/cert-inst-1.jpeg" alt="Dialog im iPadOS-Einstellungsmenü zur Installation eines Zertifikat-Profils. Überschrift Installieren und iPad, Auswahlmöglichkeiten für das Gerät, schlichte Oberfläche, Fokus auf einfache Installation." /></p>

<p>Als nächstes müssen wir auf dem iPad in die Settings (deutsch: Einstellugen) App und sehen direkt links oben, dass ein neues “Profil” heruntergeladen wurde. Profile sind eine Art Container, in denen man verschiedene Dinge verpacken und dann auf einen iPad/iPhone installieren kann, u.a. auch Zertifikate.</p>

<p><img src="/assets/images/cert-inst-2.jpeg" alt="Dialog im iPadOS-Einstellungsmenü zur Installation eines Zertifikat-Profils. Überschrift Installieren und iPad, einfache Auswahl des Geräts, schlichte und übersichtliche Oberfläche." /></p>

<p>Wir tippen auf diesen Eintrag und tippen dann im Verlauf insgesamt dreimal auf die jeweils erscheinende “Install” Option:</p>

<p><img src="/assets/images/cert-inst-3.jpeg" alt="iPad zeigt den Installationsdialog für ein Zertifikatprofil in den Einstellungen. Auswahl Installieren auf iPad, übersichtliche und schlichte Oberfläche, neutraler Ton." /></p>

<p><img src="/assets/images/cert-inst-4.jpeg" alt="Dialog zur Installation eines Zertifikat-Profils in den iPad-Einstellungen. Hauptinhalt ist die Auswahl Installieren auf iPad, übersichtliche Oberfläche, Fokus auf einfache und sichere Installation." /></p>

<p><img src="/assets/images/cert-inst-5.jpeg" alt="Installationsdialog für ein Zertifikatprofil in den iPadOS-Einstellungen. Zu sehen sind die Optionen Profil installieren und iPad als Gerät. Schlichte, übersichtliche Oberfläche." /></p>

<h2 id="dem-zertifikat-vertrauen">Dem Zertifikat vertrauen</h2>

<p>Wir sind noch nicht fertig! Jetzt gehen wir in der Settings App in den Abschnitt “General” (deutsch: Allgemein), dann auf “About” (erster Punkt; auf deutsch “Info”) und scrollen ganz runter bis zum Eintrag “Certificate Trust Settings” (deutsch: “Zertifikatsvertraueneinstellungen”), den wir antippen:</p>

<p><img src="/assets/images/cert-inst-6.jpeg" alt="Einstellungen-App auf dem iPad zeigt die Zertifikatsvertrauenseinstellungen mit einer Liste installierter Root-Zertifikate und Schaltern zum Aktivieren. Das neue Root-CA-Zertifikat ist sichtbar, die Oberfläche ist schlicht und übersichtlich." /></p>

<p>Am Ende ist unser neues Root CA Zertifikat dazu gekommen, wir müssen jetzt nur noch den Schalter dafür einschalten …</p>

<p><img src="/assets/images/cert-inst-7.jpeg" alt="iPad zeigt das Menü Zertifikatsvertrauenseinstellungen in den Einstellungen. Zu sehen sind installierte Root-Zertifikate mit Schaltern zum Aktivieren, darunter das neue Root-CA-Zertifikat. Schlichte, übersichtliche Oberfläche. Sichtbarer Text: Zertifikatsvertrauenseinstellungen und Zertifikatsnamen." /></p>

<p>… und den Dialog bestätigen:</p>

<p><img src="/assets/images/cert-inst-8.jpeg" alt="iPad zeigt einen Bestätigungsdialog zum Aktivieren des Root-CA-Zertifikats. Schalter zum Einschalten und Button zum Bestätigen, einfache Oberfläche. Sichtbarer Text: Zertifikatsvertrauenseinstellungen und Zertifikatsname." /></p>

<h2 id="endlich">Endlich</h2>

<p>Und jetzt endlich können wir am iPad in Safari ein neues Tab aufmachen und als URL <code class="language-plaintext highlighter-rouge">https://192.168.0.61:8080</code> eingeben – wobei ihr natürlich die IP Adresse eures Servers nehmen müsst. Oder den lokalen Namen: <code class="language-plaintext highlighter-rouge">https://stefmacminim2.local:8080</code> in meinem Fall.</p>

<p>Jetzt sollte Safari keine Warnung bringen und direkt zur ersten Seite von <code class="language-plaintext highlighter-rouge">code-server</code> leiten, in der man erstmal das Passwort eingeben muss, was in der <code class="language-plaintext highlighter-rouge">config.yaml</code> Datei steht.</p>

<h2 id="als-web-app-noch-besser">Als “Web App” noch besser</h2>

<p>Noch etwas besser wird das Erlebnis am iPad, wenn man sich diese Adresse als Icon auf den iPad Desktop (Home Screen) legt. Dazu in Safari auf dem iPad im Share Menü den Punkt “Add to Home Screen” wählen, einen geeigneten Namen eingeben (der erscheint dann unterm Icon) und bestätigen.</p>

<p><img src="/assets/images/code-server-webapp-1.jpeg" alt="VSCode-Oberfläche in Safari auf einem iPad im Vollbild, links Dateiliste, rechts Editor mit Quelltext. Moderner, übersichtlicher Workspace für produktives Arbeiten unterwegs. Keine sichtbaren Texte, sachliche Atmosphäre." /></p>

<p><img src="/assets/images/code-server-webapp-2.jpeg" alt="VSCode-Oberfläche in Safari auf einem iPad im Vollbildmodus, links Dateiliste, rechts Editor mit Quelltext. Moderner, übersichtlicher Workspace, neutrale Atmosphäre." /></p>

<p>Auf dem iPad Home Screen sieht das Icon dann so aus:</p>

<p><img src="/assets/images/code-server-webapp-3.jpeg" alt="iPad Home-Bildschirm mit VSCode Web-App-Icon" /></p>

<p>Wenn ihr nun das antippt, startet VSCode full screen.</p>

<p>Es sei allerdings darauf hingewiesen, dass das alles natürlich nur dann wirklich Sinn macht, wenn ihr euer iPad auch mit einer externen (Hardware-) Tastatur bedient. Und leider gibt es hier und da auch mal ein paar Hiccups, kleine Fehlerchen. Da hilft es manchmal, mit <code class="language-plaintext keycap highlighter-rouge">⌘</code><code class="language-plaintext keycap highlighter-rouge">R</code> die Seite neu zu laden oder die App ganz abzuschießen und neu zu starten. Im worst case müsst ihr den <code class="language-plaintext highlighter-rouge">code-server</code> neu starten, was natürlich remote z.B. über eine ssh Verbindung auf euren Server mit dem Kommando</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew services restart code-server
</code></pre></div></div>

<p>geht. Da müsst ihr nicht zu Fuß zum Standort des Servers gehen.</p>

<p>Mein Lieblings-Tool für ssh auf dem iPad ist die App <a href="https://blink.sh">Blink</a>, aber es gibt da ja mittlerweile zahlreiche ähnliche Apps dieser Art.</p>

<h3 id="von-unterwegs-vpn">Von unterwegs: VPN</h3>

<p>Das ganze funktioniert natürlich auch von unterwegs, obwohl wir uns bisher nur zuhause im LAN aufgehalten haben. Dafür solltet ihr einfach eine VPN Verbindung zu euch nach Hause aufbauen. Das kann man ja z.B. in der Fritz!Box oder auch in anderen Routern relativ leicht konfigurieren. Soll ich dazu auch mal einen Artikel schreiben? Schreibt’s mir in die Kommentare.</p>

<p>Meldet euch auch gern bei Fragen oder Hinweisen oder Begeisterungsausbrüchen ob des Artikels. 😂</p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="tools" /><category term="vscode" /><category term="dev-tools" /><category term="code-server" /><category term="ipad" /><category term="zertifikate" /><category term="root-ca" /><summary type="html"><![CDATA[Wir installieren code-server inklusive Zertifikate auf einem Mac mini und nutzen dann Visual Studio Code in Safari am iPad full-screen.]]></summary></entry><entry><title type="html">(Fast) jedes Unicode Zeichen am Mac eingeben</title><link href="https://blog.metawops.de/mac-tipps/Unicode-Zeichen-am-Mac-eingeben/" rel="alternate" type="text/html" title="(Fast) jedes Unicode Zeichen am Mac eingeben" /><published>2025-07-30T00:00:00+00:00</published><updated>2025-08-05T00:00:00+00:00</updated><id>https://blog.metawops.de/mac-tipps/Unicode-Zeichen-am-Mac-eingeben</id><content type="html" xml:base="https://blog.metawops.de/mac-tipps/Unicode-Zeichen-am-Mac-eingeben/"><![CDATA[<p>Ich habe schon immer etwas neidisch auf die Windows-Fraktion geblickt, wenn es darum ging, Sonderzeichen zu erzeugen, die man nicht direkt über die Tastatur eingeben kann. Da kann man dann meist die <code class="language-plaintext keycap highlighter-rouge">Alt</code>-Taste gedrückt halten und auf dem Zehnerblock der Tastatur drei oder vier Ziffern tippen, <code class="language-plaintext keycap highlighter-rouge">Alt</code> loslassen und schon erscheint das zugehörige Zeichen.</p>

<p>Mir ist zwar nie klar geworden, warum auf dem <em>einen</em> Windows Rechner dann ein anderes Zeichen erschien, als auf dem <em>anderen</em> Windows Rechner – bei der selben Ziffernfolge –, aber egal.</p>

<h2 id="zusatz-tastatur-aktivieren">Zusatz-Tastatur aktivieren</h2>
<p>Und obwohl ich schon seit vielen, vielen Jahren Mac User bin, habe ich erst jetzt gelernt, dass wir das unter macOS ja auch können! Und es braucht nicht mal eine Tastatur mit Zehnerblock dazu, geht also auch direkt am MacBook.</p>

<p>Wir müssen lediglich einmal in den System Settings – sorry, meine Apple Geräte laufen alle auf Englisch, aber ihr bekommt das sicher hin, wenn euer macOS auf Deutsch läuft – in den Abschnitt “Keyboards” und dort im Abschnitt “Text Input” einmal den “Edit…” Button hinter “Input Sources” klicken:</p>

<figure class=""><a href="/assets/images/keyboard-settings-1.png" class="image-popup" title="
"><img src="/assets/images/keyboard-settings-1.png" alt="macOS System Settings window open to the Keyboard section with the Text Input area visible. The Edit button next to Input Sources is highlighted in blue. The sidebar on the left lists other settings categories such as Appearance, Control Center, and Siri and Spotlight. The overall tone is neutral and instructional. Visible text includes System Settings, Keyboard, Text Input, and Edit." /></a><figcaption>
      

    </figcaption></figure>

<p>Im erscheinenden Dialog links unten aufs Plus-Zeichen klicken:</p>

<figure class=""><a href="/assets/images/keyboard-settings-2.png" class="image-popup" title="
"><img src="/assets/images/keyboard-settings-2.png" alt="Screenshot zeigt die macOS Systemeinstellungen im Bereich Tastatur. Im linken Bereich sind die Eingabequellen sichtbar, unten links ist das Plus-Symbol zum Hinzufügen einer neuen Eingabequelle hervorgehoben. Rechts sind verschiedene Tastatureinstellungen zu sehen." /></a><figcaption>
      

    </figcaption></figure>

<p>Im erscheinenden Dialog unten links im Such-Eingabefeld <code class="language-plaintext highlighter-rouge">uni</code> eingeben (1), es gibt nur einen Treffer, das “Unicode Hex Input” Keyboard, was rechts oben angezeigt wird (2). Mit Klick auf den “Add” Button rechts unten (3) bestätigen:</p>

<figure class=""><a href="/assets/images/keyboard-settings-3.png" class="image-popup" title="
"><img src="/assets/images/keyboard-settings-3.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Das neue Tastaturlayout ist jetzt in die Liste der konfigurierten Layouts aufgenommen worden und wir bestätigen noch einmal mit dem “Done” Button unten rechts:</p>

<figure class=""><a href="/assets/images/keyboard-settings-4.png" class="image-popup" title="
"><img src="/assets/images/keyboard-settings-4.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Die folgende Einstellung ist optional, aber praktisch, wie ich finde. Wenn wir diesen Schalter einschalten, bekommen wir in der Menüleiste rechts oben ein Icon, über das wir sowohl das aktuell aktive Tastaturlayout sehen können, als auch ein Menü, über das wir das Layout ändern können:</p>

<figure class=""><a href="/assets/images/keyboard-settings-5.png" class="image-popup" title="
"><img src="/assets/images/keyboard-settings-5.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<h2 id="tastaturlayouts-umschalten">Tastaturlayouts umschalten</h2>
<p>Wenn wir jetzt irgendwo, wo ein Textcursor blinkt, ein Unicode Zeichen eingeben wollen, brauchen wir zwei Dinge:</p>
<ul>
  <li>Den Code des Zeichens – und zwar in hexadezimal</li>
  <li>Das aktive Unicode Keyboard Layout zur Eingabe des Codes</li>
</ul>

<p>Letzteres erreichen wir entweder über das eben aktivierte Icon in der Menüleiste …</p>

<figure class=""><a href="/assets/images/keyboard-settings-7.png" class="image-popup" title="
"><img src="/assets/images/keyboard-settings-7.png" alt="macOS Tastaturlayout Menü Icon und aufgeklapptes Menü von der Menüleiste" /></a><figcaption>
      

    </figcaption></figure>

<p>… oder wir benutzen einfach da, wo der Cursor blinkt und wir etwas eingeben wollen die Tastenkombination <code class="language-plaintext keycap highlighter-rouge">⌃</code><code class="language-plaintext keycap highlighter-rouge">␣</code> (<code class="language-plaintext highlighter-rouge">␣</code> ist ein Space Zeichen, steht also für die Leertaste <code class="language-plaintext keycap highlighter-rouge">space</code>) zum “Durchsteppen” durch unsere konfigurierten Tastaturlayouts. Genau unter dem blinkenden Cursor erscheint ein kleines GUI Element und das darin farblich hervorgehobene Layout ist dann jeweils das aktive.</p>

<p>Eine weitere Alternative ist es, bei Tastaturen mit dem Globus-Symbol 🌐 diese Taste einmal kurz zu drücken. Das schaltet ein Tastaturlayout weiter.</p>

<h2 id="wie-gibt-man-ein">Wie gibt man ein?</h2>
<p>Fehlt noch der Code selbst und wie man ihn denn nun eingibt. Letzteres ist einfach: Man hält die <code class="language-plaintext keycap highlighter-rouge">⌥</code>-Taste gedrückt und gibt nun exakt vier hexadezimale Zeichen ein. Nach Eingabe des vierten Zeichens erscheint das Unicode Symbol direkt und man kann die <code class="language-plaintext keycap highlighter-rouge">⌥</code>-Taste wieder loslassen.</p>

<p>Schnell mal ausprobieren mit dem Code <code class="language-plaintext highlighter-rouge">2665</code>. Wir halten <code class="language-plaintext keycap highlighter-rouge">⌥</code>, tippen <code class="language-plaintext keycap highlighter-rouge">2</code> <code class="language-plaintext keycap highlighter-rouge">6</code> <code class="language-plaintext keycap highlighter-rouge">6</code> <code class="language-plaintext keycap highlighter-rouge">5</code> und beim Tippen der letzten Ziffer erscheint sofort ein ♥.</p>

<h2 id="wo-kommen-die-codes-her">Wo kommen die Codes her?</h2>
<p>Wenn man nun die hexadezimalen Codes zu seinen Lieblingszeichen wissen will, gibt es verschiedene Möglichkeiten. Zwei seien genannt.</p>

<h4 id="macos-character-viewer">macOS Character Viewer</h4>
<p>Mit <code class="language-plaintext keycap highlighter-rouge">⌃</code><code class="language-plaintext keycap highlighter-rouge">⌘</code><code class="language-plaintext keycap highlighter-rouge">␣</code> (möglicherweise zweimal drücken!) aktiviert man unter macOS ein kleines Fenster, den Character Viewer. Der erscheint möglicherweise erstmal nur in seiner kompakten Form. Dann klicken wir rechts unten auf den kleinen Doppelpfeil:</p>

<figure class=""><a href="/assets/images/character-viewer-2.png" class="image-popup" title="
"><img src="/assets/images/character-viewer-2.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Denn dann erscheint daraufhin rechts unten ein kleines Icon, was ein Fenster symbolisiert.</p>

<figure class=""><a href="/assets/images/character-viewer-3.png" class="image-popup" title="
"><img src="/assets/images/character-viewer-3.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Wenn wir das klicken, haben wir die volle Version des Character Viewers vor uns:</p>

<figure class=""><a href="/assets/images/character-viewer-4.png" class="image-popup" title="
"><img src="/assets/images/character-viewer-4.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Möglicherweise seht ihr bei euch aber noch nicht die Unicode Nummer (“U+1F600”) und auch nicht die UTF-8 Codierung. Das kommt jetzt.</p>

<p>Nun aktivieren wir hier die <em>volle</em> Unicode Ansicht, indem wir einmal links oben auf die eingekreisten drei Punkte klicken und dann “Customize List” wählen:</p>

<figure class=""><a href="/assets/images/character-viewer-5.png" class="image-popup" title="
"><img src="/assets/images/character-viewer-5.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Im erscheinenden Dialog ganz runterscrollen, im Abschnitt “Code Tables” den Eintrag “Unicode” aktivieren und mit dem Done Button bestätigen:</p>

<figure class=""><a href="/assets/images/character-viewer-6.png" class="image-popup" title="
"><img src="/assets/images/character-viewer-6.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Jetzt scrollen wir links einmal runter und klicken auf den neuen Eintrag “Unicode”:</p>

<figure class=""><a href="/assets/images/character-viewer-7.png" class="image-popup" title="
"><img src="/assets/images/character-viewer-7.png" alt="" /></a><figcaption>
      

    </figcaption></figure>

<p>Im mittleren Bereich können wir jetzt durch die zahlreichen Codepages blättern, dann ein Zeichen anklicken und sehen rechts unter der großen Variante des Zeichens auch den Zahlencode des Zeichens. Im Beispiel Screenshot ist es das Apple Symbol, was auf der Command-Taste meist zu sehen ist. Es heißt übrigens “Place of interest sign” und das wurde nicht von Apple erfunden, sondern nur verwendet. <a href="https://de.wikipedia.org/wiki/Schleifenquadrat">Es ist schon viel älter</a>.</p>

<p>Will man also dieses Zeichen erzeugen, geht man so vor:</p>
<ol>
  <li>Mit <code class="language-plaintext keycap highlighter-rouge">⌃</code><code class="language-plaintext keycap highlighter-rouge">␣</code> auf das Unicode Tastaturlayout umschalten.</li>
  <li>Die <code class="language-plaintext keycap highlighter-rouge">⌥</code>-Taste gedrückt halten und <code class="language-plaintext keycap highlighter-rouge">2</code><code class="language-plaintext keycap highlighter-rouge">3</code><code class="language-plaintext keycap highlighter-rouge">1</code><code class="language-plaintext keycap highlighter-rouge">8</code> tippen.</li>
</ol>

<h4 id="internet">Internet</h4>
<p>Es gibt im Web zahlreiche Seiten, auf denen man im Unicode Verzeichnis blättern und suchen kann. Hier ein paar Beispiele:</p>
<ul>
  <li><a href="https://symbl.cc">https://symbl.cc</a></li>
  <li><a href="https://unicode-explorer.com">https://unicode-explorer.com</a></li>
  <li><a href="https://jrgraphix.net/r/Unicode/">https://jrgraphix.net/r/Unicode/</a></li>
  <li><a href="https://keyboard.cool/db/">https://keyboard.cool/db/</a></li>
</ul>

<p>Auch auf diese Weise kommt man dann an den Code des gewünschten Zeichens.</p>

<h2 id="pferdefuß">Pferdefuß</h2>
<p>Die ganze Sache hat leider aktuell noch einen Haken, den ich nicht verschweigen will: Das Ganze funktioniert derzeit in macOS nur für <em>vierstellige</em> Codes! Unicode Zeichen mit einem <em>fünfstelligen</em> Code kann man auf die oben geschilderte Weise im Moment (macOS 15.5) <em>nicht</em> eingeben! 😡</p>

<p>Das betrifft dann also alles ab der Codepage, die mit <code class="language-plaintext highlighter-rouge">00010000</code> anfängt (sie heißt “Linear B Syllabary”). Zu den Unicode Zeichen mit einem fünfstelligen Code gehören z.B. auch die Emojis – aber die und viele weitere Sonderzeichen kann man ja zum Glück auch direkt und auf andere Weise über den Character Viewer finden und durch Doppelklick in seinen Text einfügen.</p>

<h2 id="betthupferl">Betthupferl</h2>

<p>Oben hatten wir das Zeichen mit der Nummer <code class="language-plaintext highlighter-rouge">U+2665</code>, das ergab ein Herz.
Das Zeichen <code class="language-plaintext highlighter-rouge">U+2764</code> ergibt übrigens <em>auch</em> ein Herz – probiert’s mal aus! Welches gefällt euch besser?</p>

<p class="small-text"><em><a href="https://www.adoc-studio.app/blog/unicode-characters-on-macos">Quelle</a></em></p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="mac-tipps" /><category term="unicode" /><category term="sonderzeichen" /><summary type="html"><![CDATA[Auch unter macOS gibt es die Möglichkeit, beliebige Zeichen über ihre Nummer einzugeben. Hier lernen wir, wie.]]></summary></entry><entry><title type="html">Keycaps in Blog Posts mit Markdown</title><link href="https://blog.metawops.de/markdown/Keycaps-in-Markdown-Artikeln/" rel="alternate" type="text/html" title="Keycaps in Blog Posts mit Markdown" /><published>2025-07-28T00:00:00+00:00</published><updated>2025-08-04T00:00:00+00:00</updated><id>https://blog.metawops.de/markdown/Keycaps-in-Markdown-Artikeln</id><content type="html" xml:base="https://blog.metawops.de/markdown/Keycaps-in-Markdown-Artikeln/"><![CDATA[<p>Wenn ich in manchen Blog Posts hier Workflows am Mac beschreibe, die das Drücken von Tasten oder Tastenkombinationen beinhalten, würde ich diese Tastendrücke gerne visuell als solche im Text hervorheben.</p>

<h2 id="webfonts">Webfonts?</h2>
<p>Meine erste Idee war: Ich suche einen Font, der alle Buchstaben, Ziffern und Sonderzeichen als Glyphs mit umschließenden Rähmchen enthält. Denn beim Schreiben <a href="https://blog.metawops.de/taschenrechner/Binomialverteilung-TI-30X-Pro/">meines letzten Artikels über Binomialverteilungen am TI-30X</a> hatte ich ja schon den speziellen TI-30X Pro MathPrint Font gelernt zu benutzen.</p>

<p>Leider habe ich aber keinen Font gefunden, der derlei Symbole enthält und gleichzeitig frei benutzbar ist. – Aber zum Glück gibt es ja noch andere Möglichkeiten …</p>

<h2 id="css">CSS!</h2>
<p>CSS to the rescue! Wir definieren uns eine CSS Klasse, die einen Buchstaben oder ein Sonderzeichen mit so einem kleinen Rähmchen versieht. Dabei können wir noch Schriftgröße, Abstände, Hintergrundfarbe und allerlei mehr selbst bestimmen, eh besser!</p>

<p>In einem auf dem <em>remote theme</em> “minimal mistakes” basierenden GitHub Pages Blog kann man eigenes, individuelles CSS in der Datei <code class="language-plaintext highlighter-rouge">/assets/css/main.scss</code> unterbringen. Das hatten wir schonmal im Artikel <a href="https://blog.metawops.de/githubpages/Link-im-Bio-Feld/">Link im Bio Feld</a> besprochen.</p>

<p>Wenn die Datei <code class="language-plaintext highlighter-rouge">main.scss</code> also startklar ist, das folgende CSS am besten unten anhängen:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">//</span> <span class="nt">class</span> <span class="nt">für</span> <span class="nt">Keycaps</span>
<span class="nc">.keycap</span> <span class="p">{</span>
  <span class="nl">display</span><span class="p">:</span> <span class="n">inline-flex</span><span class="p">;</span>
  <span class="nl">align-items</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
  <span class="nl">justify-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
  <span class="nl">min-width</span><span class="p">:</span> <span class="m">1.4em</span> <span class="cp">!important</span><span class="p">;</span>      <span class="c">/* Breite           */</span>
  <span class="nl">height</span><span class="p">:</span> <span class="m">1.3em</span> <span class="cp">!important</span><span class="p">;</span>         <span class="c">/* Höhe             */</span>
  <span class="nl">border-radius</span><span class="p">:</span> <span class="m">0.2em</span> <span class="cp">!important</span><span class="p">;</span>  <span class="c">/* Abrundung        */</span>
  <span class="nl">background</span><span class="p">:</span> <span class="m">#c5cfed</span> <span class="cp">!important</span><span class="p">;</span>   <span class="c">/* Hintergrundfarbe */</span>
  <span class="nl">border</span><span class="p">:</span> <span class="m">2px</span> <span class="nb">solid</span> <span class="m">#242424</span><span class="p">;</span>        <span class="c">/* Rahmenfarbe      */</span>
  <span class="nl">font-size</span><span class="p">:</span> <span class="m">1.0em</span> <span class="cp">!important</span><span class="p">;</span>      <span class="c">/* Schriftgröße     */</span>
  <span class="nl">font-family</span><span class="p">:</span> <span class="nb">inherit</span><span class="p">;</span>             <span class="c">/* Schriftart       */</span>
  <span class="nl">font-weight</span><span class="p">:</span> <span class="nb">normal</span> <span class="cp">!important</span><span class="p">;</span>   <span class="c">/* nicht bold       */</span>
  <span class="nl">font-style</span><span class="p">:</span> <span class="nb">normal</span> <span class="cp">!important</span><span class="p">;</span>    <span class="c">/* nicht kursiv     */</span>
  <span class="nl">margin</span><span class="p">:</span> <span class="m">0.1em</span><span class="p">;</span>                    <span class="c">/* Abstand außen    */</span>
  <span class="nl">box-sizing</span><span class="p">:</span> <span class="n">border-box</span><span class="p">;</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">0</span> <span class="m">0.15em</span> <span class="cp">!important</span><span class="p">;</span>     <span class="c">/* Abstand innen    */</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Die ganzen <code class="language-plaintext highlighter-rouge">!important</code> Anweisungen rühren daher, dass wir sicherstellen wollen, dass unsere Keycaps in jedem Fall funktionieren, egal in welche anderen HTML-Umgebungen sie eingebettet sind. Würden wir z.B. hinter <code class="language-plaintext highlighter-rouge">font-style: normal</code> kein <code class="language-plaintext highlighter-rouge">!important</code> haben und dann ein Keycap innerhalb eines Zitats (was man in Markdown bekanntlich mit einem <code class="language-plaintext highlighter-rouge">&gt;</code> Zeichen startet) einbauen wollen, würde das Keycap Zeichen <em>kursiv</em> gesetzt werden. Weil der Default Style für Zitate hier beim “minimal mistakes” Theme eben einen kursiven Font benutzt.</p>

<p>Die Änderungen müssen wir natürlich commiten und ins Repository pushen, damit der GitHub Build Prozess startet und die neuen Styles auch live benutzt werden können.</p>

<p>Aber wie benutzen wir das jetzt in unserem Markdown Blog Artikel?</p>

<h2 id="benutzung-in-markdown-via-html">Benutzung in Markdown via HTML</h2>

<p>Eine schöne Eigenschaft von Markdown ist ja, dass man zwischdurch, falls nötig, auch mal HTML direkt einbauen kann. Allerdings entspricht das nicht unbedingt der Philosophie von Markdown, dass geschriebene Texte auch im Rohformat, also Markdown selbst, für das menschliche Auge gut lesbar sein sollen.</p>

<p>Wir zeigen hier erstmal, wie man es <em>straight forward</em> mit HTML machen würde. Im nächsten Kapitel gibt’s dann eine etwas elegantere Methode.</p>

<p>Um mitten in einem Satz die oben neu definierte CSS Klasse auf ein einzelnes Zeichen anzuwenden, würde man in Markdown mit HTML so vorgehen:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bitte drücke jetzt die Tastenkombination &lt;span class="keycap"&gt;⌃&lt;/span&gt;&lt;span class="keycap"&gt;A&lt;/span&gt; und dann noch die &lt;span class="keycap"&gt;K&lt;/span&gt;-Taste.
</code></pre></div></div>

<p>Das Ergebnis sieht dann so aus:</p>

<blockquote>
  <p>Bitte drücke jetzt die Tastenkombination <span class="keycap">⌃</span><span class="keycap">A</span> und dann noch die <span class="keycap">K</span>-Taste.</p>
</blockquote>

<p>Geht. Aber das Markdown wird ein bisschen unübersichtlich.</p>

<h2 id="kramdown-ials">Kramdown IALs</h2>

<p><em>Kramdown</em> heißt der standardmäßige Markdown Interpreter, der bei GitHub Pages basierten Blogs zum Einsatz kommt. Ich habe in meiner <code class="language-plaintext highlighter-rouge">_config.yml</code> sicherheitshalber aber auch nochmal die Anweisung <code class="language-plaintext highlighter-rouge">markdown: kramdown</code> untergebracht.</p>

<p>Und Kramdown bringt ein paar Erweiterungen gegenüber Standard-Markdown mit, darunter die sogenannten <em><a href="http://kramdown.gettalong.org/quickref.html#inline-attributes">Inline Attribute Lists</a></em> (IALs). Man unterscheidet da Block-Level und Span-Level IALs. In unserem Fall brauchen wir letztere, weil wir ja <em>mitten im Text</em> ein Zeichen mit unserer CSS Klasse versehen wollen.</p>

<p>Die Syntax sieht dann für den selben Beispieltext wie oben so aus:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bitte drücke jetzt die Tastenkombination `⌃`{:.keycap}`A`{:.keycap} und dann noch die `K`{:.keycap}-Taste.
</code></pre></div></div>

<p>Das Ergebnis ist das selbe, aber das Markdown ist etwas besser lesbar (und es ist auch weniger zu tippen):</p>

<blockquote>
  <p>Bitte drücke jetzt die Tastenkombination <code class="language-plaintext keycap highlighter-rouge">⌃</code><code class="language-plaintext keycap highlighter-rouge">A</code> und dann noch die <code class="language-plaintext keycap highlighter-rouge">K</code>-Taste.</p>
</blockquote>

<h3 id="kleiner-deep-dive">Kleiner Deep Dive</h3>
<p>Man beachte: Die einzukästelnden Zeichen müssen selbst erstmal in irgendeine Art Auszeichnung gesetzt werden, hier im Beispiel ist das die Darstellung als Code über die beiden Backtick-Zeichen vor und nach den entsprechenden Zeichen. Man könnte die Zeichen z.B. genausogut kursiv setzen, also mit Sternchen umschließen. Der Hintergrund ist, dass die IAL Syntax beim durch Kramdown erzeugten HTML ansetzt/greift und die Klasse dann ergänzt:</p>

<p>Aus <code class="language-plaintext highlighter-rouge">*A*</code> in Markdown wird durch den Kramdown Interpreter dieses HTML gemacht: <code class="language-plaintext highlighter-rouge">&lt;em&gt;A&lt;/em&gt;</code>. Darauf können dann die IALs aufsetzen und z.B. die Klasse ergänzen: <code class="language-plaintext highlighter-rouge">&lt;em class="keycap"&gt;A&lt;/em&gt;</code>. Aber ohne dass das <code class="language-plaintext highlighter-rouge">&lt;em&gt;</code> vorhanden wäre, würde eine IAL Syntax nicht funktionieren. Das hier:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bitte drücke jetzt die Tastenkombination ⌃{:.keycap}A{:.keycap} und dann noch die K{:.keycap}-Taste.
</code></pre></div></div>

<p>… klappt also im Umfeld GitHub Pages / Jekyll / Kramdown <em>nicht</em>.</p>

<h2 id="bonus-apple-sonderzeichen">Bonus: Apple Sonderzeichen</h2>
<p>Oft müssen für Tastenkombinationen ja zusätzliche Umschalttasten bzw. Modifier gedrückt gehalten werden. Da gibt es in der Apple Welt ein paar besondere Zeichen. Wie man diese und generell alle Unicode Zeichen am Mac eingibt, <a href="https://blog.metawops.de/mac-tipps/Unicode-Zeichen-am-Mac-eingeben/">dazu habe ich auch einen Blog Post geschrieben</a>.</p>

<p class="qed">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="markdown" /><category term="css" /><category term="keycaps" /><category term="kramdown" /><category term="ial" /><summary type="html"><![CDATA[Wir lernen, wie man in seinen Markdown Blog Posts Tastendrücke hübsch gestalten kann.]]></summary></entry><entry><title type="html">Logarithmische Skalen und geometrisches Mittel</title><link href="https://blog.metawops.de/mathematik/Logarithmische-Skala-Mitte/" rel="alternate" type="text/html" title="Logarithmische Skalen und geometrisches Mittel" /><published>2025-07-26T00:00:00+00:00</published><updated>2025-07-27T00:00:00+00:00</updated><id>https://blog.metawops.de/mathematik/Logarithmische-Skala-Mitte</id><content type="html" xml:base="https://blog.metawops.de/mathematik/Logarithmische-Skala-Mitte/"><![CDATA[<p>Wenn man sich – so wie ich derzeit – auf eine Amateurfunkprüfung vorbereitet, stolpert man auch über das ein oder andere Diagramm mit logarithmischen Achsen. Ein Beispiel ist die Grafik zum Thema Kabeldämpfungen, bei der sowohl die x-, als auch die y-Achsen logarithmisch sind:</p>

<p><img src="/assets/images/daempfungsdiagramm.png" alt="Kabeldämpfungsdiagramm" /></p>

<h2 id="zwischen-zwei-werten-liegt">Zwischen zwei Werten liegt?</h2>
<p>Neulich stellte sich mir die Frage, welcher Wert wohl auf der x-Achse zwischen der Markierung 50 und der Markierung 100 genau liegt?</p>

<p>Bei einer “normalen”, linearen Skala ist das einfach und jeder weiß sofort: zwischen 50 und 100 liegt 75 – der (arithmetische) Mittelwert, $\frac{50+100}{2}$.</p>

<p>Wie ist das aber bei einer logarithmischen Skala? Die Antwort ist verblüffend: Es ist das <em>geometrische</em> Mittel: $\sqrt{50*100}\approx 70.71$.</p>

<h2 id="logarithmische-skala">Logarithmische Skala</h2>
<p>Eine logarithmische Skala ist eine Skala, bei der die Abstände auf der Achse nicht linearen, sondern multiplikativen Beziehungen entsprechen. Das bedeutet, dass gleiche Abstände auf der Skala gleichen Verhältnissen oder Faktoren entsprechen, anstatt gleichen Differenzen.</p>

<p>Beispiel: Auf einer linearen Skala ist der Abstand zwischen 1 und 2 derselbe wie zwischen 2 und 3 (Differenz von 1). Auf einer logarithmischen Skala ist der Abstand zwischen 1 und 10 derselbe wie zwischen 10 und 100 (Faktor von 10).</p>

<p>Mathematisch gesehen wird ein Wert $x$ auf einer logarithmischen Skala durch seinen Logarithmus $log(x)$ dargestellt. Der Abstand zwischen zwei Punkten $x_1$ und $x_2$ auf der logarithmischen Skala ist proportional zu $log(x_2)−log(x_1)$.</p>

<h2 id="herleitung-geometrisches-mittel">Herleitung geometrisches Mittel</h2>
<p>Nehmen wir an, wir haben zwei Punkte auf einer logarithmischen Skala, $A$ und $B$. Wir suchen einen Punkt $M$, der genau in der Mitte zwischen $A$ und $B$ liegt. Auf einer linearen Skala würde der Mittelpunkt $M_{linear}$ durch den arithmetischen Mittelwert gefunden:
\(M_{linear} = \frac{A+B}{2}\)</p>

<p>Auf einer <em>logarithmischen</em> Skala ist der “Abstand” zwischen den Punkten jedoch durch die Logarithmen ihrer Werte definiert. Wenn $M$ der Mittelpunkt zwischen $A$ und $B$ auf der logarithmischen Skala ist, dann muss der logarithmische Abstand von $A$ zu $M$ gleich dem logarithmischen Abstand von $M$ zu $B$ sein.</p>

<p>Das bedeutet:
\(log(M)−log(A)=log(B)−log(M)\)</p>

<p>Jetzt können wir diese Gleichung nach $M$ auflösen:</p>

\[\begin{align*}
&amp;                \qquad  &amp; log(M) - log(A)         &amp;=\; log(B) - log(M)       &amp;&amp; \quad |\, +log(M) \\
&amp;\Leftrightarrow \qquad  &amp; 2 \cdot log(M) - log(A) &amp;=\; log(B)                &amp;&amp; \quad |\, +log(A) \\
&amp;\Leftrightarrow \qquad  &amp; 2 \cdot log(M)          &amp;=\; log(A) + log(B)       &amp;&amp; \quad |\, \text{1. Logarithmengesetz} \\
&amp;\Leftrightarrow \qquad  &amp; 2 \cdot log(M)          &amp;=\; log(A \cdot B)        &amp;&amp; \quad |\, \text{3. Logarithmengesetz} \\
&amp;\Leftrightarrow \qquad  &amp; log(M^2)                &amp;=\; log(A \cdot B)        &amp;&amp; \quad |\, 10^{x} \\
&amp;\Leftrightarrow \qquad  &amp; M^2                     &amp;=\; A \cdot B             &amp;&amp; \quad |\, \sqrt{} \\
&amp;\Rightarrow \qquad  &amp; M                       &amp;=\; \sqrt{A \cdot B}      &amp;&amp;
\end{align*}\]

<p>Jetzt können wir also leicht immer die Mitte zwischen zwei Markierungen auf logarithmischen Achsen finden.</p>

<p>Noch ein Beispiel zur Grafik oben: Genau auf der halben Strecke zwischen 100 und 200 auf der y-Achse liegt also der Wert $\sqrt{100\cdot200}\approx 141.4$.</p>

<p>Auf der x-Achse ist zwischen 100 und 200 die 145 markiert – wenn man <em>genau</em> hinschaut, sieht man auch, dass der 145er Strich nicht exakt in der Mitte zwischen 100 und 200 liegt, sondern korrekterweise einen Hauch weiter rechts.</p>

<p style="text-align: right">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="mathematik" /><category term="logarithmus" /><category term="mittelwert" /><summary type="html"><![CDATA[Interessant, was auf halber Strecke bei logarithmischen Skalen liegt!]]></summary></entry><entry><title type="html">Audio Test</title><link href="https://blog.metawops.de/blog/Audio-Test/" rel="alternate" type="text/html" title="Audio Test" /><published>2025-07-25T00:00:00+00:00</published><updated>2025-07-25T00:00:00+00:00</updated><id>https://blog.metawops.de/blog/Audio-Test</id><content type="html" xml:base="https://blog.metawops.de/blog/Audio-Test/"><![CDATA[<p>Hier ein kleiner Audioschnipsel für <a href="https://de.wikipedia.org/wiki/Autonomous_Sensory_Meridian_Response">ASMR</a> Fans …</p>

<audio controls="">
   <source src="/assets/audio/gehen-auf-laub.mp3" type="audio/mpeg" />
   Scheinbar kann Dein Browser den an dieser Stelle eigentlich eingebetteten Audio Player nicht rendern. :-( 
</audio>

<p>Für mich nur ein Test, ob und wie man Audio in seine Blog Posts einbetten kann. Das eröffnet dann z.B. auch das Unterbringen von Podcast Episoden hier auf dem Blog.</p>

<p>Man schreibt Blog Posts hier ja in Markdown, aber das bietet von Haus aus keine Syntax zur Einbettung von Audio (und auch nicht für Video). Zum Glück kann man ja aber in Markdown Dateien auch jederzeit HTML Code unterbringen. Und genau für solche Fälle muss man das dann auch mal tun.</p>

<p>Die HTML Syntax zum Einbetten des Audio-Schnipsels oben in der Markdown Datei für diesen Blog Post sieht dann so aus:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;audio</span> <span class="na">controls</span><span class="nt">&gt;</span>
   <span class="nt">&lt;source</span> <span class="na">src=</span><span class="s">"/assets/audio/gehen-auf-laub.mp3"</span> <span class="na">type=</span><span class="s">"audio/mpeg"</span><span class="nt">&gt;</span>
   Scheinbar kann Dein Browser den an dieser Stelle eigentlich eingebetteten Audio Player nicht rendern. :-( 
<span class="nt">&lt;/audio&gt;</span>
</code></pre></div></div>

<p style="text-align: right">🔲</p>]]></content><author><name>Stefan Wolfrum</name></author><category term="blog" /><category term="audio" /><category term="podcast" /><summary type="html"><![CDATA[Nur ein kleiner Test, ob/wie das Einbetten von Audio funktioniert.]]></summary></entry></feed>