<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>علوم انسانی دیجیتال |</title><link>https://clementgodbarge.com/fa/category/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%86%D8%B3%D8%A7%D9%86%DB%8C-%D8%AF%DB%8C%D8%AC%DB%8C%D8%AA%D8%A7%D9%84/</link><atom:link href="https://clementgodbarge.com/fa/category/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%86%D8%B3%D8%A7%D9%86%DB%8C-%D8%AF%DB%8C%D8%AC%DB%8C%D8%AA%D8%A7%D9%84/index.xml" rel="self" type="application/rss+xml"/><description>علوم انسانی دیجیتال</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>fa</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>علوم انسانی دیجیتال</title><link>https://clementgodbarge.com/fa/category/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%86%D8%B3%D8%A7%D9%86%DB%8C-%D8%AF%DB%8C%D8%AC%DB%8C%D8%AA%D8%A7%D9%84/</link></image><item><title>tei-mcp v0.3: رمزگذاری TEI بدون بازنویسی متن مبدأ</title><link>https://clementgodbarge.com/fa/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fa/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;وقتی
، هدف این بود که
دستیارهای هوش مصنوعی از توهم در نشانه‌گذاری TEI باز بمانند. پایه‌گذاری بر شِما
بخشی از مشکل را حل کرد: با دسترسی مستقیم و ابزارمحور به مشخصات P5،
مدل دیگر ناچار نیست حدس بزند یک عنصر چه معنایی دارد یا کدام صفت‌ها را
می‌پذیرد. خروجی از اعتبارسنجی می‌گذرد.&lt;/p&gt;
&lt;p&gt;اما توهم در رمزگذاری TEI دو چهره دارد و شِما تنها یکی از آن‌ها را
می‌گیرد. اعتبارسنجی در برابر مشخصات به شما می‌گوید که &lt;em&gt;نشانه‌گذاری&lt;/em&gt;
خوش‌ساخت است. دربارهٔ &lt;em&gt;متنی&lt;/em&gt; که نشانه‌گذاری آن را در بر گرفته چیزی نمی‌گوید. و
همان‌جا — در خودِ متن — است که توهم‌های زیان‌بارتر لانه می‌کنند.
ترکیب بازه‌قفل (span-locked composition)، ویژگی شاخص نسخهٔ v0.3، دقیقاً
برای پیشگیری از همین‌ها طراحی شده است.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;فهرست مطالب&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#توهمی-که-شما-نمیتواند-بگیرد"&gt;توهمی که شِما نمی‌تواند بگیرد&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ترکیب-بازهقفل"&gt;ترکیب بازه‌قفل&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#این-چه-هست-و-چه-نیست"&gt;این چه هست و چه نیست&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#چرا-فراتر-از-tei-هم-اهمیت-دارد"&gt;چرا فراتر از TEI هم اهمیت دارد&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#دریافت-بهروزرسانی"&gt;دریافت به‌روزرسانی&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="توهمی-که-شما-نمیتواند-بگیرد"&gt;توهمی که شِما نمی‌تواند بگیرد&lt;/h2&gt;
&lt;p&gt;از مدلی بخواهید نامه‌ای فرانسوی از سدهٔ شانزدهم را رمزگذاری کند و اغلب
سند TEI‌ای تحویل می‌گیرید که بی‌عیب می‌نماید. سرآیند پر شده، برچسب‌های
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; درست نشسته‌اند، &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; خوش‌ساخت است. آن را از
&lt;code&gt;validate_document&lt;/code&gt; بگذرانید؛ قبول می‌شود.&lt;/p&gt;
&lt;p&gt;حالا بدنه را با متن مبدأ مقایسه کنید.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; شده است &lt;code&gt;même&lt;/code&gt;. یک ویرگول جابه‌جا شده. &lt;code&gt;luy&lt;/code&gt; بی‌سروصدا به
&lt;code&gt;lui&lt;/code&gt; امروزی شده. جمله‌ای که در دست‌نویس دشوارخوان بود، به چیزی
پاکیزه‌تر «تصحیح» شده. هیچ‌یک از این تغییرها خواسته نشده بود.
هیچ‌یک علامت نخورده. سند از نظر شِما معتبر است و در سکوت غلط.&lt;/p&gt;
&lt;p&gt;برای گردش کار آرشیوی — که در آن متن رمزگذاری‌شده به سند دائمی‌ای بدل می‌شود
که خوانندگان بعدی، نمایه‌های جست‌وجو و ارجاع‌ها بر آن تکیه می‌کنند —
این همان خطایی است که بیش از همه اهمیت دارد. یک برچسب بدساخت آزاردهنده است.
املایی امروزی‌شده که پنج سال کسی متوجهش نشود، تحریف است.&lt;/p&gt;
&lt;h2 id="ترکیب-بازهقفل"&gt;ترکیب بازه‌قفل&lt;/h2&gt;
&lt;p&gt;نسخهٔ تازه (v0.3) سازوکاری برای پیشگیری از توهم دارد که یک‌راست
همین خطا را نشانه رفته است. هدف طراحی این است که توهم در متن بدنه
از حیث ساخت ناممکن شود، نه صرفاً نامحتمل.&lt;/p&gt;
&lt;p&gt;ایده ساده است: &lt;strong&gt;مدل هرگز متن بدنه را تایپ نمی‌کند&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;در عوض، گردش کار چنین است:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;مدل &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; را فرا می‌خواند و متن سادهٔ مبدأ را
به‌صورت رشته‌ای تغییرناپذیر دریافت می‌کند.&lt;/li&gt;
&lt;li&gt;برای هر برچسبی که می‌خواهد به کار ببرد،
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; را فرا می‌خواند — یعنی
یک عنصر TEI را در بازه‌ای از نویسه‌ها روی متن مبدأ ثبت می‌کند.&lt;/li&gt;
&lt;li&gt;وقتی کارش تمام شد، &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; را فرا می‌خواند. سرور
برچسب‌های ثبت‌شده را با متن سادهٔ اصلی درهم می‌بافد، TEI نهایی را می‌سازد
و سپس &lt;em&gt;بایت‌به‌بایت&lt;/em&gt; وارسی می‌کند که محتوای متنی تختِ سند
ساخته‌شده با متن مبدأ برابر است.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;اگر بایت‌ها یکی باشند، سند برمی‌گردد. اگر نباشند — اگر برچسب‌های مدل
به هر دلیلی بدنه‌ای را ایجاب کنند که حتی یک نویسه با مبدأ تفاوت دارد —
&lt;code&gt;compose()&lt;/code&gt; به جای تحویل سند تحریف‌شده، خطا می‌دهد.&lt;/p&gt;
&lt;p&gt;در این گردش کار هیچ مسیری وجود ندارد که مدل از آن سند TEI‌ای
بسازد که متن بدنه‌اش با مبدأ فرق کند. این ناوردا مکانیکی است،
نه رفتاری. لازم نیست به مدل اعتماد کنید که توهم نزند؛ کافی است
به یک مقایسهٔ &lt;code&gt;==&lt;/code&gt; میان دو رشتهٔ بایت اعتماد کنید.&lt;/p&gt;
&lt;h2 id="این-چه-هست-و-چه-نیست"&gt;این چه هست و چه نیست&lt;/h2&gt;
&lt;p&gt;ترکیب بازه‌قفل &lt;strong&gt;مکمل&lt;/strong&gt; پایه‌گذاری بر شِماست، نه جانشین آن.
ابزارهای پایه‌گذاری بر شِما (&lt;code&gt;validate_document&lt;/code&gt;،
&lt;code&gt;lookup_element&lt;/code&gt;، &lt;code&gt;valid_children&lt;/code&gt; و باقی شانزده ابزار اولیه)
به مدل کمک می‌کنند TEI &lt;em&gt;معتبر&lt;/em&gt; بسازد. ترکیب بازه‌قفل تضمین می‌کند
که متن بدنه درون آن TEI به مبدأ &lt;em&gt;وفادار&lt;/em&gt; است. یک گردش کار
رمزگذاریِ قابل استقرار باید هر دو محور را برآورده کند، و حالا هر دو
با یک سرور واحد پوشش داده می‌شوند.&lt;/p&gt;
&lt;p&gt;نوشدارویی برای همه چیز هم نیست. &lt;code&gt;compose()&lt;/code&gt; هنوز بررسی نمی‌کند
که برچسب‌های ثبت‌شده بر پایهٔ یک سفارشی‌سازی ODD بارگذاری‌شده مجازند یا نه —
این کار بعدی است. برچسب‌های ثبت‌شده در حافظهٔ فرایند می‌مانند و پس از
راه‌اندازی مجدد از بین می‌روند. و فایل‌های مبدأ باید از هر جا که سرور اجرا می‌شود
خواندنی باشند. همهٔ این‌ها چاره‌پذیرند؛ هیچ‌یک ناوردای اصلی را
سست نمی‌کند.&lt;/p&gt;
&lt;h2 id="چرا-فراتر-از-tei-هم-اهمیت-دارد"&gt;چرا فراتر از TEI هم اهمیت دارد&lt;/h2&gt;
&lt;p&gt;این الگو تعمیم‌پذیر است. هر بار که از مدلی خواسته می‌شود قطعه‌ای متن را حاشیه‌نویسی، تبدیل
یا بسته‌بندی کند — و هر بار که سلامت متن زیرین
مهم‌تر از توانایی مدل در «بهتر کردن» آن باشد — همین شکل از
راه حل کاربرد دارد. از مدل نخواهید متن را دوباره تایپ کند. از آن بخواهید
دستورالعمل‌هایی روی متن تولید کند، و بگذارید یک ترکیب‌کنندهٔ قطعی
آن‌ها را زیر ناوردای برابری اعمال کند.&lt;/p&gt;
&lt;p&gt;برای نسخه‌های دیجیتال به‌طور خاص، این تغییر می‌دهد که مسئولانه چه چیزی را
می‌توان به مدل سپرد. رمزگذاری ناگهان به کاری بدل می‌شود که می‌توان واگذارش کرد
بی‌آنکه ناچار باشید هر خروجی را دستی با مبدأ مقایسه کنید.
ماشین راه ملال‌آور را می‌رود؛ مصحح نشانه‌گذاری را بازبینی می‌کند، نه
املا را.&lt;/p&gt;
&lt;h2 id="دریافت-بهروزرسانی"&gt;دریافت به‌روزرسانی&lt;/h2&gt;
&lt;p&gt;اگر 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;یا از نو:&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;برای استفاده از ترکیب بازه‌قفل، سرور را به پوشه‌ای از فایل‌های متن سادهٔ
مبدأ نشانه بروید:&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;نام هر فایل بدون پسوند، شناسهٔ سند آن می‌شود (‎&lt;code&gt;letter_001.txt&lt;/code&gt; →
&lt;code&gt;letter_001&lt;/code&gt;‎).&lt;/p&gt;
&lt;p&gt;کد منبع، مستندات کامل و یادداشت‌های طراحی ناوردا:
&lt;/p&gt;</description></item><item><title>نسخهٔ دیجیتالی از گونه‌ای دیگر</title><link>https://clementgodbarge.com/fa/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fa/post/cavriana-edition/</guid><description>&lt;p&gt;بیشتر منابع دست‌اول هرگز منتشر نمی‌شوند. الگویی که برای چاره کردن این وضع به آن تکیه می‌کنیم، یعنی نسخه‌های دیجیتال متکی به گرنت، گران‌تر، متمرکزتر و شکننده‌تر از آن است که در مقیاس بزرگ کار کند. همین تازگی
منتشر کردم و در آن توضیح دادم که چرا تصحیح انتقادی نامه‌های کاوریانا را به شیوه‌ای دیگر می‌سازم: اسناد دیجیتال‌شدهٔ منابع دست‌اول که به‌طور طبیعی رشد می‌کنند، با کمترین زیرساخت، نگهداری خودکار، گشوده به همکاری، و آن‌قدر ارزان که اصلاً به گرنتی نیاز نیست. این دفاعی است از گونه‌ای علوم انسانی دیجیتال که مستقل از پشتیبانی نهادی کار می‌کند.&lt;/p&gt;</description></item><item><title>tei-mcp: استاندارد TEI P5 برای عامل‌های هوش مصنوعی</title><link>https://clementgodbarge.com/fa/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fa/post/tei-mcp/</guid><description>&lt;p&gt;اگر تا به حال با یک دستیار برنامه‌نویسی هوش مصنوعی TEI XML نوشته باشید،
احتمالاً دیده‌اید که خراب می‌کند. عنصرها جایی ظاهر می‌شوند که نباید.
صفت‌هایی از خود ساخته می‌شوند. قواعد تودرتویی نادیده گرفته می‌شوند. مدل تصوری
تقریبی از شکل TEI دارد، اما هیچ شناخت قابل اعتمادی از مشخصات آن ندارد.&lt;/p&gt;
&lt;p&gt;tei-mcp این مشکل را با دادن دسترسی مستقیم و ابزارمحور به راهنمای TEI P5
به عامل‌های هوش مصنوعی حل می‌کند.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;فهرست مطالب&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcp-چیست"&gt;MCP چیست؟&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tei-mcp-چه-میکند"&gt;tei-mcp چه می‌کند&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#چرا-اهمیت-دارد"&gt;چرا اهمیت دارد&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#شروع-کار"&gt;شروع کار&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="mcp-چیست"&gt;MCP چیست؟&lt;/h2&gt;
&lt;p&gt;
(MCP) استانداردی باز است
که به برنامه‌های هوش مصنوعی اجازه می‌دهد به منابع داده و ابزارهای بیرونی
وصل شوند. آن را چیزی مانند درگاه USB برای هوش مصنوعی تصور کنید: یک
پروتکل واحد که هر کلاینت سازگار — Claude، Cursor، Windsurf و دیگران —
را به خدمات تخصصی وصل می‌کند.&lt;/p&gt;
&lt;p&gt;یک سرور MCP &lt;em&gt;ابزارهایی&lt;/em&gt; را در اختیار می‌گذارد که هوش مصنوعی می‌تواند در جریان
گفت‌وگو فرا بخواند. مدل به جای تکیه بر داده‌های آموزشیِ به‌خاطرسپرده،
می‌تواند از منبعی زنده و معتبر پرس‌وجو کند.&lt;/p&gt;
&lt;h2 id="tei-mcp-چه-میکند"&gt;tei-mcp چه می‌کند&lt;/h2&gt;
&lt;p&gt;tei-mcp مشخصات ODD استاندارد TEI P5 را تجزیه می‌کند و 16 ابزار در اختیار می‌گذارد که
رایج‌ترین پرسش‌های یک مصحح یا رمزگذار را پوشش می‌دهند:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;این عنصر چیست؟&lt;/strong&gt; هر عنصر، کلاس، ماکرو یا پیمانه را با نام جست‌وجو کنید،
بدون حساسیت به حروف بزرگ و کوچک و با پیشنهاد اصلاح غلط‌های تایپی.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;چه صفت‌هایی می‌پذیرد؟&lt;/strong&gt; صفت‌ها را در سراسر سلسله‌مراتب کلاس‌ها تعیین کنید
— نخست صفت‌های محلی، سپس صفت‌های به‌ارث‌رسیده به ترتیب.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;چه چیزی می‌تواند درون آن قرار بگیرد؟&lt;/strong&gt; مدل‌های محتوا را به درخت‌های ساخت‌یافته بسط دهید،
یا فهرستی تخت از فرزندان مجاز بگیرید.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;آیا این عنصر می‌تواند اینجا بیاید؟&lt;/strong&gt; تودرتویی والد–فرزند را بررسی کنید، یا
دسترس‌پذیری را در تمام سلسله‌مراتب عنصرها ردیابی کنید.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;آیا سند من معتبر است؟&lt;/strong&gt; یک فایل TEI XML را در برابر مشخصات اعتبارسنجی کنید: مدل‌های
محتوا، مقادیر صفت‌ها، فهرست‌های بستهٔ مقادیر، یکپارچگی ارجاع‌ها و
هشدارهای منسوخ‌شدگی.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;شِمای پروژهٔ من چه می‌شود؟&lt;/strong&gt; یک فایل سفارشی‌سازی ODD بارگذاری کنید تا
همهٔ موارد بالا به زیرمجموعهٔ خاص TEI در پروژهٔ شما محدود شود.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="چرا-اهمیت-دارد"&gt;چرا اهمیت دارد&lt;/h2&gt;
&lt;p&gt;رمزگذاری TEI مراجعهٔ مدام به راهنما را می‌طلبد. رمزگذاران باتجربه
رایج‌ترین الگوها را از بر می‌کنند، اما حتی آنان هم برای عنصرهای کمتر آشنا
یا مدل‌های محتوای پیچیده باید به مشخصات رجوع کنند. برای دستیارهای هوش
مصنوعی، که چنین دانش درونی‌شده‌ای ندارند، مشکل بدتر است:
نشانه‌گذاری‌ای می‌سازند که موجه می‌نماید اما نادرست است.&lt;/p&gt;
&lt;p&gt;با tei-mcp، هوش مصنوعی ناچار به حدس زدن نیست. می‌تواند پیش از نوشتن حتی یک
براکت زاویه‌دار، پاسخ را در مشخصات بیابد. نتیجه، نشانه‌گذاری‌ای است
که با TEI P5 — یا با سفارشی‌سازی ODD پروژهٔ شما — سازگار است.&lt;/p&gt;
&lt;h2 id="شروع-کار"&gt;شروع کار&lt;/h2&gt;
&lt;p&gt;از 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;سپس آن را به پیکربندی کلاینت 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;سرور در نخستین اجرا مشخصات TEI را دانلود می‌کند و با هر کلاینت
سازگار با MCP کار می‌کند.&lt;/p&gt;
&lt;p&gt;کد منبع و مستندات کامل:
&lt;/p&gt;</description></item><item><title>آموزش دودویی با شبیه‌ساز تلگراف ITA2</title><link>https://clementgodbarge.com/fa/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fa/post/baudot/</guid><description>&lt;h2 id="مفاهیم-انتزاعی-را-میتوان-لمس-کرد"&gt;مفاهیم انتزاعی را می‌توان لمس کرد&lt;/h2&gt;
&lt;p&gt;این شبیه‌ساز ITA2 ابزاری عملی برای تدریس است. رمزگذاری، که معمولاً مفهومی انتزاعی است، در اینجا دیدنی و لمس‌کردنی می‌شود و دانشجویان از همین راه با یکی از مفاهیم کلیدی رایانش و مخابرات آشنا می‌شوند: بازنمایی دودویی، یعنی اینکه متن چگونه به الگویی از صفر و یک بدل می‌شود.
ما این درس را اغلب به‌شکل انتزاعی می‌دهیم؛ اما وقتی دانشجو سوراخ‌ها را به چشم می‌بیند که روی نوار پدیدار می‌شوند، بهتر درمی‌یابد که یک سازوکار فیزیکی چگونه می‌تواند اطلاعات دیجیتال را در خود نگه دارد.
&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="زمینه-تاریخی-از-تلگراف-تا-رایانه"&gt;زمینهٔ تاریخی: از تلگراف تا رایانه&lt;/h2&gt;
&lt;p&gt;کد ITA2 (الفبای بین‌المللی تلگراف شمارهٔ 2)، که به کد بودو–موری هم شهرت دارد، در دههٔ 1920 به‌عنوان صورت پیراسته‌ای از کد تلگراف اصلی امیل بودو (دههٔ 1870) ساخته شد. این سامانه‌های مخابراتی اولیه، بر تحولات بعدی رایانش اثری مستقیم گذاشتند:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;طرح رمزگذاری 5 بیتی یکی از نمونه‌های اولیهٔ رمزگذاری نویسه‌ها بود&lt;/li&gt;
&lt;li&gt;محدودیت مجموعهٔ نویسه‌ها (با 5 بیت تنها 32 ترکیب ممکن است) به سازوکار هوشمندانهٔ تغییر حالت LETTERS/FIGURES انجامید&lt;/li&gt;
&lt;li&gt;این سامانه تا اعماق سدهٔ بیستم همچنان در دستگاه‌های تله‌تایپ به کار می‌رفت&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="یادگیری-ماشینهای-حالت-از-راه-بازی"&gt;یادگیری ماشین‌های حالت از راه بازی&lt;/h2&gt;
&lt;p&gt;سازوکار تغییر حالت LETTERS/FIGURES، ماشین‌های حالت را به طبیعی‌ترین شکل به میان می‌آورد. دانشجویان با آزمون و خطا کشف می‌کنند که یک الگوی واحد، بسته به حالت جاری، می‌تواند نمایندهٔ نویسه‌های متفاوتی باشد. این تجربهٔ عملی با رمزگذاری حالت‌محور، آنان را برای مفاهیم پیچیده‌تر رایانش آماده می‌کند.
برای نمونه، الگوی بیتی &lt;code&gt;00011&lt;/code&gt; نمایندهٔ این‌هاست:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;حرف «A» در حالت LETTERS&lt;/li&gt;
&lt;li&gt;عدد «1» در حالت FIGURES
همین تفسیر دوگانه بر حسب حالت، در بنیاد شیوهٔ کار رایانه‌ها با داده‌ها نشسته است.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="فعالیتهای-کلاسی"&gt;فعالیت‌های کلاسی&lt;/h2&gt;
&lt;p&gt;چند راه برای به‌کارگیری شبیه‌ساز ITA2 در تدریس:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;مسابقهٔ رمزگشایی&lt;/strong&gt;: از دانشجویان بخواهید پیام‌هایی را که به الگوهای ITA2 رمز شده‌اند بگشایند&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;رمزگذاری بهینه&lt;/strong&gt;: بحث کنید که چرا سازوکار تغییر حالت برای صرفه‌جویی در پهنای باند اهمیت داشت&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تکامل رمزگذاری&lt;/strong&gt;: کد 5 بیتی ITA2 را با ASCII (7 بیتی) و یونیکد مقایسه کنید&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;رایانش فیزیکی&lt;/strong&gt;: این سامانهٔ تاریخی را به میکروکنترلرهای امروزی مانند آردوینو پیوند بزنید&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="فایده-آن-برای-دسترسپذیری"&gt;فایدهٔ آن برای دسترس‌پذیری&lt;/h2&gt;
&lt;p&gt;گذشته از جذابیت تاریخی، این رویکرد به دانشجویانی با سبک‌های یادگیری گوناگون یاری می‌رساند:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;یادگیرندگان دیداری الگوها را می‌بینند&lt;/li&gt;
&lt;li&gt;یادگیرندگان حرکتی مستقیماً با فرایند رمزگذاری سروکار پیدا می‌کنند&lt;/li&gt;
&lt;li&gt;ذهن‌های مفهوم‌گرا می‌توانند جنبه‌های ریاضی نظریهٔ اطلاعات را بکاوند&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="جزئیات-پیادهسازی"&gt;جزئیات پیاده‌سازی&lt;/h2&gt;
&lt;p&gt;شبیه‌ساز به JavaScript نوشته شده و به‌آسانی در هر بستر آموزشی تحت وب جای می‌گیرد. کد آن پیمانه‌ای است و برای زمینه‌های آموزشی مختلف قابل سفارشی‌سازی.
کد منبع را می‌توانید ببینید و خودتان شبیه‌ساز را بیازمایید:
&lt;/p&gt;</description></item></channel></rss>