С++: Отключаемый отладочный вывод

Чтобы иметь возможность отключить или подключить весь отладочный вывод в коде в одном месте, я использую следующую конструкцию:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

typedef enum {
    DL_INFO = 0,
    DL_ERROR
} DebugLevel;

char * dlToString(DebugLevel dl) {
    static char INFO [] = "INFO";
    static char ERROR [] = "ERROR";
    switch(dl) {
    default:
    case DL_INFO:
        return INFO;
    case DL_ERROR:
        return ERROR;
    }
}

void printDebugString(const char * file, int line, const char * method, DebugLevel dl, const char* format, ...) {
    va_list arglist;
    va_start(arglist, format);
    printf("%s: %s:%d:%s:", dlToString(dl), file, line, method);
    vprintf(format, arglist);
    va_end(arglist);
}

#define DEBUG_PRINT(LEVEL, FMT, ...)    printDebugString(__FILE__, __LINE__, __PRETTY_FUNCTION__, LEVEL, FMT, ##__VA_ARGS__)

Linux: перенаправление потоков stderr и stdout в файл

Перенаправить одновременно stderr и stdout в файл можно так:
program > log_file 2>&1
или, чтобы не перезаписывать каждый раз файл, а добавлять в конец, соответственно:
bash_command >> log_file 2>&1
Что значит выражение: 2>&1:
2 - это дескриптор потока stderr;
&1 - это дескриптор потока stdout (амперсант перед 1 означает, что 1 - это не имя файла, а именно дескриптор);
то есть мы перенаправляем stderr туда же, куда перенаправлен к этому моменту stdout. Поэтому сначала перенаправляем stdout в файл (посредством > log_file), а затем перенаправляем туда же stderr. Например, следующая команда:
program > err_file 2>&1 > log_file
Перенаправит stderr туда, куда был к этому моменту перенаправлен stdout (в файл err_file), а потом перенаправит stdout в log_file. Другой способ перенаправить stderr и stdout в разные файлы:
program > log_file 2> err_file

Qt 5.3 QML: как принудительно выполнить перерисовку элемента

Судя по всему, стандартные средства QML не позволяют просто взять и запросить перерисовку заданного объекта. Понятно, что объекты автоматчески перерисовываются при измении их свойств, списки автоматически перерисовываются при изменении привязанных к ним моделей. Но если есть какой-нибудь кастомный элемент интерфейса на основе, например, Rectangle, отрисовка которого зависит от какой-нибудь кастомной модели, проброшенной в QML из С++ кода, все это не поможет. Модель меняется, а вот метода, который бы заставил интерфейс перерисоваться заново с учетом этих изменений, я не нашел.
Единственное решение, которое я нашел, это удалить элемент и пересоздать его заново после изменения модели (как это делать, описано здесь). Правда, статически созданные элементы не рекомендуется удалять динамически, поэтому элементы, которые нужно будет пересоздавать, нужно сразу создавать динамически.

Настройка управления питанием в Xubuntu 14.04

Столкнулся с проблемой в Xubuntu 14.04 на ноутбуке: игнорируются настройки управления питанием - действия при закрытии крышки и нажатии на кнопку выключения питания. Выяснилось, что это баг в xfce4-power-manager-settings. Суть заключается в том, что Power Manager не перехватывает у systemd соответсвующие события.
Лечится настройкой systemd, как указано на ArchLinux Wiki. Надо отредактировать файл /etc/systemd/logind.conf:
HandlePowerKey=ignore
HandleSuspendKey=ignore
HandleHibernateKey=ignore
HandleLidSwitch=ignore

Qt 5.3 QML: создание линий без использования Canvas

В QtQuick практически отсутствуют элементы, представляющие собой геометрические фигуры (есть только Rectangle). Видимо, предполагается, что если требуется рисовать что-то хоть сколько-то сложное, нужно использовать элемент Canvas. Однако, в случае интерактивного интерфейса Canvas не очень удобен - чтобы обработать, например, нажатие клавиши мышки по элементу на Canvas, нужно получить координаты указателя мыши, понять, какой элемент расположен по этим координатам, понять, какие еще элементы затрагиваются этим событием, и перестроить Canvas. В случае, если интерфейс построен из отдельных элементов (типа Item или Rectangle), каждый элемент может сам обрабатывать свои события, а связывать элементы между собой можно через сигналы-слоты. Получается гораздо удобнее.
Итак, я не хочу использовать Canvas, но мне необходимо нарисовать линию. Так как у нас есть только Rectangle, то будем использовать именно его: ведь линия - это тот же прямоугольник, просто с очень маленькой высотой (например, один пиксель), повернутый на определенный угол.

Qt 5.3 QML: создание контейнера элементов больше размера окна

У меня возникла необходимость сделать в приложении, написанном на Qt 5.3 и использующим QML, контейнер элементов интерфейса, который был бы больше окна приложения, то есть какая-то его часть бы была видна пользователю, а все остальное - скрыто в данный момент. Это очень похоже на поведение любого графического редактора при увеличении открытого изображения - становится видна только часть изображения. Соответственно, необходимо также, чтоб была возможность "передвигать" мышкой видимую часть контейнера - при этом в окне должны отображаться скрытые ранее элементы.
В QML для этого есть специальный элемент-контейнер Flickable. Однако в чистом виде его использовать не удалось - поведение не совпадает с ожидаемым. Ниже представлен QML код, который реализует описанное поведение.

