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

推荐订阅源

S
Security Archives - TechRepublic
T
Tor Project blog
Project Zero
Project Zero
S
SegmentFault 最新的问题
月光博客
月光博客
P
Palo Alto Networks Blog
H
Help Net Security
美团技术团队
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
T
Threatpost
Jina AI
Jina AI
S
Securelist
S
Schneier on Security
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy International News Feed
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Simon Willison's Weblog
Simon Willison's Weblog
T
Threat Research - Cisco Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
T
The Blog of Author Tim Ferriss
Google Online Security Blog
Google Online Security Blog
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
Hacker News: Ask HN
Hacker News: Ask HN
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
爱范儿
爱范儿
AI
AI
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
MongoDB | Blog
MongoDB | Blog
H
Hacker News: Front Page
C
Cybersecurity and Infrastructure Security Agency CISA
Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
L
LangChain Blog
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Кто решает судьбу вашего проекта? Разбираем заинтересованные стороны. BABOK #1 Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче 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 миллионов точек без потерь
Как я написал свой клиент Miracast для шаринга экрана под Linux в 2026 году и погряз в войне за проприетарные байты
Illium · 2026-06-14 · via Все публикации подряд на Хабре

Средний

6 мин

0

Введение: Почему в 2026 году это всё ещё боль?

Меня зовут Илья, мне 17 лет и всё началось с банального желания. У меня есть рабочий сетап на Arch Linux + Hyprland, диван и новенький телевизор Samsung на стене. Мне хотелось простого человеческого действия, это запустить фильм или открыть браузер на большом экране без необходимости тянуть через всю комнату чёртов HDMI-кабель.

В Windows 10/11 это делается в два клика: нажал Win + K, выбрал ТВ, готово. Как это выглядит в современном Linux? Ну… примерно как сборка космического корабля из говна и палок.

Я честно пошел в интернет и написал на Reddit:

«Why is casting your screen to a TV on Linux still this hard in 2026?» Я попытался поставить gnome-network-displays и miraclecast. Мой ТВ даже не увидел. Окей, погуглил, запустил демона avahi. Телевизор наконец-то нашёлся! Нажимаю подключиться… получаю ровно один статичный кадр на экране ТВ, после чего весь экран намертво замерзает.

Пост внезапно собрал кучу апвоутов и волну сочувствия в комментариях. В этот момент у любого линуксоида внутри щёлкает тумблер: «Хочешь сделать хорошо - сделай это сам». Я решил ради шутки и фана написать за пару вечеров свою легковесную CLI-утилиту на Python с минимальным количеством зависимостей и даже не пытался реализовывать настоящий Miracast а лишь обычный DLNA.

Так родился проект FluxCast. Но я ещё не знал, в какой ад низкоуровневой отладки это меня затянет.

Акт I: Эйфория первого запуска

План был простой как три копейки: берем ffmpeg для захвата экрана, докидываем стандартные библиотеки Python (вроде http.server) и склеиваем это в один скрипт.

Хронология моих первых коммитов со стороны выглядит как биполярное расстройство разработчика:

  • 2 мая: Скелет готов. Код ужасен, но он пытается что-то стримить.

  • 3 мая: Исторический момент. Видео пошло на экран, звук заиграл! Но радость была недолгой. Задержка между действием на мониторе и картинкой на ТВ составляла… около 20 секунд из за ограничений протокола DLNA и его буферизации. Смотреть так видео или, не дай бог, презентации просто нереально. Я оставляю в следующем коммите оптимистичный комментарий: fix_audio:TODO_fix_delay_ =] и ухожу курить мануалы.

  • 4 мая: Есть контакт! Я закопался глубже в стандарты Wi-Fi Direct, выкинул лишние промежуточные прослойки и переписал трансляцию напрямую через RTSP/RTP пайплайны GStreamer. Задержка упала почти до нуля. Картинка плавная, мышка не отстает. Победа? Если бы…

Акт II: Добро пожаловать в зоопарк Smart TV

Как только твой скрипт начинает работать на твоем личном телевизоре, тебе кажется, что ты покорил мир. Но как только проект вылезает из недр GitHub, к тебе приходят они, другие пользователи. И от них ты узнаешь, что оказывается каждый производитель железа срать хотел на единые стандарты Miracast.

  • Телевизоры LG и эпоха пингов (7-13 мая): Прибегают владельцы LG WebOS. У них FluxCast отваливается ровно через 10 секунд после старта. Почему? Оказывается, капризные корейские телевизоры требуют регулярных пустых RTCP keep-alive пакетов и ограниченного стабильного битрейта. Если их нет, ТВ закрывает сессию. За 4-5 дней мы отлаживаем эту проблему с первыми тестерами.

  • Samsung 2024+: Новые телевизоры Samsung стали строже относиться к протоколам безопасности. Из-за бага в коде программа FluxCast сообщала телевизору, что поддерживает защиту контента. Телевизор ждал подтверждения шифрования, не получал его и через 11 секунд разрывал соединение. Кроме того, телевизор ждал, что компьютер сам запустит видеотрансляцию, а программа в это время ждала действий от телевизора.

  • Проблема с артефактами (KDE/GNOME): При трансляции экрана на статичной картинке появлялись небольшие визуальные артефакты (сраные пульсирующие кубики). Попытка включить умное обновление кадров (intra-refresh) убирала артефакты, но намертво вешала стрим через полторы минуты, а мой костыль с перезапуском потока приводил к черному экрану на телевизорах LG. Пришлось временно откатить эти фиксы, чтобы вернуть стабильность. Война с артефактами продолжается и по сей день и висит в открытом issue.

