Этот сайт — моя персональная записная книжка. Интересны мне, по большей части, программирование, история и события из моей жизни.

Позднее Ctrl + ↑

TOIlet: цветные шрифты

Вчера я писал, что цветные шрифты — не самое важное расширение стандарта FIGlet. От своих слов я не отказываюсь, но это расширение точно одно из самых весёлых.

Напомню, что это шрифты, которые составлены из текстовых символов. Они могут использовать там, где, кроме текста, ничего нет — например, в текстовых файлах, в письмах без оформления, в консоли и так далее.

Идея цветных шрифтов простая: в консоли можно использовать цвета, которые задаются специальными управляющими последовательностями. Терминал не выводит их на экран как текст, а воспринимает как команды. Например: «с этого места рисуй всё зелёным».

Таких последовательностей довольно много, но для управления цветом обычно используют несколько основных режимов.

Немного истории. Сначала появились базовые цвета — классический набор из восьми цветов. Потом к нему добавили яркие варианты, и в результате получилась 16-цветная палитра. Позже этого стало мало, поэтому появился режим, позволяющий выбирать цвет из палитры в 256 цветов. А затем добавили и true color — возможность задавать цвет напрямую в формате RGB, то есть практически из всей 24-битной палитры.

Терминалы работают с разными палитрами, что они, как правило, умеют сообщать через переменные окружения. Например, у меня на «Маке» есть переменная COLORTERM со значением truecolor, что означает, что моему терминал можно отсылать 24-битные цвета, а на рабочих «Линуксах» такой переменной нет. Но там есть переменная TERM со значением xterm-256color, которое указывает на то, что эти терминалы умеют обрабатывать 256 цветов.

Когда я начал разбираться с форматом шрифтов TOIlet и библиотекой libcaca, которая их отображает (автор большой оригинал, да), оказалось, что внутри реализована идея цветных шрифтов, но ни одного примера такого шрифта нет. Судя по коду, он слегка не дописан, но тем не менее, вполне работоспособен, жаль только автор остановился на палитре из 16 цветов.

Так что, первое, что я сделал — создал из набора стандартных эмодзи цветной шрифт в формате TOIlet, где смайлики составлены из раскрашенных юникодных блочных символов. Результат мне не особо понравился. Например, местами некоторые оттенки жёлтого у меня съехали в белый (из-за ограниченной палитры) и я потом ещё улучшал алгоритм, но всё равно — в шестнадцати цветах особо не разгуляешься.

Я подумал, что было бы здорово расширить формат, но так, чтобы утилита toilet по-прежнему выводила тот же шрифт в своих знакомых шестнадцати цветах.

Если посмотреть как libcaca парсит управляющие коды, то мы заметим, что парсер достаточно вольно обращается с грамматикой, не реагируя на некоторые ошибки, например, он пропускает все управляющие числа большие 107.

for(j = 0; j < argc; j++)
{
    /* Defined in ECMA-48 8.3.117: SGR - SELECT GRAPHIC RENDITION */
    if(argv[j] >= 30 && argv[j] <= 37)
        im->fg = ansi2caca[argv[j] - 30];
    else if(argv[j] >= 40 && argv[j] <= 47)
        im->bg = ansi2caca[argv[j] - 40];
    else if(argv[j] >= 90 && argv[j] <= 97)
        im->fg = ansi2caca[argv[j] - 90] + 8;
    else if(argv[j] >= 100 && argv[j] <= 107)
        im->bg = ansi2caca[argv[j] - 100] + 8;
    else switch(argv[j])
    {
        // парсятся 1—9, 21-29, 38, 39, 48—50

        default:
            debug("ansi import: unknown sgr %i", argv[j]);
            break;
        }
    }
}

Поэтому идея возникла такая. При кодировании цвета TOIlet использует цвет фона и шрифта, чтобы точнее имитировать пиксели в текстовом режиме. Иногда используется только один из них, чтобы реализовывать условную прозрачность. Это я пишу, чтобы рассказать, что у нас есть три варианта — указан цвет фона, указан цвет шрифта или указаны оба.

Если сразу за цветом в палитре из 16 цветов писать значение цвета, к которому я прибавлю такое число, чтобы оно гарантировано пропускалось парсером libcaca, то смогу спрятать от него там более точные значения цвета.

