Обновить
4
0.1
Сергей@gres_84

C++ Developer

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

CMake и C++ — братья навек

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

Дружба навек


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


Многие ругают CMake, и часто заслуженно, но если разобраться, то не всё так плохо, а в последнее время очень даже неплохо, и направление развития вполне позитивное.


В данной заметке я хочу рассказать, как достаточно просто организовать заголовочную библиотеку на языке C++ в системе CMake, чтобы получить следующую функциональность:


  1. Сборку;
  2. Автозапуск тестов;
  3. Замер покрытия кода;
  4. Установку;
  5. Автодокументирование;
  6. Генерацию онлайн-песочницы;
  7. Статический анализ.

Кто и так разбирается в плюсах и си-мейке может просто скачать шаблон проекта и начать им пользоваться.
Читать дальше →

Продвинутое использование препроцессора в C и C++

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

Зачастую, в проектах ограничивается использование препроцессора по следующим причинам:

— Он не похож на весь остальной язык;
— Макросы могут возвращать неполные синтаксические конструкции, или вовсе различные, в зависимости от параметров.

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

Со всеми его недостатками, инструмент есть в языке и достоин изучения.

Читать далее

Исчисление геометрии 3. Проективная внешняя алгебра

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

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

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

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

На картинке для привлечения внимания вращается четырёхмерная сфера, построенная средствами внешней алгебры.

Читать далее

Как выбрать оффер? Задача о разборчивой невесте и правило 37%

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

В течение месяца вы проходите собеседования, получаете офферы — и хотите выбрать лучший. Но каждый оффер живёт недолго: если не согласитесь вовремя, к нему уже не вернуться. Как действовать, чтобы выбрать самый лучший?


Это версия классической задачи о разборчивой невесте. У неё есть красивая оптимальная стратегия — правило 37\%. Возможно, вы о нём слышали. Но знаете ли вы, почему оно работает? И как вообще до него додуматься?


Часто алгоритмы — это эвристики, без гарантии оптимальности. Но в этой задаче всё иначе. Мы шаг за шагом переоткроем правило  37 \% и докажем, что он действительно лучший

Недавно я узнал о Теореме о Шансах — более общем подходе, который, неожиданно, работает гораздо проще, чем классическое доказательство. По-русски о ней еще никто не писал

В статье мы разберём эту теорему, выведем правило 37\% и увидим, как в задаче естественно появляется число e — и какой у него смысл на самом деле

Эта задача стоит того, чтобы пройти её до конца. Будет понятно, красиво и интересно

К правилу 37%

Полный гид по 50 идеям, которые формируют современное мышление: от А до Я

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

Привет, Хабр! Представьте, что ваш мозг — это IDE, в которой 95% крутых плагинов попросту спят. Мы часто слышим об «Антихрупкости» или «FOMO», но сейчас этого стало настолько много, что я решил аггрегировать всё в одну статью, с примерами, чтобы всем было понятно.

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

Читать далее

Любителям x86-64 assembler посвящается: DIY волокна в C++

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

Нас ждёт мозговыносящая смесь 64/32-битного ассемблера и старого-доброго C++. Мы сделаем собственную реализацию... Волокон (fibers) без вызова Win API и звонков в службу спасения.

Читать далее

Реализм против платонизма. Неполнота Гёделя, неразрешимость Тьюринга и физические основания математики

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

Многие интеллектуалы склонны называть математику «царицей наук» и преподносить её теоремы как абсолютную истину, полученную чисто логическим дедуктивным выводом безотносительно физической реальности, не опираясь на эмпирические данные. Якобы математические объекты существуют вне пространства-времени, в разуме Бога или в платоновском мире идей, а мы лишь открываем вечные истины: числа и арифметические операции, геометрические фигуры, аксиомы и теоремы, а также правила вывода и доказательства истинности или ложности любых математических утверждений. Говорят, наше сознание имеет прямой доступ к этому миру математических абстракций посредством интуиции – не иначе, как божественного откровения или снисхождения самой истины, открывающейся только тем, кто её достоин.

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

Читать далее

Биполярный транзистор. Принцип работы

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

Есть множество материалов написанных о работе полупроводников и работе транзисторов.

Зачем еще одна?

