Казалось бы, Chromium был рассмотрен нами неоднократно. Внимательный читатель задастся логичным вопросом: «Зачем нужна еще одна проверка? Разве было недостаточно?». Бесспорно, код Chromium отличается чистотой, в чем мы убеждались каждый раз при проверке, однако ошибки неизбежно продолжают выявляться. Повторные проверки хорошо демонстрируют, что чем чаще будет применяться статический анализ, тем лучше. Хорошо, если проект проверяется каждый день. Ещё лучше, если анализатор используется программистами непосредственно при работе (автоматический анализ изменённого кода).
Читать полностью »
Рубрика «c++» - 140
Идем на рекорд: пятая проверка Chromium
2016-10-26 в 13:04, admin, рубрики: c++, chromium, code review, Google Chrome, open source, pvs-studio, Блог компании PVS-Studio, качество кода, обзоры кода, ошибки в коде, статический анализ кодаРеализация Undo-Redo модели для сложного документа
2016-10-26 в 10:47, admin, рубрики: c++, UndoRedo, ПрограммированиеПривет! В данной статье я хочу показать, как можно организовать модель редактирование документа со сложной структурой с возможностью отмены/возврата действий.
Предыстория и проблематика
Все началось с того, что я писал узкоспециализированный outline-софт, где основная идея заключается в оперировании кучей виртуальных бумажных карточек на разных сценах в разных редакторах.
Получилось похоже на MS Visio с определенной степенью кастомизации и плагинизации. Никаких технических сложностей здесь нету, однако есть ряд особенностей.
Во-первых, сцен несколько. А значит и оконных редакторов нужно несколько, каждый из которых работает по своим правилам.
Во-вторых, т.к. набор карточек один, а одна и та же карточка может быть использована в разных местах, то это рождает определенные зависимости между разными частями документа. И, если карточка удаляется, то это влечет за собой устранение этой карточки из всех мест, где она задействована.
В-третьих, когда я сделал все, что хотел, и показал результаты другу (который даже не программист), то он потыкал и сказал, что неплохо бы сделать Ctrl+Z. Я загорелся идеей, но вот реализовать это оказалось не такой тривиальной задачей. В этой статье я опишу, к чему пришел в итоге.
В предыдущей статье про декларативный JSON-сериализатор я рассказал, как с помощью шаблонов C++ можно описывать структуры данных и сериализовать их. Это очень удобно, т.к. не только сокращает размер кода, но и минимизирует количество возможных ошибок.Концепция — если код компилируется, то он работает. Примерно такой же подход применен и в wjrpc, о которой речь пойдет в этой статье. Но поскольку wjrpc “выдран” из фреймворка, под интерфейсы которого он был разработан, я также затрону вопросы архитектуры и асинхронных интерфейсов.
Deep Learning: Сравнение фреймворков для символьного глубокого обучения
2016-10-25 в 7:10, admin, рубрики: android, AWS, c++, caffe, deep learning, framework, iOS, javascript, Julia, machine learning, Matlab, microsoft, mxnet, OS X, python, R, scala, TensorFlow, theano, Ubuntu, windows, Алгоритмы, Блог компании Microsoft, глубокое обучение, машинное обучение, нейронные сети, рекуррентная нейронная сеть, рекуррентная нейросеть, свёрточная нейросеть, фрейморкПредставляем вам перевод серии статей посвященных глубокому обучению. В первой части описан выбор фреймворка с отрытым кодом для символьного глубокого обучения, между MXNET, TensorFlow, Theano. Автор подробно сравнивает преимущества и недостатки каждого из них. В следующих частях вы узнаете о тонкой настройке глубоких сверточных сетей, а также о сочетании глубокой сверточной нейронной сети с рекуррентной нейронной сетью.
PVS-Studio для Linux
2016-10-25 в 6:12, admin, рубрики: C, c++, developer tools, pvs-studio, PVS-Studio for Linux, PVS-Studio для Linux, static code analysis, Блог компании PVS-Studio, инструменты разработчика, Разработка под Linux, разработка под windows, Си, статический анализ кодаСвершилось! Сегодня мы выпустили публичную версию анализатора PVS-Studio для Linux. Теперь разработчики Linux приложений получат новое мощное оружие для борьбы с багами в коде. Призываем разнести эту новость по миру. Расскажите своим коллегам по работе, напишите в Twitter и Facebook! Да будут программы надёжней и стабильней!
Читать полностью »
Персона. Создатель С++ Бьярне Страуструп, который «никогда не любил» языки программирования
2016-10-24 в 13:30, admin, рубрики: c++, биография, бьярне страуструп, история успеха, Карьера в IT-индустрии, персона, программирование как искусство, разработка по, управление разработкой, Управление сообществом
У создателя С++ было очень мало шансов «выйти в люди»: бедная семья, худшая школа в городе, отсутствие якро выраженных склонностей к чему-либо. Он даже не был «гениален».
Это человек, которого можно назвать self-made. Его главной целью было добиться настоящего успеха в чем бы то ни было.
Возможно, всем нам повезло, что его «занесло» в программирование. Потому что сейчас очень трудно представить современную ИТ-индустрию без наследия С++.Читать полностью »
Элементы функционального программирования в C++: частичное применение
2016-10-24 в 9:31, admin, рубрики: c++, c++17, Программирование, Проектирование и рефакторинг, простые решения сложных проблем, функциональное программирование, частичное применениеНе буду сильно углубляться в теорию. Что такое частичное применение легко найти в интернете. В том числе на Википедии.
Если кратко, то это механизм, возволяющий зафиксировать k
аргументов функции от n
аргументов, сделав из неё функцию от (n - k)
аргументов.
// Пусть имеется функция f от четырёх аргументов:
int f (int a, int b, int c, int d)
{
return a + b + c + d;
}
// Фиксируем первые два аргумента:
auto g = part(f, 1, 2); // 1 + 2 + ...
// Добрасываем оставшиеся два:
assert(g(3, 4) == 10); // ... + 3 + 4 = 10
На эту тему уже существует масса публикаций, в том числе и на Хабре:
- C++ Variadic templates. Каррирование и частичное применение
- Частичное применение и каррирование в C++
- Каррируем на C++
А ветка "How should I make function curry?" на stackoverflow — просто кладезь для тех, кто впервые сталкивается с этой темой.
К сожалению, количество пока не переросло в качество, и хорошего, пригодного к использованию варианта я так и не увидел.
При этом любопытно вот что.
Замечательный факт №1. В упомянутых статьях присутствуют все техники, которые нужны для реализации правильного (по моему мнению) частичного применения.
Надо только всё внимательно проанализировать и сложить кубики в правильном порядке.
Именно этим я и собираюсь заняться в данной статье.
learnopengl. Урок 1.5 — Shaders
2016-10-23 в 9:28, admin, рубрики: c++, glfw, OpenGL, opengl 3, ПрограммированиеШейдеры
Мы уже упоминали шейдеры в предыдущем уроке. Шейдеры — это небольшие программы выполняемые на графическом ускорителе (далее будем использовать более распространенное название — GPU). Эти программы выполняются для каждого конкретного участка графического конвейера. Если описывать шейдеры наиболее простым способом, то шейдеры — это не более чем программы преобразующие входы в выходы. Шейдеры обычно изолированы друг от друга, и не имеют механизмов коммуникации между собой кроме упомянутых выше входов и выходов.
В предыдущем уроке мы кратко коснулись темы “поверхностных шейдеров” и того, как их использовать. В данном уроке мы рассмотрим шейдеры подробнее и в частности шейдерный язык OpenGL (OpenGL Shading Language).
Acyclic Visitor
2016-10-19 в 16:02, admin, рубрики: c++, design patterns, just for fun, visitor pattern, ПрограммированиеВ этой статье мы рассмотрим один из вариантов реализации поведенческого шаблона проектирования Acyclic Visitor без ипользования RTTI.
Филиппинские кроссворды. Доработка мобильной 2D головоломки для работы с цветными кроссвордами
2016-10-19 в 10:19, admin, рубрики: android, c++, gdiplus, marmalade sdk, Разработка под android, разработка под iOSЧто такое филиппинский кроссворд.
Цветные филиппинские кроссворды — такой вид головоломок, в сетке которой с помощью чисел зашифрована картинка. Каждое число, расположенные в сетке, кроме единицы, имеет пару. Необходимо подобрать и соединить пары чисел линиями так, чтобы линии удовлетворяли следующим условиям:
— длина каждой линии должна соответствовать числам, расположенным на ее концах;
— линии не должны пересекаться друг с другом и проходить через одни и те же клетки;
— линии могут идти в вертикальном и горизонтальном направлениях, могут преломляться, но не могут проходить по диагонали;
— соединяемые пары чисел должны быть одного цвета.
Так как единица не имеет пары, то она закрашена по умолчанию. В результате решения кроссворда, когда все пары чисел (кроме единиц) соединены линиями, получается рисунок.