Как стать автором
Обновить
2
0
Kirill Frolov @fk0

Пользователь

Отправить сообщение

Понимаем обычное дерево отрезков

Уровень сложности Средний
Время на прочтение 13 мин
Количество просмотров 12K

Всем привет! Изучив несколько статей по этой теме, у меня остались вопросы, и некоторые моменты по-прежнему были не понятны, поэтому я решил написать свою, которая, как мне кажется, была бы понятна тем, кто не силен в спортивном программировании. В ней я объясняю, как устроено дерево отрезков. Примеры с кодом будут приведены на языке C++, однако на объяснение это не влияет.

Читать далее
Всего голосов 26: ↑25 и ↓1 +24
Комментарии 4

Как разработать плату, пригодную для массового производства? Подход Design for Manufacturing

Уровень сложности Сложный
Время на прочтение 15 мин
Количество просмотров 18K

Качество печатной платы зависит не только от оборудования, уровня технологов и процессов на фабрике. Не меньший вклад в него вносят конструкторские решения разработчика платы — тополога. От них зависит технологичность: то, насколько просто будет произвести и ремонтировать изделие. Наиболее технологичной плата получится, если тополог сразу учтёт технологические нормы и особенности производства, внеся их в параметры своего CAD‑проекта. Такой подход называется Design for Manufacturing (DFM) — дизайн, оптимизированный под производство. Давайте разбираться, что это такое.

Этот материал адресован в первую очередь топологам, технологам и всем, кто уже работает в RnD и на производствах — или готовится войти в индустрию. Но мы постарались сделать его доступным для всех читателей.

Читать далее
Всего голосов 84: ↑84 и ↓0 +84
Комментарии 101

Алгоритмы быстрого умножения чисел: от столбика до Шенхаге-Штрассена

Уровень сложности Средний
Время на прочтение 26 мин
Количество просмотров 37K

При написании высокоуровневого кода мы редко задумываемся о том, как реализованы те или иные инструменты, которые мы используем. Ради этого и строится каскад абстракций: находясь на одном его уровне, мы можем уместить задачу в голове целиком и сконцентрироваться на её решении.

И уж конечно, никогда при написании a * b мы не задумываемся о том, как реализовано умножение чисел a и b в нашем языке. Какие вообще есть алгоритмы умножения? Это какая-то нетривиальная задача?

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

Скорее к формулам!
Всего голосов 173: ↑173 и ↓0 +173
Комментарии 28

Радиотелефончик на смартфоне

Уровень сложности Простой
Время на прочтение 15 мин
Количество просмотров 20K
image

Немало воды утекло со времени публикации цикла про стриминг видео на Андроид устройствах, но вот ручки добрались и до аудио потоков. Не то, чтобы это была какая-то более заковыристая тема про сравнению с видео, даже наоборот, сложно придумать что-то проще, ибо Audio API не менялось, дай бог памяти, с 2012 года, если не раньше. И не стоило бы, ради этого пилить короткий пост, если бы не зудящая мысля — а на какое расстояние и каким образом можно передать сей аудио поток, если мы будем использовать для этого только два смартфона без всякой мобильной связи и внешних точек доступа.

Если вам интересно узнать, что из этого получилось, то прошу проследовать под кат…
Читать дальше →
Всего голосов 60: ↑60 и ↓0 +60
Комментарии 65

Полное понимание асинхронности в браузере

Время на прочтение 24 мин
Количество просмотров 94K
Про асинхронность JavaScript написано много статей, документации и книг. Но вся информация сильно распределена по интернету, поэтому сложно быстро и полностью разобраться, что к чему, и составить цельную картину в голове. Не хватает одного исчерпывающего гайда. Именно эту потребность я и хочу закрыть своей статьёй.

Читать дальше →
Всего голосов 78: ↑78 и ↓0 +78
Комментарии 25

Взлом цветного картриджа HP: превращаем его в ручной принтер

Время на прочтение 15 мин
Количество просмотров 95K
image

Введение


Ещё с юности, когда у нас был старый DeskJet, меня интересовали картриджи струйных принтеров. Эти картриджи казались очень интересными и как только в них заканчивались чернила, я сразу забирал их себе. В то время я не мог сделать с ними ничего, кроме как разобрать и пачкать руки… Хоть я и знал, что там внутри есть какая-то сложная электроника, но при касании контактов батарейкой не происходило ничего интересного, а моих знаний по электронике на большее не хватало.

