Как стать автором
Обновить
766.48

Программирование *

Искусство создания компьютерных программ

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

Опасность устарела: несколько важных нюансов в новых стандартах C++

Время на прочтение16 мин
Количество просмотров114
Undefined behavior (UB) — боль, знакомая каждому разработчику со стажем; эдакий «код Шредингера», когда не знаешь, правильно тот работает или нет. К счастью, стандарты языка С++20/23/26 привнесли относительно неопределенного поведения кое-что новое. И довольно важное, если вы — архитектор ПО, а «плюсы» — ключевой стек вашей компании (подробнее о том, как и почему мы в «Лаборатории Касперского» много используем С++, читайте здесь).

В этой статье я со своих позиций Senior Software Architect и Security Champion в микроядерной операционной системе KasperskyOS рассмотрю кейсы-ловушки, в которые можно попасть практически в любом из стандартов, и покажу, что меняется в С++20/23/26, — уменьшается ли количество кейсов с неопределенным поведением, и становится ли С++ безопаснее.


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

Новости

Spring Boot Starter: практически, принципиально и подробно. Part 2

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

Продолжаю рассказывать о Spring Boot Starter. В прошлой части мы создали принципиальное решение, которое позволит запустить стартер как подключаемую к другому Spring-Boot-приложению библиотеку.

В этой части мы разберемся с зависимостями, стандартными и кастомными аннотациями.

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

Разработка ПО действительно так сложна? Или это мы делаем ее такой?

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

В новом переводе от команды Spring АйО, Siva Katamreddy, девелопер адвокат в AtomicJar (Testcontainers), поделился своими мыслями о популярных в наши дни TDD, Clean, Hexagonal, Onion и Ports & Adapters. Он также постарался ответить на вопрос, который, возможно, волнует не только его: "Действительно ли мы, разработчики, так любим всё усложнять?".

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

Сила кэширования: повышаем производительность API и масштабируемость

Время на прочтение11 мин
Количество просмотров368

В этой статье о том, как использовать кэширование для оптимальной производительности API и веб-приложений. А также подробный обзор на методы кэширования на стороне клиента, на стороне сервера и в CDN для более быстрой и надежной работы.

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

Истории

ИТ Магистратура и разработка. Все очень плохо?

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

Привет, Хабр! Приспичило мне, значит, тут на четвертом десятке стать студентом. Я долго думал, надо ли мне вообще оно, или все же подождать и отпустит, но год уже не отпускает, а именно тогда я впервые начало задумываться об этом.

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

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

Как создать Python-приложение, которое предупредит о приближении астероида

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

Привет, Хабр! В статье я постарался показать, как объединить космос и технологии в одном приложении, которое через API оповестит пользователей по SMS о приближающемся к Земле астероиде. Подробности, как всегда, под катом.

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

Классификация комбинаторных объектов на примере латинских квадратов

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

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

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

Многопоточность JavaScript с SharedArrayBuffer и Atomics: основы

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

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

Чтобы обойти эти ограничения, были введены Web Workers — они позволяют выполнять JS-код в фоновом потоке, параллельно с основным. Однако, все сложилось так, что простой обмен данными между основным потоком и воркерами через postMessage имеет свои ограничения и может быть недостаточно хорошим для некоторых задач.

Здесь помогают SharedArrayBuffer и Atomics.

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

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

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

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

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

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

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

Учимся летать: симуляция эволюции на Rust. 4/5

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



Это предпоследняя часть серии статей по разработке симуляции эволюции с помощью нейронной сети и генетического алгоритма.



В сегодняшнем выпуске:


Сексуальные многоугольники





Сертифицированные ISO диаграммы ASCII


------------
| \...%....|
|   \......|
|    @>....|
|      \...|
|        \.|
------------

Клевые числа




Читать дальше →
Всего голосов 18: ↑18 и ↓0+29
Комментарии1

Контейнер ConditionalBitset — небольшое хранилище для условий выполнения

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

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

В статье все примеры взяты из головы. Все совпадения случаны

Если интересно, прошу в статью
Всего голосов 2: ↑2 и ↓0+3
Комментарии27

Коварные утечки памяти в React: как можно обжечься на useCallback и замыканиях

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

Я работаю в Ramblr, это ИИ-стартап, где мы строим на React сложные приложения для аннотирования видео. Недавно мне попалась сложная утечка памяти, которая возникает при одновременном использовании замыканий JavaScript и хука useCallback в React. Поскольку я вырос на .NET, мне потребовалось немало времени, чтобы разобраться в происходящем. Поэтому я решил написать этот пост и рассказать вам, чему меня научила эта ситуация.
Читать дальше →
Всего голосов 8: ↑8 и ↓0+15
Комментарии10

Универсальный запуск

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

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

Представьте себе исполняемый файл, который без изменений и пересборки самостоятельно запускается на Windows, Linux, FreeBSD и MacOS.

Заинтриговал?

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

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

Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область

Новый микрофронтенд за 20 минут вместо часа: как работает система автоматической сборки

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

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

Чтобы ускорить сборку, разработали систему из шаблона и CLI утилиты. Теперь новый микрофронтенд со всей обвязкой создается за 20 минут. В статье — подробное решение для тех, кто захочет повторить.

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

Type Loopholes: решая нерешаемое. Рефлексия времени компиляции

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

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

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

Узнать, какие параметры принимает конструктор типа.

Узнать, с какими шаблонными параметрами вызывался метод/функция с ADL.

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

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

Lock-free структуры данных в Rust

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

Сегодня поговорим о lock-free (или же без использования блокировок) структурах данных и атомарных операциях в Rust.

Каждый lock может стать узким местом, тормозящим всю систему. Базовые методы синхронизации, типо мьютексов и семафор, частенько (но не всегда) снижают производительность из-за блокировок и контекстных переключений.

lock-free структуры данных позволяют нескольким потокам одновременно читать и изменять данные без блокировок.

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

Создание парсеров на Rust

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

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

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

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

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

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

Взгляд изнутри: как работает ОЦРВ Сириус

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

Всем привет! Это филиал № 11 ООО «ОЦРВ» Сириус. В нашей первой публикации мы хотим познакомиться с ИТ‑сообществом «Хабр». Поэтому немного расскажем о себе, применяемых сквозных цифровых технологиях, реализованных проектах и наших достижениях.

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

Эффективность Spring-приложений в рантайме. Текущее состояние дел и планы на будущее

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

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

Себастьян Делойзе, контрибьютор Spring Framework, делится обзором усилий команды Spring по оптимизации эффективности приложений во время выполнения. Он рассматривает Virtual Threads, GraalVM Native Image, Project CRaC, Project Leyden и всё это в контексте Spring!

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

Как уберечься от кражи репозитория (реподжекинга)

Время на прочтение8 мин
Количество просмотров946

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

Этот тип атаки привлёк мое внимание из-за своего потенциального влияния на программное обеспечение с открытым исходным кодом. В этой статье я объясню, что такое захват репозитория и что можно сделать, чтобы оставаться в безопасности. Говоря вкратце: если вы получаете все свои программные зависимости из менеджера пакетов — например, npm или PyPI, то эта атака не может на вас повлиять. Если вы берёте зависимости напрямую с GitHub, нужно быть более осторожными, но есть простое решение — заблокировать определённый ID коммита. Я поясню, как это сделать, в нескольких наиболее распространённых сценариях.

Читать далее
Всего голосов 10: ↑9 и ↓1+10
Комментарии0
1
23 ...

Вклад авторов