Например: \e[31;287;41;297m. Тут \e[ — начало специальной последовательности управляющих кодов (\e в реальности — символ с кодом 27, он никак не отображается, а только говорит, что дальше идёт команда).

Потом 31 — установка фона в красный, 287 — код цвета из 256-цветной палитры с прибавленным числом 256, чтобы оно пропускалось парсером. Так как оно идёт сразу после установки фона, то значит и тут мы ставим фон.

Следующим идёт, как возможно вы уже догадались, установка цвета шрифта, 41 — это тоже красный цвет, но для шрифта, коды разные, надо же отличать что именно мы устаналиваем. За ним — 297, принцип тот же, но так как тут значение идёт сразу после кода установки цвета шрифта, то мы понимаем, что и тут ставится цвет шрифта.

Символ m закрывает управляющую последовательность.

Таким образом утилита toilet и её библиотека libcaca увидят последовательность \e[31;41m, а мой парсер выкинет числа для 16-цветной палитры и оставит себе только 287 и 297, вычтет 256 и поставит нужный цвет.

При этом, если мой парсер таких числе не видит, то он читает цвет 16-цветной палитры. Что, во-первых, даёт обратную совместимость, во-вторых, в редких случаях, когда цвет из 256-цветной палитры совпадает в точности с 16-цветной, то можно указать «короткий» цвет и немного сэкономить.

С цветом RGB работает всё так же, только прибавляем 512. Правда цвет у меня кодируется в обратном порядке — BGR, потому что синяя компонента у́же всего используется в эмоджи, а красная — шире, поэтому если развернуть значения, числа получаются меньше и шрифт становится компактнее. Я думаю это оттого, что синий цвет хуже распознаётся глазом, недаром все градиенты во времена эпохи 256 цветов на мониторах старались делать синими.

Синий градиент в инсталляторе игры «SimCity 3000» в палитре 256 цветов

Шрифты, конечно, получаются просто огромными — по несколько мегабайт, но здесь помогает сжатие: и FIGlet, и TOIlet поддерживают сжатые шрифты.

Для конвертации эмодзи я написал конвертер на «Пайтоне», который преобразует их в шрифт отдельно в 256 цветах и в полноцветной палитре: хранить все варианты цветов было бы слишком накладно. А библиотека при отображении уже сама приближает цвет, если это требуется для конкретного терминала.

Вот, кстати, где ИИ сильно у меня начал буксовать — на задаче как компактнее спрятать новые цвета в старом формате. Сначала пришлось подумать самому, а потом уже пошло веселее — «Опус 4.6», который я не устаю нахваливать, подхватил идею и мы с ним быстро проверили различные гипотезы.

Добавлено позднее: реализацию всего вышесказанного можно увидеть в моём репозитории на «Гитхабе».

Figlet: шрифты из текста

Думаю, когда человек впервые увидел слова, которые вывел первый компьютер на первый дисплей, сразу же захотел большего — вывести туда ещё и картину. Но первые дисплеи были алфавитно-цифровыми и графику не умели выводить ещё очень долгое время. В ответ на это желание человечество придумало так называемую ASCII-графику. Не знаю, как произносит это слово читатель, но в той среде, где я общался, говорили «а-с-цы», реже — «а-с-ки».

С этим типом «графики» (не уверен, нужны ли кавычки) я впервые столкнулся за первым компьютером, на котором начал программировать, — «Радио-86РК». Очень хорошо помню программу «шахматы», которая выводила фигуры знаками псевдографики. К шахматам у меня особого интереса никогда не было, но этот факт я для себя отметил.

Позже, когда у меня появился ПК, такого рода графика мне время от времени встречалась в различных текстовых файлах. Особенно часто её использовали как одну из форм самовыражения ребята, пиратившие софт. В их сопроводительных файлах её было навалом. А когда я попал в интернет в 90-е, обнаружил её там в изобилии.

                          ________________
                         /      MAKE      \
          ___________   /   AMERICA GREAT  \
       (_(  ___ ___  )  \      AGAIN!      /
       /_/-( c) (c )< \  \   _____________/
       | |    <_      |   | /
       |_| '  ()  '   | ___/
      __\_  ( __ )  _/__
  / /|   \        /    |\ \
 (    )    ~      ~    (    )
(    |\  ( .     . )   /|    )
 (   ) \  --     --   / (   )
 |  ,| |     ___     | ,|   |
 \__/ \|  / - | - \  |/ \__/
  \oooO\_____________/Oooo/
        \   _____   /
         \. p | m ./
         | \_____/ |
        /    / \    \
       (____)  (____)
      /_____|  |_____\
    ___|   |    |   |___
   (_______|    |_______)


Не скажу, что я специально искал где-то текстовую графику, собирал её или любил любоваться ею вечерами, но, когда она мне попадалась, её, как правило, было интересно рассматривать.

Среди такой графики попадались и надписи, сделанные подобным образом, — странная, казалось бы, идея: писать буквы другими буквами. Но таким способом можно было имитировать различные шрифты или, например, рукописное начертание.


 ,ggggggggggg,     _,gggggg,_      ,ggggggggggg,     _,gggggg,_      ,ggg,        gg
dP"""88""""""Y8, ,d8P""d8P"Y8b,   dP"""88""""""Y8, ,d8P""d8P"Y8b,   dP""Y8b       88
Yb,  88      `8b,d8’   Y8   "8b,dPYb,  88      `8b,d8’   Y8   "8b,dPYb, `88       88
 `"  88      ,8Pd8’    `Ybaaad88P’ `"  88      ,8Pd8’    `Ybaaad88P’ `"  88       88
     88aaaad8P" 8P       `""""Y8       88aaaad8P" 8P       `""""Y8       88aaaaaaa88
     88""""Y8ba 8b            d8       88"""""    8b            d8       88"""""""88
     88      `8bY8,          ,8P       88         Y8,          ,8P       88       88
     88      ,8P`Y8,        ,8P’       88         `Y8,        ,8P’       88       88
     88_____,d8’ `Y8b,,__,,d8P’        88          `Y8b,,__,,d8P’        88       Y8,
    88888888P"     `"Y8888P"’          88            `"Y8888P"’          88       `Y8


В 1991 году кому-то пришло в голову, что процесс отрисовки таких надписей можно было бы автоматизировать, как это сделано со шрифтами для графических режимов. Так появилась небольшая утилита newban, которая потом выросла в «FIGlet» (название было составлено из имён автора и его друзей) и получила бешеную популярность.

Когда я ей заинтересовался в двухтысячных, по сети уже гуляло несколько сотен разных шрифтов. Восемьсот или около того. Мне очень хотелось разобраться как это всё работает.

Я тогда писал много пакетов для ПХП, мне очень нравился этот язык и очень хотелось что-нибудь сделать для сообщества. Поэтому пакет для работы со шрифтами FIGlet я написал именно на этом языке. Несколькими годами раньше это был бы Перл.

В 2008-м году появилось логическое продолжение — утилита toilet и формат шрифтов TOIletThe Other Implementation’s letters»).

Основное отличие — шрифты стали юникодными: для поддержки символов за пределами одного байта больше не приходится делать отдельный файл с перекодировкой. Кроме того, появились цветные шрифты, но это, на мой взгляд, всё же менее важно.

Когда я начал переписывать свою библиотеку с помощью ИИ, я даже не подозревал, насколько глубока кроличья нора. В очередной раз хочу сказать, насколько сильно ИИ уже изменил и ещё изменит расклад в разработке. Если бы я переписывал эту библиотеку исключительно вручную, мне пришлось бы пойти на ряд компромиссов ради экономии времени. ИИ же позволяет удовлетворить перфекционизм почти любого уровня — только плати деньги.

Раздача интернета и «Айфон»

Столкнулся тут с одной странной штукой. Недавно жена решила сменить оператора в машине, чтобы платить поменьше: старый оператор не только поднял цены, но, похоже, ещё и начал мухлевать с трафиком. Новая симка в машине пока нормально не прижилась — надо разбираться, но всё как-то некогда. Так что временно раздаём машине вайфай со смартфона.

Но вот странность: у меня всё работает нормально, а у жены на «Айфоне» «Режим модема» включается, но машина эту точку доступа просто не видит. Решил разобраться — и выяснилось, что мой смартфон её тоже не видит.

На этом месте я, честно говоря, приуныл: первой мыслью было, что проблема в железе. Но потом почему-то сработала интуиция, и я полез проверять настройки APN.

Мы с женой пользуемся «Т-Мобайлом», причём ещё с тех времён, когда он назывался «Тинькофф-Мобайл». И я подумал: а что, если после ребрендинга они поменяли имя точки доступа, а у жены с тех пор настройки никто не трогал, потому что режимом модема она давно не пользовалась?

Так и оказалось. Поменял APN — и всё сразу заработало.

Что особенно прекрасно: «Айфон» вообще никак не пытался объяснить, в чём проблема. Просто делал вид, что всё в порядке: «Режим модема» включался, но точка доступа при этом фактически не поднималась.

Но что ещё страннее, — потом я вспомнил, что я у себя на «Андроиде» настройки тоже много лет не трогал, но у меня точка доступа работает нормально.

Возвращение Text_Figlet

Нейросеть «Опус 4.6», конечно, жрёт невероятное количество денег.

Я сделал небольшую паузу в парном программировании с ней, но недавно не выдержал, потому что решил потихоньку заняться тем, до чего у меня много лет не доходили руки, — закончить или переделать некоторые проекты. Наверное, какое-то время буду транжирить деньги именно в таком режиме.

У меня уже много лет чешутся руки переделать мою старенькую библиотеку Text_Figlet. Это, наверное, самое популярное моё детище — она время от времени встречается мне в каких-то продуктах и даже входит в виде пакета в некоторые дистрибутивы «Линукса».

Библиотека написана на ПХП и умеет выводить текст специальными фиглет-шрифтами, составленными из символов. Та моя версия, помимо этого, умеет делать так называемый smushing — объединение соседних букв по специальным правилам. Этот эффект виден в примере ниже.

«Смашинг» был сделан только по горизонтали; вертикальный алгоритм я в своё время не дописал, и этот факт — одна из причин, почему мне захотелось вернуться к библиотеке.

 _  _     _ _                        _    _ _ 
| || |___| | |___    __ __ _____ _ _| |__| | |
| __ / -_) | / _ \_  \ V  V / _ \ '_| / _` |_|
|_||_\___|_|_\___( )  \_/\_/\___/_| |_\__,_(_)
                 |/                           

В итоге я так разогнался, что полностью переписал библиотеку при помощи нейросетей, реализовав всё задуманное и даже больше — например, добавил поддержку шрифтов «TOIlet» и цветных фильтров для них, а также покрыл всё тестами и подготовил библиотеку к установке через «композер».

Какое-то офигительное чувство — когда задуманное так быстро превращается в код. Да, его до сих пор приходится просматривать, чтобы подсказывать нейросети, что переделать, но, в общем-то, меня это не коробит. Зато скорость программирования вырастает многократно. Я даже не могу предположить, сколько ещё откладывал бы переделку этой библиотеки, если бы не было настолько продвинутых нейросетей.

Звуки китов

Очень люблю истории о том, как учёным удаётся найти что-то потерянное, забытое или расшифровать то, что раньше не удавалось прочесть. Мой фаворит здесь, конечно, — Вилла Папирусов. Но речь не о ней, тем более что в её исследовании пока новостей нет.

Вчера прочитал, что исследователи и архивисты Океанографического института Вудс-Хоул недавно обнаружили, возможно, самую старую из сохранившихся записей китового пения, сделанную 7 марта 1949 года недалеко от Бермудов. Запись была сделана на аудиопластинку, благодаря чему она и сохранилась: была бы она на плёнке — давно бы размагнитилась.

В то время исследователи на борту научно-исследовательского судна «Атлантис» тестировали гидроакустические системы, измеряли громкость взрывов и проводили другие акустические эксперименты в сотрудничестве с Управлением военно-морских исследований США.

На фотографии слева конверт в котором хранилась найденная запись, а справа — диктофон, который записывал звук.

Конверт снабжён примечаниями: «звуки рыб», «эхо рыб», пометки показывают, что учёные тогда ещё не знали, что записали пение горбатого кита

В статье, которую я читал, говорилось, что учёных поразило, насколько тише был тогда океан: сегодня уровень шумового загрязнения в нём значительно выше. Эта запись ценна ещё и как редкая акустическая точка отсчёта — она позволяет хотя бы приблизительно понять, как звучал океан до эпохи нынешнего интенсивного судоходства и других антропогенных шумов.

Меня же поразило другое: я никогда не задумывался, что пение китов вообще можно услышать человеческим ухом. Видимо, я путал его со звуками дельфинов: у зубатых китообразных, к которым относятся и дельфины, многие сигналы действительно лежат в очень высоком, в том числе ультразвуковом диапазоне.

Я попробовал разобраться подробнее и, насколько понял, обобщать тут нельзя: у разных китов всё по-разному. Например, у горбатых китов значительная часть «песни» лежит в диапазоне, доступном человеческому слуху, поэтому такие звуки можно не только записывать приборами, но в некоторых случаях и слышать.

А вот у некоторых других усатых китов, например синих, сигналы часто уходят в слишком низкие частоты и воспринимаются уже не как обычный звук, а скорее как низкочастотная вибрация — или вовсе остаются за пределами слуха человека.

GPU: RTX 6000 Pro vs H100

Провели тестирование графического ускорителя NVIDIA RTX 6000 Pro WE в сравнении с NVIDIA H100. Тестировали в разных режимах, с нейросетью «Квен3» с 30 миллиардами параметров, без квантования. Тесты включали и синтетику, и реальные наши задачи; мы даже подключили ускоритель к «боевой» инсталляции и наблюдали за разницей. Обучение не тестировали, так как у нас таких задач почти нет: нас больше интересовало, как будут вести себя большие языковые модели.

Все цифры публиковать не буду, но небольшую статистику по синтетическому тесту всё же приведу. Вывод такой: на реальных наших данных разницы мы не заметили, а в синтетике H100 производительнее в 1,55—1,6 раза.

Учитывая разницу в стоимости примерно в три раза, RTX 6000 Pro выглядит более выгодным вариантом для покупки, но с оговоркой: для моделей, которые не помещаются в память одной карты, H100 (или ещё более старшие модели) предпочтительнее, так как у таких карт есть собственная высокоскоростная шина для обмена данными, и общая производительность такого решения должна превосходить производительность карт RTX 6000 Pro, соединённых по обычной шине.

«Режим» — это количество одновременных запросов

Опознать по голосу

Том Круз в фильме «Солдаты неудачи» (2008)

Кажется, я очень неплохо распознаю лица, лучше среднего человека: например, я сразу понял, что Леса Гроссмана в фильме «Солдаты неудачи» (2008) играет Том Круз, едва он появился в кадре. Насколько я знаю, мало кто понял, что это он. Или я не путаю Натали Портман и Киру Найтли, да и вообще многих актёров, которых большинство людей считает почти неразличимыми.

Но вот с голосами отчего-то не так. Очень редко, когда я смотрю, например, мультфильмы, у меня перед внутренним взором возникает актёр, который озвучивает персонажа. Ну разве что это кто-то, чью манеру ни с кем не спутаешь, вроде Галустяна в «Кунг-фу панде». Обычно я вообще не понимаю кто кого озвучивает, голоса не путаю, но если меня спросить что это за актёр, вряд ли угадаю.

Недавно в каком-то ролике услышал, что где-то что-то озвучивал Нагиев и страшно удивился. Не помню о какой конкретно его работе шла речь, но там был отрывок и голос Нагиева я в нём не узнал, хотя мне казалось, что он вполне характерный. Или, например, я нигде не узнаю́ Бурунова, хотя он мне очень импонирует как человек и я постоянно смотрю какие-то интервью с ним, то есть, вроде, знаю какой у него голос.

У вас так же?

ИИ: поиск уязвимостей

Изучил несколько статей о поиске уязвимостей с помощью нейросетей. Вынужден признать, что не всё так просто, как я полагал ранее. По всей видимости, нейросети всё же способны каким-то образом находить уязвимости, читая код, а не просто запуская внешние анализаторы.

Во многих статьях фигурирует «Опус 4.6», что полностью совпадает с моими ощущениями: эта сеть — действительно ощутимый шаг вперёд. Но использовать её пока очень дорого: бюджет на токены она поедает очень быстро. Я пока поставил на паузу «Виолу» и решил, что это хобби съедает слишком много денег.

Вернёмся к уязвимостям. На «Хабре» есть очень показательная статья — «Техдиректор Microsoft Azure с помощью Claude AI обнаружил ошибки в 40-летнем коде Apple II». Упомянутый код сеть «Опус» проанализировала на уровне ассемблера процессора 6502, который использовался в тех машинах, и нашла ошибку.

Анализаторы кода не использовались, да и вряд ли они есть для настолько старого ассемблера. Так что в этом смысле это должен быть довольно чистый эксперимент. Моя прежняя попытка читать ассемблерный код нейросетями показала, что существующие на тот момент нейросети справлялись не очень, но видимо «Опус 4.6» продвинулся и в этом.

В общем, думаю, в этом году отрасль побьёт все рекорды по объёму выплат в рамках программ вознаграждения за поиск уязвимостей. Наверняка компании пересмотрят свои программы и будут самостоятельно привлекать нейросети.

Хищные растения

Выбирая дочке подарок на 8 Марта, гулял по одному из местных торговых центров, где проводилась какая-то очередная ярмарка. В голове не было ни одной мысли о том, что же подарить, поэтому я надеялся, что меня осенит у какого-нибудь прилавка. Так, собственно, и случилось: в одном месте продавались хищные растения, и я вспомнил, что дочь когда-то очень ими заинтересовалась, как и я в детстве, впрочем.

Я даже купил себе что-то хищное много лет назад, но почему оно у меня не дожило до сегодняшних дней, причину не помню. Может, кот съел.

В торговом центре продавалось несколько видов хищных растений — росянка, жирянка и мухоловка. Я, так и не определившись, купил всё, что было. Теперь у нас дома надо кормить ещё один комплект существ. Впрочем, надеюсь, с приходом весны они сами себе что-то наловят.

Дочка каждое утро льёт воду из пипетки в оба горшка — именно так их и положено поливать, — и сделала попытку покормить растения белковым кормом для улиток. Вроде бы им не понравилось: почему-то листья они не закрыли. Надо будет попробовать самому.

А сегодня мы обнаружили, что одна из жирянок выпустила очень трогательный розовый цветочек, смотрится очень красиво. Сфотографировал на память.

Удаление родинок

За прошлый год у меня на шее выросла длинная родинка, которая мне очень не нравилась. Вообще, у меня на теле было несколько таких, но жить они мне не мешали, потому что находились в местах, скрытых под одеждой.

Я сразу решил её удалить, но почему-то решил, что нужно дождаться, пока она полностью вырастет. Позже врач объяснил мне, что ждать ничего не нужно: наоборот, со временем родинка может увеличиться, и тогда удалять её придётся с большей площади.

В общем, недавно я решил, что время пришло. Выбрал клинику так, как обычно делаю в последнее время: дал нейросети задание составить для меня рейтинг, потом почитал отзывы, записался на приём и пошёл удалять.

Изначально мысль была такая — начать с одной, а потом, возможно, сходить на второй приём и удалить остальные. Но в процессе приёма врач настолько расположил меня к себе, что я попросил удалить всё, что он посчитает нужным.

В итоге вчера мне удалили 26 родинок, большинство из которых едва выступали над кожей. Теперь неделю нужно будет обрабатывать ранки два раза в день раствором, который мне выдали в клинике, а затем ещё около месяца наносить на них специальный спрей, чтобы снизить риск образования рубцов.

Вся процедура прошла очень быстро и относительно комфортно. Всё, что я чувствовал, — это уколы лидокаина и лёгкий запах горелой кожи. Я думал, что когда анестезия отойдёт, буду сходить с ума от боли, но на практике ранки почти не ощущаются, даже когда трутся об одежду.

Учитывая почти полную безболезненность процедуры (за исключением самих уколов), ожидаемый результат, как мне кажется, того стоит: родинка на шее меня очень раздражала, а некоторые другие родинки иногда могли травмироваться в походах, что, вроде, некоторыми врачами считается опасным.

Актёр Дэвид Кэррадайн

По случаю выходного дня сегодня пересматривал комедию «Большой Стэн» (2007). Не великое кино, но, как по мне, фильм неплохой — самое то, чтобы снять напряжение рабочей недели. В фильме есть персонаж Мастер — явная пародия на Билла из тарантиновской дилогии «Убить Билла». Ещё обоих персонажей играет один и тот же актёр — Дэвид Кэррадайн.

Закончив просмотр, я понял, что не могу вспомнить, где он ещё играл, и пошёл в «Википедию» смотреть его фильмографию, попутно отметив, что актёр умер в 2009 году.

Каково же было моё удивление, когда я обнаружил, что и после смерти актёр, по-видимому, активно снимается — последний фильм с его участием, «Американский связной» вышел аж в 2021 году! В общей сложности после 2009-го года с его участием вышло десять фильмов и один сериал.

Больше половины вышли на следующий год после его смерти, что легко объяснимо, конечно, но как быть с остальными? Я сначала подумал, что речь идёт о какой-то реконструкции, как делали с Майлом Джексоном, голограмма которого участвовала в одном из концертов после его смерти или о документальном кино, но Кэррадайн фигура не такого масштаба.

Оказалось, что всё проще — актёра частенько приглашали сниматься на небольшие роли независимые студии в одну-две сцены, что позволяло писать на постере, что их фильме снялся Дэвид Кэррадайн, после фильма «Убить Билла» — большая звезда!

Некоторые из таких фильмов долго лежали в пост-продакшне и выходили сильно позже, а «Американский связной» из-за проблем в исходном виде так и вообще не досняли. Через несколько лет про фильм вспомнили, досняли с другими актёрами, а сцены с Дэвидом Кэррадайном встроили в новый фильм.

Слева — Дэвид Кэррадайн в своей первой роли в фильме Таггарт (1964)

Отгадки на загадки из музея МВД

Публикую отгадки на загадки из музея МВД.

С первой загадкой проблем особых не возникло — в разных местах, где я опубликовал эти загадки, читатели легко опознали колотушку ночного сторожа. Звук колотушки означал, что сторож жив-здоров, а значит горожане под охраной.

Я думал, что больше всего проблем будет с третьей загадкой, но читатели верно достроили логический ряд по окружающим предметам и догадались, что это ключ для ручного переключения светофора.

А вот назначение второго предмета никто не угадал. Это подхомутник — штука, которую кладут под хомут на шею лошади, чтобы снизить давление и уменьшить трение.

Загадки из музея МВД

Разбирал тут на днях фотки из казанского музея МВД, где я побывал несколько месяцев назад и понял, что не выложил подборку фотографий с загадками, которые я иногда загадываю читателям по случаю, если в музеях, которые я посещаю, есть что-то не опознаваемое с первого взгляда.

Первая загадка — самая простая. Догадайтесь что за предмет. Имеет непосредственное отношение к охране правопорядка.

Вторая загадка сложнее. Этот предмет хоть и лежит в музее МВД, но в принципе мог бы лежать в любом нетематическом сельском музее.

Третья загадка — самая сложная. Из разряда «если не знаешь, то не догадаешься», по крайней мере я бы не догадался. Для чего предназначался Г-образный предмет под чёрно-белым жезлом?

Ответы выложу завтра-послезавтра.

Дополнено: отгадки выложил отдельным постом.

ИИ: поиск ошибок в bc

Много наслышан о том, что сейчас некоторые проекты с открытым кодом переживают настоящий шквал заявок от вайбкодеров, едва отбиваясь от некачественного кода и исправлений несуществующих проблем. Впрочем, есть и положительный опыт — я встречал несколько новостей о том, что искусственный интеллект успешно нашёл и исправил какие-то проблемы с безопасностью.

Очень интересно стало — а как ИИ вообще ищет такие проблемы? Ведь все взаимосвязи в коде он, в силу известных ограничений, просмотреть не может, может речь о каких-то распространённых шаблонных уязвимостях? Я как-то глубоко не погружался в тему.

Поэтому решил посмотреть как будет действовать нейросеть «Опус 4.6» на хорошо знакомом мне проекте — калькуляторе bc, работающем в командной строке. Я выбрал версию для «Линукса», так как там меньше кода.

Я написал небольшой промпт, в котором попросил найти мне переполнения стека, ошибки выделения и памяти и прочие проблемы, характерные для программ на Си. Что интересно, такие проблемы нашлись! Но как же «Опус» это сделал?

Ларчик открывался просто — нейросетка подключила к проекту ASan и UBSan — стандартные инструмент для поиска ошибок работы с памятью, знаковых переполнений, деления и ноль и так далее, а после проанализировала их вывод. Никаких чудес.

30 лет серверному ДжаваСкрипту!

Поздравляю всех фронтендеров с юбилеем серверного ДжаваСкрипта — ровно тридцать лет назад вышел Netscape Enterprise Server 2.0 с поддержкой технологии SSJS (Server-Side JavaScript).

Код можно было писать прямо внутри страницы (как в ПХП, например), оборачивая куски, выполняемые на сервере при помощи тега SERVER:

<SERVER>
write("Click a link to display an image:<P>")
cursor = database.cursor("select * from rockStarBios")
while(cursor.next()) {
    write(cursor.photos.blobLink("image/gif", "Image " + cursor.id))
    write("<BR>")
}
cursor.close()
</SERVER>

Позднее он на этом поле проиграл конкуренцию «Микрософту» и их технологии «Активных Серверных Страниц» (ASP), где можно было программировать на JScript (был такой диалект «ДжаваСкрипта») или VBScript и исчез с радаров.

Добавлено: оказывается я сам эту дату и раскопал, и даже в «Википедию» добавил.

Ранее Ctrl + ↓