Подсветка кода на html-страницах

Для подсветки кода в этом блоге я использую Javascript билиотеку SyntaxHighlighter. Легко устанавливается (в случае с Blogger просто добавляются ссылки на нужные скрипты в заголовок шаблона), имеет довольно много разных синтаксисов.

Qt 5.3: предоставление доступа к С++ объектам из QML

Связка Qt 5.3 + QML предоставляет отличную возможность разделить в приложении логику модели данных и логику представления. Но чтобы обеспечить свзять между моделью данных и представлением, необходимо предоставить представлению доступ к данным. Я это делаю через отдельную прослойку - Presenter (из Model-Vew-Presenter). Для этого я завожу отдельный класс, объекты которого, с одной стороны, имеют ссылку на объекты модели, а с другой, к ним может быть осуществлен доступ из QML - представления. Итак, необходимо предоставить из QML доступ к объектам в С++ коде.

Ubuntu 14.04: сохранять пароли от Git в gnome-keyring

Начиная с версии 1.8 в Git есть поддержка gnome-keyring, однако надо самостоятельно скомпилировать бинарники. Для Ubuntu это выглядит таким образом:
sudo apt-get install libgnome-keyring-dev
cd /usr/share/doc/git/contrib/credential/gnome-keyring
sudo make
git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring
Когда в следующий раз логин и пароль будут введены, они будут сохранены в gnome-keyring.

Linux: yстановить права доступа для файлов и поддиректорий в командной строке

Изменить права доступа для всех поддиректорий на 755 (-rwxr-xr-x):
find /path -type d -exec chmod 755 {} \;
Изменить права доступа для всех файлов на 644 (-rw-r--r--):
find /path -type f -exec chmod 644 {} \;

Vim: минимальный .vimrc для удобного редактирования С/С++ кода

" set UTF-8 encoding
set enc=utf-8
set fenc=utf-8
set termencoding=utf-8
" disable vi compatibility
set nocompatible
" use indentation of previous line
set autoindent
" use intelligent indentation for C
set smartindent
" configure tabwidth and insert spaces instead of tabs
set tabstop=4        " tab width is 4 spaces
set shiftwidth=4     " indent also with 4 spaces
set expandtab        " expand tabs to spaces
" wrap lines at 120 chars.
set textwidth=120
" turn syntax highlighting on
set t_Co=256
syntax on
" highlight matching braces
set showmatch

Linux: найти все файлы, измененные за определенный период времени

Найти файлы в текущей директории, измененные 28 октября 2014 года
find . -newermt "2014-10-28 00:00:00" ! -newermt "2014-10-29 00:00:00"

Потоковое вещание видео с камеры с помощью GStreamer и HTML5. Часть 2: код на Си++

В прошлом посте я передал картинку с камеры на html-страницу с помощью html-тега <video> и утилиты gst-launch, которая поставляется вместе с GStreamer. Однако gst-launch не очень удобно интегировать в свои программы, поэтому я написал на Си++ свой плеер на GStreamer, который использует тот же пайплайн (то есть берет картинку из /dev/video и передает на tcp порт).

Автоматическое построение зависимостей в make

Проблема в том что make сам не умеет строить зависимости файлов с исходными кодами от заголовочных файлов. То есть, например, строим бинарный файл из foo.cpp, в который, с помощью директивы include включен bar.h. Простейший makefile будет выглядить как-то так:
all: test

test: foo.cpp
    g++ foo.cpp -o test
Включаемый файл bar.h нигде не упоминается, и если мы его изменим, цель пересобрана не будет. Чтобы этого не происходило, надо указать bar.h в зависимостях рядом с foo.cpp. Однако вручную перечислять в зависимостях все включаемые заголовочные файлы практически нереально.

Linux: заменить символы '<', '>' и '&' на соответствующие html коды в командной строке

Когда вставляю сюда код, указанные символы часто заменяются неправильно на соответствующие html-коды ('&lt;', '&gt;' и '&amp;' соответственно). В Linux произвести эту замену самому перед вставкой проще всего мне показалось используя sed:
sed 's/\&/\&amp;/g;s/</\&lt;/g;s/>/\&gt;/g' inputFileName.cpp
Команда s/ в sed заменяет одну подстроку на другую. Отдельные команды в sed разделяются симоволом точки с запятой, соответственно, здесь три команды замены. Формат команды s/ такой:
sed 's/regexp/replacement/g' inputFileName
/g означает "заменить все вхождения в файле". Ну и символ & приходится экранировать, так как он используется в регулярных выражениях.

Вычислениe времени выполнения участка кода на Си/C++. Часть 2: функция clock_gettime

Некоторое время назад мне понадобилось измерить время работы одного алгоритма, и я нашел быстрое решение для этого: Вычислениe времени выполнения участка кода на Си/C++. Дальнейшее исследование показало, что способ этот отнюдь не идеален.

Потоковое вещание видео с камеры с помощью GStreamer и HTML5

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