惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
A
Arctic Wolf
S
Security Affairs
O
OpenAI News
SecWiki News
SecWiki News
TaoSecurity Blog
TaoSecurity Blog
H
Heimdal Security Blog
T
Threat Research - Cisco Blogs
Hacker News: Ask HN
Hacker News: Ask HN
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
C
Cisco Blogs
The Hacker News
The Hacker News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
T
Tenable Blog
T
The Exploit Database - CXSecurity.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
人人都是产品经理
人人都是产品经理
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V2EX - 技术
V2EX - 技术
L
LINUX DO - 最新话题
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
T
The Blog of Author Tim Ferriss
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
The Cloudflare Blog
N
News and Events Feed by Topic
量子位
Google DeepMind News
Google DeepMind News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Attack and Defense Labs
Attack and Defense Labs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hacker News - Newest:
Hacker News - Newest: "LLM"
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
Microsoft Security Blog
Microsoft Security Blog
Know Your Adversary
Know Your Adversary
Webroot Blog
Webroot Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Ch4IR: мой 4х канальный видеорекордер на Android который не умеет делать запись
JDJ · 2026-04-24 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение5 мин

Охват и читатели92

Кейс

В далёком 2018г. я целых 24 часа работал на какой то фабрике в Подмосковье. Делающей салаты и другие полуфабрикаты. В каком то отделе, то ли контроля, то ли безопасности. В общем надо было смотреть в камеры видео наблюдения. Ну и вроде всё, сутки через трое. Хотел уйти с 5/2 на 1/3. Но я не согласился, слишком тяжело, слишком. Через 6 лет после тех суток я начну изучать Java и пробовать писать приложения на андроид. Третьим моим пет приложением будет Ch4IR.

Написанный на библиотеке LibVLC и в память о несложивщейся карьере в сесурити.

Он был настоящим RTSP рекордером: отображал 4 потока, писал 4 потока на флешку или usb диск, нарезал куски видео по 60 минут и автоматически удалял записи старше указанной даты. Он умел воспроизводить записи и перематывать их. Но всё изменилось, перед самой публикацией.

dota2, теннис, кино и парковка.

dota2, теннис, кино и парковка.

Мне просто нравилось делать приложение, я не думал и не знал ни о каких лицензиях сторонних библиотек. Как оказалось библиотека LibVLC имеет лицензию LGPL требующую либо открывать код, либо подгружать библиотеку динамически, давая пользователю возможность её заменять. Динамическая подгрузка это что то сложное и не безопасное, а открыть код, как? Как можно открыть такой крутой, сложный код который принесёт мне миллионы, зачем? Вы пошутили? Поэтому я перешёл на встроенный в андроид ExoPlayer с лицензией Apache 2.0. Который не умеет одновременно, и показывать, и писать видео с камеры видеонаблюдения.

Большая часть функционала была потеряна, пришлось придумывает новые функции. Почему то не сразу, но всё таки пришла мысль добавить к воспроизведению RTSP, поддержку m3u8 ссылок для просмотра IPTV. Ну скучно же смотреть весь день на парковку или склад. В самом приложении никакого контента нет, оно просто проигрыватель. Но ссылки на бесплатные каналы можно поискать в сети. И в приложении даже есть один линк на такой репозиторий GitHub. Можно загружать их пачками из файлов txt или m3u.

Добавление плейлистов из файла m3u

Добавление плейлистов из файла m3u

Появление IPTV здорово помогло отладить кнопку Mute и цвет рамок на экране, так как камер с микрофоном у меня не было. Но у кого-то они точно есть. Цветов у рамок экранов, после удаления возможности записи, осталось всего три:

  • белый - stop

  • зеленый - play

  • жёлтый - play + mute

  • красный - record

И это всё ещё был просто онлайн медиапроигрыватель, хоть и в несколько окон. Надо было что то ещё. Очень хотелось добавить YouTube. Но там обязательная авторизация и плюс он скорее про ролики, а не про онлайн стримы. А вот Twitch, Twitch да, он про онлайн, и позволяет смотреть стримы без регистрации, хоть и с рекламными вставками. И делается это довольно просто. Нужна просто одна html страница на любом домене и всё.

Скрытый текст
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Ch4IR</title>
    <script src="https://player.twitch.tv/js/embed/v1.js"></script>
    <style>
        html, body {
          margin: 0;
          padding: 0;
          height: 100%;
          overflow: hidden;
          background-color: black;
        }
        #twitch-embed {
          width: 100vw;
          height: 100vh;
        }
    </style>
</head>
<body>
<div id="twitch-embed"></div>
<script>
    const urlParams = new URLSearchParams(window.location.search);
    const channelName = urlParams.get('channel');

    if (!channelName) {
      document.body.innerHTML = "<p style='color: white; text-align: center;'>Missing channel</p>";
    } else {
      const player = new Twitch.Player("twitch-embed", {
        width: "100%",
        height: "100%",
        channel: channelName,
        autoplay: true,
        parent: ["тут ваш домен"]
      });
    }
