Удаление объектов в 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. Если все прошло успешно, то ваш коммит появится в списке коммитов ожидающих ревью. Остается только дождаться утверждения коммита.

Ссылки

Правила кодирования в Qt

640px-qt_logo_2016-svg

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

Директивы препроцессора

Символ решетки всегда в начале строки, а имя директивы с отступом.

Пример из файла Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs.h.

# if defined(QT_NO_KEYWORDS)
#  define QT_NO_EMIT
# else
#   ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS
#     define slots Q_SLOTS
#     define signals Q_SIGNALS
#   endif
# endif

Ссылки и указатели

Операторы & и * в обозначении типа смещены вправо и примыкают к имени.

Пример из файла Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearray.h.

class Q_CORE_EXPORT QByteArray
{
    <...>
    QByteArray &prepend(char c);
    QByteArray &prepend(int count, char c);
    QByteArray &prepend(const char *s);
    QByteArray &prepend(const char *s, int len);
    QByteArray &prepend(const QByteArray &a);
    QByteArray &append(char c);
    QByteArray &append(int count, char c);
    QByteArray &append(const char *s);
    QByteArray &append(const char *s, int len);
    QByteArray &append(const QByteArray &a);
    <...>
}

Приватные поля

В имени приватного поля используется префикс m_.

Пример из файла Qt5.9.0/5.9/gcc_64/include/QtCore/qstring.h.

class QLatin1String
{
public:
    <...>
private:
    int m_size;
    const char *m_data;
};

Ссылки

О других правилах кодирования можно узнать по следующим ссылкам.

Подсветка кода с помощью Markdown в Gitlab и на Github

В файле README.md можно разместить код с подсветкой синтаксиса.

Делается это с помощью обратных кавычек (`).

Код внутри строк можно выделить если с двух сторон поставить по одной обратной кавычки. Пример: `код`.

Многострочный код выделяется тремя обратными кавычками с каждой стороны:

```
function test() {
    console.log("notice the blank line before this function?");
}
```

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

```javascript
function test() {
    console.log("notice the blank line before this function?");
}
```

Наглядные примеры с подсветкой синтаксиса можно увидеть по ссылкам ниже.

Ссылки

Анализ данных по протоколу ASTERIX в Wireshark

Протокол ASTERIX служит для передачи радиолокационной информации.

Бесплатная программа для анализа сетевого трафика Wireshark умеет работать с этим протоколом.

Протокол ASTERIX не обладает никакими признаками, по которым его можно было бы распознать в потоке данных, поэтому по умолчанию Wireshark отображает данные как набор байт.Анализ данных по протоколу ASTERIX в WiresharkПрограмму нужно научить ассоциировать данные с протоколом ASTERIX. Для этого нужно вызвать  выпадающее меню на пакете и выбрать пункт Decode As….Анализ данных по протоколу ASTERIX в Wireshark. Decode AsВ колонке Current нужно выбрать протокол ASTERIX.

Анализ данных по протоколу ASTERIX в Wireshark. Decode As Asterix

После настройки можно увидеть разбор данных.Анализ данных по протоколу ASTERIX в Wireshark

Ссылки

C++. Частичная специализация шаблонного класса

Может пригодится, когда нужно для какого-то типа по своему реализовать метод или методы шаблонного класса не специализируя и не переписывая весь класс.

Пример.

Имеется следующий шаблонный класс в файле value.h.

template<typename T>
class Value {
public:
    Value(const T &val): m_value(val) {}
    T value() const { return m_value; }
private:
    T m_value;
};

Реализуем метод value для типа int в файле value.cpp.

template<>
int Value<int>::value() const
{
    return m_value + 1;
}

Добавление Sitemap с помощью DjangoCMS

Sitemap — XML-файлы с информацией для поисковых систем (таких как Google, Яндекс, Bing, Поиск@Mail.Ru) о страницах веб-сайта, которые подлежат индексации.

DjangoCMS может самостоятельно сгенерировать Sitemap с опубликованными на сайте страницами.

Настроить выдачу Sitemap очень просто, следуя следующей инструкции.

  1. В файле настроек settings.py добавляем django.contrib.sitemaps в INSTALLED_APPS.
  2. Добавляем следующую строчку в начало файла urls.py.
    from cms.sitemaps import CMSSitemap
  3. В том же файле (urls.py) добавляем в список urlpatterns следующий код.
    url(
        r'^sitemap\.xml$',
        'django.contrib.sitemaps.views.sitemap',
        {'sitemaps': {'cmspages': CMSSitemap}}
    ),
    
  4. Запускаем локальный сайт. Вводим в адресную строку браузера http://127.0.0.1:8000/sitemap.xml (или кликаем по ссылке) и убеждаемся в наличие Sitemap.

Ссылки

How to create sitemaps (официальная документация на английском)