<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nhân Văn Số |</title><link>https://clementgodbarge.com/vi/category/nhan-van-so/</link><atom:link href="https://clementgodbarge.com/vi/category/nhan-van-so/index.xml" rel="self" type="application/rss+xml"/><description>Nhân Văn Số</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>vi-vn</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Nhân Văn Số</title><link>https://clementgodbarge.com/vi/category/nhan-van-so/</link></image><item><title>tei-mcp v0.3: Mã hóa TEI mà không viết lại văn bản gốc</title><link>https://clementgodbarge.com/vi/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/vi/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Khi
, mục tiêu của tôi là chặn các trợ
lý AI bịa ra thẻ đánh dấu TEI. Neo vào lược đồ đã giải quyết được một phần vấn
đề: có trong tay quyền truy cập trực tiếp, qua công cụ, vào đặc tả P5, mô hình
không còn phải đoán một phần tử nghĩa là gì hay nhận những thuộc tính nào. Đầu
ra vượt qua kiểm định.&lt;/p&gt;
&lt;p&gt;Thế nhưng trong mã hóa TEI, bịa đặt có hai bộ mặt, và lược đồ chỉ bắt được một.
Kiểm định theo đặc tả cho bạn biết &lt;em&gt;thẻ đánh dấu&lt;/em&gt; có đúng dạng hay không. Nó
chẳng nói gì về &lt;em&gt;văn bản&lt;/em&gt; mà thẻ ấy bao bọc. Mà chính ở đó – ở bản thân văn bản
– mới là nơi trú ngụ của những bịa đặt tai hại hơn. Ghép khóa theo đoạn, tính
năng chủ đạo của v0.3, được thiết kế riêng để ngăn chặn chúng.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Mục Lục&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#thứ-bịa-đặt-mà-lược-đồ-không-bắt-được"&gt;Thứ bịa đặt mà lược đồ không bắt được&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ghép-khóa-theo-đoạn"&gt;Ghép khóa theo đoạn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#nó-là-gì-và-không-phải-là-gì"&gt;Nó là gì, và không phải là gì&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#vì-sao-điều-này-quan-trọng-vượt-ra-ngoài-tei"&gt;Vì sao điều này quan trọng vượt ra ngoài TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cập-nhật"&gt;Cập nhật&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="thứ-bịa-đặt-mà-lược-đồ-không-bắt-được"&gt;Thứ bịa đặt mà lược đồ không bắt được&lt;/h2&gt;
&lt;p&gt;Hãy yêu cầu một mô hình mã hóa một lá thư tiếng Pháp thế kỷ XVI: bạn thường sẽ
nhận về một tài liệu TEI trông hoàn hảo. Phần đầu được điền đầy đủ, các thẻ
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; đặt đúng chỗ, &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; đúng dạng. Chạy qua &lt;code&gt;validate_document&lt;/code&gt;
– đạt.&lt;/p&gt;
&lt;p&gt;Rồi đem so phần thân với văn bản gốc.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; đã biến thành &lt;code&gt;même&lt;/code&gt;. Một dấu phẩy đã đổi chỗ. &lt;code&gt;luy&lt;/code&gt; bị lặng lẽ hiện đại
hóa thành &lt;code&gt;lui&lt;/code&gt;. Một mệnh đề khó đọc trong bản thảo được &amp;ldquo;sửa&amp;rdquo; thành thứ gì đó
gọn gàng hơn. Không thay đổi nào trong số này được yêu cầu. Không thay đổi nào
được báo. Tài liệu hợp lệ theo lược đồ, và sai một cách lặng lẽ.&lt;/p&gt;
&lt;p&gt;Với quy trình lưu trữ – nơi văn bản đã mã hóa trở thành bản ghi vĩnh viễn mà
người đọc, chỉ mục tìm kiếm và trích dẫn sau này đều dựa vào – đây chính là kiểu
thất bại đáng lo nhất. Một thẻ sai dạng thì gây bực mình. Một chính tả bị hiện
đại hóa mà năm năm sau chẳng ai nhận ra thì là văn bản đã bị làm hỏng.&lt;/p&gt;
&lt;h2 id="ghép-khóa-theo-đoạn"&gt;Ghép khóa theo đoạn&lt;/h2&gt;
&lt;p&gt;Bản phát hành mới (v0.3) đi kèm một cơ chế chống bịa đặt nhắm thẳng vào kiểu thất
bại này. Mục tiêu thiết kế là làm cho việc bịa đặt phần thân văn bản trở thành
bất khả ngay từ cấu trúc, chứ không chỉ là khó xảy ra.&lt;/p&gt;
&lt;p&gt;Ý tưởng rất đơn giản: &lt;strong&gt;mô hình không bao giờ gõ phần thân văn bản&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thay vào đó, quy trình diễn ra như sau:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mô hình gọi &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; và nhận về văn bản gốc thuần dưới
dạng một chuỗi bất biến.&lt;/li&gt;
&lt;li&gt;Với mỗi thẻ muốn áp dụng, nó gọi
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; – đăng ký một
phần tử TEI tại một khoảng ký tự trên văn bản gốc.&lt;/li&gt;
&lt;li&gt;Xong việc, nó gọi &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. Máy chủ đan các thẻ đã ghi nhận
vào văn bản gốc, kết xuất tài liệu TEI cuối cùng, rồi kiểm tra &lt;em&gt;từng byte
một&lt;/em&gt; rằng nội dung văn bản phẳng của tài liệu vừa kết xuất bằng đúng văn
bản gốc.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nếu các byte khớp, tài liệu được trả về. Nếu không – nếu các thẻ của mô hình, vì
lý do nào đó, hàm ý một phần thân khác với bản gốc dù chỉ một ký tự –
&lt;code&gt;compose()&lt;/code&gt; sẽ báo lỗi thay vì trả về một tài liệu đã bị hỏng.&lt;/p&gt;
&lt;p&gt;Không có lối nào trong quy trình này để mô hình tạo ra một tài liệu TEI mà phần
thân khác với văn bản gốc. Bất biến này mang tính cơ học, không phải tính hành
vi. Bạn không cần tin rằng mô hình sẽ không bịa; bạn chỉ cần tin vào một phép
so sánh &lt;code&gt;==&lt;/code&gt; giữa hai chuỗi byte.&lt;/p&gt;
&lt;h2 id="nó-là-gì-và-không-phải-là-gì"&gt;Nó là gì, và không phải là gì&lt;/h2&gt;
&lt;p&gt;Ghép khóa theo đoạn &lt;strong&gt;bổ sung&lt;/strong&gt; cho việc neo vào lược đồ, chứ không thay thế nó.
Các công cụ neo lược đồ (&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;,
&lt;code&gt;valid_children&lt;/code&gt;, cùng phần còn lại của mười sáu công cụ ban đầu) giúp mô hình
tạo ra TEI &lt;em&gt;hợp lệ&lt;/em&gt;. Ghép khóa theo đoạn bảo đảm phần thân văn bản bên trong TEI
ấy &lt;em&gt;trung thành&lt;/em&gt; với bản gốc. Một quy trình mã hóa có thể triển khai thực sự
phải thỏa mãn cả hai trục, và giờ đây cả hai đều được một máy chủ duy nhất đảm
đương.&lt;/p&gt;
&lt;p&gt;Nó cũng không phải là liều thuốc tiên chữa bách bệnh. &lt;code&gt;compose()&lt;/code&gt; chưa kiểm tra
xem các thẻ đã đăng ký có được phép theo một bản tùy biến ODD đã nạp hay không –
đó là việc của bước tiếp theo. Các thẻ đã ghi nhận nằm trong bộ nhớ tiến trình
và không sống sót qua một lần khởi động lại. Và các tệp gốc phải đọc được từ nơi
máy chủ chạy. Tất cả đều có thể khắc phục; không điều nào làm lung lay bất biến
cốt lõi.&lt;/p&gt;
&lt;h2 id="vì-sao-điều-này-quan-trọng-vượt-ra-ngoài-tei"&gt;Vì sao điều này quan trọng vượt ra ngoài TEI&lt;/h2&gt;
&lt;p&gt;Mẫu hình này có thể khái quát hóa. Bất cứ khi nào ta yêu cầu một mô hình chú
giải, biến đổi hay bao bọc một đoạn văn bản – và bất cứ khi nào tính toàn vẹn
của văn bản gốc quan trọng hơn khả năng &amp;ldquo;cải thiện&amp;rdquo; nó của mô hình – thì cùng
một dạng giải pháp đều áp dụng được. Đừng bắt mô hình gõ lại văn bản. Hãy bắt nó
đưa ra chỉ dẫn trên văn bản, rồi để một bộ ghép tất định áp dụng các chỉ dẫn ấy
dưới một bất biến về đẳng thức.&lt;/p&gt;
&lt;p&gt;Riêng với ấn bản kỹ thuật số, điều này thay đổi những gì bạn có thể giao cho mô
hình một cách có trách nhiệm. Mã hóa bỗng trở thành công việc có thể ủy thác mà
không phải tự tay so từng đầu ra với bản gốc. Máy đi con đường tẻ nhạt; người
biên tập duyệt thẻ đánh dấu, chứ không duyệt chính tả.&lt;/p&gt;
&lt;h2 id="cập-nhật"&gt;Cập nhật&lt;/h2&gt;
&lt;p&gt;Nếu bạn đã cài tei-mcp:&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;Hoặc cài mới:&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;Để dùng ghép khóa theo đoạn, hãy trỏ máy chủ tới một thư mục chứa các tệp văn
bản gốc thuần:&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;Phần gốc của tên mỗi tệp trở thành mã tài liệu (&lt;code&gt;letter_001.txt&lt;/code&gt; →
&lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Mã nguồn, tài liệu đầy đủ và ghi chú thiết kế về bất biến:
&lt;/p&gt;</description></item><item><title>Một kiểu ấn bản kỹ thuật số khác</title><link>https://clementgodbarge.com/vi/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/vi/post/cavriana-edition/</guid><description>&lt;p&gt;Phần lớn nguồn sử liệu gốc chẳng bao giờ được công bố. Mô hình mà chúng ta trông cậy để khắc phục điều đó – ấn bản kỹ thuật số sống nhờ tài trợ – thì quá đắt đỏ, quá tập trung và quá mong manh để có thể nhân rộng. Tôi vừa đăng
giải thích vì sao mình xây dựng ấn bản phê bình thư từ của Cavriana theo một cách khác: nguồn sử liệu gốc được số hóa và lớn dần lên một cách tự nhiên, với hạ tầng tối thiểu, bảo trì tự động, mở cửa cho cộng tác, và rẻ đến mức chẳng cần đến tài trợ nào. Đó là lời biện hộ cho một thứ nhân văn số vận hành được bất kể có hay không có sự hậu thuẫn của thiết chế.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 cho tác tử AI</title><link>https://clementgodbarge.com/vi/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/vi/post/tei-mcp/</guid><description>&lt;p&gt;Nếu đã từng nhờ một trợ lý lập trình AI viết TEI XML, hẳn bạn nhận ra nó hay
sai. Phần tử mọc ở chỗ không được phép. Thuộc tính thì bịa ra. Quy tắc lồng ghép
bị bỏ qua. Mô hình chỉ có một ý niệm đại khái về hình dáng của TEI, chứ không nắm
chắc đặc tả.&lt;/p&gt;
&lt;p&gt;tei-mcp giải quyết chuyện này bằng cách cho tác tử AI truy cập trực tiếp, qua
công cụ, vào Hướng dẫn TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Mục Lục&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcp-là-gì"&gt;MCP là gì?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tei-mcp-làm-gì"&gt;tei-mcp làm gì&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#vì-sao-điều-này-quan-trọng"&gt;Vì sao điều này quan trọng&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bắt-đầu"&gt;Bắt đầu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="mcp-là-gì"&gt;MCP là gì?&lt;/h2&gt;
&lt;p&gt;
(MCP) là một chuẩn mở
cho phép các ứng dụng AI kết nối với nguồn dữ liệu và công cụ bên ngoài. Hãy hình
dung nó như cổng USB của AI: một giao thức duy nhất để bất kỳ ứng dụng khách tương
thích nào – Claude, Cursor, Windsurf và những cái khác – cắm vào các dịch vụ chuyên
biệt.&lt;/p&gt;
&lt;p&gt;Một máy chủ MCP cung cấp những &lt;em&gt;công cụ&lt;/em&gt; mà AI có thể gọi ngay trong lúc trò chuyện.
Thay vì dựa vào dữ liệu huấn luyện đã ghi nhớ, mô hình có thể tra hỏi một nguồn
sống, có thẩm quyền.&lt;/p&gt;
&lt;h2 id="tei-mcp-làm-gì"&gt;tei-mcp làm gì&lt;/h2&gt;
&lt;p&gt;tei-mcp phân tích đặc tả ODD của TEI P5 và cung cấp 16 công cụ, bao quát những câu
hỏi thường gặp nhất của người biên tập hay người mã hóa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phần tử này là gì?&lt;/strong&gt; Tra cứu bất kỳ phần tử, lớp, macro hay mô-đun nào theo tên,
không phân biệt hoa thường, kèm gợi ý khi gõ nhầm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nó nhận những thuộc tính nào?&lt;/strong&gt; Phân giải thuộc tính xuyên suốt toàn bộ hệ
phân cấp lớp – thuộc tính cục bộ trước, rồi đến thuộc tính kế thừa theo thứ tự.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bên trong nó chứa được gì?&lt;/strong&gt; Khai triển mô hình nội dung thành cây có cấu trúc,
hoặc lấy danh sách phẳng các phần tử con hợp lệ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phần tử này đặt ở đây được không?&lt;/strong&gt; Kiểm tra quan hệ cha–con, hoặc lần theo
khả năng đạt tới qua toàn bộ hệ phân cấp phần tử.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tài liệu của tôi có hợp lệ không?&lt;/strong&gt; Kiểm định một tệp TEI XML theo đặc tả: mô
hình nội dung, giá trị thuộc tính, danh sách giá trị đóng, tính toàn vẹn của tham
chiếu, và cảnh báo về phần tử đã lỗi thời.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Còn lược đồ riêng của dự án tôi thì sao?&lt;/strong&gt; Nạp một tệp tùy biến ODD để giới hạn
tất cả những gì kể trên vào tập con TEI riêng của dự án bạn.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vì-sao-điều-này-quan-trọng"&gt;Vì sao điều này quan trọng&lt;/h2&gt;
&lt;p&gt;Mã hóa TEI đòi hỏi tra cứu Hướng dẫn không ngừng. Người mã hóa lão luyện thuộc lòng
những mẫu thông dụng nhất, nhưng ngay cả họ cũng phải giở đặc tả khi gặp phần tử ít
quen hay mô hình nội dung phức tạp. Với trợ lý AI, vốn chẳng có chút hiểu biết
thuộc lòng nào như thế, vấn đề còn tệ hơn: chúng bịa ra thứ đánh dấu trông có vẻ
hợp lý mà thực ra sai.&lt;/p&gt;
&lt;p&gt;Có tei-mcp, AI không còn phải đoán. Nó có thể tra câu trả lời trong đặc tả trước
khi viết ra dù chỉ một dấu ngoặc nhọn. Kết quả là thứ đánh dấu tuân thủ TEI P5 –
hoặc tuân thủ bản tùy biến ODD của dự án bạn.&lt;/p&gt;
&lt;h2 id="bắt-đầu"&gt;Bắt đầu&lt;/h2&gt;
&lt;p&gt;Cài từ 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;Rồi thêm vào cấu hình của ứng dụng khách 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;Máy chủ tải đặc tả TEI về trong lần chạy đầu tiên và hoạt động với mọi ứng dụng
khách tương thích MCP.&lt;/p&gt;
&lt;p&gt;Mã nguồn và tài liệu đầy đủ:
&lt;/p&gt;</description></item><item><title>Dạy hệ nhị phân bằng máy mô phỏng điện báo ITA2</title><link>https://clementgodbarge.com/vi/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/vi/post/baudot/</guid><description>&lt;h2 id="biến-cái-trừu-tượng-thành-cái-sờ-được"&gt;Biến cái trừu tượng thành cái sờ được&lt;/h2&gt;
&lt;p&gt;Máy mô phỏng ITA2 này là một công cụ giảng dạy đúng nghĩa. Nhờ làm cho những khái niệm mã hóa vốn trừu tượng trở nên hữu hình và có thể thao tác, nó dẫn sinh viên đến với một ý niệm then chốt của ngành điện toán và viễn thông: biểu diễn nhị phân – làm sao chữ viết biến thành những chuỗi số 0 và số 1.
Chúng ta thường dạy điều này trên giấy. Nhưng khi tận mắt thấy các lỗ đục hiện ra trên băng, sinh viên hiểu ngay rằng một hệ thống vật lý cũng có thể mang thông tin số.
&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="bối-cảnh-lịch-sử-từ-điện-báo-đến-máy-tính"&gt;Bối cảnh lịch sử: từ điện báo đến máy tính&lt;/h2&gt;
&lt;p&gt;Mã ITA2 (Bảng chữ cái điện báo quốc tế số 2), còn gọi là mã Baudot-Murray, ra đời trong thập niên 1920, là bản hoàn thiện của mã điện báo nguyên thủy do Émile Baudot đặt ra từ thập niên 1870. Những hệ thống viễn thông sơ khai ấy đã ảnh hưởng trực tiếp đến các bước phát triển sau này của ngành điện toán:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sơ đồ mã hóa 5 bit là một ví dụ sớm về mã hóa ký tự&lt;/li&gt;
&lt;li&gt;Giới hạn của bộ ký tự (chỉ 32 tổ hợp với 5 bit) đã dẫn đến cơ chế chuyển đổi LETTERS/FIGURES đầy tài tình&lt;/li&gt;
&lt;li&gt;Hệ thống này còn được dùng cho máy điện báo chữ (teletype) suốt một phần lớn thế kỷ XX&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="học-máy-trạng-thái-qua-trò-chơi"&gt;Học máy trạng thái qua trò chơi&lt;/h2&gt;
&lt;p&gt;Cơ chế chuyển đổi LETTERS/FIGURES đưa khái niệm máy trạng thái vào bài học một cách tự nhiên. Tự tay thử nghiệm, sinh viên phát hiện rằng cùng một chuỗi bit có thể biểu thị những ký tự khác nhau, tùy vào chế độ hiện hành. Trải nghiệm trực tiếp với mã hóa dựa trên trạng thái này chuẩn bị cho các em bước tới những khái niệm điện toán phức tạp hơn.
Chẳng hạn, chuỗi bit &lt;code&gt;00011&lt;/code&gt; biểu thị:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chữ &amp;lsquo;A&amp;rsquo; khi ở chế độ LETTERS&lt;/li&gt;
&lt;li&gt;Số &amp;lsquo;1&amp;rsquo; khi ở chế độ FIGURES
Cách đọc kép tùy theo trạng thái này chính là nền tảng cho cách máy tính xử lý dữ liệu.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hoạt-động-trên-lớp"&gt;Hoạt động trên lớp&lt;/h2&gt;
&lt;p&gt;Vài gợi ý để đưa máy mô phỏng ITA2 vào giờ học:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Thử thách giải mã&lt;/strong&gt;: Cho sinh viên giải mã những thông điệp đã được mã hóa theo mẫu ITA2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mã hóa tiết kiệm&lt;/strong&gt;: Thảo luận vì sao cơ chế chuyển đổi lại quan trọng đến thế trong việc tiết kiệm băng thông&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiến hóa của mã hóa&lt;/strong&gt;: So sánh mã 5 bit của ITA2 với ASCII (7 bit) và Unicode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Điện toán vật lý&lt;/strong&gt;: Nối hệ thống lịch sử này với các vi điều khiển hiện đại như Arduino&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="lợi-ích-về-tiếp-cận"&gt;Lợi ích về tiếp cận&lt;/h2&gt;
&lt;p&gt;Ngoài giá trị lịch sử, cách tiếp cận này còn giúp những sinh viên có phong cách học khác nhau:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Người học bằng mắt nhìn thấy các mẫu hình&lt;/li&gt;
&lt;li&gt;Người học bằng tay tương tác trực tiếp với quá trình mã hóa&lt;/li&gt;
&lt;li&gt;Người thiên về khái niệm có thể khám phá khía cạnh toán học của lý thuyết thông tin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="chi-tiết-triển-khai"&gt;Chi tiết triển khai&lt;/h2&gt;
&lt;p&gt;Máy mô phỏng được viết bằng JavaScript và dễ dàng tích hợp vào bất kỳ nền tảng học tập trực tuyến nào. Mã nguồn được tổ chức theo mô-đun và có thể tùy biến cho những bối cảnh giảng dạy khác nhau.
Bạn có thể xem mã nguồn và tự mình thử máy mô phỏng tại:
&lt;/p&gt;</description></item></channel></rss>