Чуть позже, когда я стал студентом, мне удалось раздобыть старый струйный принтер. В то время сам я пользовался лазерным принтером, поэтому он мне был не очень интересен, зато было любопытно исследовать картриджи и попытаться выполнить их реверс-инжиниринг. Я в самом деле написал статью об управлении этими картриджами, и хотя они работали достаточно хорошо, были и недостатки: мне так и не удалось выяснить точный порядок сопел, картридж был только монохромным (печатал маджентой), к тому же довольно старым, а потому разрешение оказалось довольно низким.

Недавно моя девушка занялась рисованием, поэтому это стало хорошим оправданием для возврата к струйным картриджам в надежде, что и мне удастся нарисовать что-то на холсте. На этот раз мне повезло: удалось найти способ привязки всех сопел к правильным сигналам. Кроме того, сегодня картриджи принтеров управляют бОльшим количеством сопел используя меньшее количество сигналов, что упрощает управление картриджем и увеличивает поверхность, которую можно покрыть за один проход.
Всего голосов 156: ↑155 и ↓1 +154
Комментарии 43

«Кандидат сбежал в слезах»: 5 главных вопросов для собеседования на Python разработчика

Время на прочтение 3 мин
Количество просмотров 98K

В июле и августе 1991 года я, с подачи Гвидо Ван Россума, проводил технические интервью на позицию Middle Python Backend developer. И, видимо, буду вынужден продолжать проводить, о чём ниже.

Задача формулировалась как «найти человека, который сможет задать и поддерживать высокий уровень профессионализма в применении языка Python». Под эту задачу я сформировал новый опросник вместо того, которым пользовался несколько дней — старый имел слишком жесткий закос под промышленное программирование.

И вот что я хочу сказать вам, коллеги: вы меня огорчаете.

Читать далее
Всего голосов 322: ↑193 и ↓129 +64
Комментарии 358

Игра «Жизнь» — как собрать произвольный шаблон всего из 15 глайдеров

Время на прочтение 18 мин
Количество просмотров 10K

В сообществе игры «Жизнь», изобретённой Джоном Конвеем, отмечали знаковое достижение, совершённое 9 ноября 2022 года. Идея, на воплощение которой ушли годы – проект «обратный шестометатель» — наконец дошла до той стадии, когда в наличии имелись все компоненты для этой сущности, позволявшие достичь заявленной цели.  

Цель проста. Выбираем любой шаблон, который можно собрать в «Жизни» - например, Тихоходку. Начинаем с небольшого количества шаблонов (пока 15), так, чтобы в пустой вселенной для «Game of Life» присутствовали только они. С течением времени из этих глайдеров должен собраться данный шаблон. Никакого остаточного мусора, разбросанной основы – только чистый синтез того, что вы выберете. Данный пост рассказывает, как устроен этот механизм, как мы до него дошли, и почему это так круто.

Читать далее
Всего голосов 80: ↑73 и ↓7 +66
Комментарии 20

Пишем драйвер ядра Linux для неизвестного USB-устройства

Время на прочтение 15 мин
Количество просмотров 16K
image

В этой статье объяснен весь процесс, на выходе которого получается рабочий драйвер ядра Linux для недокументированного USB-устройства. Выполнив обратную разработку коммуникационного протокола USB, я покажу архитектуру драйвера ядра для USB. Кроме драйвера ядра в этой статье будет рассказано о простом инструменте для пользовательского пространства; при помощи этого инструмента можно управлять таким устройством. Конечно, придется углубиться в подробности, касающиеся конкретного прибора, но не сомневайтесь – описанный процесс с тем же успехом применим и к другим USB-устройствам.
Читать дальше →
Всего голосов 59: ↑58 и ↓1 +57
Комментарии 9

Github Actions. Простой пример для уверенного знакомства

Время на прочтение 7 мин
Количество просмотров 35K

Здесь я буду расссказывать о моем опыте настройки CI/CD c помощью GitHub Actions.

Эта статья поможет тем, кто хочет настроить автоматический деплой для личного/учебного проекта на свой удаленный сервер, пользуясь бесплатным сервисов GitHub Actions. Причем этим сервисом можно пользоваться бесплатно даже с приватным репозиторием (на момент написания статьи).

