Создание контуров текста и обводки в Inkscape

Чтобы преобразовать обводку в объект, необходимо в меню «Контур» выбрать пункт «Оконтурить обводку». При создании контура обводки, все объекты обводок должны быть разгруппированны.

оконтуряем обводку

Получаем объект с заливкой и пустой обводкой.

измененные свойства обводки

Для создания контура текста в меню «Контур» выбираем пункт «Оконтурить объект».

оконтуряем текст

После создания контура выделяем все наши объекты и в пункте «Обводка и заливка» меню «Объект» в меню «Зливка» выбираем «нет заливки».

удаление заливки

После удаления заливки наши объекты становятся невидимыми. Для создания контура в меню «Обводка» выбираем пункт «Сплошной цвет».

создание контура

В меню «Стиль обводки» настраиваем толщину обводки. Выбираем нужные нам единицы измерения в выпадающем списке и меняем значение в текстовом поле.

создание контура 2

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

Реклама

Обработка ошибок при выделение памяти с помощью new в C++

Есть два способа определить выделена ли память оператором new.

Способ 1. Обработка исключения

Если память не выделена, то бросается исключение std::bad_alloc.

Пример обработки исключения.

// bad_alloc example
#include <iostream>     // std::cout
#include <new>          // std::bad_alloc

int main () {
  try
  {
    int* myarray= new int[10000];
  }
  catch (std::bad_alloc& ba)
  {
    std::cerr << ba.what() << std::endl;
  }
  return 0;
}

Способ 2. Проверка указателя

При вызове new в качестве аргумента можно использовать константу std::nothrow. Тогда, исключение std::bad_alloc не испускается, а вместо него возвращается нулевой указатель.

Пример обработки нулевого указателя.

// nothrow example
#include <iostream>     // std::cout
#include <new>          // std::nothrow

int main () {
  std::cout << "Attempting to allocate 1 MiB... ";
  char* p = new (std::nothrow) char [1048576];

  if (!p) {
    std::cout << "Failed!\n";
  }
  else {
    std::cout << "Succeeded!\n";
    delete[] p;
  }

  return 0;
}

Ссылки

  1. Описание std::bad_alloc.
  2. Описание std::nothrow.

Контроль версий для резервных копий

Системы контроля версий (СКВ) не годятся для резервного копирования (бэкапов).

Чтобы в этом убедится, достаточно сравнить функционал системы контроля версий и необходимый функционал для бэкапов.

Функционал СКВ:

  1. Сохранение.
  2. Совместная работа.
  3. Ветвление.
  4. Сравнение.
  5. Слияние.
  6. Разрешение конфликтов.

Необходимый функционал для бэкапов:

  1. Сохранение.
  2. Автоматичность.
  3. Периодичность.
  4. Восстановление.
  5. Распределенное хранение.

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

Две наиболее распространенные ошибки при создании бэкапа:

  1. Ручные бэкапы вместо автоматических и отсутствие периодичности.
  2. Отсутствие проверки бэкапа на возможность восстановления данных. Сюда же относится проверка факта периодичности создания бэкапа.

На этот счет есть популярная шутка:

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

 

Поиск использования сигналов в Qt Creator

В Qt Creator можно встать курсором на переменную или функцию, вызвать контекстное меню и выбрать «Найти использование».

Qt Creator найти использование

Тогда Qt Creator найдет все места, где используется эта переменная или функция.

Но это не работает на сигналах, которые подключаются по старому стилю, то есть с использование макроса SIGNAL().

connect(
    object1,
    SIGNAL(superSignal()),
    object2,
    SLOT(superSlot())
);

Qt Creator просто не будет ничего искать, если вы попробуете сделать это на функции, которая заключена в SIGNAL().

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

class SuperClass
{
...
signals:
    superSignal();
}

В этому случае Qt Creator найдет только испускания сигнала (emit).

Решение есть — использовать современный способ подключения сигналов и слотов, без макросов SIGNAL() и SLOT().


connect(
    obj1,
    &SuperClass1::superSignal,
    obj2,
    &SuperClass2::superSlot
);

Данный синтаксис был введен в Qt 5.0 в 2012 году.

Официальное описание сигналов и слотов в Qt на английском.

Удаление объектов в Qt

Эта статья учит избегать утечек памяти и ошибок сегментирования при программировании на C++ с библиотекой Qt.

qt segmetation fault fuuu

Читать далее Удаление объектов в Qt

Перенос базы данных PostgreSQL с OpenShift v2 на Heroku

С Heroku будем работать с помощью утилиты Heroku CLI, а с OpenShift — с  помощью rhc.

Подключаемся к серверу OpenShift по SSH.

rhc ssh ИМЯ_ПРИЛОЖЕНИЯ

На сервере делаем дамп базы данных.

pg_dump --format=c -f app-root/data/database.dump

Опция --format задает формат нужный для Heroku.

Уходим с сервера.

exit

Загружаем дамп с сервера OpenShift на локальный компьютер.

rhc scp ИМЯ_ПРИЛОЖЕНИЯ download ./ app-root/data/database.dupm

