Как получить почти бесконечное зацикливание без использования циклов и без переполнения стека вызовов:
// Установите N = 64, и эта функция никогда не завершится
// Количество вызовов (calls) = 2^(N+1)
// Максимальная глубина вложенности = N
let calls = 0
const N = 18
function func(state, visited) {
calls++
if (calls > 10_000_000) {
throw new Error('calls: ' + calls)
}
if (visited.includes(state)) return
const newVisited = [...visited, state]
func((state + 1) % N, newVisited)
func((state + 1) % N, newVisited)
}
func(0, [])
console.log('calls:', calls)
Почему это работает без переполнения стека?
func(0, [])
├── func(1, [0])
│ ├── func(2, [0,1])
│ │ └── ... глубина растёт до N
│ │ и перебираются все возможные комбинации значений в newVisited
│ └── func(2, [0,1]) - возвращается, глубина УМЕНЬШАЕТСЯ
└── func(1, [0]) - второй вызов, стек уже освободился
А Garbage Collector (GC) при этом бесконечно удаляет созданные ранее массивы newVisited
Стек "дышит" - достигает максимума N, потом сворачивается, потом снова растёт. Это обход огромного дерева, имеющего небольшую глубину, но очень большую ширину. Это не бесконечная рекурсия. Но при N = 64 количество вызовов будет 2^65 (примерно 10^19) - это займёт тысячи лет, и стек никогда не переполнится.
Только этим своим новым скриптом загрузил уже сотни файлов. Вам теперь тоже ещё легче будет спасти какие-нибудь сканы старых газет - помните что в Commons можно загружать только файлы со свободной лицензией - например когда автор умер более 70 лет назад.
Если хотите помочь цивилизации в нашем движении презерваторов - пишите мне - расскажу какие пакеты файлов нужно скачать и загрузить.
В этот раз не буду ждать никаких пятниц, потому что вся начинающаяся неделя — гигантская суперпятница перед гипервыходными. В этот раз я выкатил особо отбитый инженерный бред, по сути скорее даже геометрическую головоломку. Может, боян, не проверял. Оно мне только что прибредилось в полусне.
Ахинейно-поршневой двигатель с симметричным поршнем и параллельными ахинеями.
Вот такой вот «двигатель», у которого поршень в виде «колобашки» без всяких шатунов сидит сам на шатунной шейке коленвала. Косинусную составляющую вращения он, естественно, отрабатывает сам, а синусную… как говорил сатирик, вы побольше воздуха наберите и покрепче сядьте — синусную отрабатывает весь сдвоенный цилиндр, болтаясь вверх-вниз на маленьких поршеньках-направляющих (для этого сверху и снизу в нём сделаны дополнительные маленькие цилиндрики). В этом месте вы все уже представили, какой массой мы собираемся размахивать в воздухе туда-сюда, а самые сообразительные — ещё и какие там будут перекосы и какое адское трение (усилие-то приложено несбалансированное).
Проржавшись, переходим к занимательной геометрии, поскольку в силу описанного считать это двигателем уже нельзя. В геометрии можно сделать следующие допущения: охлаждающая рубашка не нужна, 1200 оборотов при 50 кубиках нам достаточно (масса не страшна), вместо свечи вспышки обеспечивает маг-пирокинетик, трение в малых ЦПГ отсутствует. В общем, переходим к математической абстракции.
И тут становится интересно: можно ли, правильно выбрав диаметры малых ЦПГ, положение их перепускных окон на главном цилиндре, положение выпускных и продувочных окон на них самих и так далее, реализовать не просто фыр-фыр-двухтактник, в котором окна в главном цилиндре открываются «сразу на улицу», а какой-нибудь более интересный цикл: Аткинсона, Миллера или, наоборот, Цоллера (Доппельколбен, который решает противоположную Аткинсону задачу), ну или там, не знаю, Уткинсона, Мурчинсона, Пушкина, Кукушкина или вообще Нак-Мак-Фиггля. Допустим, что к продувочным окнам ведут идеально гибкие шланги (абстракция же; в принципе, в реальной модели, если бы она была нужна, это более-менее обходится тоже).
Сами понимаете, что одни двигаются по синусу, другие — по косинусу, перепускные окна открываются согласно косинусоиде, выпускные и продувочные — согласно синусоиде, и всё это можно произвольно двигать вдоль ходов поршней, причём независимо. А если это кажется слишком лёгкой задачей — добавим возможность наклонять группу малых ЦПГ на небольшие углы (чтобы отрабатывали не чистый синус, а какую-то смесь), да ещё и вместо поршней в некоторых местах сделать полноценные золотники, которые открывают окна только при строгом совпадении положений, а не «от N мм и до мёртвой точки» (они же, кстати, и в шлангах не нуждаются, потому что наружная часть у них неподвижна).
В общем, такая вот небольшая тригонометрическая головоломка. Занимательная и в целом практически бессмысленная. Пафнутий Львович Чебышёв, конечно, назвал бы это задачкой для первого класса спецшколы для умственно отсталых, но простым смертным типа нас с вами может представлять интерес. Не забывайте только, что в малых ЦПГ при движении газ тоже не исчезает «в никуда», чтобы не получить незапланированный компрессионный двигатель, например. Задачка-то геометрическая, но граничные условия у неё от «реального» ДВС, иначе будет слишком просто.
Слышу уже от второго человека, что язык Rust не дает нормально работать с указателями в связанных списках, деревьях и графах (в моей вселенной ЯП без этого - это как свадьба без невесты). Взял ChatGPT, задал промпт: "write a code to insert a node into a doubly linked list in rust". Оно сгенерило нечто с кучей дополнительных слов, которых не было ни в Си, ни в Паскале 40 лет назад: borrow, as_ref, and_then, upgrade, map, downgrade, Some, clone, borrow_mut. Это все реально нужно или они там совсем озверели?
Вышло новое интервью на Русском (https://www.youtube.com/watch?app=desktop&v=BBL-IFZJGWA) от Романа Ямпольски (один из тех дядек, что твердит об опасности ИИ). Выдает фразы насколько непонятные, что пришлось нейронкой проанализировать смысл его высказываний.
Базовый тезис
Текущая линия развития (в сторону общих моделей и затем сверхинтеллекта) ведёт к ситуации, где долгосрочный контроль невозможен, а значит риск катастрофы становится доминирующим.
Что именно он считает главной угрозой
Не «нынешний чат-бот сам по себе», а переход к AGI, после которого появляется возможность самоускоряющегося улучшения (AI помогает делать следующий AI быстрее, параллельно, эффективнее), что приводит к ASI.
Для ASI он утверждает: мы окажемся в положении «муравьёв» относительно людей — не сможем предсказать, остановить, навязать ограничения.
Как по мне, в его суждениях есть несколько фундаментальных ошибок:
Он безусловно принимает на веру тот тезис, что "AGI будет однозначно враждебен к человечеству".
Как AGI придет к такому заключению, он объяснить не смог. И даже почему-то заезженный пример со скрепками не привел
Он говорит, что "Умный агент при оптимизации целей естественно приходит к инструментальным стратегиям (самосохранение, ресурсы, обман/шантаж как выгодные ходы в теории игр)".
Нет, и нет. Пока что это результаты просто мысленных экспериментов. И даже, если нейронки с чего-то додумают не то, то хватит ли им мозгов довести задачу до конца?
ИИ- это чёрный ящик (в смысле, что человек не понимает, как оно устроено), что уже умнее человека.
Уточнение, что умнее в определенных областях, и не факт, что во всех, которые важны для выживания/уничтожения человека. Калькулятор, смартфон, процессор: в мире найдется всего несколько десятков тысяч человек, которые понимает, как устроен калькулятор. Все, что сложнее, не сможет объяснить ни один человек в мире (имеется ввиду полностью, все детали и механизмы). Но бояться надо именно нейросетей - да...
Такие люди, как Роман Ямпольски нужны, чтобы сохранять трезвость мысли и адекватно оценивать риски. Но доводы его... неубедительны.
Состоялся первый мажорный релиз открытого проекта для шифрования текста и файлов Stirlitz. Программа написана на языке С++ и распространяется под лицензией GPLv3. Приложение адаптировано для работы в операционных системах семейства Linux, Windows и Android. Для пользователей Arch Linux в AUR доступен сценарий сборки пакета. Для пользователей Windows доступен экспериментальный инсталлятор. Для пользователей Android доступен экспериментальный пакет в формате apk.
Основные возможности Stirlitz 1.0:
Шифрование текста и файлов для передачи через любые каналы публичной связи (мессенджеры, e‑mail сообщения и тому подобное). Шифрование осуществляется на базе публичных ключей (алгоритм Ed25519) и алгоритма шифрования AES256.
Шифрование файлов для локального хранения. Шифрование осуществляется через задание имени пользователя и пароля с использованием алгоритма AES256.
Создание шифрованных профилей для хранения ключей, используемых для обмена сообщениями через публичные каналы связи.
Создание одноразовых профилей: ключи хранятся в защищённой памяти, выделяемой с помощью библиотеки libgcrypt, и уничтожаются после выхода из профиля или закрытия программы.
Криптографические функции вынесены в отдельную библиотеку stirlitz, которая может быть собрана и использоваться полностью независимо.
Для библиотеки stirlitz доступна документация в формате html.
DDoS-атаки: почему стандартные решения не спасают и как выстроить эффективную защиту. Интервью ispmanager с GreyWeb
Рады вас приветствовать, дорогие читатели!
Тема противодействия DDoS-атакам остается одной из самых острых и актуальных в сфере IT. Атаки постоянно эволюционируют, становятся более сложными и мощными, заставляя специалистов искать новые, более изощренные методы защиты.
В ispmanager мы регулярно сталкиваемся с вопросами наших пользователей о том, как обезопасить свои серверы и проекты. Именно поэтому мы провели глубокое интервью с ведущими экспертами по кибербезопасности из компании GreyWeb, которые специализируются на профессиональной защите от DDoS.
Что мы обсудили и почему это важно для каждого, кто управляет инфраструктурой:
• Эволюция угроз: Как меняются DDoS-атаки и почему вчерашние методы защиты сегодня уже неэффективны.
• Ограничения стандартных решений: Разбор типовых ошибок и мифов, связанных с "базовой" защитой.
• Комплексные стратегии: Какие подходы и технологии позволяют эффективно отражать даже самые мощные и целевые атаки.
• Взгляд изнутри: Практический опыт GreyWeb по предотвращению и минимизации ущерба от DDoS, кейсы и рекомендации.
• Подготовка к атаке: Что нужно сделать заранее, чтобы быть готовым к худшему сценарию.
Это интервью — не просто набор теоретических выкладок, а концентрат практического опыта и аналитики от специалистов, которые ежедневно борются с киберугрозами. Если вы системный администратор, DevOps-инженер, разработчик или владелец сервиса, который не понаслышке знает о рисках DDoS, этот материал будет для вас крайне полезен.
Готово ли ваше облако к 2026 году? Быстрый FinOps-чек-лист
Облачные расходы растут, а контроль и прозрачность часто не поспевают. Чтобы понять, насколько процессы готовы к следующему году, эксперты из Практики FinOps подготовили короткий чек-лист.
Это бесплатный инструмент в формате гугл-таблицы. Прохождение занимает 5–7 минут.
Что дает чек-лист:
видно, где процессы уже работают, а где есть пробелы
понятно, на каких этапах теряется прозрачность расходов
есть конкретные шаги, что имеет смысл внедрять дальше
Чек-лист можно пройти одному, например CTO или Head of Engineering, либо вместе с командой, инженером, архитектором и финансовым специалистом.
Результат, понятный срез текущего состояния и ориентиры, как корректировать облачные расходы в 2026 году.
Перевел почти всё на Grok 4.1 с декабря не смотря на ажиотаж в других моделях. 1. Дешево за большой контекст 2. Code execution дает возможность дешево анализировать данные 3. Реальные расходы токенов на задачи уровня flash и mini моделей, но качество заметно лучше 4. Хорошо следует схемам 5. Контекст 2M
Экономия в 3-4 раза с Claude Sonnet.
Где использовал: HR-тематика: массовая обработка резюме и вакансий Анализ данных, поиск информации
Claude Sonnet: $3 / $15 за 1M токенов (input/output)
Grok 4.1 Fast: $0.20 / $0.50 за 1M токенов
Использую Grok 4.1 Fast для простых задач и 4.1 Fast Reasoning когда нужно "подумать".
Расскажите в комментариях, на каких моделях работаете и для каких задач?
Когда говорят об автоматизации, чаще всего имеют в виду Python. Но важно понимать: Photoshop не выполняет Python-код напрямую.
Зато у него есть встроенная поддержка скриптов — Photoshop умеет исполнять код на JavaScript (ExtendScript).
Это не «JS как в браузере» и не замена Python. Это родной язык автоматизации Photoshop, с прямым доступом к:
слоям
тексту
смарт-объектам
экспорту файлов
истории документа
Если задача — управлять самим Photoshop, то скрипты внутри Photoshop — самый надёжный путь.
Что это даёт на практике
Через код можно:
массово менять текст в PSD
генерировать сотни изображений из одного шаблона
автоматизировать экспорт
исключить Actions и Variables с их ограничениями
По сути, мы описываем действия, которые дизайнер делает руками, но в виде кода.
Пример задачи
Есть:
один PSD
текстовый слой
значения 1 м → 100 м
Нужно:
автоматически подставить значения
сохранить 100 PNG-файлов
вернуть PSD в исходное состояние
Пример скрипта для Photoshop (JSX)
#target photoshop
var doc = app.activeDocument;
var layerName = "1 м"; // имя текстового слоя
var outputFolder = Folder.selectDialog("Выбери папку для сохранения");
if (!outputFolder) {
alert("Папка не выбрана");
exit();
}
function findTextLayer(layerSet) {
for (var i = 0; i < layerSet.layers.length; i++) {
var layer = layerSet.layers[i];
if (layer.kind == LayerKind.TEXT && layer.name == layerName) {
return layer;
}
if (layer.typename == "LayerSet") {
var found = findTextLayer(layer);
if (found) return found;
}
}
return null;
}
var textLayer = findTextLayer(doc);
if (!textLayer) {
alert("Текстовый слой не найден");
exit();
}
for (var i = 1; i <= 100; i++) {
textLayer.textItem.contents = i + " м";
var file = new File(outputFolder + "/pkabel_4x2_5_" + i + "m.png");
var opts = new PNGSaveOptions();
opts.compression = 9;
doc.saveAs(file, opts, true, Extension.LOWERCASE);
}
// откат без сохранения
doc.activeHistoryState = doc.historyStates[0];
alert("Готово!");
Привет, Хабр. Мы уже почти отправились на новогодние праздники, но хотим обратить ваше внимание на обзор одной из наших интереснейших книг по теме искусственного интеллекта, вышедшей в конце октября. Это "Программирование с помощью искусственного интеллекта" (AI-Assisted Programming) Тома Таулли. Обзор вышел в корпоративном блоге компании SSP-Soft, он называется "Рецензия на книгу «Программирование с помощью искусственного интеллекта»". Не скроем, нас, как и всю отрасль, всерьёз интересует тема промпт-инжиниринга, однако эта книга - лишь первая ласточка. В настоящее время у нас в работе две рукописи, которые уже можно анонсировать. В высокой степени готовности работа Константина Клепикова с рабочим названием "Графы знаний и логика работы больших языковых моделей". Кроме того, недавно мы согласовали и заключили договор с Камилем Гадеевым @Kamil_GR, который рассматривает в своём блоге на Хабре различные темы, связанные с правильным формулированием промптов и с галлюцинациями искусственного интеллекта. Рабочее название его книги - "Как говорить с искусственным интеллектом. Практическое руководство по промпт-инжинирингу и работе с LLM". Книги по разработке ИИ-агентов (авторская) и RAG (переводная) - в ближайших планах.
Команда разработки Хабра запустила культовую игру Doom прямо на профильном ресурсе для IT-специалистов. Это открытая версия Chocolate Doom, доступная в браузерах на ПК и мобильных устройствах.
Управление на ПК стандартное, также работает мышка (поворот, движение, выстрел). В мобильной версии (в горизонтальной ориентации) также добавлены контролы для удобного управления.
Неделю назад выступал с темой MCP сервера и как можно решить проблему с забиванием контекста как при старте диалога, так и при последующем общении через MCP сервера
Это больше походит на исследовательскую работу, а не на мой каждодневный сценарий использования. Мне было интересно, до скольки токенов можно сжать диалог без ухудшения качества
Вот, можете ознакомиться ⤵️⤵️⤵️
Давайте для начала о том, что такое MCP
MCP — протокол, который позволяет LLM подключаться к внешним сервисам: Notion, GitHub, Jira, Google Analytics, любой сервис с API. Один стандартный разъём вместо зоопарка интеграций — как USB для AI.
Протокол создали в Anthropic в ноябре 2024, в декабре 2025 передали в Linux Foundation с поддержкой OpenAI, Google, Microsoft и AWS. Де-факто стандарт индустрии. Вот тут есть каталог серверов, можете глянуть
Но у MCP есть две неочевидные проблемы, на которые я наткнулся после нескольких месяцев активного использования.
🛸 Проблема №1: Tools съедают контекст до старта
Предзагруженные MCP Tools занимают Context Window ещё до первого сообщения. Как системный промпт — уже там, когда вы только открыли чат.
Конкретные цифры из моих замеров:
Apify MCP — 7 инструментов, ~11.8k токенов
GitHub Official MCP — 40 инструментов, ~25-30k токенов
Несколько серверов вместе — легко съедают 40-70k токенов
При контексте в 200k это уже 20-35% бюджета — и вы ещё ничего не спросили.
🛸 Проблема №2: JSON забивает контекст в процессе
MCP-сервер — это переброска JSON-запросов между LLM и сервисом. Каждый вызов инструмента генерирует запрос и ответ, которые остаются в истории чата. Эти JSON часто громоздкие — особенно ответы с данными. Контекст забивается не на старте, а по ходу общения.
Почему это важно
Популярные модели имеют Context Window 128-200k токенов. Это весь бюджет чата: системные промпты, знания о вас, файлы, коннекторы. Что не влезает — забывается.
Хуже того: чем больше загружено в контекст, тем чаще модель теряет детали. В тестах на поиск 8 фактов GPT-5.1 падает с 65% до 30% при заполнении до 100k токенов. Даже более мощная GPT-5.2 проседает с 95% до 70%.
То есть проблема не только в лимите, но и в качестве работы модели при забитом контексте.
Решение для проблемы №1: Dynamic MCP
Docker Dynamic MCP — подключаем серверы не заранее, а динамически, во время разговора.
Например, вместо 40+ инструментов GitHub в контексте постоянно — лёгкий шлюз с базовыми командами:
mcp-find — найти сервер в каталоге
mcp-add — подключить к текущей сессии
mcp-exec — выполнить инструмент
mcp-remove — отключить сервер
Базовая нагрузка: ~4k токенов вместо 40-70k. Серверы подключаются по требованию и удаляются, когда больше не нужны. Работает с каталогом Docker MCP, где уже 300+ верифицированных серверов.
Нужно установить Desktop Client и в настройках Beta Features включить Enable Docker MCP Toolkit
Решение проблемы №2: запускать MCP сервера в SubAgents
SubAgents из Claude Code выполняют запрос в изолированном контексте, возвращая только результат.
Вся грязная работа — поиск серверов, подключение, вызовы инструментов, парсинг JSON-ответов — происходит в отдельном контексте подагента. В основной контекст попадает только чистый финальный ответ.
Claude Code (основной контекст)
│
▼ Запрос
┌─────────────┐
│ SubAgent │ ← вся работа с MCP
└─────────────┘
│
▼ Только результат
Claude Code (чистый контекст)
Итог: ~70k токенов экономии = 35% контекста свободно для реальной работы
Для полного описания всего этого нужна большая статья, так как без картинок и примеров суть идеи может быть непонятна
Факториалы и субфакториалы. Разбираемся с ними вместе с экспертами ИТ-компании «Криптонит».
Когда человек первый раз встречает восклицательный знак в математических записях, он обычно удивляется. Это выглядит, словно цены на распродаже: 50! 80! 100!
На самом деле запись вида n! называется факториал и означает произведение всех натуральных чисел от 1 до n. Например: 5! = 5 × 4 × 3 × 2 × 1 = 120.
Идея факториала встречалась ещё в Древней Индии, а современное обозначение n! ввёл французский математик Кристиан Крамп в 1808 году.
Функция вычисления факториала есть во многих математических библиотеках. Она применяется, в частности, при анализе алгоритмов сортировки для определения верхней границы их сложности.
В общем случае факториал n! показывает количество всех возможных перестановок ИЗ n элементов. Например, из трёх элементов [A, B, C] всего может быть 6 перестановок: ABC, ACB, BAC, BCA, CAB, CBA, т.е. 3! = 6.
Дальнейшее развитие идеи привело к появлению субфакториала.
Он обозначается !n и показывает число перестановок n элементов, в которых ни один элемент не остаётся на своём месте.
Для тех же трёх элементов [A, B, C] субфакториал записывается как !3 и равен двум, поскольку возможны только две комбинации, в которых каждый элемент меняет своё положение: [B, C, A] и [С, A, B].
Факториалы и субфакториалы используются в разных разделах математики.
В комбинаторике они выражают количество перестановок, в теории чисел их изучают в контексте делимости, в теории вероятностей — для подсчёта элементарных исходов.
Рассматриваем генетический код через призму машинного в новом выпуске ПВЗ
ПВЗ — подкаст команды Ozon Tech, в котором мы говорим о технологиях. На этот раз — о генной инженерии.
У микрофона ведущие Марина Самойлова, руководитель направления платформы данных, и Виктор Корейша, руководитель направления Managed Services. Гость выпуска: учёный-нейробиолог Владимир Алипов.
Разобрали, действительно ли у человека и бактерии один и тот же генетический код, возможности и этичность его редактирования. Узнали, с какой биг датой работают учёные и смогут ли они сделать человека умнее.
Как тестировать Joomla PHP-разработчику? Компонент Patch tester.
Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать.
На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla.
Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора.
Записал видео (на английском языке) своей критики выдачи ИИ тула от Абишека Вармы из университета штата Иллинойс. Тул генерит SVA (SystemVerilog Assertions) для верификации (по простонародному - QA) цифровых аппаратных блоков систем на кристалле. Для повышения понятности, в начале видео рассказал основные идеи протокола AXI (Advanced eXtensible Interface): правила хендшейка valid/ready, конвейерность транзакций, внеочередной возврат данных по запросу чтения с тэгами.
Правила для проверок оно пишет некорректные. Например что если записать по адресу 100 число 123, то отныне и вовеки веков если прочитать с адреса 100, то там будет 123. Не задумывается, то после первой записи и до чтения может быть вторая, которая запишет число 456.
Далее, проверка для теста проверяет что после сброса (reset) данные на шине AXI будут равны X в виде data == 'x. Но это ерунда по двум причинам: Во-первых, данные могут быть после сброса какими угодно, хоть 0, хоть 123, так как они будуг игнорироваться если с ними не ходит бит valid=1, который кстати сбрасывается в 0. Во вторых, операция сравнения == 'x (неопределенным значением) дает в качестве результата 'x. Чтобы делать именно сравнение с 'x нужно использовать другую операцию ===, то это все равно не будет работать потому что (1). Это вообще невалидный тест.
Но это все цветочки - на это его можно натаскать. Более интересный вид тупости - ИИ конструирует проверку, что если сделаны запросы с тэгами 11, 3, 4, 7, то и данные будут возвращаться в таком же порядке - с тэгами 11, 3, 4, 7. Ему не приходит в голову задать себе вопрос - если бы это было так, зачем в AXI вообще были бы нужны тэги? Они ведь нужны чтобы идентифицировать данные которые приходят не в том порядке, скажем 4, 11, 3, 7.
Не нравится скроллить длинные тексты, поэтому искал веб-браузер для Андроид, в котором можно перелистывать касаниями. Поиск и нейросети подсказали несколько вариантов, из которых часть оказалась устаревшей или просто ошибочной. К примеру- в Mozila Firefox была такая встроенная возможность , но её убрали. С остальными дело такое-
У Firefox есть много расширений, среди них нашёл подходящий режим чтения с перелистыванием. Однако оно работало плохо .
EinkBro. Его пришлось ставить из APK. Тоже глючил.
UC Browser. Обещают такую функцию. Из Гугл Плей его удалили, но в магазине Xiaomi он есть. Среди разрешений требует возможность изменять системные настройки. Поэтому решил не устанавливать.
4. Наконец нашёл Via Browser. Очень маленький, но с богатыми настройками, среди них можно назначить на "длительные нажатия" на стандартные элементы интерфейса( к примеру, на "вперёд") разные действия на выбор. Среди них есть и перелистывание. Кроме того Via поддерживает скрипты и в режиме чтения очень хорошо сохраняет уже переформатированный текст( с крупным шрифтом) в PDF и MHT( даже сложные статьи с Хабра).