Акцентирую на тех моментах, которые для меня оказались не самыми очевидными, читая краткое руководство от Github.

Предполагается, что вы уже знаете, как пользоваться Github. По большому счету, не важно, какой у вас язык программирования или стек: главное - понять, как работают Github Actions и уметь применить его для любого проекта.

Читать далее
Всего голосов 18: ↑18 и ↓0 +18
Комментарии 9

Стрёмное собеседование в Яндекс

Время на прочтение 3 мин
Количество просмотров 92K
Находит меня хеадхантерша из другой страны и предлагает попробовать пройти собеседование в Яндекс. Работы почти нет, зарплаты, судя по рассылкам, там большие. Немножко не тот профиль вообще, но в частности в требуемой теме полгода опыта есть. Сказала, что там задачи решать.

Интервьюер почти ничего не спросил, выдал ссылку на общий вебовский редактор, где первым заданием было написать структуру односвязного списка с данными. А затем было предложено написать функцию, где на входе два таких списка, а на выходе один, отсортированный по данным из первых двух и без всякого копирования.
Читать дальше →
Всего голосов 154: ↑68 и ↓86 -18
Комментарии 235

Kincony KC868-AI: 48 цифровых входов + ESP32, ETH, RS232, RS485 и приёмники IR и 433 МГц

Время на прочтение 6 мин
Количество просмотров 3.7K


Пока мы с вами занимались контроллерами AlertBox (1, 2), подключали Wiren Board блоки на DIN-рейку и пытались полечиться при помощи ТГС-7А, компания Kincony тоже не теряла времени даром и выпустила ещё несколько контроллеров в своём неподражаемом форм-факторе «а-ля скейтборд, только колёсики приделать нужно».

На этот раз она нас порадовала концептуальным решением KC868-AI по организации сбора данных со множества (48 шт.) цифровых входов, плюс на плату добавлены приёмники инфракрасных сигналов (IR) и сигналов от радиомодулей на 433 МГц. Получилось что-то вроде универсального (Wi-Fi, Ethernet) умного (ESP32) гейта для сбора информации с какого-то объекта и передачи её для дальнейшей обработки в общую систему.

Ну а наличие интерфейсов RS485 и I2C и разъёма с 4-я свободными GPIO позволяет подключить к KC868-AI дополнительное оборудование, например, блок реле и сделать этот контроллер полноценным управляющим элементом вашей системы автоматизации.

Далее мы попробуем поподробнее разобраться с устройством KC868-AI и даже немного попрограммировать его в своё удовольствие.
Читать дальше →
Всего голосов 14: ↑13 и ↓1 +12
Комментарии 14

Парсинг JSON — это минное поле

Время на прочтение 25 мин
Количество просмотров 155K
image

JSON — это стандарт де-факто, когда заходит речь о (де)сериализации, обмене данными в сети и мобильной разработке. Но насколько хорошо вы знакомы с JSON? Все мы читаем спецификации и пишем тесты, испытываем популярные JSON-библиотеки для своих нужд. Я покажу вам, что JSON — это идеализированный формат, а не идеальный, каким его многие считают. Я не нашёл и двух библиотек, ведущих себя одинаково. Более того, я обнаружил, что крайние случаи и зловредная полезная нагрузка могут привести к багам, падениями и DoS, в основном потому, что JSON-библиотеки основаны на спецификациях, которые со временем развиваются, что оставляет многие вещи плохо или вообще не задокументированными.

Читать дальше →
Всего голосов 170: ↑164 и ↓6 +158
Комментарии 60

Как оценить реальную производительность своего кода

Время на прочтение 9 мин
Количество просмотров 13K

Код, который мы пишем, и который будет исполнен процессором, — две разные вещи. На уровне ассемблера существует миллион вариантов, в каком виде интерпретировать и запустить высокоуровневые команды. Более того, современные компиляторы сильно оптимизируют код, а результат этой оптимизации похож на магию.
Читать дальше →
Всего голосов 68: ↑65 и ↓3 +62
Комментарии 3

Астрофото: совмещаем одиночные кадры

Время на прочтение 11 мин
Количество просмотров 6.2K

Одной из главных проблем при съёмке астрофотографий являются разнообразные шумы. Не буду подробно останавливаться на том, откуда они берутся и какие компоненты в них присутствуют. Об этом уже есть хорошая серия статей на Хабре, за подробностями рекомендую обратиться к ней. Здесь я только резюмирую основной способ борьбы с шумом: нужно снять несколько кадров одной и той же области неба (чем больше, тем лучше) и усреднить сигнал с соответствующих пикселей.