К концу мая проект внезапно “повзрослел”. Я добавил симпатичный системный трей используя библиотеку pystray, чтобы уйти от чистого терминала, и настроили полноценную работу через xdg-desktop-portal — теперь захват экрана работал на любом Wayland-композиторе из коробки.

А потом случилось то, чего я вообще не ожидал. Энтузиаст под ником alba4k залетает в репозиторий, наводит там порядок, создает и по сей день поддерживает пакет в AUR и… пробивает FluxCast на официальную ArchWiki в раздел Miracast софтверного каталога мультимедиа! Мой проект теперь стоит на главной вики линуксоидов рядом с официальным софтом от GNOME.

Акт III: Отладка черного ящика и война за портативность

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

Пользователь SebSch182 решил запустить Fluxcast через фирменный адаптер Microsoft 4K Wireless Display Adapter.

Эта проприетарная железка наотрез отказывалась принимать стандартный видеопоток на 3-м уровне RTSP рукопожатия и аудиопоток, который выдавал GStreamer. Соединение просто рвалось в ту же секунду. Пришлось копать спецификации Intel WiDi и смежных стандартов стриминга. Выяснилось, что адаптер требует жестко фиксированный формат аудиопакетов (LPCM со специфическими заголовками) и дико чувствителен к микроскопическим задержкам таймингов.

Я сажусь писать свой собственный кастомный мультиплексор аудио на Python прямо внутри проекта. Запушил, жду.

  • Видео работает! но обрывается.

  • Исключаю keepalive пакеты конкретно для него чтобы адаптер не ругался.

  • Видео работает и не обрывается! Но звука нет.

  • Делаю свобственный мультиплексор на Python попутно изучив библиотеку gc чтобы выжать из питоновской скорости максимум.

  • Фидбек от тестера: «Оно работает! Но звук ужасен, как будто из консервной банки».

Началась недельная игра в угадайку. У меня на столе этого адаптера нет. Мы гоняем коммиты туда-сюда. Я перевожу звук в Little-Endian (S16LE) — тестер пишет: «Стало ещё хуже, один белый шум и шипение». Возвращаю обратно.

Борьба с Майкрософт также длится до сих пор. Чтобы окончательно убедиться в теории, я скидываю тестеру ссылку на YouTube с чистой синусоидой, тест-тоном на 440 Гц. Когда ты тестируешь музыку, искажения понять сложно, а на чистом тоне сразу слышно характер деградации звука. Посмотрим чем завершится эта история но этот blind-дебаг стал для меня настоящим инженерным тренажёром.

Параллельно с дебагом железа всплыла другая проблема. Python-скрипт это круто, но заставлять обычного пользователя клонировать репо, вручную ставить кучу системных зависимостей, ставить иконки для приложения, алиасы и вручную пихать в системные папки конфиг для wpa_supplicant — это верный способ растерять всю аудиторию. Софт должен запускаться в один клик.

На этом этапе к разработке активно подключился alba4k. Мы решили автоматизировать всё, что только можно:

  1. Мы написали инсталлятор на bash (и деинсталлятор тоже) который сам после клонирование репо и его запуска все нужные файлы положит в /opt, сделает алиасы, конфиги и.т.д.

  2. Портативный AppImage: Чтобы полностью отвязаться от проблем с разными версиями библиотек в системе, я упаковал весь проект в единый AppImage-пакет. Сделали специальный bash-скрипт для автоматической сборки и добавили кастомный wrapper для ffmpeg. Теперь пользователю достаточно скачать один файл, выдать ему права на запуск и всё работает из коробки почти в любом окружении.

Заключение: Из костыля в PyPI-пакет

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

За чуть больше чем месяц программа научилась:

  • обнаруживать Miracast-приёмники,

  • Выполнять полноценное RTSP-рукопожатие

  • Что самое главное в отличие от заброшенного работать параллельно с обычным Wi-Fi соединением на почти всех адаптерах с поддержкой MCC (Multi-Channel Concurrent).

  • захватывать экран через xdg-desktop-portal в KDE и GNOME, через x11grab на X11 и через wf-recorder в Hyprland, Sway и других Wayland-композиторах,

  • автоматически подбирать параметры стрима для разных телевизоров,

  • поддерживать LG WebOS, Samsung, TCL телевизоры и даже были отчеты об успешной работе на проекторах и хоть как то частично работать с Microsoft Wireless Display Adapter,

  • запускаться через AppImage,

  • ставиться через AUR,

Но самое главное для меня что Fluxcast собрал за столь небольшое время 60 звезд на Github тем самым получив признание и место в официальной ArchWiki и обзавёлся удобным треем как для обычных пользователей так тайлинговых менеджеров.

Сейчас я готовлю релиз для публикации на PyPI, чтобы утилиту можно было поставить на абсолютно любом Linux-дистрибутиве одной понятной командой: pip install fluxcast.

Мораль истории проста: если в Linux что-то работает не так, как вам хочется - не бойтесь лезть под капот! Даже если в процессе вам придётся воевать с байтами, проводить в документациях больше времени чем на улице, слать иностранцам синусоиды на 440 Гц и писать системные скрипты сборки вместо сна. Оно того стоит. Это именно тот опыт который я так хотел получить от Open-source разработки.

Если кто-то заинтересовался проектом или хотел бы помочь. Все ссылки здесь.