Как стать автором
Обновить
0
0

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

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

Обработка ошибок в C

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


Введение


Ошибки, увы, неизбежны, поэтому их обработка занимает очень важное место в программировании. И если алгоритмические ошибки можно выявить и исправить во время написания и тестирования программы, то ошибок времени выполнения избежать нельзя в принципе. Сегодня мы рассмотрим функции стандартной библиотеки (C Standard Library) и POSIX, используемые в обработке ошибок.
Читать дальше →
Всего голосов 31: ↑26 и ↓5+21
Комментарии41

Тысяча и одна библиотека С++

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

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

Столкнувшись много раз подряд с тем, что найти что-то толковое довольно непросто, я решил попробовать распутать это узел и предложить для русскоязычных читателей свой справочник классных библиотек на С++. Я исходил из этого источника. Это очень многогранный и объемный список библиотек языка С++, но, скажем так, у меня были к нему вопросы. Потому я сделал перевод, затем значительно улучшил его в плане содержания (далее объясню, как, почему и зачем). На выходе получилось около 1000 библиотек. Как в сказке). Они, конечно, не покрывают все возможные задачи и предметные области, но поверьте, они затрагивают действительно многое.

Прикоснуться к сокровищнице языка С++
Всего голосов 82: ↑81 и ↓1+92
Комментарии23

Укрощаем суммы с плавающей запятой

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

Допустим, у нас есть массив чисел с плавающей запятой, и мы хотим их суммировать. Можно наивно подумать, что их достаточно просто сложить, например, на Rust.

Однако это запросто может привести к произвольно большой накопленной погрешности. Давайте проверим:

naive_sum(&vec![1.0; 1_000_000]) = 1000000.0
naive_sum(&vec![1.0; 10_000_000]) = 10000000.0
naive_sum(&vec![1.0; 100_000_000]) = 16777216.0
naive_sum(&vec![1.0; 1_000_000_000]) = 16777216.0

Ой-ёй… Что произошло? Проблема в том .что следующее 32-битное число с плавающей запятой после 16777216 — это 16777218. Так что при вычислении 16777216 + 1, значение округляется до ближайшего числа с плавающей запятой, имеющей чётную мантиссу, то есть снова до 16777216. Мы зашли в тупик.

К счастью, есть более совершенные способы суммирования массива.

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

Практическое применение LD_PRELOAD или замещение функций в Linux

Время на прочтение4 мин
Количество просмотров43K
Всем привет!
В 2010 году, shoumikhin написал замечательную статью Перенаправление функций в разделяемых ELF-библиотеках. Та статья очень грамотно написана, полная, но она описывает более харкордный способ замещения функций. В этой статье, мы будем использовать стандартную возможность динамического линкера — переменную окружения LD_PRELOAD, которая может загрузить вашу библиотеку до загрузки остальных.

Как это работает?

Да очень просто — линкер загружает вашу библиотеку с вашими «стандартными» функциями первой, а кто первый — того и тапки. А вы из своей библиотеки можете загрузить уже реальную, и «проксировать» вызовы, попутно делая что вам угодно.

Реальный Use-Case #1: Блокируем mimeinfo.cache в Opera


Мне очень нравится браузер Opera. А еще я использую KDE. Opera не очень уважает приоритеты приложений KDE, и, зачастую, так и норовит открыть скачанный ZIP-архив в mcomix, PDF в imgur-uploader, в общем, вы уловили суть. Однако, если ей запретить читать файл mimeinfo.cache, то она все будет открывать через «kioclient exec», а он-то уж лучше знает, в чем я хочу открыть тот или иной файл.

Чем может приложение открывать файл? На ум приходят две функции: fopen и open. В моем случае, opera использовала 64-битный аналог fopen — fopen64. Определить это можно, воспользовавшись утилитой ltrace, или просто посмотрев таблицу импорта утилитой objdump.
Читать дальше →
Всего голосов 75: ↑74 и ↓1+73
Комментарии14

Фантомный double в прошивках для ядер Cortex-M*

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

В последнее время появилось много микроконтроллеров на ядрах ARM Cortex-M*, которые поддерживают аппаратную реализацию математики плавающей запятой (FPU). В основном FPU работают с одиночной точностью (float) и её вполне достаточно для работы с сигналами, полученными с АЦП. FPU позволяет забыть о проблемах дискретизации и проблемах переполнения целочисленных вычислений. FPU быстр - все математические операции с одиночными float, кроме деления и взятия корня, занимают на Cortex-M4F один такт. Поэтому после перехода на Cortex-M4F мы вздохнули свободно и стали писать математику на float. Как же мы удивились, найдя в скомпилированном коде математические операции над double с программной, очень медленной эмуляцией.

В статье рассказывается, как обнаружить и исправить присутствие double в прошивках, где ядро аппаратно поддерживает тип float, но не поддерживает double.

Работа ведётся в среде IAR Embedded Workbench на примере реального кода на языке Си.

Читать далее
Всего голосов 65: ↑63 и ↓2+82
Комментарии25

Flipper на минималках. Как мы делаем устройство для чтения и эмуляции ключей от домофонов…

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