</script>
</body>
</html>

и стримы будут работать по ссылкам

https://ваш.домен/?channel=название_канала

Но ExoPlayer не умеет показывать Twitch, правильно, не умеет. Но умеет гугловский WebView. И если у вас нет сервисов Google на устройстве, то стримы твича приложение вам не покажет. Ошибки воспроизведения всех типов ссылок, тоже показывает WebView. Он вообще молодец. Поскольку мой СТУЛЬчик родом из рекордеров, он умеет делать Fullcreen, Zoom и Pan. И даже мышкой. Да мышкой тоже можно управлять. А вот пультом нет, казалось бы, а как же Android TV? Приложение показывающее в 4 экрана IPTV и не поддерживает телик, серьёзно? Ага, серьёзно. У меня нет Android TV, а если и появится, я 8 раз подумаю, стоит ли возиться с ним. Там всё управление завязано на пульт, который захватывает фокус элементов. А у меня одно меню на восемь экранов, семь из которых могут быть скрыты. Хотя это класный вызов, но... я восемь раз подумаю. Тем более что usb или air мышка стоят не дорого, а с ними работает и так.

И так, в приложении на самом деле 8 экранов (4 ExoPlayer + 4 WebView). Они просто появляются или скрываются в зависимости от типа выбранной для отображения ссылки. Меню вызывается при удержании пальца на любом экране. Но если присмотреться, то можно заметить что оно при просмотре IPTV вызывается быстрее, чем при просмотре Twitch. У твича есть свои элементы управления: запуск, остановка, изменение громкости, Mute. Чтоб управлять твичем через его собственные кнопки и не вызывать при этом моё меню, пришлось увеличить время удержания пальца для WebView.

И это было самое сложное, сложнее записи и удаления файлов. Это до сих пор самое сложное что приходит на память, из того что приходилось делать. Связать кнопку громкости твича с моей Mute. Твич отлично присылает события от своих кнопок в моё приложение через JavaScript Bridge. Но если ползунком убрать звук на твиче до 0, а потом нажать Mute. Твич отправит сообщение что звук включен, а громкость у этого звука будет равно 0. Потому что Mute на твиче восстанавливает предыдущее значение громкости, которое ползунком можно сдвинуть в 0. Хотя прошёл уже год, может что то и изменилось за это время у них. Проверил, исправили, а скорее подсмотрели у меня, и тоже выталкивают при анмуте громкость на 10%. Правильно я не хотел открывать код, ну всё таки подсмотрели.

Скрытый текст
private void setTwitchPlayerMute(boolean needMuted) {
        WebView webView = webViewRef != null ? webViewRef.get() : null;
        if (webView != null) {
            webView.evaluateJavascript(WINDOW_PLAYER_READY, value -> {
                //   Log.e(AppController.LOG_TAG, "Твичу пришла команда мут.анму, а твич реди статус = " + value);
                if (TRUE.equals(value)) {
                    if (needMuted) {
                        saveTwitchVolume();
                        webView.evaluateJavascript(TWITCH_MUTE_SCRIPT, null);
                        //   Log.e(AppController.LOG_TAG, "твичу пришла команда сделать мут" );
                    } else {
                        webView.evaluateJavascript(TWITCH_UNMUTE_SCRIPT, null);
                        //   Log.e(AppController.LOG_TAG, "твичу пришла команда сделать анмут" );
                        if (twitchVolume == 0f) {
                          // КАРАУЛ, УКРАЛИ :)
                            webView.evaluateJavascript(String.format(Locale.ENGLISH, TWITCH_SET_VOLUME_SCRIPT, 0.1f), null);
                            //  Log.e(AppController.LOG_TAG, "При анмуте громкость была 0: установлена 0.1" );
                        } else {
                            webView.evaluateJavascript(String.format(Locale.ENGLISH, TWITCH_SET_VOLUME_SCRIPT, twitchVolume), null);
                            // Log.e(AppController.LOG_TAG, "При анмуте установлена громкость" + twitchVolume);
                        }
                    }
                }
            });
        }
    }

Но это пустяки по сравнению с тем что получилось.

2026

Бывшие коллеги могут теперь смотреть спорт, ставки, мультики, танцующих и приседающих девочек на твиче, Джейсона Стэйтема. А ну и за складом тоже. А я нет. Я не смог смотреть за тем производством. Там в 2018 под предлогом важности работы, коллеги в столовую не ходили, а заказывали обед к столу, по звонку. Штрафовали на пятак мойщика за то что камера запотела. Подсовывали в паллет мусор чтоб выжить соперника упаковщика с любовного фронта. И всё это за одну смену стажёра. Я целые сутки просидел в этой копакабане, бесплатно. Тяжело, очень тяжело.

Скачать программу для работы.