У Телеги под капотомКогда вы отправляете в Телеграм ссылку, то мессенджер показывает превью страницы, на которую ссылка ведет. Пользователю удобно и выглядит красиво, но требует серверных мощностей – чтобы знать, что рисовать, надо сходить на чужой сайт. Эти посещения Telegram экономит – на каждую страницу он ходит только один раз и всем всегда показывает то, что увидел в тот день. На pogoda.mail.ru, например 16 градусов тепла в Амстердаме в прошлую пятницу зафиксировались.Но иногда сайт меняется. И его владелец хотел бы, чтобы все теперь видели новую красивую версию, а не устаревшую. Для этого в мессенджере есть специальный бот – почти #стартапдня @Webpagebot. Кидаете ему ссылку, он обновляет её контент. Один раз и опять же для всех. Если кто-то ему сейчас pogoda.mail.ru отправит – там новая температура появится. Удобно.Но кроме благодарности команде Телеграма за эту прекрасную фичу, у меня есть несколько вопросов без ответа.– Это часть сервиса, не сторонний бот. Почему бы ему не дать синюю галочку?– Сейчас знания про него передаются из уст в уста, и ещё на последней странице документации мелким шрифтом написано. Месячная аудитория – 30 тысяч человек. У PremiumBot – 13 миллионов для сравнения. Уж если он есть – может как-то в интерфейс внести?– А что ещё полезного я не знаю про Телеграм?#общение #корпоративный
Программирование — страница 4
Лента темы
😁 В ИТ идут психопаты Ученые выяснили, что люди с острой психопатией чаще всего идут в IT, технологии и инженерию. Связь между тёмными чертами личности и выбором карьеры четкая:- Смелые и самоотверженные люди идут в медицину;- Жестокие люди без эмпатии выбирают технологии и инженерию;- Импульсивные личности (Disinhibition) оказываются в творческих профессиях;- Циники и манипуляторы хотят на руководящие роли.✖️ xCode Journal
👨💻 Structured Concurrency в Java 26 — шестое превью. JEP 525.Проблема, которую решает эта фича, хорошо знакома любому, кто писал параллельный код на Java. ExecutorService, Future, CompletableFuture ничего не знают о связях между задачами. Три параллельные подзадачи для одного запроса живут в разных потоках без общего «родителя» — и если одна упала, об этом никто автоматически не узнает.Классический пример: параллельно загружаем профиль, настройки и историю пользователя. public class UnstructuredExample { public static UserData loadUserData(int userId) { String profile = fetchProfile(userId); String preferences = fetchPreferences(userId); String history = fetchHistory(userId); return new UserData(profile, preferences, history); }}Можно, конечно, попробовать добиться этого поведения вручную: добавить cancel() в catch, завернуть всё в CompletableFuture.allOf, аккуратно обработать CompletionException. Но очень легко сделать что-то не так. И чем больше задач — тем больше бойлерплейта, который всё равно не даёт нормальной иерархии, нормальных стектрейсов и легко читаемого кода.Structured Concurrency решает это на уровне API. public class StructuredExample { public static UserData loadUserData(int userId) { try (var scope = StructuredTaskScope.open( StructuredTaskScope.Joiner.allSuccessfulOrThrow(), Configuration cfg -> cfg .withTimeout(Duration.ofSeconds(5)) .withName("load-user-data"))) { // Fork all three subtasks — they run concurrently var profile = scope.fork(() -> fetchProfile(userId)); var preferences = scope.fork(() -> fetchPreferences(userId)); var history = scope.fork(() -> fetchHistory(userId)); scope.join(); return new UserData(profile.get(), preferences.get(), history.get() ); } catch (StructuredTaskScope.FailedException e) { throw new RuntimeException("Failed to load user data: " + e.getCause().getMessage(), e); } }}Согласитесь, круто? Если любая задача упала — остальные отменяются автоматически. Поток-владелец гарантированно переживает все дочерние. Стектрейсы отражают реальную иерархию вызовов. Время жизни задач привязано к лексическому блоку — как try-with-resources. И, что самое главное, описанное выше поведение можно довольно легко настроить.Данная функциональность, на самом деле, с нами уже довольно давно. А что же поменялось в Java 26 по сравнению с Java 25?— скоуп создаётся через статический StructuredTaskScope.open() вместо new— join() возвращает List вместо Stream — результаты материализованы сразу, без риска обратиться к ним после закрытия скоупа— добавился joinUntil(deadline) — если задачи не успели к дедлайну, скоуп их отменяетAPI явно стабилизируется, но одному Гослингу известно сколько еще итераций preview ждёт эта фича 🙂Подробнее про Java 26 можно почитать и посмотреть в отдельном видео и статье на Хабре.@spring_aio
Подключение к shadow сессии непривилегированного пользователяНеобходимо выдать права группе пользователей на подключение к shadow сессии на терминальном сервере.В командной строке терминального сервера выполняем следующую команду:wmic /namespace:\root\CIMV2\TerminalServices PATH Win32_TSPermissionsSetting WHERE (TerminalName="RDP-TcНеобходима перезагрузка. Определяем список сессий:query session /server:terminal01И выполняем подключение:mstsc /shadow:5 /control /noconsentpromptНебольшой скрипт автоматизации подключения:@echo offquery sessionechoset /p UserSessionID= Enter the session ID: mstsc /shadow:%UserSessionID% /control /noconsentprompt#СекретыСисадмина
Автоматизация, как мышление: расширяю возможности Очень люблю оптимизировать свои рабочие процессы и обязательно покажу вам позже, что можно сделать, если владеть азами работы в n8n.Сейчас небольшой пример. Есть программа, которую я использую для планирования. Прибегаю к ней, когда задач становится слишком много и не хватает простых решений. У этой проги есть один минус. Мне нужна автоматическая выгрузка выполненных задач хотя бы в телеграм. А в перспективе в мою систему, чтобы я могла подключать нейросеть к анализу выполненных задач.Но программа делает выгрузку только внутри своей системы. Я же хочу, чтобы вечером мне прилетал список в телеграм. Сделать это базовыми средствами программы нельзя. Но у нее есть api и куча встроенных автоматизаций 😊Поэтому я могу настроить то, что мне нужно, даже если у программы нет такого функционала. Вот ради этого ощущения свободы возможностей и начала изучать n8n.Разбираюсь еще с программами для созвонов. Zoom мне уже шлет по запросу из бота ссылки на созвон. Осталось донастроить работу с итоговыми материалами. С Телемостом тоже работа идет потихоньку. Изучаю возможности сразу 2 систем.Бот в помощь ✊
Для тех, кто работает с большими объёмами информации в Cursor.Была удивлена когда обнаружила что многие пользователи Cursor не очень понимают как прописывать правила. На самом деле все очень просто.Если ваша работа — это постоянный поток данных, документов, исследований и текстов, то Cursor может стать не просто редактором кода, а полноценным рабочим инструментом. Но только если правильно его настроить.Файл .cursorrules — решает все. Его можно писать в свободной форме, но Markdown — правильный выбор. Структура с заголовками и списками помогает Cursor точнее считывать приоритеты. Плюс файл становится читаемым для людей — его удобно редактировать и передавать коллегам.Вот базовая структура:# Контекст проектаЯ исследователь / аналитик / редактор. Работаю с большими массивами текстов, интервью, отчётов.# Приоритеты при работе с информацией- Сохраняй исходные формулировки, не перефразируй без запроса- При суммаризации всегда указывай что было опущено- Если в тексте есть противоречия — фиксируй их, не сглаживай- Структурируй вывод через заголовки, даже если я не прошу# Формат ответов- Кратко, без воды- Сначала вывод, потом детали- Таблицы и списки предпочтительнее сплошного текста# Запреты- Не додумывай факты- Не убирай детали "для краткости" без предупрежденияКогда дорабатывать файл.cursorrules — это не документ, который пишется один раз. Его стоит воспринимать как живой инструмент.Сразу — добавляйте правило, когда Cursor сделал что-то не так и вы объяснили ему как надо. Не ждите, что в следующий раз он вспомнит. Он не вспомнит.Когда меняется проект — взялись за новую тему, изменился формат выходных данных, появились новые источники с особым статусом — обновите файл.Когда замечаете паттерн — если вы три раза написали одно и то же уточнение в чате, это сигнал: пора перенести его в .cursorrules.Раз в месяц — просто перечитайте файл. Часть правил устаревает, часть становится избыточной. Чистый, актуальный файл работает лучше перегруженного.Практический приёмПопросите Cursor помочь с самим файлом:"Посмотри на задачи, которые я решал последние несколько дней, и предложи что добавить в .cursorrules"или"Вот мой текущий .cursorrules — что здесь избыточно, что противоречит друг другу?"Файл становится точнее не сразу, а итерационно — как любой хороший рабочий процесс.@glamgpt
🤔 Как устроено наследование в Swift?Наследование в Swift позволяет классу (подклассу) унаследовать свойства, методы и инициализаторы от другого класса (суперкласса). Подклассы могут переопределять (override) поведение суперкласса, добавлять новые свойства и методы, но не могут наследовать структуры, перечисления или протоколы.Ставь 👍 если знал ответ, 🔥 если нетЗабирай 📚 Базу знаний
По разработке с ИИ. Отдельные утилиты с помощью ИИ я писал давно, но когда дело доходило до компонентов, тесно интегрированных в движок, я был в ловушке прокрастинации: писать по-старому медленно и неэффективно, а беглое применение ии-шки на легаси-движке из 100к строк кода, который разрабатывался более двадцати лет, показало довольно плохие результаты. В итоге я несколько месяцев потратил на формирование промтов, на создание карт, инструкций и правил, и вот уже полторы недели с кайфом создаю новые вещи, тесно и глубоко интегрированные в движок. При этом, часть карт формируется автоматически при каждой отправке промта, это позволяет моделям не делать кучу grep/pg, забивая контекст не особо релевантными данными, а быстро схватывать связи и зависимости, особенно учитывая, что в проекте довольно плотно применяются global-переменные для основного окружения. Результатами очень доволен.
ПЕРЕКЛЮЧАТОРОдна маленькая утилита для Mac и Win, которая экономит мне кучу нервов каждый день.Больше всего я не люблю повторять рутинные действия. Даже переключение раскладки на MacBook меня бесит — пальцы делают это сотни раз в день, а мозг всё равно спотыкается об опечатки вроде «ghbdtn» вместо «привет».Несколько лет я жил с Punto Switcher. Привык. Считал, что лучше уже не будет.А потом наткнулся на Caramba Switcher — новую разработку того же автора. Поставил из любопытства. Снёс Punto через десять минут.Caramba лёгкая, шустрая и работает тихо — без настроек на три экрана. Просто делает свою работу и не мешает жить.Что она умеет:- Сама определяет язык и на лету исправляет раскладку.- Переключает язык одной клавишей.- Исправляет уже набранное слово или выделенный кусок текста.- Автоматически ставит «ё» по правилам.Скачать 🖱🔄🔄🔄⚡️ — тоже бесит переключать языки#продуктивность Спасибо🔴Чат🔴Особняк🔴Автор
🤔 В чем различие методов call apply bind? Методы call, apply и bind принадлежат к функциональному объекту Function и используются для указания контекста this при вызове функции. Хотя все три метода позволяют контролировать значение this внутри функции, между ними существуют ключевые различия в способе использования и поведении.🚩СallВызывает функцию, явно устанавливая this в первом аргументе. Остальные аргументы передаются в вызываемую функцию как есть.function greet(message, name) { console.log(${message}, ${name}. This is ${this});}greet.call("Earth", "Hello", "Alice"); // "Hello, Alice. This is Earth"🚩ApplyОчень похож на call, но принимает аргументы в виде массива, а не по отдельности.function greet(message, name) { console.log(${message}, ${name}. This is ${this});}greet.apply("Earth", ["Hello", "Alice"]); // "Hello, Alice. This is Earth"🚩BindСоздаёт новую функцию, которая, когда она вызывается, имеет установленный контекст this, указанный в первом аргументе. В отличие от call и apply, bind не вызывает функцию сразу, а возвращает новую функцию, которую можно вызвать позже.function greet(message, name) { console.log(${message}, ${name}. This is ${this});}const greetEarth = greet.bind("Earth", "Hello", "Alice");greetEarth(); // "Hello, Alice. This is Earth"Ставь 👍 и забирай 📚 Базу знаний
Concurrency and Consistency. Non-blocking, lock-free and async. Пост №1. В чем разница между Blocking, Non-blocking, lock-free?После написания десятков постов о традиционном способе синхронизации конкуррентных программ - блокирующей синхронизации, я задумался, а возможен ли другой путь? Я что-то слышал про lock-free алгоритмы, а также слышал что в распределенных системах существуют conflict-free структуры данных. Вдогонку к этому - флешбэки из десятых когда был максимальный хайп вокруг функционального программирования и отовсюда звучал тезис - "только на ФП языках получается трушный concurrency код". Что же там такого под капотом у этих языков чего нет у остальных я разобраться не успел, но у меня закрались сомнения от таких сильных заявлений, ведь какой бы не был язык все что мы пишем превращается в - syscalls для ядра ОС написанного на С.- инструкции для процессора.Поэтому в новом цикле постов будем развеивать туман. Начнем с разбора основных баззвордов.Блокирующий (blocking) вызовПонятие блокирующих функций мы подробно разбирали в прошлых постах. Во время работы один из потоков нашей программы может заблокироваться если наткнулся на блокирующий примитив синхронизации захваченный или например ему понадобилось вызвать системную функцию. В такие моменты исполнение инструкций потоком останавливается, поток засыпает. Разблокировка потока происходит по сигналу ОС или рантайма ЯП.Примеры блокирующих функций:- функции работы с сокетами (send, recv, accept)- функции работы с файлами (fsync, fdatasync)- синхронизация (pthread_mutex_lock, pthread_cond_wait, pthread_barrier_wait)- sleep 😊Неблокирующий (non-blocking) вызовТут все намного проще. Неблокирующая функция - та в которой нет вызовов блокирующих функций. И как следствие остановить выполнение такой функции может только ОС или рантайм языка программирования через вытесняющую многозадачность.Как обеспечивать синхронизацию в случае когда мы не можем себе позволить засыпать и передавать контроль ОС? Ответ - Spinlocks. Потому что это примитив с активным ожиданием, то есть он заставляет потоки постоянно крутится в ожидании освобождения ресурса. Lock-freeПонятие lock-free обычно упоминают в контексте структур данных или алгоритмов. В общем случае это код в котором - Отсутствуют мьютексы. Как следствие невозможно уснуть и передать контроль ОС. Отсутствует блокирующая синхронизация- Отсутствуют спинлоки. Несмотря на неблокирующую логику спинлоков у нас в программе создается ситуация эксклюзивного владения и при захвате примитива одним потоком у остальных нет возможности продвигаться и делать полезную работу. С чем мы в итоге остаемся?Для того чтобы строить lock-free алгоритмы и логику у нас остается только один путь - самостоятельно писать код на атомарных операциях (CAS, TAS, FAA).Без этого с большой вероятностью наша программа будет работать некорректно, так как все равно даже без примитивов синхронизации потоки программы в любое время могут быть остановлены ОС и запущены спустя время. И если поток был остановлен где то посередине важной операции и такой сценарий не учтен в коде нас будут ждать сюрпризы😁Нужно ли стремиться к lock-free коду?Когда мы пишем код, используем структуры данных, алгоритмы мы всегда взвешиваем все за и против. В Concurrency тоже самое.Алгоритм / структура данных построенный на Blocking примитивах работает предсказуемо и понятно, не самый сложный код. Поддержка в любом ЯП и ОС из коробки. Для низконагруженных приложений - обязательно к использованию. Под высокой нагрузкой может стать бутылочным горлышком.Алгоритмы и СД со спинлоками или трушные lock-free без них потенциально позволяют увеличить пропускную способность системы, но все равно существует риск пауз связанных с активным ожиданием. Плюс такие программы все таки сложнее проектировать и реализовывать. Подступаться к снаряду стоит после того как убедились что бутылочное горлышко именно в блокирующих примитивах.На этом первый пост всё, спасибо что читали, оставляйте комментарии и реакции, чтобы я видел что вы ждали посты❤️
Если в команде всё плохо, дело не в недостатке инновацийЕсли твоё IT работает как куча говна, добавление к нему "самых последних технологий", превратит ее в кучу говна, из которой торчат обломки космолёта. Скорее всего, это не то, что тебе нужно.Что такое "куча говна"? Это такой адский треугольник: медленно, дорого и некачественно. В отличие от положительной версии, сочетать все три негативные стороны обычно можно с большим успехом. В 100% случаев если выглядит всё именно так – тебе не хватает не <вставь любимое название модной технологии: ai, микросервисы, кроссплатформенная разработка, что-еще-там-было-в-том-блоге>.Если твои разработчики не умеют в код-ревью, а ты всех посадил на claude code, они вместо того, чтобы руками писать плохой код, который делает не то, что нужно, будут его генерировать и уходить домой пораньше. Если твоя инфраструктурная команда не может построить нормальный релизный пайплайн для одного некрасивого и немодного монолита, а ты вместо него запилишь 50 микросервисов – попробуй прикинуть вероятность, с которой 50 раз вместо одного у них, почему-то, получится. Если твои qa недостаточно понимают продукт и пользователей, чтобы протестировать его руками, от того, что ты заставишь их писать автотесты, понимать это они не начнут – просто плохие тесты станут автоматизированными и будут проходить быстрее!В общем – попробуй начать с качества людей (часть придется поменять, часть обучат новые люди) и базовой гигиены жизненного цикла разработки по (спроси у коллег, айти которых работает нормально, что это такое). Еще лет 5-7 назад люди умели поставлять ценность в продакшен за дни и недели, а не кварталы и полугодия, тестировать софт, и, вообще говоря, зарабатывать на IT деньги. Да, новые подходы к технологиям ускоряют эти команды еще больше, но если совсем уж пропустить базовый путь становления и поверх людей, не умеющих работать, натянуть "инновации" – у тебя получися совсем не то же самое, что у топовых игроков на рынке, которые пишут статьи про эти инновации :)
CQRS ≠ MediatR.Перестаньте смешивать CQRS и MediatR.То, что вы используете MediatR, не означает, что у вас реализован CQRS.CQRS — это про разделение операций чтения и записи, часто с разными моделями, стратегиями хранения и иногда с разными хранилищами данных.MediatR — это библиотека для диспетчеризации сообщений внутри процесса. Она удобна для организации команд и запросов, но это не фреймворк CQRS.Можно использовать MediatR в архитектуре, построенной по CQRS.Но не стоит считать, что одно автоматически означает другое.Сначала разберитесь в различии, прежде чем внедрять паттерн или инструмент.👉 @KodBlog
Ответ на вопрос № 9.Согласно данным, «Бурильщик обнаружил утечку в ПУГе и приступил к закрытию скважины с помощью верхнего плашечного превентора с трубными плашками. Давление в манифольде снизилось до нуля, давление в аккумуляторах снижается. Включился нагнетательный насос на станции управления ПВО. Какие первоочередные действия необходимо предпринять, чтобы обеспечить герметичность скважины и сохранность гидравлической системы?»Можно сделать следующий вывод:После активации плашечного превентора произошла проблема, связанная с нарушением целостности линии гидравлического управления на линии закрытия трубного ППГ, это можно понять по резкому снижению давления в манифольде до нуля и отсутствию восстановления этого давления, наблюдается падение давления в аккумуляторах, которое привело к включению гидравлических насосов на станции управления. Из-за того, что на скважине ГНВП, необходимо как можно быстрее обеспечить герметизацию устья. Помним, проблема еще и в том, что у нас идет уход гидравлического масла в атмосферу (в никуда, на улицу), что вызывает риск полной потери гидравлики в дальнейшем, а следовательно, и невозможность применить гидравлические элементы. Поэтому в первую очередь необходимо вернуть герметичность самой линии.Думаем, когда не происходило никаких утечек? Когда кран был в положении «открыто», утечек не было, но если мы поставим в это положение, мы не сможем закрыть превентор с помощью штурвалов... Поэтому краны сделаны трехпозиционными, где есть положение «ОТКРЫТО» — «БЛОКИРОВКА» (НЕЙТРАЛЬНОЕ) — «ЗАКРЫТО». «Блокировка» как раз и выполняет функцию ремонта и замены линий от станции к превентору. Данное положение буквально не допускает поступления гидравлического масла ни в одну из линий и камеру превентора. Поэтому бурильщику следует перевести кран в режим блокировки (это можно сделать вручную на основной станции). Что это даст? Сейчас на данный момент линия открытия и камера на открытие у превентора уже без давления, в камере закрытия и линии закрытия превентора тоже давления нет, потому что линия негерметична, масло не успело поступить и передать давление. Блокировка автоматически позволит убить двух зайцев: не допустить дальнейший уход жидкости «на улицу» и, поскольку в камере открытия превентора нет давления, позволит с помощью ручных штурвалов провести закрытие и одновременную фиксацию плашек на трубе. На что обращаю внимание — это аварийная операция, связанная с повышенной опасностью в плане риском прорыва флюида и получения открытого фонтанирования, поэтому требует скорости и понимания процесса. Второй момент — это давление в скважине, в случае высокого устьевого давления закрыть превентор будет сложнее.
Есть такая игра: Космические рейнджеры 2. Игра довольно старая (22 года уже!). Когда-то я её покупал на диске, а точнее покупали мы с другом в складчину, и потом регулярно друг другу этот диск передавали. Я её прошёл раз 20. Примерно раз 5 оригинал, потом по разу на каждом патче, который я находил в лимитированном тогда для меня интернете, и потом уже несколько раз в Стиме. И до сих я считаю эту игру лучшей компьютерной игрой в принципе.Игра эта очень большая, и одна из мини-игр в ней — это планетарные бои. Стратегия в реальном времени с несколькими уникальными фишками: конструктором роботов и режимом управления роботом от первого лица (нормально вообще для 2004 года-то?).Ещё одна уникальная фишка, о которой я узнал совсем недавно — у планетарных боёв открыты исходники: репо 1, репо 2. Написано оно на C++ DirectX 9. И в какой-то момент я загорелся идеей перенести их в браузер, что должно быть возможно с текущим уровнем кодовых агентов. Для этого я переписываю игру на Rust WASM.Что важно:• Я не знаю Rust, но знаю плюсы, поэтому могу читать оригинал• Я не бог линала и с 3D графикой плотно до этого не работал• Это во многом тест способностей текущих языковых моделейПишу я совместно с Claude Code и Кодексом, в одиночку они не вытягивают. Основные проблемы были пока с водой.Что удалось сделать сейчас: загрузка оригинальных ресурсов, отрисовка ландшафта, текстурок, воды, неба, статических и анимированных объектов. То есть играть пока нельзя, но можно посмотреть рендер. Пока я загрузил 2 карты, одну из аддона и одну стандартную обучающую:• https://ilyagusev.dev/matrixgame/• https://ilyagusev.dev/matrixgame/?bundle=assets/training.bundleПеремещаться на WASD или стрелочки, вращать камерой на ПКМ. Код.
Ржавый FOCДавайте проверим дееспособность нашего микросообщества и накидаем звёзд в Github Даниле @okhsunrog из Rust-комьюнити:https://github.com/okhsunrog/oxifocТам сейчас всего 6 звёзд, что я считаю недостойным такого проекта! выше видео-пруф работы библиотеки.Если коротко, это аналог SimpleFOC на чистом Rust, который использует все самые новые и крутые фичи языка и его экосистемы: например, асинхронный фреймворк embassy. Embassy позволяет обходиться без RTOS (Real-Time Operating System, сидит почти в любом MCU) за счёт использования асинхронной модели (async-await) языка и кооперативной многозадачности, что обеспечивает меньшие накладные расходы по памяти и времени. В oxifoc нет жесткого реалтайма в рамках планировщика, поэтому цикл управления мотором работает в отдельном прерывании. В библиотеке уже поддерживаются STM32G431CB, STM32F405RG, STM32G474RE.По утверждению автора, ни один мосфет не сгорел!)#rust #embedded #motor #control
Kimi K2.6 релизнули, и по кодовым бенчмаркам это прям уровень Opus 4.6 и GPT-5.4. Веса открыты сразу же, без «периода охлаждения» через API.Напомню, на основе предыдущей Kimi K2.5 Cursor натренировал свой Composer 2, который сейчас в курсор-подписке единственная юзабельная модель с нормальной скоростью и лимитами. А тут выходит прямое обновление этой кими, так что точно надо пробовать.Далее хайлаты из релиза, сам ещё не тестировал, подтвердить не могу.Coding-Driven Design. Модель умеет не просто писать код, но и собирать UI. Вы даёте промт, а она сама пишет фронтенд на React, прикручивает анимации при скроле, цепляет простую базу данных и генерирует картинки/видео для сайта через сторонние тулзы.Agent Swarms 2.0. Новая архитектура позволяет запускать до 300 субагентов и управлять всем этим роем.Claw Groups. Это режим для совместной работы людей и ИИ-агентов. Модель выступает в роли тимлида: она сама раскидывает задачи по разным агентам в зависимости от их специализации, следит за их работой и перезапускает, если кто-то завис.Ну а бенчи сами смотрите на картинке, если это всё правда, то впечатляет прям очень-очень.@neuro_channel (теперь ещё в VK и Max)
Филологическая минутка — to prikryt' — уникальный английский глагол, который знают все экипажи и ЦУПы. К этому невозможно привыкнуть — меня это веселит все несколько лет, в течение которых я тесно работаю с английской версией аварийной документации МКС. …
Небольшая библиотека для прокси на Go без лишнего слоя абстракцийproxykit - это набор базовых компонентов, из которых можно собрать свой прокси под задачу.Что есть из коробки:- reverse proxy - forward proxy - CONNECT (HTTPS туннели) - WebSocket проксирование - управление прокси во время работы Подход простой: не сервер «под ключ», а конструктор.Где это может пригодиться:- прокси внутри сервиса - инструменты для дебага трафика - сетевые middleware - кастомные gateway Почему это удобно:- нет лишней архитектуры - можно встроить в любой проект - легко контролировать поведение Это скорее фундамент, чем готовое решение. Берёшь и собираешь под свой сценарий.https://github.com/777genius/proxykit
Версии бывают разныеПричем версии бывают разные не только в следственном комитете, но и в ИТ. Я тут недавно знатно косякнул, ладно хоть коллега подстраховал и на своем редакторском этапе выловил, а то бы и косяк в тексте остался, и этого поста бы не было😳 В общем переводим на 🇺🇸 вот такой текст:Основная версия ПО вносит дополнительные функции в систему, а версия для технического обслуживания отвечает за исправление ошибок.Мой изначальный перевод:The main version of software introduces additional features to the system, while the software version for maintenance helps with troubleshooting.Кстати, troubleshooting - шикарное в своей лаконичности и красоте слово, которое буквально означает "поиск и устранение неисправностей". Но вот c версиями я как раз напортачил🙈В этом контексте я (Шарик, ты балбес) должен был вспомнить, что ПО обычно релизят. И версии - это именно релизы.🧨 В нашем случае основная версия - это major releasе (например, был Android v.14, а стал Android v. 15). Такие релизы бывают редко и означают, что в ПО много чего поменялось, добавились новые функции и возможности.🧨 Версия для технического обслуживания - это maintenance release или, как ещё говорят, minor release. Бывает так, что разработчик ещё не готов выпускать основной релиз, но в ПО найдено довольно много критичных ошибок (bugs) и надо выпустить их исправления (bug fixes). Вот для этих целей, когда нужно заплаты поставить, и используется maintenance release (и тогда это переход с Android 14.1.5.2 на Android 14.1.5.3). И чтобы не повторять глагол, во второй части заменяем его на запятую (в 🇷🇺 обычно в таких случаях вместо запятой ставят тире).Отредактированный перевод на 🇺🇸:The major release provides additional features, while the maintenance release, bug fixes.#хренпереведешь
На днях многие российские приложения перестали работать со включённым VPN. Причём поведение сильно отличается и зависит не только от устройства (iOS или Android), но и от настроек самого VPN.Так, например, WB на моём телефоне просто выводит предупреждение, что стоит отключить VPN. При этом пользоваться даёт. А вот Ozon отказывается работать вовсе. Показывает предупреждение, и пока VPN не отключишь, посмотреть товары не получится.Но и это не у всех одинаково. У кого-то и WB работает так же жёстко, как Ozon.Яндекс Диск пошёл ещё дальше. Не пускает даже на десктопной версии сайта. При этом я им активно пользуюсь и тариф у меня не бесплатный. Плюс есть отдельная проблема. На каждом потоке курса у меня есть люди из Китая, Беларуси, Кыргызстана и Казахстана. И многих на Яндекс Диск без VPN просто не пускает, особенно Китай. Им-то как быть?С Telegram тоже начались проблемы. Вчера, например, полдня не мог зайти в свой канал. Без VPN он иногда работает, но изображения не грузит. С включённым VPN может вообще не подключаться. С тех пор как пошли разговоры про встроенные обходы блокировок, стало только хуже.В итоге сейчас это выглядит так. С VPN не работает одно, без VPN другое.Разумеется, это не реклама VPN, на всякий случай уточню.Но при этом я не думаю, что будет какая-то существенная просадка по трафику и заказам на маркетплейсах. Выключить VPN, чтобы сделать заказ, задача несложная.Что касается внешнего трафика, тоже не верю, что это сильно на него повлияет. Затронет в основном переходы по прямым ссылкам, то есть Telegram-трафик, но как будто бы селлеры не так часто используют его для рекламы товаров. В остальных соцсетях люди копируют артикул и ищут товар через поиск вручную.Так что разгонять панику точно не стоит.Поговорили про технологии, теперь про людей. Настроение, думаю, и так считывается. Даже по чату видно, как аудитория обновляется, каждые пару месяцев как будто другая атмосфера, другой чат, другие люди.У меня сейчас тоже смешанные чувства. С одной стороны идёт курс по рекламе, и я вижу много товаров, где достаточно немного донастроить рекламу и можно неплохо зарабатывать. С другой стороны есть товары, которые уже не отобьются никогда. Там задача хотя бы выйти с минимальными потерями, что почти невозможно.Что касается канала. Да, активность читателей в последнее время оптимизма не прибавляет. Но спасибо, что хотя бы читаете! Сначала думал писать реже, думал, может, всех уже задолбал. Потом понял, что дело, наверное, в количестве. Просто нужно немного сместить фокус: меньше про аналитику и рекламу, больше про жизнь. А?По видео пока тоже без изменений. Анонсов со стороны WB много, по факту никакой новый функционал не реализован. Как только появится что-то интересное, будет разбор на канале.Кстати, Нейромаркет, возможно, скоро выкатит функционал списков, который многие ждали.Так что не унывайте там. Всё в итоге будет нормально, но это не точно.Я в Max.
Денису Кривенцеву из Алросы задали вопрос, зачем им в этих их алмазных шахтах ИИ?Ответ логичный, кейсы и вот это все. Самый большой страх - если ИИ найдет алмазы под зданием администрации города Мирного. Которых там КОНЕЧНО НЕТ, а не то что вы подумали.На самом деле очень взвешенный спич именно от заказчика.
🔐 Замыкания: Управление состоянием без классовdef create_counter(start: int = 0): count = start def increment(): nonlocal count count += 1 return count return increment# Пример использованияcounter = create_counter()print(counter()) # Выведет: 1print(counter()) # Выведет: 2print(counter()) # Выведет: 3📌 Замыкания позволяют создавать функции с собственным состоянием, что может быть полезно для управления счетчиками, кэшами и другими задачами, требующими сохранение состояния между вызовами. В приведенном примере замыкание create_counter создает функцию increment, которая помнит текущее значение счетчика. Это позволяет обойтись без использования классов, сохраняя код компактным и понятным.Подпишись 👉🏻 @KodduuPython 🤖
Low-code сдулся: бизнес выбирает ИИ Low-code, похоже, отправляется в архив вместе с другими "универсальными решениями".За год доля крупных российских компаний, использующих или планировавших внедрение low-code, упала с 66% до 34% (опрос BPMSoft, топ-50 компаний с выручкой >10 млрд руб.). Половина рынка - минус за 12 месяцев.Причина прозаичная: обещали "быстро и без кода", получили - обучение платформам, ограничения по архитектуре и сложности с интеграциями. В итоге low-code из "замены разработки" превратился в инструмент для прототипов и базовых решений.Параллельно бизнес переключился на генеративный ИИ. Логика простая: если уж упрощать разработку, то сразу до уровня "запрос - готовый код", без сборки визуальных конструкторов.Новая реальность уже породила новую роль - разработчиков, которые чистят код после ИИ.Low-code не исчезает, но возвращается на свое место - вспомогательной технологии. А гонка снова смещается туда, где быстрее, гибче и... пока менее предсказуемо.#IF_софт
🤔 Open Claw: реальный инструмент или просто очередной хайп из Reels?🟢 Сели тут с Андреем и разобрал иOpen Claw, ту самую штуку, про которую сейчас говорят все, кто хоть как-то трогает нейросети. Только мы пошли не по пути красивых демок из инсты (там и так всё прекрасно), а полезли смотреть, что там под капотом. Как реально работают агентные системы на Cloudflare Workers AI, зачем профи гоняют серьёзные эксперименты на отдельном железе, а не на рабочем ноуте, и почему Open Source здесь, это не про идеологию, а про трезвый расчёт.🟢Заодно прошлись по практике: где такие Workflow уже приносят живые деньги (даже Яндекс вспомнили), а где это всё ещё просто красивая игрушка на один вечер. Поговорили про Paper Clip и почему я настороженно отношусь к коммерческим AI-платформам, потому что условия доступа к твоим данным там могут поменяться ровно в тот момент, когда тебе это максимально неудобно.🟢Этот выпуск не для тех, кто ищет ещё один «топ-5 нейросетей в 2026». Это для тех, кто хочет понимать, как собирать автономные системы у себя, а не арендовать чужую песочницу. Если думаете тащить ИИ-агентов в работу или в бизнес посмотрите до того, как убьёте десятки часов на пустые тесты.Тык смотреть 🫡
Хватит мучить sync.WaitGroup для HTTP-запросовКаждый джун проходит этот путь:1. Запускаем 10 горутин через go func().2. Добавляем wg.Add(1).3. Понимаем, что одна горутина может вернуть ошибку.4. Создаем канал для ошибок, мьютекс или (о ужас) глобальную переменную.5. Код превращается в нечитаемую простыню.Коллеги, для групповых задач с возвратом ошибок есть стандартный (почти) инструмент - errgroup.Пакет golang.org/x/sync/errgroup делает три вещи, которые вы обычно пишете руками:1. Ждет завершения всех горутин.2. Возвращает первую случившуюся ошибку.3. (Опционально) Отменяет контекст для остальных, если кто-то один упал.Как это выглядит:import "golang.org/x/sync/errgroup"func fetchAll(urls []string) error { // Создаем группу и контекст g, _ := errgroup.WithContext(context.Background()) for _, url := range urls { url := url // Go 1.22 fix not needed, but habit 🙂 // g.Go принимает функцию вида func() error g.Go(func() error { resp, err := http.Get(url) if err == nil { resp.Body.Close() } return err // Если вернем err != nil, контекст отменится }) } // Ждем всех. Если была ошибка — получим её. return g.Wait()}🔥 Senior Tip:В последних версиях добавили метод g.SetLimit(n).Это киллер-фича. Она превращает errgroup в Worker Pool с ограничением конкурентности. Больше не нужно создавать семафоры на каналах, чтобы не за-DDOS-ить внешний API. Просто добавьте g.SetLimit(10) перед циклом.Чисто, лаконично, и никаких дедлоков на wg.Done().#golang #concurrency #patterns #bestpractices📲 Мы в MAX👉 @golang_lib
🎮 Учись программировать через игры — это реально работаетЕсли скучно учить код по книжкам - попробуй формат, где ты сразу применяешь знания на практикеВот 10 крутых платформ:1. Kubernetes http://k8sgames.com 2. DevOps http://devops.games 3. Linux http://overthewire.org 4. Git http://ohmygit.org 5. Python http://codecombat.com 6. CSS & HTML http://codepip.com 7. Кибербезопасность http://picoctf.org 8. Мобильное обучение (как Duolingo) http://sololearn.com 9. Для новичков с нуля http://scratch.mit.edu 10. 25+ языков программирования http://codingame.com Почему это работает:- сразу практика, а не теория - есть цель и геймификация - быстрее запоминается - не выгораешь Если ты только начинаешь или застрял — это один из самых быстрых способов прокачаться
Каждый раз гуглю эту штуку, пришло время сделать зарубку:Вы зашли на сервер по ssh, открыли файл через micro но все попытки что-то оттуда скопировать в буфер обмена хостовой машины тщетны?Это потому что micro по дефолту использует xclip или wl-copyНадо переключить его на OSC 52 последовательность.mkdir -p ~/.config/micro && echo '{"clipboard": "terminal"}' > ~/.config/micro/settings.jsonP.S. если используете tmux ему надо дать явное разрешение на нее set -g allow-passthrough on#linux #micro #ssh
MQTT-NP - кроссплатформенный настольный MQTT-клиент, разработанный для разработчиков и энтузиастов Интернета вещей. Созданный с использованием современных веб-технологий и языка Rust, он предоставляет быстрый, безопасный и удобный интерфейс для мониторинга и управления MQTT-брокерами.Возможности: - несколько профилей серверов: сохранение и переключение между различными MQTT-брокерами. - защищенные соединения: поддержка аутентификации (имя пользователя/пароль) - статус соединения: мониторинг соединения в режиме реального времени с помощью визуальных индикаторов. - быстрое переключение: плавное переключение между серверами без потери данных. - динамическое обнаружение тем: автоматическое обнаружение тем из брокера. - Infinity Topics Explorer: подпишитесь на все темы, используя символ #wildcard - фильтрация по темам: выберите темы для мониторинга. - визуальные индикаторы: анимированные уведомления о поступлении сообщений. - массовые операции: снять выделение со всех элементов, удалить все элементы или удалить невыбранные элементы. - сообщения в режиме реального времени: просматривайте входящие сообщения по мере их поступления. - счетчик сообщений: отслеживание порядка сообщений с обратной нумерацией. - копировать в буфер обмена: функция быстрого копирования содержимого сообщений. - подписка на темы: подписывайтесь на новые темы прямо из журналов. - Clear Logs: начните с чистого листа одним щелчком мыши - современный дизайн: чистый, интуитивно понятный интерфейс, созданный с помощью Tailwind CSS. - темный режим: приятная для глаз тема благодаря поддержке темного оформления. - адаптивный дизайн: оптимизирован для экранов настольных компьютеров и мобильных устройств. - боковая панель навигации: быстрый доступ ко всем функциям. - функция Keep-Alive Views: сохраняет состояние при переключении между страницами. - Infinity Topics Explorer: включение/выключение автоматического поиска тем - сохранение соединения: запоминает ваше последнее подключение. -сохранение тем: сохраняет темы для каждого соединения.https://github.com/leruetkins/mqtt-np-tauri Подсказал: @parum_amicaОпубликовано в @gitgate#mqtt #rust
В ядро Linux 7.1 принят новый драйвер NTFS — ntfsplus, быстрее и современнее ntfs3 Линус Торвальдс принял в состав ядра 7.1 (релиз в середине июня) набор патчей с новой реализацией файловой системы NTFS под именем ntfs. Разработчик Намджэ Чон (участник Samba, сопровождающий EXFAT и KSMBD). Драйвер основан на кодовой базе старого классического ntfs (только чтение), переработан с поддержкой записи и современных возможностей ядра (iomap, отложенное выделение блоков, фолианты страниц вместо buffer_head). По тестам xfstests ntfsplus проходит 326 тестов (41.4%), ntfs3 — 273 (34.6%). По производительности: запись в однопоточном режиме быстрее на 3-5%, в 4 потока — на 35-110%. Чтение на одном уровне. Вывод списка файлов (ls -lR) быстрее на 12-14%. Монтирование 1 ТБ раздела — 0,38 секунды против 2,03 у ntfs3 (в 5-6 раз быстрее). В ntfsplus реализованы отложенное выделение блоков, iomap, idmap при монтировании. В планах — полноценное журналирование. Разработан собственный набор утилит ntfsprogs-plus (ntfsclone, ntfscluster, ntfsinfo) и новая утилита ntfsck для проверки и восстановления разделов.