Файл дампа нужно загрузить в интернет, так, чтобы была прямая ссылка на файл (https://АДРЕС/database.dupm).

Восстанавливаем базу данных на Heroku из дампа.

heroku pg:backups:restore -a ИМЯ_ПРИЛОЖЕНИЯ 'https://АДРЕС/database.dupm'

Протокол ASTERIX. Cтроки из 8 символов по 6 бит

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

Список категорий (возможно не полный): 004, 010, 021, 025, 030, 048, 062.

Формат строк описан в документе ICAO, Annex 10 Aeronautical Telecommunications, Vlolume IV Surveillance and Collision Avoidance Systems.

Порядок символов в потоке байт:

Байт 1 Байт 2 Байт 3 Байт 4 Байт 5 Байт 6
Сим. 1 Сим. 2 Сим. 3 Сим. 4 Сим. 5 Сим. 6 Сим. 7 Сим. 8

Порядок и нумерация бит символа:

b6 b5 b4 b3 b2 b1

Используются следующие символы:

  • Прописные буквы английского алфавита от A до Z.
  • Цифры от 0 до 9.
  • Символ пробела.

Коды цифр и пробела совпадают с кодами ASCII. Коды букв также совпадают с кодами ASCII, если у кодов ASCII отбросить два старших бита.

Ниже представлена таблица кодировки символов. SP — символ пробела.

b6 0 0 1 1
b5 0 1 0 1
b4 b3 b2 b1
0 0 0 0 P SP 0
0 0 0 1 A Q 1
0 0 1 0 B R 2
0 0 1 1 C S 3
0 1 0 0 D T 4
0 1 0 1 E U 5
0 1 1 0 F V 6
0 1 1 1 G W 7
1 0 0 0 H X 8
1 0 0 1 I Y 9
1 0 1 0 J Z
1 0 1 1 K
1 1 0 0 L
1 1 0 1 M
1 1 1 0 N
1 1 1 1 O

 

Файловый хостинг Amazon S3 + Django + Heroku

Django — библиотека для создания сайтов на языке Python.

Heroku — платформа, которая позволяет размещать сайты, сделанные на Django.

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

Допустим, что мы уже зарегистрировались на Heroku и Amazon.

Настройка Amazon

Перейдем в My Security Credentials (учетные данные безопасности).

My Security Credentials

Создадим новый ключ доступа с помощью кнопки Create New Access Key.

Create New Access Key

Появится окно с идентификатором ключа и секретным ключом. Их надо сохранить, чтобы потом настроить Heroku. Сохранить можно в файл с помощью кнопки Download Key File.

Access Key

Теперь нужно перейти в Amazon S3 и создать хранилище (кнопка Create Bucket).

Amazon S3

Зададим DNS-совместимое имя хранилища и регион такой же как на Heroku, чтобы минимизировать задержки при передаче данных. Остальные настройки можно оставить без изменения. Имя понадобится для настройки Heroku.

Create Bucket

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

При загрузке файла создается ссылка на него, по которой он будет доступен в интернете.

Загрузим один файл, чтобы узнать по какому адресу располагается наше хранилище. Адрес зависит от выбранного региона. Часть ссылки, которая подчеркнута красным, понадобится для настройки Heroku.

example.txt

Настройка Heroku

Перейдем в настройки приложения и назначим переменные окружения, которые здесь называются Config Variables.

Heroku Config Variables

Требуется назначить 4 переменные окружения на основе настроек Amazon:

  • AWS_ACCESS_KEY_ID — идентификатор ключа.
  • AWS_SECRET_ACCESS_KEY — секретный ключ.
  • AWS_STORAGE_BUCKET_NAME — имя хранилища.
  • AWS_URL — адрес, по которому располагается хранилище.

Настройка проекта Django

Для работы с Amazon S3 нужно установить пакеты django-storages и boto3.

  • django-storages — это коллекция хранилищ для Django.
  • boto3 — библиотека для работы с сервисами Amazon.

Если используется файл requirements.txt для удовлетворения зависимостей, то в него нужно прописать пакеты нужных версий, например:

django-storages==1.6.5
boto3==1.4.7

Установить пакеты можно следующей командой:

pip install -r requirements.txt

В файле settings.py нужно прописать следующий код.

INSTALLED_APPS = (
    ...
    'storages',
    ...
)

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_URL = os.environ.get('AWS_URL')

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_MEDIA_URL = "{}/{}/".format(AWS_URL, AWS_STORAGE_BUCKET_NAME)

MEDIA_URL = AWS_MEDIA_URL

Продолжение будет…

Внесение изменений в программу Wireshark

wireshark

Репозиторий исходного кода программы Wireshark расположен по адресу https://code.wireshark.org/review.

  1. Клонируем репозиторий следующей командой.
    git clone https://code.wireshark.org/review/wireshark
  2. Вносим какое-нибудь изменение в код.
  3. В папке проекта собираем программу следующими командами.
    ./autogen.sh
    ./configure
    make
  4. ./configure может выдать ошибку при неудовлетворенной зависимости и завершиться. Удовлетворяем зависимость и снова запускаем.
  5. Запускаем программу следующей командой.
    ./wireshark
  6. Проверяем, что внесенные изменения работают.
  7. Регистрируемся на сайте репозитория.
  8. В папке проекта добавляем в файл .git/config следующие строчки.
    [gerrit]
        createchangeid = true
  9. Делаем коммит и убеждаемся, что в конец комментария коммита автоматически вставилась строчка
    Change-Id: Icdd39166059c080e7844968219f2a8f387c587a6
    только с другим кодом.
  10. В настройках на сайте репозитория генерируем пароль.
    code.wireshark.org settings HTTP password
  11. Отправляем изменения в удаленный репозиторий следующей командой.
    git push origin HEAD:refs/for/master
  12. При этом вводим логин и пароль, который сгенерировали.
  13. Если все прошло успешно, то ваш коммит появится в списке коммитов ожидающих ревью. Остается только дождаться утверждения коммита.

Ссылки