Search
Write a publication
Pull to refresh
0
0
Send message

Нативная рефлексия в C++ уже близко

Level of difficultyMedium
Reading time5 min
Views14K

Почему в 2024 году нам приходится писать каст енума к строке вручную, для каждого кастомного типа нужна своя функция логирования, а биндинги к C++ библиотеке требуют кучу повторяющегося кода?

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

Сегодня рассматриваем пропозалы рефлексии, которые с большОй вероятностью попадут в следующий стандарт - C++26.

Читать далее

Статический и динамический полиморфизм в C++

Level of difficultyEasy
Reading time6 min
Views15K

Привет, Хабр! К сегодняшнему дню написано уже немало учебников и статей по полиморфизму в целом и его воплощения в C++ в частности. Однако, к моему удивлению, при описании полиморфизма никто (или почти никто) не затрагивает тот факт, что помимо динамического полиморфизма в C++ имеется и достаточно мощная возможность использования его младшего брата – полиморфизма статического. Более того, он является одной из основных концепций STL – неотъемлемой части его стандартной библиотеке.

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

Читать далее

Засады многопоточности

Level of difficultyMedium
Reading time8 min
Views9.3K

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

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

Предсказанное сбылось, как говорится, по полной программе. Думаю, что озвученные далее проблемы для кого-то не станут новостью, но будут и те, кто о них не подозревает, как не подозревал и я. А потому захотелось их зафиксировать и поделиться, с чем пришлось столкнуться.  Ну, и рассказать, как я выкрутился, попав в не совсем привычные для меня ситуации (в автоматном программировании, подчеркну, они не возникли бы в принципе).

Итак, создав ранее тест потоков (о нем подробнее см. [1]), гоняя его многократно и в разных режимах, я заметил, что пусть редко, но выскакивают некорректные результаты. В подобных случаях я грешу обычно на себя. А в данном случае тем более, т.к., что там скрывать, имею весьма небольшой опыт использования потоков.

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

Читать далее

Часть пользователей Telegram в опасности

Level of difficultyEasy
Reading time2 min
Views56K

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

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

Но мы решили провести небольшой анализ, чтобы понять, каким образом аккаунт был взломан и пришли вот к чему:

Стандартная процедура входа в telegram:

Читать далее

Изучаем freeware вирус на ПК

Level of difficultyEasy
Reading time3 min
Views8.3K

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

Читать далее

Вечный покой .env: как эффективнее удалять закомиченный файл .env из Git-репозитория

Level of difficultyEasy
Reading time3 min
Views25K

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

Я работаю на VS Code, и я, to be honest, так и не понял, с какой стати .gitignore "не игнорирует" .env. Причем спокойно "игнорирует" другие файлы, директории.

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

Читать далее

Что такое программирование игр и как стать игровым программистом?

Level of difficultyEasy
Reading time8 min
Views18K

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

Читать далее

Два типа рефлексий в C++

Level of difficultyEasy
Reading time6 min
Views10K

Привет, Хабр!

Задумывались ли вы когда-нибудь, что вашему коду стоило бы пройти сеанс психотерапии? В C++ это возможно благодаря такой замечательной штуке, как рефлексия. Она позволяет вашему коду буквально видить в зеркале себя и понимать свои ошибки и достоинства.

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

Рефлексия в C++ бывает двух основных типов: компиляционная и рефлексия времени выполнения. Оба типа имеют свои особенности и применяются в различных сценариях.

Читать далее

10 вредных привычек, которые программисты втайне обожают

Level of difficultyEasy
Reading time7 min
Views35K

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

Читать далее

С++: освобождение ресурсов в деструкторах с использованием вспомогательных функций

Level of difficultyEasy
Reading time7 min
Views8.3K

Про освобождение ресурсов в деструкторах с использованием вспомогательных функции


В этой статье мы рассмотрим, как правильно разрушать объекты в ООП программе на языке C++, не выполняя избыточных операций. Этим мы завершим цикл публикаций, посвящённый обзору ошибок в игровом движке qdEngine.

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

Почему я отказался от разработки игр на Rust, часть 2

Level of difficultyMedium
Reading time16 min
Views11K

Часть 1

Обобщённые системы не приводят к интересному геймплею

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

Это сильный аргумент, на который почти нечем ответить, за исключением того, что обобщённые системы приводят к скучному геймплею. Я был довольно активен в сообществе разработчиков игр на Rust, поэтому видел множество проектов, которые создают другие; разумеется, предлагаемые ими рекомендации коррелируют с теми играми, которые они создают. Люди, которые склонны создавать красиво спроектированные системы, работающие полностью обобщённо, обычно создают не совсем игры, а симуляции того, что со временем станет игрой; в таких симуляциях геймплеем часто считается даже нечто типа «у меня есть персонаж, который может двигаться».

Читать далее

Почему я отказался от разработки игр на Rust, часть 1

Level of difficultyMedium
Reading time19 min
Views34K

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

Пост не будет ни научной оценкой, ни A/B-исследованием. Это моё личное мнение после разработки игр на Rust маленькой инди-командой (два человека) в попытках заработать достаточно денег, чтобы финансировать процесс. Мы не одни из тех разработчиков с бесконечными финансами от инвестора и многолетним запасом времени. Если вы находитесь в этой категории и получаете удовольствие от многолетней разработки систем, то всё написанное ниже к вам не относится. Я рассматриваю всё с такой точки зрения: «Мне хочется создать игру максимум за 3-12 месяцев, чтобы люди могли сыграть в неё, а я — немного заработать». Статья не написана с точки зрения «Я хочу изучить Rust, а разработка игр — это весело», хотя это и вполне нормальная цель; просто она никак не согласуется с тем, чего хотим мы — заниматься разработкой игр коммерчески успешным и самодостаточным образом.