Дело в том, что я заметил такую тенденцию в вузовских учебниках – довольно подробное описание работы p-n перехода и очень поверхностное описание работы биполярного транзистора. Зачастую «механика» работы такого транзистора описывается довольно схематично (в совершенно неработоспособном виде) и далее следует быстрый переход на описание внешних параметров. Причем у этих же авторов описание «механики» работы полевого транзистора дается куда обширнее. Видимо, авторы учебников сами не очень «догоняют», как там все работает. И это не удивительно. Человечество вначале эры полупроводников пыталось повторить схему работы вакуумной лампы на полупроводниках, т.к. работа лампы достаточно логична. И собственно полевые транзисторы, в какой-то степени повторяют принцип работы вакуумных ламп. Но вот биполярный транзистор, хотя и был изобретен первым, но это было скорее случайное изобретение, а не осознанный путь к цели.

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

Если Вы задавали себе вопросы наподобие таких:

почему через коллекторный p-n переход, включенный в обратном направлении, течет ток, да еще и самый, что не на есть главный рабочий ток?

почему неосновные носители тока базы в биполярном транзисторе, вдруг стали вполне себе главными представителями тока?

Почему ток в базы через открытый эмиттерный p-n переход меньше тока через закрый коллекторный p-n переход?

Ну и совсем «подковыристый» вопрос. Почему при включении биполярного транзистора по схеме с общим эмиттером, когда транзистор полностью открыт (находится в режиме насыщения), напряжение на коллекторе становиться меньше напряжения базы? Ведь если смотреть на транзистор с точки зрения пирога n-p-n переходов (как рисуют в учебниках), то сумма падения напряжения на двух p-n переходах (открытом эмиттерном и закрытом коллекторном) должно быть больше напряжения на одном открытом эмиттерном переходе. А оно у нас меньше.

Ответы на эти вопросы под катом

Отсутствие оснований и аксиома Бога

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

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

Читать далее

Embedded Linux для начинающих — Часть 1

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

Однажды по работе мне прилетела задача по сборке и запуску Linux на одноплатном ПК. Тогда я, будучи разработчиком ПО для микроконтроллеров, встал в небольшой ступор — задачка явно не решалась установкой IDE и нажатием в ней кнопки «Собрать проект». Гугл помог узнать о том, что существует некий Buildroot. В материалах по теме всё выглядело довольно просто: скачай, настрой, дерни пару команд, загрузи результат на одноплатник — и можно запускать! Получается, процесс не многим сложнее установки дистрибутива Linux или Windows на обычный ПК? Конечно же, нет. Ведь если у тебя в руках кастомный одноплатник неизвестного китайского бренда, а не BeagleBone или Raspberry Pi, то зарыться в Buildroot придётся с головой...

Читать далее

Жребий брошен: оптимальная генерация распределений и алгоритм Кнута-Яо

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

Задача
Три айтишника — Маша, Вася и Петя — пошли в поход. После ужина они решают, кто будет мыть посуду. Петя дежурит один, а Маша с Васей — вдвоём. Значит, нужно выбрать Петю с вероятностью ⅓, а Машу с Васей — с вероятностью ⅔. Под рукой — только честная монетка. Как с её помощью устроить такой жребий?

Когда мы обсуждали эту задачу со студентами, они предложили такой способ. Бросим монету дважды: если выпали два орла — дежурит Петя; если один орёл и одна решка — Маша с Васей; если две решки — перебрасываем

Чтобы выбрать дежурного так, в среднем уходит 8⁄3 броска (чуть позже мы это докажем). Можно ли сделать это быстрее? Существует ли алгоритм, для которого ожидаемое число бросков меньше?

Оказывается, можно придумать простой, но неочевидный метод, позволяющий смоделировать событие с вероятностью ⅓ — и в среднем требует не больше двух бросков. Он называется алгоритмом Кнута–Яо

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

В финале мы обобщим эту идею: научимся моделировать любую вероятность p от 0 до 1 — и любое дискретное распределение. Заодно познакомимся с важным понятием, называемым энтропией

А в самом конце, как всегда — красивая задача

Читать далее

Встреча ISO C++ в Софии: С++26 и рефлексия

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

Привет! На связи Антон Полухин из Техплатформы Городских сервисов Яндекса, и сейчас я расскажу о софийской встрече Международного комитета по стандартизации языка программирования C++, в которой принимал активное участие. Это была последняя встреча, на которой новые фичи языка, с предодобренным на прошлых встречах дизайном, ещё могли попасть в C++26.


И результат превзошёл все ожидания:


  • compile-time-рефлексия
  • рефлексия параметров функций
  • аннотации
  • `std::optional<T&‍>`
  • параллельные алгоритмы
Об этих и других новинках расскажу в посте

Преобразование JSON в объекты C++ на этапе компиляции: демонстрация возможностей принятой в C++26 рефлексии

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

На прошлой неделе в Софии, столице Болгарии, закончилась работа над стандартом C++26, который помимо контрактов, std::execution и всего прочего теперь включает и рефлексию.

В этой статье будет продемонстрирован один из примеров её использования: преобразование строк в формате JSON в объекты C++ на этапе компиляции.

Читать далее

Исчисление геометрии Часть 2. Внутри внешней алгебры

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

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

В этой части мы рассмотрим алгебры Грассмана или внешние алгебры с несколькими «корнями из нуля», то есть ненулевыми элементами, обращающимися в ноль при возведении в квадрат. Однородные элементы внешней алгебры — мультивекторы или k-векторы, имеют геометрическую интерпретацию, которая позволяет рассматривать их как модели линейных пространств. Так строится афинная геометрическая алгебра с операциями пересечения и соединения. Мы рассмотрим двойственные алгебры и порассуждаем над ориентацией и мерой подпространств, соответствующих мультивекторам. Изучим свойства внешнего произведения и его геометрическую интерпретацию, коснёмся принципа двойственности и введём новые операции: два дополнения и регрессивное произведение.

Читать далее

Исчисление геометрии Часть 1. Алгебры Клиффорда

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

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

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

Читать далее

Плоские контейнеры в C++23

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

Новый стандарт C++, C++23, впервые с C++11 расширил всем привычную линейку контейнеров: помимо знакомых array, vector, (unordered_)set, (unordered_)map и прочим в нее теперь входят непонятные flat_set, flat_map, flat_multiset и flat_multimap. Ответим на вопросы, что это за контейнеры, когда они могут быть полезны, сравним дизайн стандартизированных «плоских» контейнеров с дизайном плоских контейнеров из Boost и ETL и, конечно, произведём замеры и сравним производительность flat_ и не flat_ контейнеров.

Читать далее

Проблема тонкой настройки Вселенной и её решения: разумный замысел или мультивселенная?

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

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

Читать далее

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

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

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

follow the white rabbit

Детальный обзор полей Галуа

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

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

Этими словами заканчивалось письмо Эвариста Галуа, написанное для своего друга Огюста Шевалье за два дня до его смерти от полученных на дуэли ран на 21 году жизни. Ни Якоби, ни Гаусс в его теоремах не разобрались, зато спустя 15 лет разобрался Жозеф Лиувилль и опубликовал работы Галуа, ставшие впоследствии фундаментом современной алгебры, известные сейчас как теория Галуа. В статье расскажу про одну из частей этой теории - поля Галуа, получившая настолько повсеместное применение в криптографии и избыточном кодировании, что Intel и AMD выпустили набор процессорных расширений для эффективной реализации операций над этими полями.

Заметка! Если вам довелось использовать/реализовывать поля Галуа, то большая часть статьи для вас скорее всего будет не интересна, но возможно в последних разделах будет что-то для вас новое.

Читать далее

Лаконичный макрос defer для C++17

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

Ручное управление ресурсами в низкоуровневом си-подобном коде на C++ — довольно хлопотное занятие. Создание достойных RAII-врапперов для каждого используемого сишного API не всегда практично, а использование подходов с goto cleanup или множеством вложенных if (success) вредит читаемости кода.

Макрос defer как никогда кстати! Отложенная лямбда будет выполнена при выходе из области видимости, независимо от того, будет ли выполнен return, брошено исключение, или даже выполнен goto наружу. Данный макрос по-настоящему zero-cost и не зависит от рантайма C или стандартной библиотеки, поэтому его можно использовать даже в разработке под ядро ОС.

Читать далее

Информация

В рейтинге
3 209-й
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность