<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Digital Humaniora |</title><link>https://clementgodbarge.com/sv/category/digital-humaniora/</link><atom:link href="https://clementgodbarge.com/sv/category/digital-humaniora/index.xml" rel="self" type="application/rss+xml"/><description>Digital Humaniora</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>sv-se</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Digital Humaniora</title><link>https://clementgodbarge.com/sv/category/digital-humaniora/</link></image><item><title>tei-mcp v0.3: TEI-kodning utan att skriva om källan</title><link>https://clementgodbarge.com/sv/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;När jag
var målet att hindra
AI-assistenter från att hallucinera TEI-uppmärkning. Schemaförankringen
löste en del av problemet: med direkt, verktygsbaserad tillgång till
P5-specifikationen behöver modellen inte längre gissa vad ett element
betyder eller vilka attribut det tar. Resultatet validerar.&lt;/p&gt;
&lt;p&gt;Men hallucinationen har två ansikten i TEI-kodning, och schemat fångar
bara det ena. Att validera mot specifikationen säger dig att &lt;em&gt;uppmärkningen&lt;/em&gt;
är välformad. Det säger inget om den &lt;em&gt;text&lt;/em&gt; uppmärkningen omsluter. Och
det är där – i själva texten – de mer skadliga hallucinationerna håller till.
Spannlåst komposition (span-locked composition), huvudnyheten i v0.3, är
utformad just för att förhindra dem.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Innehållsförteckning&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#hallucinationen-som-schemat-inte-kan-fånga"&gt;Hallucinationen som schemat inte kan fånga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#spannlåst-komposition"&gt;Spannlåst komposition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#vad-det-är-och-vad-det-inte-är"&gt;Vad det är, och vad det inte är&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#varför-det-spelar-roll-bortom-tei"&gt;Varför det spelar roll bortom TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hämta-uppdateringen"&gt;Hämta uppdateringen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="hallucinationen-som-schemat-inte-kan-fånga"&gt;Hallucinationen som schemat inte kan fånga&lt;/h2&gt;
&lt;p&gt;Be en modell koda ett franskt brev från 1500-talet, och du får ofta tillbaka
ett TEI-dokument som ser oklanderligt ut. Headern är ifylld,
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;-taggarna sitter rätt, &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; är välformad. Kör det genom
&lt;code&gt;validate_document&lt;/code&gt; och det går igenom.&lt;/p&gt;
&lt;p&gt;Jämför sedan brödtexten med källan.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; har blivit &lt;code&gt;même&lt;/code&gt;. Ett komma har flyttat på sig. &lt;code&gt;luy&lt;/code&gt; har i tysthet
moderniserats till &lt;code&gt;lui&lt;/code&gt;. En sats som var svårläst i handskriften har
”rättats” till något prydligare. Ingen av ändringarna var begärd. Ingen av
dem flaggas. Dokumentet är schemagiltigt och tyst felaktigt.&lt;/p&gt;
&lt;p&gt;För ett arkivflöde – där den kodade texten blir den permanenta post som
senare läsare, sökindex och citeringar förlitar sig på – är detta den
typ av fel som betyder mest. En felformad tagg är irriterande. En moderniserad
stavning som ingen upptäcker på fem år är en korruption.&lt;/p&gt;
&lt;h2 id="spannlåst-komposition"&gt;Spannlåst komposition&lt;/h2&gt;
&lt;p&gt;Den nya versionen (v0.3) levererar en mekanism mot hallucinationer som
siktar rakt på just den här typen av fel. Designmålet är att göra hallucinationer i
brödtexten omöjliga per konstruktion, inte bara osannolika.&lt;/p&gt;
&lt;p&gt;Idén är enkel: &lt;strong&gt;modellen skriver aldrig brödtext&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I stället ser arbetsflödet ut så här:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Modellen anropar &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; och får källans råtext som
en oföränderlig sträng.&lt;/li&gt;
&lt;li&gt;För varje tagg den vill sätta anropar den
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; – och
registrerar därmed ett TEI-element över ett teckenintervall i källan.&lt;/li&gt;
&lt;li&gt;När den är klar anropar den &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. Servern flätar in
de registrerade taggarna i den ursprungliga råtexten, renderar den
färdiga TEI-filen och kontrollerar sedan &lt;em&gt;byte för byte&lt;/em&gt; att det
renderade dokumentets rena textinnehåll är identiskt med källan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Stämmer bytena kommer dokumentet tillbaka. Gör de inte det – om modellens
taggar på något sätt implicerar en brödtext som avviker från källan med ett
enda tecken – kastar &lt;code&gt;compose()&lt;/code&gt; ett fel i stället för att returnera ett
korrupt dokument.&lt;/p&gt;
&lt;p&gt;Det finns ingen väg genom det här arbetsflödet där modellen producerar ett
TEI-dokument vars brödtext avviker från källan. Invarianten är mekanisk,
inte beteendemässig. Du behöver inte lita på att modellen låter bli att
hallucinera; du behöver lita på en &lt;code&gt;==&lt;/code&gt;-jämförelse mellan två bytesträngar.&lt;/p&gt;
&lt;h2 id="vad-det-är-och-vad-det-inte-är"&gt;Vad det är, och vad det inte är&lt;/h2&gt;
&lt;p&gt;Spannlåst komposition är ett &lt;strong&gt;komplement&lt;/strong&gt; till schemaförankringen, inte en
ersättning. Schemaverktygen (&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;,
&lt;code&gt;valid_children&lt;/code&gt; och resten av de ursprungliga sexton) hjälper modellen att
producera &lt;em&gt;giltig&lt;/em&gt; TEI. Spannlåst komposition garanterar att brödtexten
inuti den TEI-filen är &lt;em&gt;trogen&lt;/em&gt; källan. Ett kodningsflöde som ska kunna tas
i drift måste uppfylla båda kraven, och nu täcks båda av en och samma
server.&lt;/p&gt;
&lt;p&gt;Det är heller inget trollspö som fixar allt. &lt;code&gt;compose()&lt;/code&gt; kontrollerar ännu
inte att de registrerade taggarna är tillåtna enligt en laddad
ODD-anpassning – det kommer i en uppföljning. Registrerade taggar ligger i
processminnet och överlever inte en omstart. Och källfilerna måste vara
läsbara från den plats där servern körs. Allt detta går att åtgärda; inget
av det rubbar den centrala invarianten.&lt;/p&gt;
&lt;h2 id="varför-det-spelar-roll-bortom-tei"&gt;Varför det spelar roll bortom TEI&lt;/h2&gt;
&lt;p&gt;Mönstret går att generalisera. Varje gång en modell ombeds annotera,
omvandla eller omsluta en text – och varje gång textens integritet väger
tyngre än modellens förmåga att ”förbättra” den – passar samma slags
lösning. Be inte modellen skriva om texten. Be den producera instruktioner
över texten, och låt en deterministisk kompositör tillämpa dem under en
likhetsinvariant.&lt;/p&gt;
&lt;p&gt;För digitala utgåvor i synnerhet förändrar detta vad man med gott samvete
kan be en modell om. Kodningen blir med ett slag en uppgift man kan
delegera utan att manuellt behöva jämföra varje resultat med källan.
Maskinen tar den tråkiga vägen; utgivaren granskar uppmärkningen, inte
stavningen.&lt;/p&gt;
&lt;h2 id="hämta-uppdateringen"&gt;Hämta uppdateringen&lt;/h2&gt;
&lt;p&gt;Har du redan tei-mcp installerat:&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;Eller från början:&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 att använda spannlåst komposition pekar du servern mot en katalog med
källfiler i råtext:&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;Varje fils namnstam blir dess 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;Källkod, fullständig dokumentation och designanteckningarna om invarianten:
&lt;/p&gt;</description></item><item><title>En annan sorts digital utgåva</title><link>https://clementgodbarge.com/sv/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/post/cavriana-edition/</guid><description>&lt;p&gt;De flesta primärkällor blir aldrig utgivna. Den modell vi förlitar oss på för att råda bot på det, anslagsfinansierade digitala utgåvor, är för dyr, för centraliserad och för bräcklig för att fungera i stor skala. Jag har just publicerat
som förklarar varför jag bygger den kritiska utgåvan av Cavrianas brev på ett annat sätt: digitaliserade primärkällor som växer organiskt, med minimal infrastruktur och automatiserat underhåll, öppna för samarbete och så billiga att inga anslag ens behövs. Det är ett argument för en digital humaniora som fungerar oavsett institutionellt stöd.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 för AI-agenter</title><link>https://clementgodbarge.com/sv/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/post/tei-mcp/</guid><description>&lt;p&gt;Har du någon gång låtit en AI-kodassistent skriva TEI-XML har du nog märkt
att den gör fel. Element dyker upp där de inte hör hemma. Attribut hittas på.
Nästlingsreglerna ignoreras. Modellen har en ungefärlig känsla för hur TEI
ser ut, men ingen tillförlitlig kunskap om specifikationen.&lt;/p&gt;
&lt;p&gt;tei-mcp löser det genom att ge AI-agenter direkt, verktygsbaserad tillgång
till riktlinjerna för TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Innehållsförteckning&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#vad-är-mcp"&gt;Vad är MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#vad-tei-mcp-gör"&gt;Vad tei-mcp gör&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#varför-det-spelar-roll"&gt;Varför det spelar roll&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#kom-igång"&gt;Kom igång&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="vad-är-mcp"&gt;Vad är MCP?&lt;/h2&gt;
&lt;p&gt;
(MCP) är en öppen
standard som låter AI-applikationer ansluta till externa datakällor och
verktyg. Tänk på det som en USB-port för AI: ett enda protokoll som låter
vilken kompatibel klient som helst – Claude, Cursor, Windsurf och andra –
koppla in sig på specialiserade tjänster.&lt;/p&gt;
&lt;p&gt;En MCP-server exponerar &lt;em&gt;verktyg&lt;/em&gt; som AI:n kan anropa under ett samtal.
I stället för att förlita sig på memorerade träningsdata kan modellen fråga
en levande, auktoritativ källa.&lt;/p&gt;
&lt;h2 id="vad-tei-mcp-gör"&gt;Vad tei-mcp gör&lt;/h2&gt;
&lt;p&gt;tei-mcp tolkar ODD-specifikationen för TEI P5 och exponerar 16 verktyg som
täcker de vanligaste frågor en utgivare eller kodare ställer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vad är det här elementet?&lt;/strong&gt; Slå upp vilket element, vilken klass, vilket
makro eller vilken modul som helst på namn, med skiftlägesokänslig matchning
och förslag vid felstavning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vilka attribut tar det?&lt;/strong&gt; Lös upp attributen genom hela klasshierarkin –
lokala attribut först, sedan de ärvda i ordning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vad får finnas inuti?&lt;/strong&gt; Expandera innehållsmodeller till strukturerade
träd, eller få en platt lista över giltiga barnelement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Får det här elementet stå här?&lt;/strong&gt; Kontrollera nästlingen förälder–barn,
eller spåra nåbarheten genom hela elementhierarkin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Är mitt dokument giltigt?&lt;/strong&gt; Validera en TEI-XML-fil mot specifikationen:
innehållsmodeller, attributvärden, slutna värdelistor, referensintegritet
och utfasningsvarningar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Och mitt projektschema?&lt;/strong&gt; Ladda en ODD-anpassningsfil för att begränsa
allt ovanstående till ditt projekts specifika delmängd av TEI.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="varför-det-spelar-roll"&gt;Varför det spelar roll&lt;/h2&gt;
&lt;p&gt;TEI-kodning kräver att man ständigt slår i riktlinjerna. Erfarna kodare har
de vanligaste mönstren i ryggmärgen, men även de måste kontrollera
specifikationen för mindre bekanta element eller invecklade innehållsmodeller.
För AI-assistenter, som inte har någon sådan inövad kunskap, är problemet
värre: de hallucinerar fram uppmärkning som ser rimlig ut men är fel.&lt;/p&gt;
&lt;p&gt;Med tei-mcp behöver AI:n inte gissa. Den kan slå upp svaret i specifikationen
innan den skriver en enda vinkelparentes. Resultatet är uppmärkning som följer
TEI P5 – eller ditt projekts ODD-anpassning.&lt;/p&gt;
&lt;h2 id="kom-igång"&gt;Kom igång&lt;/h2&gt;
&lt;p&gt;Installera från 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;Lägg sedan till servern i din MCP-klients konfiguration:&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;Servern laddar ner TEI-specifikationen vid första körningen och fungerar
med vilken MCP-kompatibel klient som helst.&lt;/p&gt;
&lt;p&gt;Källkod och fullständig dokumentation:
&lt;/p&gt;</description></item><item><title>Att lära ut binär kod med ITA2-telegrafemulatorn</title><link>https://clementgodbarge.com/sv/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/post/baudot/</guid><description>&lt;h2 id="att-göra-det-abstrakta-gripbart"&gt;Att göra det abstrakta gripbart&lt;/h2&gt;
&lt;p&gt;Den här ITA2-emulatorn är ett handfast hjälpmedel i undervisningen. Genom att göra abstrakta kodningsbegrepp synliga och interaktiva leder den studenterna fram till ett av datorteknikens och telekommunikationens nyckelbegrepp: den binära representationen – hur text blir mönster av ettor och nollor.
Det brukar vi lära ut abstrakt, men när hålen faktiskt dyker upp på remsan blir det lättare att begripa hur fysiska system kan bära digital information.
&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="historisk-bakgrund-från-telegraf-till-dator"&gt;Historisk bakgrund: från telegraf till dator&lt;/h2&gt;
&lt;p&gt;Koden ITA2 (International Telegraph Alphabet No. 2), även kallad Baudot–Murray-koden, utvecklades på 1920-talet som en förfining av Émile Baudots ursprungliga telegrafkod från 1870-talet. Dessa tidiga telekommunikationssystem påverkade den senare datorutvecklingen direkt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fembitarskodningen var ett tidigt exempel på teckenkodning&lt;/li&gt;
&lt;li&gt;Teckenuppsättningens begränsningar (bara 32 möjliga kombinationer med fem bitar) ledde till den sinnrika skiftmekanismen mellan BOKSTÄVER och SIFFROR (LETTERS/FIGURES)&lt;/li&gt;
&lt;li&gt;Systemet användes för fjärrskrivare långt in på 1900-talet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tillståndsmaskiner-på-lek"&gt;Tillståndsmaskiner på lek&lt;/h2&gt;
&lt;p&gt;Skiftmekanismen mellan BOKSTÄVER och SIFFROR är en naturlig ingång till tillståndsmaskiner. Genom att pröva sig fram upptäcker studenterna att samma mönster kan stå för olika tecken beroende på vilket läge apparaten befinner sig i. Den praktiska erfarenheten av tillståndsberoende kodning förbereder dem för mer avancerade datavetenskapliga begrepp.
Bitmönstret &lt;code&gt;00011&lt;/code&gt; står t.ex. för:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bokstaven ’A’ i BOKSTÄVER-läget&lt;/li&gt;
&lt;li&gt;siffran ’1’ i SIFFROR-läget
Denna dubbla tolkning, styrd av tillståndet, är grundläggande för hur datorer hanterar data.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="övningar-i-klassrummet"&gt;Övningar i klassrummet&lt;/h2&gt;
&lt;p&gt;Några sätt att använda ITA2-emulatorn i undervisningen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kodknäckning&lt;/strong&gt;: låt studenterna avkoda meddelanden skrivna som ITA2-mönster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effektiv kodning&lt;/strong&gt;: diskutera varför skiftmekanismen var viktig för att spara bandbredd&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kodningens utveckling&lt;/strong&gt;: jämför ITA2:s fembitarskod med ASCII (sju bitar) och Unicode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fysisk databehandling&lt;/strong&gt;: koppla det historiska systemet till moderna mikrokontroller som Arduino&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="tillgänglighet"&gt;Tillgänglighet&lt;/h2&gt;
&lt;p&gt;Bortom det historiska intresset passar det här arbetssättet studenter som lär sig på olika sätt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;den som lär visuellt ser mönstren&lt;/li&gt;
&lt;li&gt;den som lär genom att göra griper direkt in i kodningsprocessen&lt;/li&gt;
&lt;li&gt;den som tänker i begrepp kan utforska informationsteorins matematiska sida&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="teknisk-utformning"&gt;Teknisk utformning&lt;/h2&gt;
&lt;p&gt;Emulatorn är skriven i JavaScript och kan enkelt byggas in i vilken webbaserad lärplattform som helst. Koden är modulär och kan anpassas till olika undervisningssammanhang.
Källkoden finns här, och där kan du också pröva emulatorn själv:
&lt;/p&gt;</description></item></channel></rss>