<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Humanitats Digitals |</title><link>https://clementgodbarge.com/ca/category/humanitats-digitals/</link><atom:link href="https://clementgodbarge.com/ca/category/humanitats-digitals/index.xml" rel="self" type="application/rss+xml"/><description>Humanitats Digitals</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>ca</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Humanitats Digitals</title><link>https://clementgodbarge.com/ca/category/humanitats-digitals/</link></image><item><title>tei-mcp v0.3: codificar en TEI sense reescriure la font</title><link>https://clementgodbarge.com/ca/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Quan
, l’objectiu
era evitar que els assistents d’IA al·lucinessin marcatge TEI. L’ancoratge a
l’esquema en va resoldre una part: amb accés directe, mitjançant eines, a
l’especificació P5, el model ja no ha d’endevinar què significa un element ni
quins atributs accepta. El resultat valida.&lt;/p&gt;
&lt;p&gt;Però en la codificació TEI l’al·lucinació té dues cares, i l’esquema només
n’atrapa una. Validar contra l’especificació et diu que el &lt;em&gt;marcatge&lt;/em&gt; està ben
format. No diu res del &lt;em&gt;text&lt;/em&gt; que aquest marcatge embolcalla. I és allà – en el
text mateix – on viuen les al·lucinacions més perjudicials. La composició per
intervals blocats (&lt;em&gt;span-locked composition&lt;/em&gt;), la novetat estrella de la v0.3,
està dissenyada precisament per evitar-les.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Index&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#lallucinació-que-lesquema-no-pot-atrapar"&gt;L’al·lucinació que l’esquema no pot atrapar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#la-composició-per-intervals-blocats"&gt;La composició per intervals blocats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#què-és-i-què-no-és"&gt;Què és, i què no és&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#per-què-importa-més-enllà-de-la-tei"&gt;Per què importa més enllà de la TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#obtenir-lactualització"&gt;Obtenir l’actualització&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="lallucinació-que-lesquema-no-pot-atrapar"&gt;L’al·lucinació que l’esquema no pot atrapar&lt;/h2&gt;
&lt;p&gt;Demana a un model que codifiqui una carta francesa del segle XVI i sovint et
tornarà un document TEI d’aspecte impecable. La capçalera és plena, les
etiquetes &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; són al lloc correcte, el &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; està ben format.
Passa’l per &lt;code&gt;validate_document&lt;/code&gt; i el supera.&lt;/p&gt;
&lt;p&gt;Després compara el cos amb la font.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; s’ha convertit en &lt;code&gt;même&lt;/code&gt;. Una coma ha emigrat. &lt;code&gt;luy&lt;/code&gt; s’ha modernitzat
silenciosament en &lt;code&gt;lui&lt;/code&gt;. Una frase difícil de llegir al manuscrit ha estat
«corregida» cap a alguna cosa més neta. Cap d’aquests canvis no s’havia demanat.
Cap no està assenyalat. El document és vàlid segons l’esquema i discretament
erroni.&lt;/p&gt;
&lt;p&gt;En un flux de treball arxivístic – on el text codificat esdevé el registre
permanent de què depenen els lectors, els índexs de cerca i les citacions –
aquest és el mode de fallada que més importa. Una etiqueta mal formada és una
molèstia. Una grafia modernitzada que ningú no detecta durant cinc anys és una
corrupció.&lt;/p&gt;
&lt;h2 id="la-composició-per-intervals-blocats"&gt;La composició per intervals blocats&lt;/h2&gt;
&lt;p&gt;La nova versió (v0.3) incorpora un mecanisme de prevenció d’al·lucinacions que
apunta directament a aquest mode de fallada. L’objectiu de disseny és fer que
les al·lucinacions en el cos del text siguin impossibles per construcció, no
merament improbables.&lt;/p&gt;
&lt;p&gt;La idea és senzilla: &lt;strong&gt;el model no escriu mai el cos del text&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En lloc d’això, el flux de treball és el següent:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El model crida &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; i rep el text pla de la font com
una cadena immutable.&lt;/li&gt;
&lt;li&gt;Per a cada etiqueta que vol aplicar, crida
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt;, i registra així
un element TEI sobre un interval de caràcters de la font.&lt;/li&gt;
&lt;li&gt;Quan ha acabat, crida &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. El servidor intercala les
etiquetes registrades amb el text pla original, genera la TEI final i, tot
seguit, verifica &lt;em&gt;byte a byte&lt;/em&gt; que el contingut textual pla del document
generat és igual a la font.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si els bytes coincideixen, el document es retorna. Si no – si les etiquetes del
model impliquen d’alguna manera un cos que difereix de la font encara que sigui
en un sol caràcter –, &lt;code&gt;compose()&lt;/code&gt; llança un error en lloc de retornar un document
corromput.&lt;/p&gt;
&lt;p&gt;No hi ha cap camí en aquest flux de treball pel qual el model produeixi un
document TEI amb un cos de text diferent de la font. L’invariant és mecànic, no
conductual. No cal confiar que el model no al·lucini; cal confiar en una
comprovació &lt;code&gt;==&lt;/code&gt; entre dues cadenes de bytes.&lt;/p&gt;
&lt;h2 id="què-és-i-què-no-és"&gt;Què és, i què no és&lt;/h2&gt;
&lt;p&gt;La composició per intervals blocats és &lt;strong&gt;complementària&lt;/strong&gt; de l’ancoratge a
l’esquema, no el substitueix. Les eines d’ancoratge a l’esquema
(&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;, &lt;code&gt;valid_children&lt;/code&gt; i la resta de les setze
originals) ajuden el model a produir una TEI &lt;em&gt;vàlida&lt;/em&gt;. La composició per
intervals blocats garanteix que el cos del text dins d’aquesta TEI és &lt;em&gt;fidel&lt;/em&gt; a
la font. Un flux de codificació apte per al desplegament ha de satisfer tots dos
eixos, i ara un sol servidor els cobreix tots dos.&lt;/p&gt;
&lt;p&gt;Tampoc no és una vareta màgica que ho arregli tot. &lt;code&gt;compose()&lt;/code&gt; encara no
comprova que les etiquetes registrades siguin admissibles segons una
personalització ODD carregada: això vindrà més endavant. Les etiquetes
registrades viuen a la memòria del procés i no sobreviuen a un reinici. I els
fitxers font han de ser llegibles des d’allà on s’executa el servidor. Tot això
té solució; res d’això no soscava l’invariant central.&lt;/p&gt;
&lt;h2 id="per-què-importa-més-enllà-de-la-tei"&gt;Per què importa més enllà de la TEI&lt;/h2&gt;
&lt;p&gt;El patró es generalitza. Sempre que es demana a un model que anoti, transformi
o embolcalli un fragment de text – i sempre que la integritat del text subjacent
importa més que la capacitat del model per «millorar-lo» – s’hi aplica la
mateixa forma de solució. No demanis al model que torni a teclejar el text.
Demana-li que produeixi instruccions sobre el text, i deixa que un compositor
determinista les apliqui sota un invariant d’igualtat.&lt;/p&gt;
&lt;p&gt;Per a les edicions digitals en concret, això canvia el que es pot demanar
responsablement a un model. La codificació esdevé de cop una tasca que es pot
delegar sense haver de comparar manualment cada resultat amb la font. La màquina
fa el camí avorrit; l’editor revisa el marcatge, no l’ortografia.&lt;/p&gt;
&lt;h2 id="obtenir-lactualització"&gt;Obtenir l’actualització&lt;/h2&gt;
&lt;p&gt;Si ja tens tei-mcp instal·lat:&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;O bé, des de zero:&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;Per fer servir la composició per intervals blocats, apunta el servidor a un
directori de fitxers font en text pla:&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;El nom de cada fitxer, sense l’extensió, esdevé l’identificador del document
(&lt;code&gt;letter_001.txt&lt;/code&gt; → &lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Codi font, documentació completa i notes de disseny de l’invariant:
&lt;/p&gt;</description></item><item><title>Una edició digital d’una altra mena</title><link>https://clementgodbarge.com/ca/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/cavriana-edition/</guid><description>&lt;p&gt;La majoria de fonts primàries no es publiquen mai. El model amb què confiem posar-hi remei, l’edició digital finançada amb subvencions, és massa car, massa centralitzat i massa fràgil per funcionar a gran escala. Acabo de publicar
on explico per què construeixo l’edició crítica de les cartes de Cavriana d’una altra manera: fonts primàries digitalitzades que creixen orgànicament, amb una infraestructura mínima, un manteniment automatitzat, obertes a la col·laboració i tan barates que ni tan sols calen subvencions. És una defensa d’unes humanitats digitals que funcionen tant si hi ha suport institucional com si no.&lt;/p&gt;</description></item><item><title>tei-mcp: la TEI P5 per als agents d’IA</title><link>https://clementgodbarge.com/ca/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/tei-mcp/</guid><description>&lt;p&gt;Qui hagi fet servir un assistent de programació amb IA per escriure XML TEI
probablement s’haurà adonat que s’equivoca. Apareixen elements on no toca.
S’inventen atributs. Les regles d’imbricació s’ignoren. El model té una idea
aproximada de quin aspecte té la TEI, però cap coneixement fiable de l’especificació.&lt;/p&gt;
&lt;p&gt;tei-mcp ho resol donant als agents d’IA un accés directe, mitjançant eines,
a les directrius de la TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Index&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#què-és-mcp"&gt;Què és MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#què-fa-tei-mcp"&gt;Què fa tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#per-què-importa"&gt;Per què importa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#per-començar"&gt;Per començar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="què-és-mcp"&gt;Què és MCP?&lt;/h2&gt;
&lt;p&gt;El
(MCP) és un estàndard
obert que permet a les aplicacions d’IA connectar-se a fonts de dades i eines
externes. Pensa-hi com en un port USB per a la IA: un únic protocol amb què
qualsevol client compatible – Claude, Cursor, Windsurf i d’altres – pot
endollar-se a serveis especialitzats.&lt;/p&gt;
&lt;p&gt;Un servidor MCP exposa &lt;em&gt;eines&lt;/em&gt; que la IA pot invocar durant una conversa.
En lloc de refiar-se de les dades d’entrenament memoritzades, el model pot
consultar una font viva i autoritzada.&lt;/p&gt;
&lt;h2 id="què-fa-tei-mcp"&gt;Què fa tei-mcp&lt;/h2&gt;
&lt;p&gt;tei-mcp analitza l’especificació ODD de la TEI P5 i exposa 16 eines que cobreixen
les preguntes més habituals que es faria un editor o un codificador:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Què és aquest element?&lt;/strong&gt; Consulta qualsevol element, classe, macro o mòdul
pel nom, sense distingir majúscules i amb suggeriments en cas d’errata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quins atributs admet?&lt;/strong&gt; Resol els atributs al llarg de tota la jerarquia
de classes: primer els locals, després els heretats, per ordre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Què hi pot anar a dins?&lt;/strong&gt; Expandeix els models de contingut en arbres
estructurats, o obtén una llista plana de fills vàlids.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aquest element pot anar aquí?&lt;/strong&gt; Comprova la imbricació pare-fill, o traça
l’accessibilitat a través de tota la jerarquia d’elements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El meu document és vàlid?&lt;/strong&gt; Valida un fitxer XML TEI segons l’especificació:
models de contingut, valors d’atribut, llistes de valors tancades, integritat
de les referències i avisos d’obsolescència.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I l’esquema del meu projecte?&lt;/strong&gt; Carrega un fitxer de personalització ODD per
restringir tot l’anterior al subconjunt específic de la TEI que fa servir el teu projecte.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-què-importa"&gt;Per què importa&lt;/h2&gt;
&lt;p&gt;Codificar en TEI exigeix consultar constantment les directrius. Els codificadors
experimentats interioritzen els patrons més comuns, però fins i tot ells han de
comprovar l’especificació quan es tracta d’elements menys familiars o de models
de contingut complexos. Per als assistents d’IA, que no tenen cap coneixement
interioritzat d’aquesta mena, el problema és pitjor: al·lucinen un marcatge
d’aparença plausible però incorrecte.&lt;/p&gt;
&lt;p&gt;Amb tei-mcp, la IA no ha d’endevinar res. Pot buscar la resposta a l’especificació
abans d’escriure ni un sol parèntesi angular. El resultat és un marcatge conforme
a la TEI P5, o a la personalització ODD del teu projecte.&lt;/p&gt;
&lt;h2 id="per-començar"&gt;Per començar&lt;/h2&gt;
&lt;p&gt;Instal·la’l des de 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;Després, afegeix-lo a la configuració del teu client MCP:&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;El servidor descarrega l’especificació de la TEI la primera vegada que s’executa
i funciona amb qualsevol client compatible amb MCP.&lt;/p&gt;
&lt;p&gt;Codi font i documentació completa:
&lt;/p&gt;</description></item><item><title>Ensenyar el sistema binari amb l’emulador de telègraf ITA2</title><link>https://clementgodbarge.com/ca/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/baudot/</guid><description>&lt;h2 id="fer-tangibles-els-conceptes-abstractes"&gt;Fer tangibles els conceptes abstractes&lt;/h2&gt;
&lt;p&gt;Aquest emulador de l’ITA2 és una eina docent pràctica. En fer visibles i interactius uns conceptes de codificació que d’entrada són abstractes, introdueix els estudiants a una noció clau de la informàtica i de les telecomunicacions: la representació binària, és a dir, com un text es converteix en seqüències d’uns i de zeros.
Sovint ho ensenyem de manera abstracta; veure aparèixer els forats de debò ajuda els estudiants a entendre com un sistema físic pot representar informació digital.
&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="context-històric-del-telègraf-a-la-informàtica"&gt;Context històric: del telègraf a la informàtica&lt;/h2&gt;
&lt;p&gt;El codi ITA2 (Alfabet Telegràfic Internacional núm. 2), conegut també com a codi Baudot-Murray, es va desenvolupar als anys vint del segle XX com un refinament del codi telegràfic original que Émile Baudot havia ideat als anys setanta del segle XIX. Aquests primers sistemes de telecomunicació van influir directament en l’evolució posterior de la informàtica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L’esquema de codificació de 5 bits va ser un dels primers exemples de codificació de caràcters&lt;/li&gt;
&lt;li&gt;Les limitacions del joc de caràcters (només 32 combinacions possibles amb 5 bits) van donar lloc a l’enginyós mecanisme de canvi LLETRES/XIFRES&lt;/li&gt;
&lt;li&gt;El sistema es va fer servir en els teletips fins ben entrat el segle XX&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aprendre-les-màquines-destats-jugant"&gt;Aprendre les màquines d’estats jugant&lt;/h2&gt;
&lt;p&gt;El mecanisme de canvi LLETRES/XIFRES introdueix les màquines d’estats de manera natural. Tot experimentant, els estudiants descobreixen que un mateix patró pot representar caràcters diferents segons el mode actiu. Aquesta experiència directa amb la codificació basada en estats els prepara per a conceptes informàtics més complexos.
Per exemple, el patró de bits &lt;code&gt;00011&lt;/code&gt; representa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La lletra «A» en mode LLETRES&lt;/li&gt;
&lt;li&gt;El número «1» en mode XIFRES
Aquesta doble interpretació segons l’estat és un principi fonamental de com els ordinadors treballen amb les dades.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="activitats-per-a-laula"&gt;Activitats per a l’aula&lt;/h2&gt;
&lt;p&gt;Algunes maneres d’incorporar l’emulador de l’ITA2 a la docència:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Repte de desxifratge&lt;/strong&gt;: fer que els estudiants descodifiquin missatges codificats en patrons ITA2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codificació eficient&lt;/strong&gt;: discutir per què el mecanisme de canvi era important per estalviar amplada de banda&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evolució de la codificació&lt;/strong&gt;: comparar el codi de 5 bits de l’ITA2 amb l’ASCII (7 bits) i amb Unicode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Informàtica física&lt;/strong&gt;: relacionar aquest sistema històric amb microcontroladors moderns com Arduino&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="avantatges-per-a-laccessibilitat"&gt;Avantatges per a l’accessibilitat&lt;/h2&gt;
&lt;p&gt;Més enllà de l’interès històric, aquest enfocament ajuda estudiants amb estils d’aprenentatge diferents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Els aprenents visuals veuen els patrons&lt;/li&gt;
&lt;li&gt;Els aprenents cinestèsics interactuen directament amb el procés de codificació&lt;/li&gt;
&lt;li&gt;Els pensadors conceptuals poden explorar els aspectes matemàtics de la teoria de la informació&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="detalls-dimplementació"&gt;Detalls d’implementació&lt;/h2&gt;
&lt;p&gt;L’emulador està escrit en JavaScript i s’integra fàcilment en qualsevol plataforma d’aprenentatge en línia. El codi és modular i es pot adaptar a contextos docents diversos.
Pots consultar el codi font i provar l’emulador tu mateix a:
&lt;/p&gt;</description></item></channel></rss>