Но какие пиксели на разных кадрах считать соответствующими? Если бы можно было гарантировать, что объекты между кадрами не сдвинутся ни на пиксель, то всё было бы предельно ясно: просто суммируем одни и те же пиксели на матрице. Но что делать, когда слежение неидеально, или съёмка вовсе ведётся с неподвижного штатива? Тогда звёзды и другие небесные тела будут смещаться, и перед сложением кадры нужно будет правильно наложить друг на друга. Эта статья посвящена тому, как это сделать.

Читать далее
Всего голосов 42: ↑42 и ↓0 +42
Комментарии 15

Имя enum'a C++ в рантайме

Время на прочтение 10 мин
Количество просмотров 5.6K

Получение имени типа, не важно это структура или перечисление, в C++ — проблема. То, что тривиально известно компилятору на этапе парсинга исходников, не получится перевести в человеко-читаемый вид в рантайме. Можно использовать std::type_info::name, который не является переносимым решением, потому что зависит от реализации манглинга в компиляторе. Некоторые компиляторы (например, MSVC, IBM, Oracle) создают "удобное" имя типа, а вот gcc и clang, возвращают искаженное имя, котороe можно преобразовать в удобочитаемую форму с помощью дополнительных функций, например abi::__cxa_demangle. Чтобы вся эта магия работала нужно подключить RTTI, который тоже не всегда доступен, а иногда и вообще-то вреден, потому что сжирает драгоценную производительность, но можно сделать по другому.

follow the white rabbit
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 11

Разработка блока управления боковыми зеркалами автомобиля

Время на прочтение 10 мин
Количество просмотров 17K

Особенности разработки автомобильной электроники, некоторые хитрости и почти весь процесс создания блока на примере простого устройства.

Подробнее
Всего голосов 77: ↑77 и ↓0 +77
Комментарии 92

Как улучшить английский в документации

Время на прочтение 11 мин
Количество просмотров 34K

Я работаю техническим писателем в компании documentat.io. Мы занимаемся заказной разработкой технической документации, в том числе на английском языке. Иногда я дорабатываю уже существующие документы или спецификации к API на английском. Как правило, такие документы написаны русскоязычными разработчиками, которые неплохо владеют английским. И всё же они часто допускают характерные грамматические, пунктуационные и стилистические ошибки.

Корень этих ошибок один — разные языковые механизмы. Нам бывает легко запутаться в употреблении временных форм, порядке слов или непонятно зачем придуманных артиклях. 

Поэтому в этой статье я постарался не просто дать рекомендации о том, как можно избежать распространённых ошибок, но и подсветить те отличительные черты английского языка, которые к этим ошибкам приводят.

Читать далее
Всего голосов 99: ↑98 и ↓1 +97
Комментарии 27

Как работает stack trace на ARM

Время на прочтение 8 мин
Количество просмотров 11K
Добрый день! Несколько дней назад столкнулся с небольшой проблемой в нашем проекте — в обработчике прерывания gdb неправильно выводил stack trace для Cortex-M. Поэтому в очередной раз полез выяснять, а какими способами можно получать stack trace для ARM? Какие флаги компиляции влияют на возможность трассировки стека на ARM? Как это реализовано в ядре Linux? По результатам исследований решил написать эту статью.
Читать дальше →
Всего голосов 34: ↑34 и ↓0 +34
Комментарии 4

Бэкдоры в микросхемах — оценка рисков

Время на прочтение 6 мин
Количество просмотров 14K

Не первый год специалисты задаются вопросом, как обнаружить аппаратные закладки в микросхемах. Но никто не видел таких закладок и не представляет, как они выглядят. Это может быть посторонний артефакт, добавленный на этапе корпусировки микросхемы или сборки устройства. Но самый простой и логичный вариант — спроектировать в дизайне микросхемы недокументированную функцию, которую даже в случае обнаружения посчитают просто ошибкой или неизбежным «компромиссом» дизайна, как уязвимости Spectre и Meltdown.
Читать дальше →
Всего голосов 53: ↑52 и ↓1 +51
Комментарии 7
1

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург и область, Россия
Зарегистрирован
Активность