На пороге 2027 год, и с момента появления языка Си прошло уже более 50 лет… Но, что удивительно, за все эти годы так и не появилось идеальной альтернативы этому языку. Поэтому, ради интереса, я попробовал разработать дизайн своего "идеального" языка. И теперь я хочу рассказать о том, что у меня получилось.
Читать далееРазработка такого рода для меня совершенно новый опыт, поэтому, периодически, ловлю откровенный "тупняк" от решений, которые нужно применять в этой области.
Продолжаю рассказывать о том, как делаю ровер с управлением по сети.
Читать далееПривет!
Представьте, что вы с удовольствием пишите один код на все платформы на Kotlin Multiplatform, и вдруг приходит задача «синкать данные раз в час, только по вайфаю и когда телефон на зарядке».
Под Android вы берёте WorkManager и за пятнадцать минут закрываете тикет. Потом яблочный смежник открывает документацию по BGTaskScheduler и обнаруживает, что модель там вообще другая и работает всё по-другому: нет очереди задач, есть окна, которые система выдаёт по своему усмотрению и т. д.
В итоге в проекте появляется expect fun scheduleSync() с разными реализациями, которые ведут себя по-разному, и никто в команде через год не сможет сказать, что именно произойдёт на iOS, если приложение свернули посреди загрузки.
Так как я андроидер с альтернативным мышлением, мне нравится API WorkManager'а. Я захотел его скопировать под KMP, породив так называемый Kotlin Multiplatform Work Manager или же Jabbit (job + rabbit, да, я знаю) — планировщик фоновых задач для KMP.
Таргеты: Android, iOS, js и wasmJs. Как будет время и желание, появится ещё и декстоп.
Читать далееПрофессия меняется на глазах: часть работы, ради которой мы когда-то пришли в код и которая была удовольствием, переезжает под ответственность LLM. Мы всё ещё инженеры — читаем код, держим архитектуру, — но, давайте честно, это уже другая профессия.
Вопрос, который меня не отпускает: как нам, у кого за плечами годы опыта, расти дальше в этом новом мире — где учиться новым способам работы с AI и куда девать собственные находки? Пришла спорить и собирать ваши мнения.
Читать далееНаконец-то кто-то нормально посчитал, как сравнивать венчурные фонды!
Спойлер: не просто по количеству единорогов в портфеле.
На днях вышло большое исследование Ильи Стребулаева, профессора Стэнфордской высшей школы бизнеса: вместе с коллегами он собрал альтернативу Forbes Midas List (один из самых известных рейтингов венчурных инвесторов).
В публичном пространстве о фондах часто судят по бренду, известным компаниям в портфеле, количеству единорогов - но эти признаки могут ничего не значить.
Мой агент дошёл до состояния, когда я перестал читать письма перед отправкой. Между «агент решил» и «письмо ушло» не было ничего — ни паузы, ни человека, ни записи о произошедшем.
Слой подтверждений выглядит как день работы: таблица, кнопка «одобрить», кнопка «отклонить». Я вёл каталог отказов, пока его делал. К релизу в нём было 66 пунктов. Разбираю пять, которые почти всегда переживают первую версию, и показываю, почему 100% покрытия по ветвям ничего не гарантируют.
Читать далее«Управление сложностью — сама суть программирования компьютеров.» — Брайан Керниган
Стадия финального тестирования
Мы находились на этапе финального тестирования проекта IoT‑датчика — устройства для умного дома с 128 КБ ОЗУ, которое отслеживает температуру, влажность и качество воздуха. Прошивка прошла все функциональные тесты. Юнит‑тесты: зелёные. Интеграционные тесты: зелёные. Энергопотребление: в пределах спецификации.
Последним требованием был тест непрерывной эксплуатации в течение 72 часов. Мы подготовили в лаборатории двенадцать устройств, настроив их на отправку данных датчиков каждую секунду, и оставили их работать.
Спустя три дня я пришёл в лабораторию, ожидая собрать логи тестирования и завершить проект.
Но вместо этого выяснилось, что все двенадцать устройств аварийно выключились.
В консоли последовательного порта на каждом устройстве была одна и та же ошибка:
[72:14:23] malloc failed: out of memory
[72:14:23] Fragmentation: 45%
[72:14:23] System halted
У меня cкрутило желудок. Проект планировалось выпустить через две недели. Я в точности знал, что произошло, и понимал, что решать проблему будет очень трудоёмко.
Читать далееЕсли вы когда-нибудь настраивали Patroni, то знаете это чувство: чтобы просто следить за одной базой, вам нужно построить вокруг неё целый город. Тут у нас etcd, там Consul, здесь зоопарк зависимостей, а вон там отдельный бюджет на железо под систему управления. Это напоминает попытку установить охранную систему, которая потребляет больше электричества, чем защищаемый объект.
Классика HA строится на «централизованном консенсусе». Это когда три сервера управления спорят между собой, кто из двух серверов базы данных сейчас главный. Я решил, что пора перестать плодить сущности.
Познакомьтесь с GFM (Gorgona Failover Manager). Это менеджер отказоустойчивости, который работает на принципах P2P-меша.
Читать далееУтро часто начинается с простого движения: рука тянется к телефону.
Telegram. YouTube. Новости. Рабочие чаты. За несколько минут можно узнать, что произошло ночью, о чём спорят люди, что нового появилось на работе и что предлагают посмотреть следующим.
При этом на один вопрос вы ещё не ответили: что сегодня важно лично мне?
В этом для меня и есть главная проблема утреннего думскроллинга. Дело даже не в том, сколько времени прошло с телефоном в руке.
Ещё до того, как вы успели подумать о собственном дне, в голове уже появились чужие темы.
Кто-то написал сообщение. В одном из каналов обсуждают новую историю. В рабочем чате появился вопрос, который мог бы подождать, но теперь вы уже о нём знаете.
День ещё толком не начался, а внимание уже чем-то занято.
Читать далееКак хранили данные в PROM начала 1970-х, когда один бит буквально зависел от состояния микроскопической плавкой перемычки? Кен Ширрифф разобрал MMI 5300 и показал устройство кристалла изнутри: от массива на 1024 бита и схемы адресации до высоковольтного программирования и хитростей, которые использовали для тестирования таких микросхем.
Разобрать PROMВ этой статье я покажу, как использовать IAsyncEnumerable в WPF‑приложении для асинхронных операций. Код полностью рабочий, его можно скопировать и запустить.
Для команд используется библиотека Prism (NuGet: Prism.WPF). Если у вас нет Prism, команды можно реализовать вручную, но в примере используется стандартный подход из Prism.
Предположим нам нужно выполнить поиск устройств по протоколу Modbus RTU или любую другую операцию с результатами.
Часто первым решением становится использовать асинхронную операцию или поток в совокупности с событиями для проброса данных. Но тогда нам необходимо будет управлять подписками на события, пробрасывать данные из внешнего потока в основной UI через Dispatcher.Invoke.
В начале пути я, как и многие, использовал асинхронные операции с событиями, методами‑обработчиками и Dispatcher.Invoke для проброса данных в основной поток. Но если данных много и\или они часто меняются, это создает дополнительные сложности. Так же куча событий, делает код более запутанным и менее масштабируемым.
Начиная с C# 8, появилась возможность использовать IAsyncEnumerable, позволяющие реализовать код профессионального уровня с линейной сигнатурой и преимуществами такими как:
Читать полностьюЕсли вы ведете pet‑проекты, требующие большого количества вычислений, то наверняка сталкивались с проблемой их - вычислений - оркестрации. Содержать личный кластер позволить себе могут далеко не все, а каждая арендная платформа имеет свой специфический инструментарий интеграции и свои ограничения, а хуже всего, что ни одна из них не имеет гарантий полного выполнения. Вдобавок к этому, еще и не хотелось бы завязываться на одну конкретную площадку, как минимум потому, что некоторые провайдеры дают бесплатные возобновляемые квоты, и тратить их, вместо своих кровно заработанных, гораздо приятнее. В данной статье будет рассматриваться пример с арендными GPU, однако все основные тезисы полностью переносимы и на другие сценарии использования.
У вас, скорее всего, уже открыт десяток разнообразных вкладок: какая‑нибудь платформа с бесплатными недельными лимитами, вроде Kaggle; что‑нибудь с бесплатными возобновляемыми кредитами, на подобии Lightning AI; возможно, пара площадок со спотовыми машинами по цене чашки кофе, например Vast, но с оговоркой — никто не обещает, что машину не заберут, или у ее владельца не отвалится сеть.
Каждый вариант в отдельности выглядит как «ну, на пару экспериментов может быть и хватит» с различной долей допущения. Все вместе они выглядят как кластер. Нюанс в том, что кластером они становятся не сами: между «у меня есть пяток площадок» и «моя задача точно доедет до конца и не ляжет в непредсказуемый момент» находится довольно много инженерной работы, и почти вся она — не про площадку, а про грамотную оркестрацию.
Эту работу я выполнил для своего проекта и хочу поделиться тем, из чего она состояла. Многие решения оказались неочевидными, а добрая половина появилась лишь после того, как самый явный вариант сломался.
Итак, приступаем...
Где взять гарантию, которая не существует?Как сжать данные на диске на компьютере/ноутбуке?
Почему нажимать эту кнопку не стоит?
Что использовать вместо этой кнопки?
Я хочу знать большеОтчужденность — это чувство внутреннего разрыва человека с миром, людьми, трудом.
В разговоре с другими людьми вы чувствуете себя отдельно от них. Ваш труд перестает отражать вас, в нём больше не видно вашего следа. Вокруг всё меняется быстрее, чем вы успеваете подстроиться — мир становится немым.
Обратное чувство отчужденности — отзвучность. Человек слышит мир, и он ему откликается. Немецкий социолог Хартмут Роза называет это резонансом.
Под катом — попытка разобрать эту метафору как механизм: камертоны, метрономы и смерть осциллятора; нейросеть, где вместо нейронов — осцилляторы; мозг как химера ритмов и внимание, которое оказывается не лучом, а стробоскопом; живые нейроны, выучившие Pong ради предсказуемого мира; семь признаков, отличающих отчужденность от одиночества, фрустрации и апатии. И вывод, который спорит с самим Розой: отчужденность — не противоположность резонанса.
Читать далееУ меня браузерный генератор вывесок: человек набирает надпись, получает STL-модель корпуса под светодиодную ленту. Всё считается на его же машине, файл никуда не уходит. Однажды пришёл вопрос, который сломал мне неделю: надпись 500 мм, стол принтера 256×256. Что делать?
Стандартный ответ — «режьте в слайсере». Слайсер режет плоскостью, и это честно работает ровно до момента, когда вы забираете со стола две половинки со стеклянно-гладкими срезами и понимаете, что совместить их нечем. Клей по гладкому PLA держит на честном слове, при склейке половинки едут, и на видном месте остаётся ступенька.
Я решил сделать рез внутри генератора: чтобы части сразу выходили с замками и собирались без клея. Дальше — про то, как я трижды всё переделал, и про шесть граблей, каждая из которых стоила мне вечера.
Читать далееПолтора года назад в России появились оборотные штрафы за утечки персональных данных. За это время Роскомнадзор назначил штрафов на 2,6 млн рублей (при 1,58 млрд утёкших записей). Почему угроза штрафа изменила поведение бизнеса сильнее, чем сам штраф? И как посчитать риск утечки в рублях?
Читать далееКак-то незаметно прошла новость, что иена упала до минимального за 40 лет значения к доллару. Ну, казалось бы: упала, так упала. Тем более что объяснение везде одно и то же.
Мол, ставка Банка Японии — 1%, а у ФРС США — 3,5–3,75%, и значит, делают вывод: глобальные инвесторы занимают в иенах, потом их продают, меняют на доллары и вкладываются в долларовые активы — акции и облигации на Уолл-стрит.
Называется эта игра на ставках, или кэрри-трейд. Ну, а раз иену сбрасывают, вот она и катится по наклонной.
Читать далееНеважно, что делает LLM. Задача все равно приходит словами, и одно пропущенное не может испортить уже вполне материальное действие. Смотрю на LLM глазами лингвиста и разбираюсь, как языковед проверяет LLM от токенизации до прагматики и что разработчик может превратить из этого филологического занудства в код, метрики и тесты.
Читать далееКогда говорят о DuckDB, обычно вспоминают аналитику: локальные запросы к Parquet, быстрые агрегации, ноутбуки. Но у него есть свойство, к аналитике отношения не имеющее: он умеет соединять источник и приёмник данных внутри одного SQL-плана. С расширениями для Oracle и PostgreSQL перенос данных сводится к одному запросу — без Instant Client, без OCI, без Python и без промежуточных файлов. А если одной сессии Oracle мало, чтение разбивается на параллельные шарды, читающие один согласованный снимок по единому SCN.
Читать далееПолгода назад я поддерживал TypeScript SDK для одной панели администрирования. Обычная библиотека: сгенерированный из OpenAPI клиент, авторизация, ретраи, вебхуки. И в какой‑то момент я поймал себя на том, что рутинные вопросы к панели — «у кого истекает доступ на этой неделе», «почему нода отвалилась», «сколько трафика съел вот этот аккаунт» — я решаю одинаково: открываю редактор, пишу пятнадцать строк скрипта на своём же SDK, запускаю, читаю, удаляю.
Мысль напрашивалась: SDK уже типизирован, схемы уже есть, значит модель может вызывать его сама. Так появился marzban-mcp.
Дальше выяснилось, что «обернуть SDK в MCP» — это примерно 10% работы. Остальные 90% — ответ на вопрос, который в обычной библиотеке вообще не стоит: что можно доверить модели делать с боевой инфраструктурой, а что нельзя, и как эту границу выразить в коде.
Читать далее