Обновить
128K+

C++ *

Типизированный язык программирования

261,7
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Как использовать Singleton и не потерять тестируемость

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

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

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

Читать далее

Принципы SOLID, только понятно

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели148K

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

Изучить принципы

Сила шифрования или как я выявил недостаток работы Defender’а

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

Внимание! Статья несёт исключительно информативный характер. Подобные действия преследуются по закону!

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

К сожалению, шифрование часто используется не только в хороших, но и плохих целях...

Читать далее

Кто реально угрожает C++ (нет, Rust, не ты)

Время на прочтение14 мин
Охват и читатели87K

Привет! Меня зовут Александр Каленюк, и я крепко подсел на C++. Пишу на C++ 18 лет кряду, и все эти годы отчаянно пытаюсь избавиться от этой разрушительной зависимости.

Всё началось в конце 2005 года, когда мне довелось писать движок для симуляции 3D-пространства. В этом движке было буквально всё, чем язык C++ мог похвастаться в 2005 году. Трёхзвёздочные указатели, восьмиуровневые зависимости, C-подобные макросы повсюду. Кое-где – вкрапления ассемблера. Итераторы в стиле Степанова и мета-код в стиле Александреску. В общем, всё. Кроме ответа на самый важный вопрос: зачем?

Читать далее

Проверка игрового движка qdEngine, часть первая: топ 10 предупреждений PVS-Studio

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

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

Читать дальше →

Основные принципы разработки (SOLID, KISS и т. д.)

Уровень сложностиПростой
Время на прочтение21 мин
Охват и читатели28K

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

В общем вас ждет теория, ещё теория, словесные примеры и даже примеры кода (он на С++, но написан понятно).

А еще это полезно знать на собесах :-)

Читать далее

Проект «Мультиключ». Как мы побеждали контактные ключи Metacom и Cyfral

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

Как и обещал в предыдущей статье, пишу о нашем опыте работы с контактными ключами Metacom и Cyfral.

Эти ключи построены на микросхемах 1233KT1 и 1233KT2, которые не сильно друг от друга отличаются и имеют очень схожий принцип работы.

При подаче питания ключ просто выдает свой id. При этом никакие команды ключ не принимает и не посылает, а проверка правильности считывания ключа производится путем повторного считывания. Первым, для определения начала передачи, всегда идет стартовое слово. В отличие от ключей Dallas, они работают не по напряжению, а по току. Это менее распространенные и более дорогие ключи. Таким образом, логические уровни определяются сопротивлением ключа (около 400 Ом и 800 Ом). А значение бита определяется длительностью удержания низкого и высокого значения потребления тока.

Разберем эти ключи по отдельности...

Читать далее

Удобное управление тестовыми окружениями в docker-compose

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели7.9K

Всем привет, хочу рассказать о своей утилите dcw (Docker Compose Workspace) для удобного управления тестовыми окружениями на базе docker-compose.

Читать далее

Миллер, Рабин, вектор

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели7.4K

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

У меня давно было желание с ним поиграться, стараясь оптимизировать различными способами. Например, векторизовать и посмотреть, станет ли быстрее.

Читать далее

Каким может быть алгоритмическое собеседование и как к нему подготовиться

Время на прочтение4 мин
Охват и читатели20K

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

Мы попросили Самсонова Ивана рассказать о его критериях оценки кандидатов, а также поделиться советами по подготовке. На видео Иван выступал в роли тимлида, а в обычной жизни он разработчик со степенью в Computer Science и наставник курса «Алгоритмы и структуры данных».

Смотреть и читать

Вы все еще пишете многопоточку на C++ с ошибками синхронизации?

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели29K
Привет, коллеги! В этой статье я покажу свой подход к написанию многопоточного кода, который помогает избежать типовых ошибок, связанных с использованием базовых примитивов синхронизации.

Демонстрация идеи будет проходить на живых примерах кода на современном C++. Большинство описанных решений я применял сначала на собственных проектах, а теперь часть этих подходов уже используется в нашей собственной микроядерной операционной системе «Лаборатории Касперского» (KasperskyOS).

Сразу хочу оговориться, что тема многопоточности — очень большая и серьезная. И эта статья — не полноценный анализ проблем многопоточки, а только частНЫе (но довольно частЫе) кейсы, когда мы вынуждены использовать мьютексы.
Читать дальше →

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

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

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

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

Читать далее

Дерево отрезков

Время на прочтение21 мин
Охват и читатели31K

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

Читать далее

Ближайшие события

Сказание о static и неименованном пространстве имен для функции в C++

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

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

// Все персонажи и события вымышлены, любые совпадения случайны.

Читать далее

Статический анализатор подталкивает писать чистый код

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

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

Читать дальше →

35+ бесплатных ресурсов для начинающих разработчиков С++

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

Привет. Предположим, вы захотели начать изучать языĸ программирования C++ или, возможно, тех материалов, что уже изучили, вам недостаточно.

