<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Digital Humanities |</title><link>https://clementgodbarge.com/de/category/digital-humanities/</link><atom:link href="https://clementgodbarge.com/de/category/digital-humanities/index.xml" rel="self" type="application/rss+xml"/><description>Digital Humanities</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>de-de</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Digital Humanities</title><link>https://clementgodbarge.com/de/category/digital-humanities/</link></image><item><title>tei-mcp v0.3: TEI kodieren, ohne die Quelle anzutasten</title><link>https://clementgodbarge.com/de/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Als ich
, ging es darum,
KI-Assistenten das Halluzinieren von TEI-Markup abzugewöhnen. Die Verankerung
im Schema (Schema Grounding) hat einen Teil des Problems gelöst: Mit direktem,
werkzeuggestütztem Zugriff auf die P5-Spezifikation muss das Modell nicht mehr
raten, was ein Element bedeutet oder welche Attribute es zulässt. Die Ausgabe
validiert.&lt;/p&gt;
&lt;p&gt;Nur hat die Halluzination beim TEI-Kodieren zwei Gesichter, und das Schema
erkennt bloß eines davon. Die Validierung gegen die Spezifikation verrät, dass
das &lt;em&gt;Markup&lt;/em&gt; in Ordnung ist; über den &lt;em&gt;Text&lt;/em&gt;, den dieses Markup umschließt,
sagt sie nichts. Und genau dort – im Text selbst – hausen die gefährlicheren
Halluzinationen. Span-locked Composition, das Herzstück von v0.3, ist eigens
dafür gebaut, sie zu unterbinden.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Inhaltsverzeichnis&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#die-halluzination-die-dem-schema-entgeht"&gt;Die Halluzination, die dem Schema entgeht&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#span-locked-composition"&gt;Span-locked Composition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#was-das-ist--und-was-nicht"&gt;Was das ist – und was nicht&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#warum-das-über-tei-hinausweist"&gt;Warum das über TEI hinausweist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#das-update-beziehen"&gt;Das Update beziehen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="die-halluzination-die-dem-schema-entgeht"&gt;Die Halluzination, die dem Schema entgeht&lt;/h2&gt;
&lt;p&gt;Lassen Sie ein Modell einen französischen Brief aus dem 16. Jahrhundert
kodieren, und Sie bekommen nicht selten ein TEI-Dokument zurück, das tadellos
aussieht. Der Header ist ausgefüllt, die &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;-Tags sitzen, die
&lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; ist wohlgeformt. Durch &lt;code&gt;validate_document&lt;/code&gt; geschickt, besteht es
die Prüfung.&lt;/p&gt;
&lt;p&gt;Dann vergleichen Sie den Textkörper mit der Quelle.&lt;/p&gt;
&lt;p&gt;Aus &lt;code&gt;mesme&lt;/code&gt; ist &lt;code&gt;même&lt;/code&gt; geworden. Ein Komma ist gewandert. &lt;code&gt;luy&lt;/code&gt; wurde
stillschweigend zu &lt;code&gt;lui&lt;/code&gt; modernisiert. Ein in der Handschrift schwer lesbarer
Satzteil ist zu etwas Glatterem „berichtigt“ worden. Nichts davon war
verlangt, nichts davon wird gemeldet. Das Dokument ist schemavalide – und in
aller Stille falsch.&lt;/p&gt;
&lt;p&gt;In einem archivischen Arbeitsablauf, in dem der kodierte Text zur dauerhaften
Aufzeichnung wird, auf die sich spätere Leser, Suchindizes und Zitate
verlassen, ist das der Fehler, der wirklich zählt. Ein missratenes Tag ist
ärgerlich. Eine modernisierte Schreibung, die fünf Jahre lang niemand
bemerkt, ist eine Textverderbnis.&lt;/p&gt;
&lt;h2 id="span-locked-composition"&gt;Span-locked Composition&lt;/h2&gt;
&lt;p&gt;Die neue Version (v0.3) bringt einen Schutzmechanismus mit, der genau auf
diesen Fehler zielt. Der Anspruch: Halluzinationen im Textkörper sollen nicht
bloß unwahrscheinlich, sondern schon durch die Konstruktion unmöglich sein.&lt;/p&gt;
&lt;p&gt;Die Idee ist einfach: &lt;strong&gt;Das Modell tippt nie Textkörper.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Der Ablauf sieht stattdessen so aus:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Das Modell ruft &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; auf und erhält den Quelltext
als unveränderliche Zeichenkette.&lt;/li&gt;
&lt;li&gt;Für jedes Tag, das es setzen möchte, ruft es
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; auf und
registriert damit ein TEI-Element an einem Zeichenbereich über der Quelle.&lt;/li&gt;
&lt;li&gt;Ist es fertig, ruft es &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; auf. Der Server verschränkt
die registrierten Tags mit dem ursprünglichen Klartext, rendert das
endgültige TEI und prüft dann &lt;em&gt;Byte für Byte&lt;/em&gt;, ob der reine Textinhalt des
gerenderten Dokuments der Quelle gleicht.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Stimmen die Bytes überein, kommt das Dokument zurück. Wenn nicht – wenn die
Tags des Modells auf irgendeinem Weg einen Textkörper ergeben, der auch nur
um ein einziges Zeichen von der Quelle abweicht –, wirft &lt;code&gt;compose()&lt;/code&gt; einen
Fehler, statt ein verdorbenes Dokument auszuliefern.&lt;/p&gt;
&lt;p&gt;Es gibt in diesem Ablauf keinen Pfad, auf dem das Modell ein TEI-Dokument
erzeugen könnte, dessen Textkörper von der Quelle abweicht. Die Invariante
ist mechanisch, nicht eine Frage des Wohlverhaltens. Sie müssen nicht darauf
vertrauen, dass das Modell nicht halluziniert – nur darauf, dass ein
&lt;code&gt;==&lt;/code&gt;-Vergleich zweier Byte-Strings tut, was er soll.&lt;/p&gt;
&lt;h2 id="was-das-ist--und-was-nicht"&gt;Was das ist – und was nicht&lt;/h2&gt;
&lt;p&gt;Span-locked Composition &lt;strong&gt;ergänzt&lt;/strong&gt; das Schema Grounding; sie ersetzt es
nicht. Die Schema-Grounding-Tools (&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;,
&lt;code&gt;valid_children&lt;/code&gt; und die übrigen der ursprünglichen sechzehn) helfen dem
Modell, &lt;em&gt;valides&lt;/em&gt; TEI zu erzeugen. Span-locked Composition garantiert, dass
der Textkörper in diesem TEI der Quelle &lt;em&gt;treu&lt;/em&gt; bleibt. Ein einsatzreifer
Kodierungsablauf muss auf beiden Achsen bestehen – und beide deckt nun ein
einziger Server ab.&lt;/p&gt;
&lt;p&gt;Ein Allheilmittel ist es freilich nicht. &lt;code&gt;compose()&lt;/code&gt; prüft noch nicht, ob die
registrierten Tags nach einer geladenen ODD-Anpassung zulässig sind; das ist
der nächste Schritt. Registrierte Tags leben im Arbeitsspeicher des Prozesses
und überleben keinen Neustart. Und die Quelldateien müssen von dort aus lesbar
sein, wo der Server läuft. All das lässt sich lösen; nichts davon rührt an der
Kerninvariante.&lt;/p&gt;
&lt;h2 id="warum-das-über-tei-hinausweist"&gt;Warum das über TEI hinausweist&lt;/h2&gt;
&lt;p&gt;Das Muster lässt sich verallgemeinern. Wann immer ein Modell einen Text
annotieren, umformen oder umschließen soll – und wann immer die Unversehrtheit
dieses Textes wichtiger ist als die Gabe des Modells, ihn zu „verbessern“ –,
taugt dieselbe Lösung. Lassen Sie das Modell den Text nicht neu tippen. Lassen
Sie es Anweisungen über dem Text erzeugen, und überlassen Sie es einem
deterministischen Composer, sie unter einer Gleichheitsinvariante anzuwenden.&lt;/p&gt;
&lt;p&gt;Für digitale Editionen im Besonderen verschiebt das die Grenze dessen, was man
einem Modell guten Gewissens überlassen kann. Das Kodieren wird mit einem Mal
zu einer Aufgabe, die sich delegieren lässt, ohne dass man jede Ausgabe von
Hand mit der Quelle abgleichen müsste. Die Maschine übernimmt den öden Teil;
die Editorin prüft das Markup, nicht die Rechtschreibung.&lt;/p&gt;
&lt;h2 id="das-update-beziehen"&gt;Das Update beziehen&lt;/h2&gt;
&lt;p&gt;Wenn tei-mcp bereits installiert ist:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oder frisch:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Für Span-locked Composition zeigen Sie dem Server ein Verzeichnis mit
Klartext-Quelldateien:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TEI_MCP_SPAN_SOURCE_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/sources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Dateiname ohne Endung wird zur Dokument-ID (&lt;code&gt;letter_001.txt&lt;/code&gt; →
&lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Quellcode, vollständige Dokumentation und die Entwurfsnotizen zur Invariante:
&lt;/p&gt;</description></item><item><title>Eine digitale Edition anderer Art</title><link>https://clementgodbarge.com/de/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/cavriana-edition/</guid><description>&lt;p&gt;Die meisten Primärquellen werden nie veröffentlicht. Und das Modell, mit dem wir dem abhelfen wollen – die drittmittelfinanzierte digitale Edition –, ist zu teuer, zu zentralisiert und zu zerbrechlich, als dass es in der Breite funktionieren könnte. In
lege ich dar, warum ich die kritische Edition von Cavrianas Briefen anders anlege: als digitalisierte Primärquellen, die organisch wachsen, mit minimaler Infrastruktur auskommen, sich selbsttätig warten, offen für Mitarbeit sind und so wenig kosten, dass es gar keiner Förderung bedarf. Es ist ein Plädoyer für Digital Humanities, die auch ohne institutionellen Rückhalt funktionieren.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 für KI-Agenten</title><link>https://clementgodbarge.com/de/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/tei-mcp/</guid><description>&lt;p&gt;Wer schon einmal einen KI-Programmierassistenten TEI-XML hat schreiben lassen,
weiß, dass dabei Fehler passieren. Elemente stehen, wo sie nicht hingehören;
Attribute werden frei erfunden; Verschachtelungsregeln bleiben unbeachtet. Das
Modell hat eine ungefähre Vorstellung davon, wie TEI aussieht – von der
Spezifikation selbst weiß es nichts Verlässliches.&lt;/p&gt;
&lt;p&gt;tei-mcp schafft hier Abhilfe: Es gibt KI-Agenten direkten, werkzeuggestützten
Zugriff auf die TEI-P5-Guidelines.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Inhaltsverzeichnis&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#was-ist-mcp"&gt;Was ist MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#was-tei-mcp-leistet"&gt;Was tei-mcp leistet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#warum-das-zählt"&gt;Warum das zählt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#erste-schritte"&gt;Erste Schritte&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="was-ist-mcp"&gt;Was ist MCP?&lt;/h2&gt;
&lt;p&gt;Das
(MCP) ist ein
offener Standard, über den sich KI-Anwendungen mit externen Datenquellen und
Werkzeugen verbinden. Man kann es sich als USB-Anschluss für KI vorstellen:
ein einziges Protokoll, mit dem sich jeder kompatible Client – Claude, Cursor,
Windsurf und andere – an spezialisierte Dienste anstöpseln lässt.&lt;/p&gt;
&lt;p&gt;Ein MCP-Server stellt &lt;em&gt;Tools&lt;/em&gt; bereit, die die KI im Laufe eines Gesprächs
aufrufen kann. Statt auf angelerntes Trainingswissen zu vertrauen, kann das
Modell eine aktuelle, maßgebliche Quelle befragen.&lt;/p&gt;
&lt;h2 id="was-tei-mcp-leistet"&gt;Was tei-mcp leistet&lt;/h2&gt;
&lt;p&gt;tei-mcp liest die ODD-Spezifikation von TEI P5 ein und stellt 16 Tools bereit,
die die häufigsten Fragen beantworten, die sich beim Edieren und Kodieren
stellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Was ist dieses Element?&lt;/strong&gt; Nachschlagen von Elementen, Klassen, Makros und
Modulen nach Namen, ohne Rücksicht auf Groß- und Kleinschreibung und mit
Vorschlägen bei Tippfehlern.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Welche Attribute nimmt es?&lt;/strong&gt; Auflösen der Attribute über die gesamte
Klassenhierarchie – zuerst die lokalen, dann der Reihe nach die geerbten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Was darf hinein?&lt;/strong&gt; Entfalten von Inhaltsmodellen zu strukturierten Bäumen
oder eine flache Liste der zulässigen Kindelemente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Darf dieses Element hierhin?&lt;/strong&gt; Prüfen der Eltern-Kind-Verschachtelung oder
Nachverfolgen der Erreichbarkeit durch die gesamte Elementhierarchie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ist mein Dokument valide?&lt;/strong&gt; Validieren einer TEI-XML-Datei gegen die
Spezifikation: Inhaltsmodelle, Attributwerte, geschlossene Wertelisten,
Integrität der Verweise und Warnungen vor veralteten Konstrukten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Und mein Projektschema?&lt;/strong&gt; Laden einer ODD-Anpassung, um all das auf die
projektspezifische Teilmenge von TEI einzuschränken.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="warum-das-zählt"&gt;Warum das zählt&lt;/h2&gt;
&lt;p&gt;Wer in TEI kodiert, schlägt ständig in den Guidelines nach. Erfahrene Encoder
haben die gängigen Muster verinnerlicht, aber selbst sie müssen bei selteneren
Elementen oder verwickelten Inhaltsmodellen in die Spezifikation schauen. Für
KI-Assistenten, denen jedes verinnerlichte Wissen fehlt, ist das Problem
gravierender: Sie halluzinieren Markup, das plausibel aussieht und falsch ist.&lt;/p&gt;
&lt;p&gt;Mit tei-mcp muss die KI nicht raten. Sie kann die Antwort in der Spezifikation
nachschlagen, ehe sie auch nur eine spitze Klammer schreibt. Heraus kommt
Markup, das TEI P5 entspricht – oder der ODD-Anpassung Ihres Projekts.&lt;/p&gt;
&lt;h2 id="erste-schritte"&gt;Erste Schritte&lt;/h2&gt;
&lt;p&gt;Installation von PyPI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Anschließend in die Konfiguration Ihres MCP-Clients eintragen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Beim ersten Start lädt der Server die TEI-Spezifikation herunter; er arbeitet
mit jedem MCP-kompatiblen Client zusammen.&lt;/p&gt;
&lt;p&gt;Quellcode und vollständige Dokumentation:
&lt;/p&gt;</description></item><item><title>Binärcode begreifen mit dem ITA2-Telegrafen-Emulator</title><link>https://clementgodbarge.com/de/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/baudot/</guid><description>&lt;h2 id="abstraktes-greifbar-machen"&gt;Abstraktes greifbar machen&lt;/h2&gt;
&lt;p&gt;Dieser ITA2-Emulator ist ein handfestes Lehrmittel: Er macht sichtbar und anfassbar, was sonst abstrakt bleibt, und führt Studierende so an einen Grundbegriff von Informatik und Telekommunikation heran – die Binärdarstellung, also die Frage, wie aus Text ein Muster aus Einsen und Nullen wird.
Oft lehren wir das rein abstrakt. Wer aber zusieht, wie die Löcher tatsächlich im Streifen erscheinen, begreift viel leichter, dass ein physisches System digitale Information tragen kann.
&lt;div class="baudot-emulator"&gt;
&lt;h2&gt;ITA2 (Baudot-Murray) Telegraph Type Emulator&lt;/h2&gt;
&lt;p&gt;Type a word in the input below to see its representation on the ITA2 tape.&lt;/p&gt;
&lt;div class="baudot-controls"&gt;
&lt;label for="baudot-input"&gt;Type word:&lt;/label&gt;
&lt;input id="baudot-input" class="text-input" size="50" maxlength="50" /&gt;
&lt;button type="button" id="baudot-ltr-button" class="control-button active"&gt;LTR&lt;/button&gt;
&lt;button type="button" id="baudot-fig-button" class="control-button"&gt;FIG&lt;/button&gt;
&lt;/div&gt;
&lt;div class="tape-outer-container"&gt;
&lt;div class="tape-container"&gt;
&lt;table&gt;
&lt;tbody id="baudot-tape"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.baudot-emulator {
--light-color: #f3f4f6;
--dark-color: #1f2937;
--light-alt-color: #e5e7eb;
--dark-alt-color: #374151;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
max-width: 100%;
margin: 2rem 0;
padding: 0;
box-sizing: border-box;
}
.baudot-emulator {
--tape-bg: var(--light-color);
--hole-bg: var(--light-color);
--hole-border: #d1d5db;
--punched-bg: var(--dark-color);
--punched-border: var(--dark-color);
--sprocket-bg: var(--light-color);
--sprocket-border: #9ca3af;
--button-bg: var(--light-color);
--button-bg-active: #d1d5db;
--button-text: var(--dark-color);
--button-border: #d1d5db;
--input-bg: white;
--input-border: #d1d5db;
--input-text: var(--dark-color);
--line-number: #6b7280;
}
html.dark .baudot-emulator,
html[data-theme='dark'] .baudot-emulator,
body.dark .baudot-emulator {
--tape-bg: var(--dark-alt-color);
--hole-bg: var(--dark-alt-color);
--hole-border: #4b5563;
--punched-bg: var(--light-color);
--punched-border: var(--light-color);
--sprocket-bg: var(--dark-alt-color);
--sprocket-border: #9ca3af;
--button-bg: var(--dark-alt-color);
--button-bg-active: #4b5563;
--button-text: var(--light-color);
--button-border: #4b5563;
--input-bg: var(--dark-alt-color);
--input-border: #4b5563;
--input-text: var(--light-color);
--line-number: #9ca3af;
}
.baudot-controls {
margin-bottom: 1.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.baudot-emulator .text-input {
flex: 1;
min-width: 200px;
padding: 0.5rem;
font-size: 1rem;
border: 1px solid var(--input-border);
border-radius: 4px;
background: var(--input-bg);
color: var(--input-text);
}
.baudot-emulator .control-button {
padding: 0.5rem 1rem;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--button-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.baudot-emulator .control-button.active {
background: var(--button-bg-active);
font-weight: bold;
}
.tape-outer-container {
padding: 0;
margin-bottom: 1.5rem;
border-radius: 4px;
overflow: hidden;
}
.tape-container {
width: 100%;
overflow-x: auto;
background: var(--tape-bg);
padding: 1rem 0.5rem;
}
.baudot-emulator table {
border-collapse: collapse;
width: 100%;
table-layout: fixed;
border: none;
}
.baudot-emulator tr {
height: 24px;
border: none;
}
.baudot-emulator td {
border: none;
padding: 0;
}
.baudot-emulator .line-number {
width: 20px;
text-align: center;
color: var(--line-number);
font-size: 0.8rem;
padding: 0 8px 0 0;
font-weight: bold;
}
.baudot-emulator .cell {
position: relative;
width: 20px;
height: 20px;
}
.baudot-emulator .cell-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--hole-bg);
border: 1px solid var(--hole-border);
}
.baudot-emulator .punched .cell-content {
background: var(--punched-bg);
border: 1px solid var(--punched-border);
}
.baudot-emulator .sprocket-hole {
position: absolute;
left: 50%;
top: 100%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--sprocket-bg);
border: 1px solid var(--sprocket-border);
z-index: 2;
}
&lt;/style&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded', function() {
initBaudotEmulator();
});
function initBaudotEmulator() {
if (!document.getElementById('baudot-input')) return;
const textInput = document.getElementById('baudot-input');
const tape = document.getElementById('baudot-tape');
const ltrButton = document.getElementById('baudot-ltr-button');
const figButton = document.getElementById('baudot-fig-button');
const ita2Code = {
'A': '00011', 'B': '11001', 'C': '01110', 'D': '01001', 'E': '00001',
'F': '01101', 'G': '11010', 'H': '10100', 'I': '00110', 'J': '01011',
'K': '01111', 'L': '10010', 'M': '11100', 'N': '01100', 'O': '11000',
'P': '10110', 'Q': '10111', 'R': '01010', 'S': '00101', 'T': '10000',
'U': '00111', 'V': '11110', 'W': '10011', 'X': '11101', 'Y': '10101',
'Z': '10001',
'1': '00011', '2': '11001', '3': '01110', '4': '01001', '5': '00001',
'6': '01101', '7': '11010', '8': '10100', '9': '01011', '0': '11000',
'-': '00011', '?': '00100', ':': '01010', '(': '11000', ')': '11101',
'.': '01000', ',': '00010', "'": '10001', '=': '01111', '/': '10011',
'+': '11011', ' ': '00100',
'FIG': '11011', 'LTR': '11111',
};
function generateTape() {
let rows = '';
for (let row = 0; row &lt; 5; row++) {
rows += '&lt;tr&gt;';
rows += `&lt;td class="line-number"&gt;${row + 1}&lt;/td&gt;`;
for (let col = 0; col &lt; 50; col++) {
rows += `&lt;td id="baudot_${row}_${col}" class="cell unpunched"&gt;
&lt;div class="cell-content"&gt;&lt;/div&gt;
${row === 2 ? '&lt;div class="sprocket-hole"&gt;&lt;/div&gt;' : ''}
&lt;/td&gt;`;
}
rows += '&lt;/tr&gt;';
}
tape.innerHTML = rows;
}
function updateITA2Code(word) {
clearTape();
word = word.toUpperCase();
let tapePosition = 0;
let currentCharType = 'LTR';
ltrButton.classList.add('active');
figButton.classList.remove('active');
for (let i = 0; i &lt; word.length; i++) {
const char = word[i];
let code = ita2Code[char] || ita2Code[' '];
let requiredCharType = /[A-Z ]/.test(char) ? 'LTR' : 'FIG';
if (requiredCharType !== currentCharType) {
const shiftCode = requiredCharType === 'LTR' ? ita2Code['LTR'] : ita2Code['FIG'];
punchTape(shiftCode, tapePosition++);
currentCharType = requiredCharType;
ltrButton.classList.toggle('active', currentCharType === 'LTR');
figButton.classList.toggle('active', currentCharType === 'FIG');
}
punchTape(code, tapePosition++);
}
}
function punchTape(code, tapePosition) {
if (tapePosition &gt;= 50) return;
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${tapePosition}`);
if (cell) {
cell.className = code[bit] === '1' ? 'cell punched' : 'cell unpunched';
}
}
}
function clearTape() {
for (let i = 0; i &lt; 50; i++) {
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${i}`);
if (cell) {
cell.className = 'cell unpunched';
}
}
}
}
generateTape();
textInput.addEventListener('input', function() {
updateITA2Code(this.value);
});
ltrButton.addEventListener('click', function() {
this.classList.add('active');
figButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
figButton.addEventListener('click', function() {
this.classList.add('active');
ltrButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
if (textInput.value) {
updateITA2Code(textInput.value);
}
}
&lt;/script&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="historischer-hintergrund-vom-telegrafen-zum-computer"&gt;Historischer Hintergrund: Vom Telegrafen zum Computer&lt;/h2&gt;
&lt;p&gt;Der ITA2-Code (Internationales Telegrafenalphabet Nr. 2), auch Baudot-Murray-Code genannt, entstand in den 1920er Jahren als Weiterentwicklung des Telegrafencodes, den Émile Baudot in den 1870er Jahren entworfen hatte. Diese frühen Fernmeldesysteme haben die spätere Entwicklung des Computers unmittelbar geprägt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Das 5-Bit-Schema ist ein frühes Beispiel für Zeichenkodierung&lt;/li&gt;
&lt;li&gt;Weil fünf Bit nur 32 Kombinationen zulassen, brauchte es einen Kunstgriff: die Umschaltung zwischen Buchstaben und Ziffern (LETTERS/FIGURES)&lt;/li&gt;
&lt;li&gt;Fernschreiber arbeiteten mit diesem System bis weit ins 20. Jahrhundert hinein&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="zustandsautomaten-im-spiel-lernen"&gt;Zustandsautomaten im Spiel lernen&lt;/h2&gt;
&lt;p&gt;Mit der LETTERS/FIGURES-Umschaltung ist der Zustandsautomat wie von selbst im Raum. Beim Ausprobieren entdecken die Studierenden, dass ein und dasselbe Muster je nach Modus ein anderes Zeichen bedeutet – eine handfeste Erfahrung mit zustandsabhängiger Kodierung, die den Boden für anspruchsvollere Begriffe der Informatik bereitet.
Das Bitmuster &lt;code&gt;00011&lt;/code&gt; etwa steht für:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;den Buchstaben ‚A‘ im LETTERS-Modus&lt;/li&gt;
&lt;li&gt;die Ziffer ‚1‘ im FIGURES-Modus
Dass die Bedeutung vom Zustand abhängt, gehört zum Kern dessen, wie Computer mit Daten umgehen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="übungen-für-den-unterricht"&gt;Übungen für den Unterricht&lt;/h2&gt;
&lt;p&gt;Einige Vorschläge, wie sich der ITA2-Emulator in die Lehre einbauen lässt:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Code knacken&lt;/strong&gt;: Lassen Sie Studierende Nachrichten entschlüsseln, die als ITA2-Muster vorliegen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sparsam kodieren&lt;/strong&gt;: Erörtern Sie, warum die Umschaltung wichtig war, um Bandbreite zu sparen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kodierung im Wandel&lt;/strong&gt;: Stellen Sie dem 5-Bit-Code von ITA2 ASCII (7 Bit) und Unicode gegenüber&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Physical Computing&lt;/strong&gt;: Schlagen Sie die Brücke von diesem historischen System zu heutigen Mikrocontrollern wie dem Arduino&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="ein-gewinn-für-die-zugänglichkeit"&gt;Ein Gewinn für die Zugänglichkeit&lt;/h2&gt;
&lt;p&gt;Abgesehen vom historischen Reiz kommt dieser Zugang Studierenden mit ganz unterschiedlichen Lernweisen entgegen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wer visuell lernt, sieht die Muster&lt;/li&gt;
&lt;li&gt;Wer über die Hand lernt, greift unmittelbar in den Kodierungsvorgang ein&lt;/li&gt;
&lt;li&gt;Wer begrifflich denkt, kann die mathematische Seite der Informationstheorie erkunden&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="zur-implementierung"&gt;Zur Implementierung&lt;/h2&gt;
&lt;p&gt;Der Emulator ist in JavaScript geschrieben und lässt sich ohne Umstände in jede webbasierte Lernplattform einbinden. Der Code ist modular aufgebaut und für verschiedene Unterrichtssituationen anpassbar.
Quellcode und Emulator zum Selbstausprobieren finden Sie hier:
&lt;/p&gt;</description></item></channel></rss>