Мы выпустили несколько игр на Rust, Godot, Unity и Unreal Engine, и многие люди сыграли в них в Steam. Мы создали с нуля собственный игровой 2D-движок с простым рендерером, а также в течение нескольких лет использовали Bevy и Macroquad во многих проектах, некоторые из которых были очень нетривиальными. Кроме того, я бэкенд-разработчик на полную ставку и пишу код на Rust. Этот пост — не какое-то поверхностное мнение после изучения нескольких туториалов или разработки небольшой игры для геймджема. За три с лишним года мы написали сильно больше ста тысяч строк кода на Rust.

Задача этого поста — развеять популярные и часто повторяемые аргументы. Но это всё-таки субъективное мнение; по большей части я написал пост, чтобы не объяснять снова и снова одно и то же. Пусть это будет справочный материал о том, почему мы, скорее всего, откажемся от Rust как от инструмента для разработки игр. Мы ни в коем случае не планируем прекращать создавать игры, просто не будем делать это на Rust.

Читать далее

Книга: «C++20 для программистов»

Reading time20 min
Views11K
image Привет, Хаброжители!

Программисты с опытом работы на других языках высокого уровня смогут на практике освоить современный С++ и «большую четверку» его новых возможностей: диапазоны, концепты, модули и корутины.

200+ практических примеров реального исходного кода позволят быстро овладеть идиомами современного С++, используя популярные компиляторы: Visual C++®, GNU® g++, Apple® Xcode® и LLVM®/Clang. Знание базы позволит перейти к контейнерам стандартной библиотеки С++ array и vector; функциональному программированию с диапазонами и представлениями C++20; строкам, файлам и регулярным выражениям; объектно-ориентированному программированию с классами, наследованием, динамическим и статическим полиморфизмом; перегрузке операторов, семантике копирования и перемещения, RAII и умным указателям; исключениям и ожидаемым в С++23 контрактам; контейнерам, итераторам и алгоритмам стандартной библиотеки; шаблонам, концептам С++20 и метапрограммированию; модулям С++ 20 и технологии разработки больших программ; конкурентности, параллелизму, параллельным алгоритмам стандартной библиотеки С++17 и С++20 и корутинам С++20.
Читать дальше →

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

Reading time6 min
Views12K

Привет, Хабр! На связи Виталий Киреев, руководитель R&D SpaceWeb. Это первая часть статьи про веб-безопасность — здесь я расскажу про главные уязвимости Server Side, покажу примеры и объясню, как защищать данные. 

Читать далее

Ответ на «Коротко о том, почему Rust лучше C/C++» или меня не бомбит

Level of difficultyEasy
Reading time11 min
Views36K

Собственно ответка на указанную статью.

Решил ответить на претензии автора. А так же рассказать, почему С\С++ именно такой какой есть. Почему приняты такие решения при его создании и развитии. Указать на явные недостатки Rust'а и его инфраструктуры. Язык не может существовать сам по себе. Он должен иметь не только токсичное сообщество, но и быть нужным работодателю.

Поехали

16-битная операционная система на коленках

Level of difficultyMedium
Reading time15 min
Views21K

В мире компьютерных наук мало что может сравниться с созданием собственной операционной системы. В этой статье мы погрузимся в увлекательный мир разработки операционных систем, создав 16-битную ОС с помощью языка ассемблера NASM под архитектуру процессоров Intel x86-64. Мы рассмотрим каждый этап разработки, начиная с основ и заканчивая реализацией ключевых компонентов.

Заменит Windows?

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

Level of difficultyMedium
Reading time11 min
Views27K
Привет, коллеги! В этой статье я покажу свой подход к написанию многопоточного кода, который помогает избежать типовых ошибок, связанных с использованием базовых примитивов синхронизации.

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

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

Если покупка — это не владение, то пиратство — не воровство

Reading time6 min
Views54K

Двадцать лет назад я ввязался в публичную перепалку (дружескую) с Крисом Андерсоном, работавшим тогда главным редактором Wired. Я публично выразил своё разочарование публикуемыми в Wired радужными обзорами отягощённых DRM цифровых устройств. Андерсон сказал, что я идеалист, если жду, что журнал откажется от обзоров гаджетов из-за DRM:

https://longtail.typepad.com/the_long_tail/2004/12/is_drm_evil.html

Я публично ответил, сказав ему, что он неправильно меня понял. Дело было не в идеологической чистоте, а в добросовестности обзоров. Wired призывал покупать продукт, потому что у него имелись функции x, y и z, но в любой момент в будущем производитель мог отключить любые из этих функций:

https://memex.craphound.com/2004/12/29/cory-responds-to-wired-editor-on-drm/
Читать дальше →

Программирование вне парадигм

Reading time3 min
Views7.4K
Со времени изобретения высокоуровневых языков программирования в отрасли доминируют парадигмы. Именно парадигмы, от императивных до объектно-ориентированных и функциональных – в основном формируют современный дискурс, касающийся языков программирования.
Читать дальше →

Information

Rating
Does not participate
Registered
Activity