Мне понравилась идея Flipper Zero в хранении и эмуляции электронных ключей. Это довольно удобно, можно избавится от половины моей связки со всеми ключами, плюс те ключи, которые я обычно даже не ношу, будут под рукой, в том числе универсальные. Но не понравились его габариты. К тому же, весь остальной функционал хоть мне и интересен, для этой задачи излишен, а за него тоже надо платить. В этот момент появилась идея и, что самое главное, желание самостоятельно реализовать такую штуку.

Конечная идея была в эмуляции ключей стандартов TouchMemory, Em-Marine и Mifare classic в одном устройстве. Хочется, чтобы это устройство было максимально компактным, в идеале вообще помещалось на связку ключей.

Читать далее
Всего голосов 58: ↑56 и ↓2+65
Комментарии56

Китай не принимает платежи из России. Где заказать печатные платы в Китае в 2024 году

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

Полгода назад я писал, как решал проблему с ушедшими JLCPCB. И вот с марта возникла новая проблема ахахах (истерический смех) —  китайские банки начали блокировать оплату от российских компаний за компоненты для сборки электроники. Оплаты не проходят даже у тех компаний, которые заключили долгосрочные контракты с китайскими производственными площадками.

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

Я порезал свой первый обзор + добавил несколько новых компаний, которые сейчас напрямую поставляют компоненты и печатные платы из Китая. В конце - сводная таблица с итогами.

Читать далее
Всего голосов 59: ↑58 и ↓1+71
Комментарии63

Исследование деградации Li-ion аккумуляторов в результате “быстрой” зарядки

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

Задача выяснить, как влияет “быстрая” зарядка на скорость деградации Li-ion аккумуляторов в устройствах с высоким током потребления.

В рамках исследования провел ряд экспериментов. Эксперимент заключается в зарядке аккумулятора током в 4-5 раз выше номинального. Номинальный ток заряда для исследуемых аккумуляторов от 2 до 5А, я буду использовать ток 20А.
В результате эксперимента будет видно, как “быстрая” зарядка увеличивает скорость деградации аккумуляторов.

В качестве испытуемых выбраны Li-ion аккумуляторы Sanyo NSX и LG 18650HG2 в формфакторе 18650.Выбор формфактора обусловлен тем, что именно данный они чаще всего применяется в устройствах с высоким током потребления. А именно: аккумуляторный электроинструмент, электронные сигареты, мощные фонари и некоторые виды электротранспорта.

Читать далее
Всего голосов 102: ↑99 и ↓3+115
Комментарии132

Надежный обход блокировок в 2024: протоколы, клиенты и настройка сервера от простого к сложному

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

Поскольку блокировки интернета в РФ в последние недели и месяцы многократно активизировались, а маразм все крепчает и крепчает, стоит еще раз поднять тему обхода этих самых блокировок (и делаем ставки, через сколько дней на эту статью доброжелатели напишут донос в РКН чтобы ограничить к ней доступ на территории страны).

Вы, наверняка, помните отличный цикл статей на Хабре в прошлом году от пользователя MiraclePtr, который рассказывал о разных методах блокировок, о разных методах обхода блокировок, о разных клиентах и серверах для обходов блокировок, и о разных способах их настройки (раз, два, три, четыре, пять, шесть, семь, восемь, десять, десять, и вроде были еще другие), и можете спросить, а зачем еще одна? Есть две основные причины для этого.

Читать далее
Всего голосов 445: ↑437 и ↓8+489
Комментарии373

Продвинутая работа с логами в Linux

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

Журнал событий, это компонент systemd, который захватывает сообщения Syslog, логи ядра, все события при инициализации системы (RAM, диск, boot, STDOUT/STDERR для всех сервисов), индексирует их и затем предоставляет удобной пользовательский интерфейс для поиска и фильтрации логов. Журнал (systemd journal) можно использовать вместе или вместо syslog или syslog-ng.

Утилита командной строки journalctl, если сравнивать ее с традиционным инструментами для работы с логами в UNIX (tail, grep, sed, awk) более широкие возможности.

Давайте рассмотрим основные возможности которые предоставляет журнал systemd и способы их применения.

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

Как польские математики взломали Энигму

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

Когда речь заходит о взломе Энигмы, то всегда вспоминают об успехе британцев в Блетчли-парк. Но менее известно, что этот успех был построен на фундаменте, который заложили польские криптографы. История о том, как польские математики первыми смогли взломать легендарную Энигму.

Читать далее
Всего голосов 22: ↑21 и ↓1+29
Комментарии14

Лайфхак: как зимой спасти аккумуляторы своих гаджетов

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


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

А учитывая, что сейчас практически везде используются встроенные (несъёмные) аккумуляторы, то последствия могут быть не менее драматическими: либо гаджет летит на помойку (вместе с потраченными на него деньгами), либо ему требуется дорогостоящая и «муторная» замена аккумулятора в сервисном центре.

Меня эта проблема волновала давно, но ничего лучше, чем положить в мороз смартфон в карман рубашки (поближе к телу) мне в голову не приходило. Надо ли говорить, что это паллиативное решение, которое не выдерживает никакой критики…