Я — Савва, программирую уже больше 7 лет, работаю менеджером команды наставников в Практикуме на курсе «Разработчик С++», а с недавнего времени — разработчиком в Positive Technologies. В этой статье мы с вместе с Практикумом собрали леĸции, ĸниги, курсы и всяĸое таĸое, чтобы шансов выстрелить себе в ногу самостоятельно было меньше :) По C++ существуют и другие подборĸи, но, ĸ удивлению, на Хабре их всего две.

Читать далее

Жизнь без линтеров и расчет цены абстракции: материалы для разработчиков на С++

Время на прочтение2 мин
Охват и читатели5.7K

В марте мы собирались на митапе по С++ в Санкт-Петербурге. Для всех, кто не смог присоединиться к встрече, подготовили записи докладов и дискуссии с экспертами из YADRO, VK и Kaspersky, а также создателем Sphinx Андреем Аксёновым. Почему стоит сохранить подборку в закладки:

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

• Эксперт из PVS-Studio покажет, почему линтеры не всегда подходят для поиска ошибок и какое решение использовать вместо них, чтобы не навредить безопасности сервиса.

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

Читать далее

Теоретическая и реальная производительность Intel AMX

Уровень сложностиСложный
Время на прочтение11 мин
Охват и читатели8.4K

AMX (Advanced Matrix Extension) - это модуль аппаратного ускорения умножения матриц, который появился в серверных процессорах Intel Xeon Scalable, начиная с 4 поколения (архитектура Sapphire Rapids). 

В начале этого года ко мне в руки наконец попал сервер, с данным типом процессора.

Конкретно модель Xeon(R) Gold 5412U - это 24 ядерный процессор с тактовой частотой в 2.1 GHz. При этом 8 приоритетных ядер могут разгонятся до 2.3 GHz, а 1 ядро до 3.9 GHz в Turbo Boost). Кроме того данный процессор поддерживает 8 канальную DDR-5 4400 MT/s. 

Мне как человеку, достаточно долгое время посвятившему оптимизации алгоритмов компьютерного зрения и запуска нейронный сетей на CPU (библиотеки Simd и Synet), было интересно: на сколько AMX позволяет реально ускорить вычисления и как извлечь из него максимальную производительность.

Далее я постараюсь максимально подробно ответить на данные вопросы. Прежде все я буду касаться вопросов однопоточной производительности (многопоточную рассмотрю позже). 

Далее много кода на С++...

И полгода не прошло: релиз Qt 6.7 и Qt Creator 13. Что нового и что изменилось?

Время на прочтение4 мин
Охват и читатели9.3K

В этом месяце много релизов, хороших и разных. Так, на днях компания Qt Company опубликовала релиз фреймворка Qt 6.7. Разработчики придерживаются прежней стратегии как по стабилизации работы, так и по увеличению функций ветки Qt 6. Поддерживается много платформ, включая Windows 10+, macOS 12+, Linux (Ubuntu 22.04, openSUSE 15.5, SUSE 15 SP5, RHEL 8.8/9.2, Debian 11.6), iOS 16+, Android 8+ (API 23+), webOS, WebAssembly, INTEGRITY, VxWorks, FreeRTOS и QNX. Подробности — под катом.

Читать далее

Эффект Монреаля: почему языкам программирования нужен Царь стилей

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели11K

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

Пусть это будет мысленный эксперимент. Подыграйте мне. Если вы читали мою прошлую статью (англ.), то должны правильно предположить, что я бы предпочёл экспрессивный язык, ориентированный на профессионалов. Так и есть. Но в гибком языке программирования есть серьёзная проблема с масштабированием – слишком много стилей оформления кода и способов его написания. В итоге просто не обойтись без руководств по стилю, которые помогут сориентироваться в правильной реализации.

Какое подмножество C++ или Kotlin вы используете? Что вы предпочтёте: project.toml или requirements.txt? Теперь у вашего языка есть возможность поэтапной типизации с помощью аннотаций типов. Хотите ей воспользоваться? Как вы реализуете конкурентность: с помощью многопоточности, Tokio или std::async?

Чем более экспрессивный язык, тем сложнее всё становится. И здесь на сцену выходит Go. И речь не только о gofmt, но и о его стандартной библиотеке и согласованности. В Kotlin вам приходится гадать, что лучше использовать для ошибок: исключения или объекты Result? В случае же Go вам всё ясно – ищем err. Да, это многословно, но зато предсказуемо.

Экспрессивные языки прекрасны, но часто создают путаницу. Вы можете использовать богатый и комплексный язык, поддерживающий миллион способов реализации одного и того же. Именно это я хочу вам показать. Как же сохранить всю эту мощь, но уменьшить беспорядок? Как избежать возникновения 500 поддиалектов? Но прежде, чем переходить к решениям, обсудим Scala.
Читать дальше →