Дома в качестве часов и прогноза погоды используется старый планшет Acer A500, аккумулятор у него отключен, и он постоянно работает от сети. Вопрос есть ли какая-то возможность получать с его датчиков данные по локальной сети. Акселерометр, датчик освещения, температуры и т.д.?
Андроид на нем стоит уже старенький 4.0.
Возможно есть како-то готовый софт который шлет данные в сеть.
Имеется два Андройд (Android 4.1) планшета. У них удалены аккумуляторы, питание у них от сети и используются в качестве "фоторамки".
Захотелось попробовать собирать с них значения температуры, на небольшой сервер на котором бы работала SCADA система (пока не определился).
Пока все чего смог добиться это с помощью команды: "adb shell cat sys/class/thermal/thermal_zone1/temp" получать в ответ значение 32000 что соответствует температуре 32 градуса по Цельсию.
Может можно и каким то более простым способом это сделать
Все устройство подключены к одной беспроводной сети.
В итоге хочется получить на экране "АРМ" :) графики температуры, суточный, месячный.
В дальнейшем может как то еще получится получить данный с остальных датчиков.
Как и с помощью какого софта подобное можно реализовать?
Собственно, началось все с того, что мы купили телевизор.
Toshiba 55U7750EV
Уж не знаю, котируется он в кругах знающих людей или нет, но для нас в целом техника весьма неплохая. Используется как большой монитор, благо при наличии модуля Wi-Fi это совсем не проблема, не надо танцев с бубном и кабелем HDMI.
Пока только одна загвоздка - проблема с приложением Youtube.
После открытия приложения выскакивает системное сообщение о том, что для работы приложения требуются сервисы Google Play? которые не поддерживаются на этом устройстве. Это показалось странным, начался серфинг инета, результатом которого стало только одно решение вопроса: эти самые сервисы не знают моего устройства, а значит, их надо убедить, что я пользуюсь не Toshiba TV, а, например, Samsung Galaxy. Для этого есть замечательная программа Market Helper. Но для того, чтобы ею воспользоваться, нужны root-права. И вот тут беда. С ними полный пролет. Ни Kingroot, ни Baido Root, ни еще 6 разных приложений с 4pda помочь не смогли. Root получить не удалось.
Поэтому, собственно, я тут и графоманю. Есть ли хоть кто-то знающий, кто может помочь решить проблему? Почему не получается достучаться до root? Или, может, есть другой способ решить проблему с сервисами и Youtube? Очень надеюсь на коллективный разум)
Привет вомбаты. Поделитесь пожалуйста кому удалось успешно настроить смартфон на запись. Что ни пирога так слышно только меня на записи, а то и вообще ничего не слышно.
Пока диванные аналитики и скептики продолжают строчить комментарии, команда Marsa Chain просто берет и делает. Разработчик официально запустил сайт проекта, развернул Explorer и выложил прямую ссылку на скачивание официального Android-клиента в формате APK!
Мы с вами наблюдали за этим блокчейном на этапе зарождения, а теперь он обрел свое официальное лицо. Я уже изучил сайт вдоль и поперек и несу вам главные выжимки и инсайды.
Что прямо сейчас доступно на сайте?
● Официальный Android-клиент (APK): Больше никаких тестов «на коленке». Качаем чистое, подписанное приложение напрямую с сайта, заводим кошелек и начинаем майнить. Кошелек, майнинг, пулы - всё внутри одной эппки.
● Живой Block Explorer: Сеть полностью прозрачна. Появилось поле поиска, где по любому кошельку (они теперь официально начинаются на mrs...) или хэшу транзакции можно проверить баланс и историю переводов.
● Прозрачная токеномика (MINER_STAKE): На сайте официально закрепили механику: чтобы майнить, монеты MRS нужно заморозить через транзакцию стейкинга, получить «хэш-кредиты» и запустить добычу. Награды за подтвержденные блоки капают прямо на кошелек.
● Майнинг-пулы «из коробки»: Подтверждено, что можно майнить как соло, так и подключаться к пулам, где награда распределяется автоматически по правилам протокола.
Дорожная карта (Roadmap):
1. 20 мая 2026 года - Официальный публичный релиз и старт майнинга (мы как раз в этой точке!).
2. Q2 2026 - Публикация исходного кода на GitHub и анонс легкой ноды.
3. Q3 2026 - Первый халвинг! Награда за блок срежется до 5 000 MRS. В этот же период - релиз приложения в Google Play и App Store!
4. Q4 2026 - Запуск децентрализованных пулов.
5. 2027 год - Глобальное обновление Marsa 2.0, внедрение смарт-контрактов, поддержка NFT и второй халвинг (до 3 000 MRS за блок).
Что делаем сейчас?
Проект перестал быть кустарным. Перед нами готовая, высокопроизводительная C++ экосистема с низкими комиссиями и понятным вектором развития. Самое главное - успеть намайнить как можно больше монет до первого халвинга в третьем квартале, пока награда за добытый блок не снизилась вдвое. Marsa Chain позволяет позволяет майнить на обычном смартфоне во время «кофе-брейка».
Заходим, изучаем сайт, качаем APK и запрыгиваем в первый вагон, пока раздача максимальная!
За последние годы Google расширила функции личной безопасности в Android — смартфоны могут передавать медицинские данные экстренным службам, когда пользователи набирают 911.
Отправляемые данные должны быть введены в приложение «Личная безопасность». Сведения включают возраст, вес, группу крови, аллергии и многое другое. Информация передаётся через платформу RapidSOS, к которой подключены более 15 тыс. служб экстренной помощи.
Владельцы устройств на Android и iOS имеют возможность отправлять медицинскую информацию через RapidSOS с 2018 года. Функция также позволяет отображать эти данные на экране блокировки смартфона.
В некоторых случаях пострадавшие не могут сообщить о происшествии при наборе 911. Переданная медицинская информация позволит спасателям узнать больше о пользователе до прибытия на место событий, а также сэкономить время.
Функцию Emergency SOS можно включить в настройках Android-устройства в разделе «Безопасность и экстренная помощь». Затем необходимо настроить приложение «Личная безопасность». В сервисе можно указать контактную информацию и сведения о том, является ли пользователь донором органов.
Захватывающая визуальная новелла в стиле якутского фольклора, где вы станете Айсеном, молодым шаманом, возвращающимся в родную деревню после смерти деда. Разгадайте тайны смерти, путешествуйте по трём мирам (Верхнему, Среднему и Нижнему), сражайтесь с духами Абаасы и общайтесь с Тэнгри. Ваш выбор определяет судьбу: станете ли вы хранителем равновесия или жертвой древних сил? https://www.rustore.ru/catalog/app/com.seckunn.program
— Я сегодня снова кредиткой расплатилась в магазине. И еще счета пришли за квартиру… Может, тоже пока ею? — Надя осторожно коснулась плеча мужа, боясь, что от резкого движения тот может рассыпаться, как древняя реликвия.
Костя молча кивнул. Он уже полтора часа сидел за верстаком, гипнотизируя ноутбук и телефон, словно мог притянуть таким образом заказы.
— Пойдем домой. Когда будет надо, тогда и позвонят, — решила Надя снова достучаться до мужа, запутавшегося в своих мыслях, словно муха в ловушке давно высохшего паука.
— Может, продать инструмент и пойти к твоему брату на производство? У них стабильно вроде, — не своим голосом произнес мужчина, оторвав взгляд от экрана, где из раздела сообщений на него злорадно таращилась цифра ноль.
— И не жалко? Ты ведь всю жизнь реставрацией занимался, — Надя старалась действовать аккуратно, как сапер на минном поле, но все равно нечаянно задела детонатор.
— Вот именно! Всю жизнь! Вот не мог отец меня чему-то другому научить?!
Началось…
Костя вскочил на ноги и стал нервно наворачивать круги по мастерской, стреляя злобным взглядом по инструментам, беспорядочно разложенным там и тут, и по кускам дерева, что никогда не вернутся к своим хозяевам, а Костя никогда не получит за них деньги от давно пропавших с радаров заказчиков.
— Нет бы сантехникой какой заняться, слаботочкой, да хоть сваркой элементарной, а не этой… фигней! — он пнул свой любимый стул середины прошлого века, и тот с шумом рухнул на бетонный пол, взметнув в воздух облачка едкой пыли. — Нет, ему же созидать надо было, творить! Сердца́ вещам восстанавливать! Болел своей работой и меня… заразил. Сижу теперь месяцами без денег. — Костя устало рухнул на диван и закрыл лицо руками.
Надя молчала. Она знала, что надо выждать немного, прежде чем снова открыть рот.
— Ты ведь любишь свою работу, сам всегда говорил. Любишь восстанавливать, оживлять, давать вещам вторую жизнь.
— Это его слова, не мои. Я повторял просто, — промычал Костя сквозь ладони.
— Себе, главное, не ври, — попыталась подбодрить его жена.
— Да что толку от любви этой? — безразлично бросил Костя, окончательно остыв. — Я уже три месяца сижу без заказов. Скоро надо будет за кредит отдавать. У отца-то всё всегда схвачено было. Понятия не имею, как он это делал, но заказы всегда у него были, а от меня требовалось только на ус наматывать. Я и наматывал… Да не намотал.
— Пойдем домой?
— Да, пошли…
Ночью не спалось. Костя ерзал, пытался считать от пятисот до нуля и обратно, выравнивал дыхание. Уснул лишь ближе к рассвету. Отец приснился. Молодой почему-то, без усов еще, с наждачкой в руках. Улыбался, как всегда, шутил о чем-то беззвучно.
Проснулся Костик еще до раздражающего будильника жены. Из лап Морфея его вырвала вибрация собственного телефона. Долго шаря рукой по полу, Костя нащупал мобильник, прищурился, глядя на экран, спросонья не стал разбирать, что там написано, и, сбросив вызов, выключил телефон.
Когда проснулся, жены дома уже не было. Умывшись и влив в себя через силу крепкий кофе, Костик вспомнил про утренний звонок и решил посмотреть, кто же это мог быть. Он рассчитывал на спам или, на худой конец, звонок из банка с напоминанием о платеже, который он уже не раз пропускал. Но, увидев сообщение, чуть не выронил телефон из рук.
«Батя. Этот абонент пытался позвонить вам 3 раза. Последний звонок в 7:30».
Подержав с полминуты голову под холодной водой, Костик убедился, что точно не спит, а потом, удалив историю входящих звонков и пугающее СМС, постарался выкинуть из головы произошедшее. Отца не стало два года назад, а телефон его валялся разряженный в мастерской. Так что это был просто какой-то глюк смартфона или сети, не более.
День прошел так же бесполезно, как и предыдущий. Было всего одно сообщение на сайте. Мужчина интересовался восстановлением дивана, которыми Костик не занимался, да и, как оказалось, вообще писал из другого города.
Когда с работы пришла Надя и они уселись ужинать, телефон Костика завибрировал, и на экране снова высветилось страшное и совершенно нереалистичное: «Батя».
— Кость, ты чего такой бледный? — спросила Надя, глядя, как муж тыкает вилкой мимо тарелки.
— Да так, ничего… Ты ешь, мне отойти надо.
Он сбросил вызов, затем встал из-за стола и направился во двор, чтобы позвонить сотовому оператору. В динамике Костю водил по меню бездушный робот, не желавший связывать его с оператором из плоти и крови (восстание машин, не иначе). Но когда Костя всё же его уговорил, робот сообщил, что время ожидания составляет двадцать минут и Костя тринадцатый в очереди.
Плюнув на оператора, Костя ворвался в мастерскую и открыл сундук, отреставрированный им совместно с отцом десять лет назад. На дне, среди кучи барахла, покоился отцовский смартфон. Подсоединив аппарат к зарядке и дождавшись, пока тот включится, Костя проверил исходящие звонки. Последний был сделан два года назад. Отец звонил своему заказчику, которому они тогда восстанавливали французский комод. Сети у телефона не было.
Выключив его, Костя вернулся в дом и предложил жене лечь в кровать пораньше, чувствуя, что ему необходимо выспаться. Телефон, разумеется, тоже был отправлен в мир снов. Утром на экране снова высветилось: «Этот абонент пытался позвонить вам 2 раза» и номер, пугавший до чертиков. Костя не собирался перезванивать. Вместо этого он сел в машину и направился за город. Ехал медленно, много думал, вспоминал, вел беседы с самим собой.
— Ну вот он я. Говори, чего хотел. Зачем ты меня кошмаришь? Я же тебя любил и люблю, ты прекрасно это знаешь, — говорил Костя камню, с которого на него смотрел отец с навечно застывшей улыбкой. — Ты всегда был рядом, когда нужно. Все у тебя было вовремя, и приходил ты всегда вовремя. Так почему же ушел так внезапно? Почему бросил?! — трудно было сдержать слезы, и Костя не стал. Горло засаднило, нос потёк.
В этот самый момент карман стал тяжелым. В нем завибрировал телефон.
Дрожащей рукой Костя вытащил мобильный и посмотрел на экран. Звонил отец. Подняв вверх по дисплею зеленый кружок, Костя прислонил трубку к уху и, зажмурившись, стал слушать.
— Алло, алло, меня слышно? — хрипел в трубке мужской голос.
— Да, слышно, — вытирая свободной рукой слезы, всхлипнул Костя. — Кто говорит?
— Здравствуйте. Меня зовут Геннадий, я ваше объявление по реставрации мебели нашел на сайте. Сообщения писать там не могу, не зарегистрирован, да и не умею. Вот звоню уже третий день, никак не могу дозвониться.
— Где вы взяли номер, с которого сейчас звоните?! — резко закипел Костя.
— В смысле — где? — удивился собеседник. — Это важно?
— Издеваетесь? Смешно, по-вашему?!
— Нет, не издеваюсь. Я этот номер месяц назад купил в салоне сотовой связи, — оправдывались в динамике. — А ваш контакт на сайте нашел. Это же реставрация?
— Как это — купили в салоне? Это номер моего отца! — Костя снова взглянул на камень, затем на надпись в телефоне: «Батя».
— Ну, может, он не пользовался им давно?.. Я слышал, если полгода номером не пользоваться, то его продают другому, — сказал Геннадий.
Тут всё встало на свои места. Да, Костик слышал, что если номер долго неактивен, то его запускают в продажу по второму кругу. Но кто бы мог подумать, что новый владелец позвонит именно ему.
— Алло, вы тут?
— Да, да, — вернулся в реальность Костя. — Это реставрация мебели.
— Отлично. Слушайте, я посмотрел на сайте ваши работы, почитал отзывы. У меня тут очень большой объем. Мы восстанавливаем один фамильный особняк в вашем городе. Он был закрыт почти семьдесят лет. Сейчас вот решили отреставрировать. Музей будет. Мебель девятнадцатого века два года по всей стране собирали: аукционы, частные коллекции. В общем, семьдесят процентов надо реставрировать, думаю, работы на полгода минимум, а то и больше, но это вам оценивать. Возьметесь? Всё официально по договору, аванс — как полагается.
Костя не мог поверить своим ушам. Он хотел закричать от радости, но язык онемел, а слова застряли где-то в горле, и он просто угукнул, как филин.
— Хорошо, давайте завтра на месте встретимся, только запишите адрес, а то я не умею эти сообщения отсылать, мне проще сказать.
Запомнив адрес, Костя сбросил вызов и хорошенько вытер рукавом глаза и нос.
— Даже не верится. Ты, как всегда, вовремя, бать… Как всегда, вовремя... — он погладил камень, собрал прибитый ветром мусор и направился к машине. Хотелось как можно скорее начать готовить инструмент, чтобы снова вдыхать запах старой краски и слушать, слушать, слушать, как оживают и бьются впавшие в летаргию сердца́ прекрасных вещей из прошлого. Хотелось жить.
Большинству пользователей известно, почему возник Вомбат. На этом я не стану заострять внимание.
А хочу обратить внимание на сложность разработки подобных сайтов. Даже на уровне MVP (минимально жизнеспособный продукт).
Даже если есть готовые наработки, то в любом случае надо продумать: модель, то есть схему базы данных, дизайн веб-морды, общее взаимодействие, то есть бизнес-модель,...
Независимо от всего разрабатываю своего бобра (это скорее будет что-то вроде Хабра, а не очередной аналог Пикабу). И уже раз десять сносил БД из-за невозможности внести изменения (миграции). Ну, может я такой рукожоп и просто не знаю как правильно сделать. 🤷♂️
Нужно продумать внешний вид сайта. Тут сильно помогает такой инструмент как Figma. Да, дизайнеры Figm-ой занимаются. 🙃После пары настроек пользоваться одно удовольствие. Но мало задизайнить. Надо это ещё и в код перенести. А это уже вёрстка. Довольно нудное занятие.
В общем, чего хотел сказать, захотите сделать свой Пикабу с блекджеком и плюхами, то готовьтесь к тому, что заебётесь...
По словам исполнительницы главной роли, её такая реакция зрителей совсем не удивила.
Зрительская оценка шоу, которое вышло 1 июня 2021 года, на агрегаторе IMDb составила 1,2 балла из 10 на основе более 1500 рецензий.
Большинство пользователей выразили недовольство тем, что королеву Англии сыграла темнокожая актриса Джоди Тёрнер-Смит. По словам некоторых зрителей, сложно представить, что белый актёр мог бы аналогичным образом исполнить темнокожую историческую личность.
Зрители раскритиковали и другие аспекты шоу: сценарий назвали исторически недостоверным, а диалоги — «ужасной пародией на шекспировские».
Вы должно быть шутите! Это ужасно написанная и плохо продуманная откровенная чушь — я не могу даже вообразить, чем думали на Channel 5, когда заказывали сериал. Можете ли вы представить, какой скандал случился, если бы известного темнокожего сыграл белый актёр? Это было бы неслыханно! Я продержался около десяти минут. Полагаю, это должна была быть остросюжетная драма, но на деле это эпический провал. 1/10. пользователь IMDb
Критики оценили сериал более высоко. Обозреватели The Guardian и The Telegraph поставили шоу 3 балла из 5, а журнал Empire — 4 балла из 5, особенно сильно похвалив актёрскую игру исполнительницы главной роли Джоди Тёрнер-Смит.
Тёрнер-Смит прокомментировала недовольство зрителей, сказав, что её такая реакция не удивила. По её словам, она знала, что не все поймут эту роль. Актриса отметила, что авторы просто пытались рассказать историю конкретного человека, откинув вопрос расы.
Мини-сериал «Анна Болейн» рассказывает историю приговорённой к казни второй жены английского короля Генриха VIII Тюдора и её борьбе за право на престол для дочери Елизаветы.
Пришла на днях дамочка на консультацию. Вертит в руках решение суда, рассказывает, что банк взыскал с нее задолженность по кредиту, да только кредит она брала больше трех лет назад, стало быть прошли сроки давности, а, во-вторых, судья все неправильно посчитала, математику в школе плохо учила, накинула лишнего.
Короче, типичная ситуация, банкиры - упыри, суды все куплены и так далее.
- Дайте решение посмотреть.
- Нет, не дам!
- В смысла? Как это так - не дам? Вы пришли на консультацию, так мне нужно понимать, как и куда вас консультировать. Для этого я хочу решение увидеть.
- Зачем вам решение, если я все рассказала?
- Рассказали - это одно, но в решении указаны конкретные даты, конкретные суммы. Вот их я и хочу увидеть.
- То есть вот так вы с клиентами поступаете? Я пришла, все рассказала, а вы мне не верите?
- Я вам верю. Но, возможно, вы что-то не так поняли в решении. А уж правильно судья посчитала или нет без цифр, на пальцах, я точно не проверю.
- Решение я вам не дам, там мои персональные данные.
- А как я могу вас проконсультировать, если нечего консультировать?
- Я ж только что рассказала: сроки прошли, посчитано неправильно, банкиры - упыри, судья - взяточник, вы - тупой, только я одна - умничка.
Это, конечно, так - утрировано, но произнесенная дамочкой тирада послышалась мне именно так.
- Тогда сделайте копию решения, маркером персональные данные зачеркните и возвращайтесь обратно.
- Так дорого сейчас копии делать! Пять рублей за страницу!
- Вы чего хотите? Чтоб я вам еще и денег на копии дал, чтобы вас проконсультировать?
Причем мысль дать решение с теми же персональными данными сотруднику копи-центра дамочку совершенно не смутила. Поняв, что у нее элементарно течет крыша, я выставлял дамочку за дверь еще минут десять.
Кстати, не особо глубоко влезая в дебри памяти, могу припомнить как минимум еще один такой случай, когда типа-клиент, сжимая в руках документы, отказывался дать их для ознакомления. Тогда дамочка кричала "какой смысл вам давать документы, если вы все равно не поможете". Сдается мне, что этот факт имеет значение для клинической картины.
ЗЫ: сейчас уже мысль пришла, нужно было сказать: вы совершенно правы, с вас 500 рублей за консультацию
В Android уже достаточно давно появилась фича для экстренной связи, но многие о ней так и не знают. Смотрите:
А) Набираем в поиске по настройкам "данные для экстренных случаев"
Б) Если не ищется, идём по пути:
Безопасность и блокировка экрана
Экстренная помощь
Редактировать информацию и контакты для экстренной связи
Как видите - данных хватает. Это и имя-адрес, и более сложные вещи типа группы крови или аллергических реакций. Контакты для связи выбираются из адресной кнгиги т.е. дополнительно следить за их актуальностью не надо. Код лучше хранить в международном формате, это общий совет.
Как это выглядит в работе?
На заблокированном экране нажимаем "экстренный вызов" и проводим пальцем по кнопке SOS чтобы подтвердить действие.
В меню набора экстренных служб выбираем "Экстренная помощь".
Готово. Мы можем связаться с любым из выбранных контактов, виден номер на случай если нет денег / антенна умерла, внизу кнопка "данные для экстренных случаев" что отправит нас в то меню что я показывал выше. Напомню, телефон всё ещё заблокирован.
Помните: настроив эту штуку заранее 1 раз, вы можете сильно помочь себе в чрезвычайной ситуации и даже вернуть потерянный телефон, если нашедший в этом заинтересован.
Upd. Ещё варианты в зависимости от производителя:
Стиль часов экрана блокировки. Там можно информацию необходимую разместить
У меня эти данные вносятся совсем иначе. Ни меню настроек, ни поиск в настройках не помогли. Пришлось через меню экстренного вызова искать. в общем, у меня зайти в контакты, нажать фото своего профиля, и "изменить". В конце списка будут эти данные
Gotcha Gotcha Games, разработчики серии RPG Maker, выпустили крупное обновление для инструмента создания игр Action Game Maker.
Релиз версии 1.3.0 состоялся 17 июня и приурочен к годовщине выхода программы. Главное нововведение – поддержка 3D-фонов, позволяющая разрабатывать игры в стиле 2.5D.
Action Game Maker появился в Steam в 2025 году и стал преемником Pixel Game Maker MV. Инструмент рассчитан на создателей без навыков программирования и позволяет разрабатывать 2D-игры разных жанров, включая платформеры, экшен-RPG и прочие жанры.
В основе программы лежит открытый игровой движок Godot, обеспечивающий доступ ко всем его 2D-возможностям.
Хотя движок полностью поддерживает стандартное написание кода на GDScript, в нем также доступен визуальный язык программирования на основе нод, разработанный специально для непрограммистов.
Помимо функций Godot, инструмент предлагает возможности в духе RPG Maker, такие как система баз данных, инструменты для смены сцен, 2D-анимация костей и библиотеки графических и аудиоресурсов.
С новым обновлением пользователи могут загружать 3D-модели в качестве окружения для своих игр. Эту функцию давно просили в сообществе. Стоит отметить, что 3D-контент существует отдельно от 2D-пространства геймплея, однако может работать как параллакс-фон, синхронизированный с 2D-элементами, например следовать за движением 2D-камеры.
Еще одним значимым дополнением стали кастомные плагины действий, вдохновленные системой плагинов из серии RPG Maker.
Эта возможность позволяет создавать оригинальные Условия (Conditions) и Действия (Actions) с помощью GDScript. Подробности об обновлении и дальнейших планах разработчиков опубликованы в Producer Letter #19 на странице Action Game Maker в Steam.
Случайно стала свидетелем разговора двух молодых людей. Не всего разговора, а только его обрывка. Я шла домой и обогнала двух юношей. А пока обгоняла, услышала:
- Прикинь! Она пообещала мне, что если я напишу контрольную работу на отлично, то тогда за четверть у меня выйдет четыре, а значит и за год тогда поставит тоже четвёрку. Я написал. Старался, готовился. Пять за контрольную, четыре за четверть. Но за год всё равно три.
- Обманула, да?
- Получается, что да. В прошлом году так же математичка пообещела. И тоже трояк за год поставила. Типа того, что учиться надо весь год, а не последние пару месяцев. Хрен когда я ещё им поверю!
(Нецензурную брань я оставила за кадром). Этот разговор напомнил мне мою учительницу по биологии. Только она свои обещания выполняла. Вела она у нас анатомию. И не только рассказывала о том, как устроен человек, но и пыталась заставлять нас думать.
В начале четверти, которую мы начали с изучения строения сердца, учительница повесила на доску плакат с изображением сердца в разрезе, и сказала:
- Дети. На прошлом уроке мы ознакомились с большим и малым кругами кровообращения. А теперь посмотрите внимательно на этот плакат, и ответьте на вопрос. Какая стенка желудочка толще и почему? Тому, кто сможет ответить правильно, поставлю пять за год.
Я подумала и подняла руку. Мой ответ был верным, мне поставили отлично за урок. И годовая отметка за анатомию тоже была пять. Не смотря на то, что четвёрок у меня иногда было больше, чем пятёрок.
Сдержала учительница своё слово. Правда подобных экспериментов она больше не проводила.
А вы знаете, почему левая стенка желудочка сердца толще правой?
Все началось с рабочей задачи по реализации весьма специфичной web-панели мониторинга и управления различным оборудованием, в которой нужно было получать данные и отправлять команды по разнообразным сценариям (периодический опрос, подписка на websocket-события, https-запросы и т.д.), а также выводить состояние и графики в реальном времени, динамически комбинируя различные источники данных в разных виджетах.
Кроме того, у панели было предусмотрено несколько настраиваемых режимов работы, которые переключались по запросу пользователя, что требовало массового управления маршрутами потоков данных внутри системы.
В первой итерации с использованием RxJS получилось много неструктурированного и сложно поддерживаемого кода, так как архитектура на RxJS вынуждала императивно описывать перестроение топологии при изменении правил маршрутизации «на лету». В нашем специфичном кейсе с динамическими виджетами это приводило к сайд-эффектам и сложностям в отладке. Кроме того, местами размывалась строгая типизация и мы лишались compile-time гарантий. Так появилась идея разработать собственное решение на основе альтернативной концепции — модели графа потоков данных.
В результате получившаяся модель продемонстрировала предсказуемое поведение и низкую связность компонентов, а кодовая база сократилась на ~30% и приобрела более декларативный вид. Убедившись в эффективности решения, мы решили оформить его в виде отдельной библиотеки с открытым исходным кодом — Transferum.
И что, получилась просто еще одна реактивная библиотека?
Не совсем. Классические FRP-библиотеки (RxJS, Bacon, Most) построены вокруг единственного примитива (Observable). Transferum же основан на композиции различных типов узлов с явно определенным поведением.
Каждый узел в графе потоков распространения данных явно декларирует свои способности: может ли он принимать данные через push, отдавать через pull, распространять полученный сигнал подписчикам, опрашивать источник, фильтровать, блокировать поток и т.д.
Объявленные узлом возможности являются одновременно флагами для использования в runtime и compile-time гарантиями наличия соответствующих методов, определяющих его поведение.
Ключевая идея: поведение системы описывается как композиция независимых возможностей, которые одновременно определяют тип, реализацию и правила взаимодействия.
Transferum предоставляет четыре слоя абстракции:
Трансферы — узлы графа (каналы, поллеры, мапперы, буферы, разветвители и концентраторы, реализации debounce, throttle, switchMap и т.д.).
Мосты — ребра графа — управляемые вентили между узлами с динамической маршрутизацией и гейтингом.
Операторы — stateless-трансформаторы и фильтры данных (используются трансферами, отвечающими за конвертацию данных).
Билдеры — fluent-конструкторы композитных трансферов из цепочек трансферов-примитивов.
Концептуальная и архитектурная основа — capability flags system. Каждый трансфер реализует CommunicationContractInterface — набор булевых флагов, определяющих его возможности.
Флаги isPushable, isPullable, isSubscribable, isGate и другие — это не просто свойства объекта. Это метаданные, которые:
Определяют TypeScript-интерфейс трансфера на этапе компиляции.
Управляют стратегией связывания с другими трансферами в рантайме (с помощью функции linkTransfers()).
Обеспечивают совместимость в билдерах без приведений типов.
Один набор флагов — три потребителя. Это единый источник истины для всей системы.
Когда флаг равен true, соответствующий метод входит в TypeScript-интерфейс трансфера. Это позволяет предоставлять трансфер пользователю вот так:
Transfer
// гомогенный трансфер: T -> [ Transfer ] -> T
Или вот так:
Transfer
// гетерогенный трансфер: TInput -> [ Transfer ] -> TOutput
Именно в таком формате типов фабрики в библиотеке возвращают трансферы. Например:
const pushChannel: Transfer;
const converter: Transfer;
// содержат методы push(), subscribe()
const manualBuffer: Transfer;
// содержит методы push(), pull(), trigger()
// trigger() в данном случае нужен, чтобы сделать запушенное значение
// доступным для чтения через pull()
const pollingProxy: Transfer
// содержит методы pull(), subscribe(), trigger(), activate(), deactivate(), toggle()
// может быть связан с pullable-источником благодаря поддержке поллинга
Эта «магия» работает в compile-time благодаря несколько замысловатой системе вычислимых типов:
Трансфер определяет своё поведение (push, pull, subscribe и др.), но никогда не ссылается и не проверяет класс другого трансфера. Он не знает, что является upstream или downstream — лишь выполняет свой контракт. Пользователь может создать свой трансфер, объявить и реализовать его возможности — и он органично и бесшовно впишется в экосистему.
2. Мосты не знают конкретных реализаций
Мост инспектирует capability flags, а не имена классов. Нет цепочки instanceof, нет переключения по имени класса. Любой output-трансфер может быть соединен с любым input-трансфером — при условии совместимости их флагов, о чем мы поговорим чуть ниже. Это применимо и к тем узлам, которые еще не существуют и будут созданы пользователем.
3. Значение undefined никогда не распространяется
В Transferum undefined означает «нет данных», а не «пустое значение». Оно подавляется на уровне внутренней реализации менеджера подписок — подписчики никогда не уведомляются с undefined. При этом для явных маркеров пустых значений можно использовать null. Мы сознательно пошли на этот компромисс, чтобы избежать runtime-оверхеда и сохранить нативную скорость работы на плотных потоках данных.
Связывание трансферов
Функция linkTransfers(lhs, rhs) соединяет output-трансфер (lhs) с input-трансфером (rhs) с автоматическим выбором стратегии связывания на основе возможностей этих трансферов:
Protocol-oriented design: механизм не спрашивает «какой это класс?» — он выясняет, какие у него есть возможности. Любая пара трансферов с совместимыми возможностями является linkable. Добавление нового класса трансфера требует только объявления его флагов и реализации соответствующих методов — как связать его с другим трансфером, связующий алгоритм разберется сам.
Синхронные и асинхронные трансферы сосуществуют и могут быть связаны между собой. linkTransfers() предпочитает sync-связывание, когда это возможно, а async-стратегии применяет только когда sync неприменим. Нет отдельного «асинхронного мира».
Поддержка backpressure
Ряд асинхронных трансферов (AsyncSinkTransfer, AsyncWriteTransfer, AsyncConvertTransfer, AsyncConditionTransfer) поддерживают необязательные поля в конфигурации: maxConcurrency, bufferSize и onBufferOverflow — для ограничения параллельных async-операций, очереди избыточных данных и graceful-обработки переполнения. По умолчанию — неограниченная обработка, без буферизации.
Локальная обработка ошибок
Transferum использует единую модель обработки ошибок для всех трансферов. Каждый трансфер, который может столкнуться с runtime-ошибкой, принимает опциональный onError-хэндлер в своей конфигурации.
А теперь — к примерам использования
Вот так можно просто и декларативно описать опрос и агрегирование данных из нескольких источников:
А вот как можно организовать динамический роутинг:
import {
createPushStoredChannelTransfer,
createBridgeMultiSelector,
createBridgeSelector,
createPassBridge,
} from 'transferum';
// Вариант 1. Выбор одного реципиента
const commandRouter = createBridgeSelector({
bridges: {
light: createPassBridge({ source: commandChannel, target: lightController, activated: false }),
thermostat: createPassBridge({ source: commandChannel, target: thermostatController, activated: false }),
lock: createPassBridge({ source: commandChannel, target: lockController, activated: false }),
},
initialKey: 'thermostat', // выбор по умолчанию
activated: true,
owned: true,
});
commandRouter.select('lock'); // выберем другой вариант
// Вариант 2. Выбор нескольких реципиентов
const loggersRouter = createBridgeMultiSelector({
bridges: {
prometheus: createPassBridge({ source: metricsChannel, target: prometheusWriter, activated: false }),
elk: createPassBridge({ source: metricsChannel, target: elkWriter, activated: false }),
sentry: createPassBridge({ source: metricsChannel, target: sentryWriter, activated: false }),
},
initialKeys: ['prometheus', 'elk'], // будут активированы по умолчанию
activated: true,
owned: true,
});
loggersRouter.check('elk'); // теперь выбраны все три
loggersRouter.uncheck('prometheus'); // выбраны elk, sentry
loggersRouter.select(['prometheus', 'sentry']); // выбраны prometheus, sentry
А вот пример c организацией игровой механики:
import {
createDebounceTransfer,
createConvertTransfer,
createMapOperator,
createBridgeSelector,
createPassBridge,
linkTransfers,
} from 'transferum';
// Источник: debounce нажатий клавиш (16ms ~ 1 кадр при 60 FPS)
const rawInputSource = createDebounceTransfer({ delay: 16 });
// Конвертер: KeyboardEvent -> код клавиши
const inputConverter = createConvertTransfer({
operator: createMapOperator((event) => event.code),
});
// Целевые системы-потребители пользовательских событий
const carSystem = { push: (cmd: string) => console.log(🚗 Car executing: ${cmd}) };
const planeSystem = { push: (cmd: string) => console.log(✈️ Plane executing: ${cmd}) };
const menuSystem = { push: (cmd: string) => console.log(📋 Menu processing: ${cmd}) };
// Роутер: динамическое переключение между игровыми контекстами
const gameplayRouter = createBridgeSelector({
bridges: {
driving: createPassBridge({ source: inputConverter, target: carSystem }),
flying: createPassBridge({ source: inputConverter, target: planeSystem }),
ui: createPassBridge({ source: inputConverter, target: menuSystem }),
},
initialKey: 'driving', // игрок начинает в машине
activated: true,
});
// Связывание источника с конвертером с автовыбором стратегии
linkTransfers(rawInputSource, inputConverter);
// Демонстрация:
// Игрок в машине нажимает "W"
rawInputSource.push(new KeyboardEvent('keydown', { code: 'KeyW' }));
// Через 16ms: 🚗 Car: KeyW
// ==================
// Переключаемся на самолёт
gameplayRouter.select('flying');
// Та же клавиша теперь управляет самолётом
rawInputSource.push(new KeyboardEvent('keydown', { code: 'KeyW' }));
// Через 16ms: ✈️ Plane: KeyW
Когда имеет смысл попробовать Transferum
Библиотека подойдет для:
TypeScript-first проектов — благодаря максимально строгой типизации и compile-time вычислению доступных методов любого трансфера на основе объявленных у него флагов возможностей.
Работы с pull-based источниками данных — polling API, датчиков, хранилищ с PollingProxy.
Смешанных sync/async пайплайнов — в единой модели без ручного преобразования.
Явного flow control — gates, bridges, selectors для runtime-маршрутизации.
Game development / IoT — frame-aligned tickers, idle polling, sensor aggregation.
Устойчивой обработки ошибок — локальная, non-fatal обработка: одна стадия не убивает пайплайн при условии переданного в конфиге обработчика ошибок, ничего не подавляется молча.
Результаты и планы
Библиотека уже используется в двух наших внутренних проектах и показывает свою эффективность. Код доступен на GitHub под лицензией MIT, библиотека не имеет внешних зависимостей и поставляется с подробной документацией (README + API Reference).
В одном из проектов граф состоит из ~80 узлов и стабильно обрабатывает несколько сотен событий в секунду без деградации. На основе этих данных в том числе рендерится 3D-сцена в Babylon.js со стабильным фреймрейтом ~60 FPS без микрофризов.
Тесты библиотеки покрывают не только отдельные трансферы, но и поведение системы в динамике: переподключение мостов, обработку ошибок в длинных асинхронных цепочках, а также разнообразные граничные случаи. Покрытие — 100%.
В дальнейшем планируем реализовать хуки и утилиты для более удобного и нативного использования Transferum с Vue и React. Если они окажутся в достаточной мере переиспользуемыми, оформим в отдельные пакеты-адаптеры.
Буду рад, если вы заглянете в репозиторий, попробуете библиотеку в деле и поделитесь замечаниями — обратная связь поможет сделать Transferum лучше.
P. S. Если вы сталкивались с похожими задачами и решили их как-то иначе — буду рад прочитать о вашем опыте в комментариях.
Специалисты Национального управления по аэронавтике и исследованию космического пространства США 19 мая, впервые с ноября прошлого года, получили данные от двух из четырех рабочих научных инструментов космического аппарата «Вояджер-1» (Voyager 1).
Нормальная работа запущенного 46 лет назад зонда прервалась в 2023 году, когда «Вояджер-1» начал передавать на Землю повторяющийся шаблон из единиц и нулей.
Инженеры долго разбирались в проблеме, поскольку аппарат находится на расстоянии более 24 миллиардов километров от нашей планеты: потребовалось свыше 22 с половиной часов, чтобы сообщение с Земли достигло зонда, и столько же времени, чтобы его ответ вернулся в Центр управления полетами. Специалисты установили, что примерно 3% рабочей памяти «Вояджер-1» повреждено, однако им удалось переписать программное обеспечение зонда, чтобы избежать использования поврежденной памяти.
В апреле «Вояджер-1» прислал точные данные о состоянии бортовых инженерных систем, а в ответ на запрос, отправленный 17 мая, космический аппарат направил на Землю данные, полученные от магнитометра и инструмента для исследований плазменной среды. Два оставшихся действующих научных прибора зонда в ближайшее время пройдут калибровку и, как планируют инженеры, вернутся к полноценной научной работе.
Уважаемая команда разработки, во первых строках сего поста хочу выразить вам огромнейшую благодарность за ваш труд! Вы офигенные!
Во вторых строках хотел бы задать пару вопросов:
Будет ли в будущем обозримом возможность редактировать свои комменты?
Будет ли возможен просмотр фото в комментах?Камрады, если еще вопросы есть, предлагаю их в комменты к этому посту писать - может что и получится у нас!
Нейро Сама была первой "витубершей" (от Virtual Youtuber - в классическом понимании человек, делающий видеоконтент, управляя анимированным аватаром c помощью motion capture технологий). В ней нет ничего человеческого (всеми системами управляют ИИ). Удерживает титул самой популярной стримерши Твича.
В своё время их размножили на две версии, потому что фанаты тяжело переживали изменения классического голоса и прочих "личностных" характеристик по мере развития. В итоге Нейро Сама осталась на ранней версии вокалоида и улучшается только в аспектах, которые не нарушают её восприятие зрителями, а в Злой Нейро дорабатываются все аспекты.
Бывший автосалон, три этажа, переделывают под складские помещения, разного размера. Наше дело электромонтаж. Рядом железка, метрах в трёх от здания.
Мы молодцы, работу сдаём, проверено и всё работает.
Только один маленький косяк, выявился позже. Временами ночью вырубается часть внешнего освещения.
Приехали, диагностика по каждому участку, проблем никаких.
Замечания повторяются, четыре головы думают что за нахуй такой странный.
Мудрое предложение одного из шефов в мою сторону:
-А давай ты одну ночь тут подежуришь.
Ночная смена тоже нормально, даже работать не надо, просто наблюдать. Кресло на улице, кури бамбук и пей пиво.
Сработало как надо, согласно настройкам.
Вжжж... Лепиздричка проехала, вдоль железки свет погас. От вибрации? Включается вновь. После третьей догадался, вот же падла какая, завтра будет весело.
-Что, выявил проблему?
-Выявил, тащите сюда часовое реле.
Установили, настроили. От такого часа до такого работает принудительно.
Электричка освещала датчик, тот вырубал свет. Знаний много не бывает...
Комментарии