
Доброго времени суток.
В качестве первой статьи решил выбрать разбор реализации отечественного шифра «кузнечик». Постараюсь объяснить сложные вещи простым языком.
В качестве рабочего примера моя реализация на C.
Типизированный язык программирования
Доброго времени суток.
В качестве первой статьи решил выбрать разбор реализации отечественного шифра «кузнечик». Постараюсь объяснить сложные вещи простым языком.
В качестве рабочего примера моя реализация на C.
Одно время на прогулках по блошиным рынкам я увлеченно высматривал винтажные музыкальные инструменты, особенно синтезаторы 70x-80x годов. Я нахожу их звуки очень красочными и разнообразными, а так же эти устройства интересны с точки зрения схемотехники.
И вот однажды по счастливой случайности и благодаря алгоритму поиска на основе AI на одном из самых популярных интернет-сервисов для купли-продажи подержанных вещей, который предложил мне объявление по моим интересам.
И это оказалась не «пиликалка» с пластиковым звуком и не кондовый электроорган, - а очень даже продвинутый для середины 80ых и актуальный по сей день аналоговый полифонический синтезатор с цифровым управлением, выпущенный компанией Roland.
После приобретения музыкальный инструмент не подавал ни каких признаков жизни кроме подсветки дисплея. Вскрытие и сверка со схемой из документации показали то, что хоть разработчики и использовали Poka Yoke для предотвращения неправильного подключения межплатных кабелей, но или не досмотрели или ассортимента не хватило и установили на главной плате два разъёма с одинаковым количеством контактов и невнимательный настройщик который обслуживал синтезатор перепутал местами те единственные два кабеля в которых можно было ошибиться. В таком вот состоянии инструмент мне и достался. Уcтранив ошибку сначала я очень обрадовался, - основные функции заработали, но к сожалению вышли из строя два входа микросхемы IC7 “Gate Array“, которая выполняет роль IO интерфейса для CPU, в частности для функций клавиатуры. Из Рис. 1 и Рис. 3-4 видно как происходит обработка нажатия клавиш.
Недавняя публикация о векторном расширении RISC-V архитектуры, подтолкнула меня к мысли написать небольшую заметку об использовании данного расширения в задаче, имеющей практическое применение. После появления векторного расширения, в сети начали публиковаться статьи о применении RISC-V ядер с данным расширением в задачах, ранее в которых безальтернативно использовались только процессоры ЦОС. В данной статье рассматривается тест, в котором используется алгоритм декодирования Витерби - задача, требующая значительных вычислительных ресурсов.
Личный взгляд программиста с стажем на то, как Microsoft переманил Хейлсберга, создал .NET и вытеснил Delphi с технологической сцены. История предательства, перехода эпох и чемодана, который до сих пор скрипит в углу.
При линковке приложения с двумя статическими библиотеками, в которых определён один и тот же символ, возникает классическая и потенциально фатальная проблема — двойное определение символа. Вроде бы всё просто: multiple definition
— ошибка, надо переименовать. Но не тут-то было.
Разберёмся, как устроен линковщик, почему конфликты могут не проявляться сразу, и как на проде всё может пойти не так. Ну и конечно, как эту проблему исправить, не трогая архитектуру проекта.
Перевод статьи с небольшими правками для ESP-IDF 4.4.5.
В этом руководстве показано, как настроить soft-AP с использованием модуля Espressif и ESP-IDF. Оно охватывает процесс создания проекта, настройки Wi-Fi и обработки событий подключения с помощью event loop и логирования.
В любом Wi-Fi-приложении первым шагом является установление соединения между устройством и маршрутизатором. В терминологии Wi-Fi устройство называется станцией (STA), а маршрутизатор — точкой доступа (AP). В большинстве случаев модуль Espressif работает как станция, подключаясь к существующему маршрутизатору. Однако перед этим пользователь должен пройти процесс provisioning — то есть ввести SSID и пароль маршрутизатора.
Существует несколько способов provisioning, но наиболее распространённые — это через Bluetooth и Wi-Fi. При использовании Wi-Fi процесс обычно выглядит следующим образом:
Python... язык программирования, не нуждающийся в особом представлении. За удобство в обработке "больших данных" заслуженно получил звание "лучшего Excel". За удобство интеграции в C и C++ код его любит геймдев. А также у него низкий порог вхождения!
Встречайте suex и sush – su и sudo в новом формате.
Эти современные решения, написанные на чистом C, появились как упрощенные альтернативы для тех, кто считает традиционные su
и sudo
чрезмерно сложными.
Понадобился специфичный вариант "сигнализации в машину". Можно было использовать сочетания покупного иммобилайзера и GPS трекера (делал так). Но, захотелось сделать свое, адаптированное под мои хотелки. Делал исходя из "а почему бы и нет". Однако, с практическим применением (поставил в машину).
Все что хотел из функциональности - сделал.
Хотел бы поделится опытом не очевидных проблем "на пути".
Дана функция чтения и записи EEPROM dword.
Запись и стирание возможно только по выровненному адресу и пословно.
Надо поверх EEPROM API сделать функцию чтения, записи и стирания для произвольных массивов байт, по произвольному адресу (NVRAM).
Простыми словами надо состыковать Dword API с Byte API.
В этом тексте я представил простой наивный алгоритм решения данной задачи.
Мне часто задают такой вопрос: как мы пишем на C код для curl, чтобы он был безопасным и надёжным в миллиардах установок? Мы предпринимаем определённые меры и принимаем решения. «Серебряной пули» нет, есть только рекомендации. Как вы убедитесь сами из этой статьи, в них тоже нет ничего странного или неожиданного.
«c» в слове «curl» не обозначает и никогда не обозначало язык программирования C, это расшифровывается как client.
Предупреждение
Этим текстом мы ни в коем случае не хотим сказать, что иногда случайно не мерджим баги, вредящие безопасности. Это происходит. Мы люди, мы совершаем ошибки. А потом мы их устраняем.
Недавно МЦСТ опубликовала кросскомпилятор для «Эльбрус». Это большой шаг в развитии платформы. Теперь любой человек может собрать программу под е2к на своем домашнем компьютере.
В этой статье вас ждет инструкция по ручному развертыванию всего окружения для разработки под е2к, скрипт для автоматического развертывания, а также Docker-контейнер с готовым окружением. Благодаря контейнеру процесс развертывания упрощается до вызова одной команды, а также он позволяет работать даже на Windows.
Если вы хотели попробовать собрать свой код или какой-нибудь другой код под «Эльбрус», то сейчас самое время.
В биографии Эдуарда Лимонова — писателя, диссидента и политика — есть неожиданный эпизод: в конце 1970-х годов, во время жизни в США, он подрабатывал в IT-сфере и, по некоторым данным, участвовал в разработке ранних версий языка C.
Проверяя код проекта TDengine с помощью PVS-Studio, можно встретить код с запахом, канонические ошибки и опечатки. Многое из этого можно избежать, если изначально аккуратно оформлять код, делать логику простой и избегать макросов. Давайте рассмотрим некоторые фрагменты кода и подумаем, как можно провести его рефакторинг так, чтобы багам просто не было там места.
В этот раз поговорим про написание кода методом Copy-Paste. С одной стороны, программисты знают, что копирование кода с последующей его модификацией провоцирует ошибки и опечатки. С другой — набирать каждый раз фрагмент кода, похожий на уже написанный, скучно и непродуктивно. Здесь важно соблюдать некий баланс, который сложно сформулировать и понимание которого приходит с опытом.
Игра Rogue знаменита не только тем что породила и вдохновила огромное количество "потомков" - от визуально схожих Moria и NetHack до графически продвинутых вроде DIablo. Знаменита она ещё и тем что является одной из самых сложных игр для прохождения (в этом классе она гораздо интеллектуальнее чем Flappy Bird). Не уверен что вы найдете даже по форумам человека который скажет что проходил её (не читеря с файлами сохранения). А может такие есть среди вас?
Я заметил что современная опенсорсная версия (например доступная в пакетах для разных Linux и BSD) отличается от той, например, что была портирована коммерчески под ДОС где-то в 80е. Заметно отличаются монстры - чуть ли не со 2 уровня уже можно напороться на Ледяного Монстра который не только лишает подвижности но ещё и активно дамажит. Как будто и без того сложная игра стала ещё сложнее!
Дело в том что ранний код Rogue изначально не был доступен публично - кроме того авторы опенсорсной версии хотели избежать возможных нарушений прав (т.к. существовали уже коммерческие порты).
Чтобы разобраться я решил скомпилировать и запустить одну из самых старых доступных версий - посмотреть отличия - и вообще как что устроено. Здесь я расскажу о возникших мелких проблемах (любопытно м.б. для программистов на С) - и возможностях этой самой оживлённой версии (её я выложил на гитхаб - каждый может взять и погонять).
Рано или поздно любому разработчику на С-подобном языке приходит в голову идея использовать двумерный массив как одномерный. Причины для этого всегда разные, а вот результат чаще всего один. В этой небольшой заметке разберём эту сомнительную технику и какие проблемы она может привнести в вашу программу.
В этом HowTo мы рассмотрим подготовку пакетов vcpkg
для использования в двоичном виде.
В качестве "подопытных кроликов" будут выступать Qt6
, QCustomPlot
и я.
Spoiler: с QCustomPlot
придется немного пострадать, но обычно все проще.
TLDR: vcpkg export
Ведущий инженер-разработчик Postgres Professional Николай Шаплов столкнулся с неожиданной проблемой при тестировании: коллизии хэшей в clang ломали метрики покрытия. Расскажем, как удалось решить эту задачу и что это меняет для всего сообщества.
Шёл 2025 год, а я задался вопросом: «Не пора ли нашей команде выбрать стандарт языка Си, на котором будет вестись основная часть разработки?» С одной стороны кажется, что этот вопрос давно должен быть решён, стандарт языка указан в code style, конечно, после «холиваров», череды обсуждений, обид, проклятий и прочих маленьких трагедий. А если нет? А если нет, то так ли это важно? Что там нового может быть в языке Си? Стоит ли этот вопрос вообще того, чтобы тратить время? В этой заметке поделюсь с уважаемым читателем тем интересным, что я узнал и вспомнил во время неспешного исследования этого вопроса, относительно холодными и тёмными вечерами.
Первая часть: Ethernet, ARP, IPv4 и ICMPv4
Пока наш стек TCP/IP пользовательского пространства содержит минимальные реализации Ethernet и IPv4. Настало время заняться пугающим Transmission Control Protocol (TCP).
TCP, работающий на четвёртом (транспортном) сетевом слое OSI1, отвечает за починку ошибочных подключений и сбоев в доставке пакетов. TCP — «рабочая лошадка» Интернета, обеспечивающая надёжную связь практически во всех компьютерных сетях.
TCP — не особо новый протокол, первая его спецификация вышла в 1974 году2. С тех пор многое поменялось, TCP дополнился множеством расширений и исправлений3.
В этом посте мы изучим базовую теорию TCP, а также рассмотрим заголовок TCP и поговорим об установке соединения (TCP handshaking). Под конец мы продемонстрируем первую функциональность TCP в нашем сетевом стеке.