Но тут меня посетила гениальная идея.
Читать дальше →
Всего голосов 37: ↑28 и ↓9+28
Комментарии93

Продолжаем глубже изучать передачу данных по сетям GSM через GPRS с помощью SIM868 и Repka Pi — про AT-команды

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

 

В предыдущей статье мы рассказали, как с помощью модуля GSM/GPRS/GNSS Bluetooth HAT, созданного на базе SIM868, библиотек SIM800L, RoverConnect и Telemetry можно обмениваться данными между микрокомпьютером Repka Pi с JSON-сервисом, доступным в интернете.

Мы привели исходные коды программ на Python, которые можно использовать для такого обмена. Однако за пределами изложения остался рассказ о том, как происходит работа с модулем на уровне AT-команд.

Такая информация нужна для более глубокого понимания принципов работы SIM800 и SIM868 при передаче данных через GPRS (General Packet Radio Service). Она может пригодиться при отладке программ передачи данных, составленных с использованием других библиотек и языков программирования. Также же сведения об AT-командах GPRS потребуются, если вы собираетесь создать свою собственную библиотеку передачи данных в сетях мобильных операторов.

Собираем стенд для работы

Установка и запуск терминала minicom

Документация по AT-командам модуля

Получаем информацию с помощью AT-команд

Инициализация модуля SIM868

Обмен данными через GPRS

Полезные ссылки

Итоги

Читать далее
Всего голосов 12: ↑10 и ↓2+11
Комментарии10

Управление сервоприводами, часть 4. Управление «сервами» по I2C с Repka Pi через серво-драйвер Robointellect Controller

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

В предыдущих статьях нашей серии про сервоприводы мы рассказывали, как они устроены, как можно управлять сервоприводами с помощью широтно-импульсной модуляции ШИМ (Pulse Width Modulation,  PWM) с помощью контроллеров Robointellect Controller 001, а также напрямую через GPIO через генератор ШИМ на плате микрокомпьютера Repka Pi.

В четвертой статье серии статей про сервоприводы мы расскажем, как управлять сервоприводами с помощью контроллеров Robointellect Controller 001 или PCA9685, подключенных к Repka Pi через шину I2C.

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

Вас сдаст Гитхаб: деанонимизация пользователей SSH-серверов

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

Недавно в своих ежедневных чтениях я наткнулся на явление, о котором думал уже много лет: феномен утечки информации людей, использующих SSH. Этот тип утечки информации не является новым явлением. Я давно предупреждал об этой опасности своих друзей, использующих SSH, но мой голос услышали лишь несколько человек. Поэтому я решил дать пояснения по этому поводу, потому что я считаю, что необходимо понимать этот риск в ИТ-сообществе, особенно в нынешней ситуации. Я буду исходить из предположения, что у вас, дорогой читатель, есть опыт работы с SSH.

Читать далее
Всего голосов 71: ↑67 и ↓4+79
Комментарии153

Жаргон программистов

Время на прочтение4 мин
Количество просмотров65K
Наткнулся на Stackoverflow.com на интересный топик с вопросом о новом в программистском жаргоне. Предлагаю здесь подборку наиболее интересных выражений.

Египетские операторные скобки

if (a == b) {<br>  printf("hello");<br>}<br><br>
Читать дальше →
Всего голосов 314: ↑284 и ↓30+254
Комментарии282

Новый программерский жаргон

Время на прочтение7 мин
Количество просмотров51K
Посетителям сайта stackoverflow.com был задан вопрос: «Какие программерские термины вы придумали, так чтобы они стали популярны в ваших кругах (то есть вы слышали, что кто-то их повторяет)?

Ниже — вольный перевод самых популярных ответов.

Читать дальше →
Всего голосов 411: ↑373 и ↓38+335
Комментарии193

IMSProg — программатор для CH341a в Linux

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

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

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

10 лучших практик логирования в Python

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

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

В этой статье мы рассмотрим лучшие практики логирования в Python. Следуя им, вы сможете обеспечить информативность, практичность и масштабируемость генерируемых логов. Давайте начнём!

Читать далее
Всего голосов 50: ↑49 и ↓1+70
Комментарии19

Настройка производительности диска и памяти в Linux

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

В отличие от таких операционных систем как HPUX (dbc_min_pct, dbc_max_pct) или AIX (minperm%, maxperm%), в Linux нет возможности настраивать размер кэша страниц, читаемых с диска (страничный кэш, page cache). Под страничный кэш Linux использует всю доступную память. Размер страничного кэша можно увидеть в /proc/meminfo в параметре "Cached". В /proc/meminfo есть также значение "Buffers", которое часто путают с размером страничного кэша. "Buffers" — это память, содержащая сырые дисковые данные (raw disk data) и выступающая в роли промежуточного буфера между процессами, ядром и диском.

В этой статье рассмотрим, как Linux работает с памятью, и, в частности, со страничным кэшем, а также исследуем, как доступный объем памяти влияет на производительность буферизованного ввода-вывода (buffered IO).

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

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность