Как стать автором
Обновить
4
0.2
Олег @playermet

Программист

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

Некоторые малоизвестные фичи, фокусы и причуды языка C

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

В этом посте разобраны некоторые фокусы, причуды и фичи языка C (некоторые из них – весьма фундаментальные!), которые, казалось бы, могут сбить с толку даже опытного разработчика. Поэтому я потрудился сделать за вас грязную работу и (в произвольном порядке) собрал некоторые из них в этом посте. Примеры сопровождаются ещё более вольными краткими пояснениями и/или листингами (некоторые из них цитируются).

Конечно же, здесь я не берусь перечислять абсолютно всё, так как факты из разряда «функция nan() не может устанавливать errno, поскольку в определённых ситуациях поведёт себя как strtod()» не слишком интересны.

ВНИМАНИЕ: сам факт попадания тех или иных вещей в эту подборку  не означает автоматически, что я рекомендую или, наоборот, не рекомендую ими пользоваться! Некоторые из приведённых примеров никогда не должны просачиваться за пределы списков наподобие этого, тогда как другие примеры невероятно полезны! Уверен, что могу положиться на ваш здравый смысл, дорогие читатели.

Читать далее
Всего голосов 76: ↑75 и ↓1+94
Комментарии45

Руководство по CMake для разработчиков C++ библиотек

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

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

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

Создаем свою библиотеку на C++ с тестированием, CMake и блекджеком: часть 2

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

В мире программирования создание собственных библиотек — это не просто возможность пополнения своего портфолио или способ структурировать код, а настоящий акт творческого самовыражения (и иногда велосипедостроения). Каждый разработчик иногда использовал в нескольких своих проектах однообразный код, который приходилось каждый раз перемещать. Да и хотя бы как упаковать свои идеи и знания в удобный и доступный формат, которым можно будет поделиться с сообществом.

Если вы ловили себя на мысли: «А почему мне бы не создать свою полноценную библиотеку?», то я рекомендую прочитать вам мою статью.

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

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

Добро пожаловать во вторую, скорее всего финальную часть статьи! Здесь мы окончательно допишем код, исправим некоторые ошибки.

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

Создаем свою простую (C++) библиотеку с документацией, CMake и блекджеком

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

В мире программирования создание собственных библиотек — это не просто возможность пополнения своего портфолио или способ структурировать код, а настоящий акт творческого самовыражения (и иногда велосипедостроения). Каждый разработчик иногда использовал в нескольких своих проектах однообразный код, который приходилось каждый раз перемещать. Да и хотя бы как упаковать свои идеи и знания в удобный и доступный формат, которым можно будет поделиться с сообществом.

Если вы ловили себя на мысли: ‭«А почему мне бы не создать свою полноценную библиотеку?‭», то я рекомендую прочитать вам мою статью.

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

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

Читать далее
Всего голосов 47: ↑46 и ↓1+57
Комментарии68

Профили крыла для полёта без флаттера и загадочные «суперкритические» профили

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

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

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

Также нужно рассмотреть аэродинамику крыла при преодолении  развитого  флаттера при разгоне самолёта к сверхзвуку.

Профиль  крыла для недопущения флаттера

Ранее мы уже выяснили, что уже с конца 1930-х годов  стараниям профессора Келдыша было сформулировано  общее правило для конструирования неподверженных флаттеру самолётов, а именно:

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

Из этого  правила следует следящие неприятные конструктивные следствия:

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

Так если в начале 1930-х у самолётов толщина профиля составляла 15-20% от ширины крыла по хорде, то к 1940-м толщины крыльев истребителей и бомбардировщиков  упали до 8-15%, при этом   максимальные толщины профиля сместились ближе к середине хорды крыла. (см.рис.1-4.)

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

Почему слишком быстрые мыши могут ломать FPS в играх

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

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

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

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

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

Математическая продлёнка. Квадратные уравнения во всей красе

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

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

Каков геометрический смысл решения? Какова вероятность придумать нерешаемое уравнение? Как выглядит пространство уравнений, имеющих целочисленные решения? Куда деваются корни квадратного уравнения, когда оно не имеет действительных решений и откуда берутся комплексные корни? Как выглядят квадратные уравнения "на самом деле"?

Обо всём этом читайте далее
Всего голосов 77: ↑77 и ↓0+77
Комментарии41

10 принципов хорошего левел дизайна

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


Я откопала видео про 10 принципов хорошего левел дизайна с Game Developers Conference аж 2013. Это как 10 принципов дизайна Диттера Рамса, только про игры. Часовое выстуление на английском по ссылке. Мне так понравился этот подход, что я решила сделать конспект на 5-7 минут чтения.

Вот эти 10 принципов, а примеры из игр под катом.

Хороший левел дизайн:

  1. Доставляет удовольствие от навигации;
  2. Не полагается на слова;
  3. Сообщает игроку что делать, но не как;
  4. Постоянно учит чему-то новому;
  5. Удивляет;
  6. Наделяет игрока возможностями;
  7. Позволяет игроку контролировать сложность;
  8. Эффективен;
  9. Создает эмоции;
  10. Основывается на игровых механиках.

Я веду канал в Telegram GameDEVils и блог на Substack . Подписывайтесь, я делюсь там материалами про геймдизайн, разработку и историю игр.
Читать дальше →
Всего голосов 18: ↑16 и ↓2+24
Комментарии25

Всё что нужно знать про ECS

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

Привет, Хабр! В этой статье я расскажу всё, что знаю про Entity-Component-System и попытаюсь развеять различные предубеждения об этом подходе. Здесь вы найдете много слов о преимуществах и недостатках ECS, об особенностях этого подхода, о том как с ним подружиться, о потенциальных граблях, о полезных практиках, а также в отдельном разделе коротко посмотрим на ECS фреймворки для Unity/C#.

Окунуться в мир ECS
Всего голосов 35: ↑34 и ↓1+36
Комментарии24

std::array в С++ не медленнее массива в С

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

Или почему не нужно бояться того, что удобно работает. Узнаем, что по этому поводу пишет стандарт, потом заглянем в реализации std::array в libc++ и libstdc++, затем посмотрим на ассемблер некоторых операций с этими объектами. Завершим всё это дело, как и полагается, бенчмаркингом.

Проверить, так ли это
Всего голосов 39: ↑38 и ↓1+52
Комментарии46

Создание аппаратно-независимых библиотек для микроконтроллеров

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

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

Суть создания аппаратно-независимой библиотеки состоит в том, чтобы отвязаться от того уровня абстракции (библиотеки и фреймворки), который предоставляет производитель микроконтроллеров, внутри реализуемой библиотеки. Например, для STM32 - HAL, ESP32 - ESP-IDF или Arduino, для AVR зачастую используют Arduino. Это позволит использовать одну и ту же библиотеку на различных микроконтроллерах (и не только) без изменения кода библиотеки под каждый камень.

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

Обход блокировок с помощью Double…

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

В статье будут рассмотрены четыре независимых варианта прохождения трафика транзитом с помощью:

1) Double openVPN

2) openVPN + vtun

3) openVPN + tun2proxy через socks5 прокси

4) GOST + openVPN

Читать далее
Всего голосов 35: ↑33 и ↓2+44
Комментарии98

Что значит инициализировать int в C++?

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

Недавно я получил по почте от Сэма Джонсона этот вопрос. Вот слегка отредактированное письмо Сэма:

«Возьмём для примера этот код в локальной области видимости функции:

int a;

a = 5;

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

Однако я убеждён, что инициализация происходит в строке 2, потому что [в разных хороших книгах по C++] инициализация определяется как первое существенное значение, попадающее в переменную.

Можете ли вы сказать, какая строка считается инициализацией?»

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

Но (а вы ведь знали, что будет «но») для локального объекта фундаментального встроенного типа наподобие int ответ будет... чуть более сложным. И именно поэтому Сэм задал этот вопрос, ведь он знает, что язык достаточно свободно обращается с инициализацией таких локальных объектов по историческим причинам, имевшим в то время смысл.

Короткий ответ: вполне допустимо говорить, что переменная получает своё исходное значение в строке 2. Но заметьте, что я намеренно не сказал «Объект инициализируется в строке 2», к тому же и код, и этот ответ обходят молчанием более важный вопрос: «Ну ладно, а что, если код между строками 1 и 2 попробует считать значение объекта?»

Читать далее
Всего голосов 24: ↑22 и ↓2+29
Комментарии106

Простая красота XOR-сжатия чисел с плавающей запятой

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

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

Алгоритм


Алгоритм* прост. Сначала мы записываем первое число с плавающей запятой полностью; для всех последующих чисел выполняется XOR с предыдущим числом, а затем результат кодируется одним из трёх способов.

[*Конкретно эта версия сжатия чисел с плавающей запятой при помощи XOR была впервые описана в «Gorilla: A Fast, Scalable, In-Memory Time Series Database» и часто называется «Gorilla-сжатием».]
Читать дальше →
Всего голосов 23: ↑22 и ↓1+31
Комментарии16

Гипотеза континуума, современное состояние

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

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

Читать далее
Всего голосов 69: ↑66 и ↓3+85
Комментарии109

Человек мухлюющий — читы в гейм-индустрии. Часть 2: Античиты, их проблемы и возможности

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

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

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

Человек мухлюющий — читы в гейм-индустрии. Часть 1: Ландшафт читерства и методы борьбы с читами

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

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

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

Работа с ConstraintLayout через XML-разметку

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

ConstraintLayout


Привет! Меня зовут Гавриил, я Android-лид Touch Instinct.


В марте Google выкатил релизное обновление ConstraintLayout. Презентовали его еще на прошлом Google I/O. С того момента прошел почти год, ConstraintLayout стал лучше, быстрее и оброс новыми возможностями. Например, приятно, что появилась возможность объединения элементов в цепи — это позволяет использовать ConstraintLayout вместо LinearLayout.


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

Читать дальше →
Всего голосов 15: ↑13 и ↓2+11
Комментарии6

Топ 20 ошибок при работе с многопоточностью на С++ и способы избежать их

Время на прочтение21 мин
Количество просмотров79K
Привет, Хабр! Предлагаю вашему вниманию перевод статьи «Top 20 C++ multithreading mistakes and how to avoid them» автора Deb Haldar.


Сцена из фильма «Петля времени» (2012)

Многопоточность— одна из наиболее сложных областей в программировании, особенно в C++. За годы разработки я совершил множество ошибок. К счастью, большинство из них были выявлены на код ревью и тестировании. Тем не менее, некоторые каким-то образом проскакивали на продуктив, и нам приходилось править эксплуатируемые системы, что всегда дорого.

В этой статье я попытался категоризировать все известные мне ошибки с возможными решениями. Если вам известны еще какие-то подводные камни, либо имеете предложения по решению описанных ошибок– пожалуйста, оставляйте свои комментарии под статьей.
Читать дальше →
Всего голосов 62: ↑60 и ↓2+58
Комментарии94

Ещё о красоте в простой формуле

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

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

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

Информация

В рейтинге
2 491-й
Откуда
Украина
Дата рождения
Зарегистрирован
Активность