Hatred's Log Place

DON'T PANIC!

Oct 13, 2010 - 1 minute read - linux

Пара замечаний

Замечание 1: Qt Creator (одна из последних git сборок)

При включенном отображении Outline в левой панели, при работе появляются значительные тормоза даже на небольших проектах (при моих 1024Мб RAM и Atom 1.6Гц). Решение: выбрать другой режим, тем более что в значительный промежуток времени эта панель вообще не нужна (убирается и вновь показывается при помощи Alt-0), да и есть мощный инструмент Locate (Ctrl-K)

Замечание 2: sshfs и не уходим в sleep

Я активно пользуюсь sshfs для подключения удалённых ресурсов, удобно, быстро, не нужно дополнительных плясок. Недавно стал наблюдать, что система при каких-то условиях перестала засыпать на нетбуке. Опытным путем выяснилось условие: ресурс, примонтированный при помощи sshfs, был отлючен с использованием опции lazy у fusermount (иначе ругался на Resource busy). При этом продолжал висеть процесс sshfs, его убийство после, опять позволяло уводить систему в sleep.

Oct 11, 2010 - 1 minute read -

Crowns 0.5.0

Вышла версия 0.5.0 программы Crowns для построения проекций крон деревьев. Скачать можно тут

В этой версии, основные изменения, касающиеся функционала в целом:

  • Добавлена возможность удалять подложку из проекта.
  • Добавлена возможность экспорта параметров крон деревьев в формат, пригодный для обработки в математических программах типа Octave (100% проверено), Scilab (проверено частично), Mathlab (теоретически должно работать). Т.к. проекции теперь строятся при помощи кривых Безье, то при экспорта с точностью 0.1 выдаются и промежуточные точки для построения полной проекции, теоретически, после обработки данные будут пригодны для загрузки в GIS.
  • Исправлена ошибка, при которой подложка не удалялась при открытии проекта без оной или создании нового проекта.
  • Исправлена ошибка, при которой случайное нажатие клавиши Esc приводило к закрытию окна программы.

Другие изменения, касающиеся технических аспектов разработки:

  • Исправлены вспомогательный скрипты для отстройки и паковки win32 версии из среды Linux.
  • Был осуществлен переход на систему сборки CMake.
  • Исправлено не критическое поведение с float типами при сохранении проекта: значения сохранялись как @Variant(..).

Полный список изменений: ChageLog

Oct 9, 2010 - 1 minute read - programming

Документация по GCC

На правах мемориза.

Тут лежит полная и последняя: http://gcc.gnu.org/onlinedocs/ в различных форматах, берём то, что нужно, а в системе пользуемся инфо

А здесь полезная информация от гентоводов: http://en.gentoo-wiki.com/wiki/Safe_Cflags - безопасные флаги оптимизация для различных процессоров (далее по тексту - ссылки)

Oct 2, 2010 - 8 minute read - programming

Цветовое пространство YUV

Многим знакомо цветовое пространство RGB (Red/Green/Blue), мне потребовалось же работать с входными данными пространства YUV, которое широко используется в семействе кодеков MPEG.

Sep 28, 2010 - 1 minute read -

FlashBlock в Opera

Полезная ссылка: http://my.opera.com/Lex1/blog/flashblock-for-opera-9/

даны различные рецепты, в том числе очень удобный для Opera 10.5+: просто включить опцию EnableOnDemandPlugin, для чего нужно открыть настройки: opera:config#UserPrefs|EnableOnDemandPlugin, опция автоматически добавится, и можно её включить. Да, это будет работать для любых плагинов.

Sep 16, 2010 - 1 minute read - linux туризм maps

OpenSource #068

А в нем и моя очередная статья “QLandKarte GT как замена OziExplorer в GNU/Linux” (название откорректировано редактором, но не суть). Рассматривается вопрос использования данных, подготовленных для использования в OziExplorer (или созданных ими), коих на просторах интернетов премножество, в среде Linux, на примере QLandKarte GT.

Скачать: http://osa.samag.ru/get/OpenSource068.zip

Sep 15, 2010 - 1 minute read - life

WebMoney и Альфа Банк

Стоимость (полная) перевода WM -> Alfa-click - 2.8%, обратно - 1%

Привязка осуществляется через Альфа-Клик, предварительно в WM нужно получить формальный аттестат (http://passport.webmoney.ru), после чего нужно в секции “Мои документы” закачать сканы или снимки:

  • разворота паспорта с фотографией
  • разворота паспорта с пропиской
  • ИНН

Дождаться, когда рядом с ними появятся зелёные значки, до тех пор Альфа-Клик будет ругаться на то, что вам нужно иметь формальный сертификат с подтвержденными паспортными данными.

Если возникнут проблемы, можно спросить в этой теме: Привязка к Альфа-банку.

Из вышеуказанной темы, уверяют, что для сверки используется информация о номере паспорта и ФИО, так что следите, что бы они были корректными (я, при заполнении анкеты в банке, нашел несколько, в т.ч. в имени, так что будьте бдительны).

Несколько ссылок:

Те же самые операции с Яндекс.Деньгами прошли менее болезненно, при условии, что паспортные данные в системе ЯД уже предоставлены (там только ничего никуда не нужно сканировать и выкладывать)

Sep 13, 2010 - 1 minute read - programming

256

Ну чтос, с праздничком!

Sep 8, 2010 - 2 minute read -

Unix man pages в Qt Assistant

В продолжении темы, поднятой мною тут: 906984 , таки решил озадачится, результатом озадачивания стало два скрипта.

  • gen-man2html.sh - пробегает по указанным секциям man-страниц (где они лежат и какие секции - внутри файла, лениво было опциями делать), и конвертирует их в HTML, заодно, по некоторым патернам создаёт ссылки (типа printf(3) или ссылкки в секцию 0, для <header.h>)
  • gen-html2assistant.sh - собственно уже пробегает по этим, сгенерированным, страницам, делает файл проекта справки Qt Assistan и, по завершении, вызывает *qhelpgenerator// для создания файла справки (на самом деле это SQLite база). После чего этот файл можно подключить в Qt Assistant:

Для того, что бы к работал поиск в “Указателе”, нужно указывать ключевые слова, в данный момент, в качестве оных, используется имя самой страницы. Полнотекстовый поиск будет доступен в соответствуем месте в Qt Assistant после окончания генерации индекса. В “Содержании” добавится новый пункт “Unix man pages”.

Вот так вот примерно это дело выглядит:

Сразу вопрос: подскажите инструмент для генерации ключевых слов для документа, интересует, на данный момент, только английский язык.

Бонусом нам это добавляет контекстную справку по всем функциям glibc и установленных библиотек (для которых есть man-page) в Qt Creator.

Сгенерированный мною файл справки можно взять тут: http://hatred.homelinux.net/~hatred/unixman.qch.gz

UPD:
буквально сегодня в списке рассылки Qt Creator проскользнула статья: Linux Man Pages integration with Qt Creator со схожим механизмом получения справочного файла. Отличие в том, что он брал готовые man-страницы в html с http://www.kernel.org/doc/man-pages/online_pages.html

UPD2:
Там же в рассылке всплыла ссылка на галерею документации для Qt Creator: https://wiki.qt.io/Qt_Creator_Documentation_Gallery (или поиском по “Qt_Creator_Documentation_Gallery”, так как они уже несколько раз домены тосовали).

В текущем состоянии не густо, но есть C++ Reference и убогенькая, сгенерированная doxygen документация по STL, а так же рекомендацию, как при помощи Doxygen генерировать документацию для Assistant.

Aug 31, 2010 - 10 minute read - туризм

Слоны идут на север

Ещё когда топали на Ольховую, Ярослава кинула идею, что надо бы съездить на север Приморья, посетить водопад Чёрный Шаман (Большой Амгинский, высота около 30-35 метров - видимая часть и около 10-15 метров невидимая). Тогда дата была определена крайне расплывчато: а вот как нибудь в августе.

Aug 29, 2010 - 1 minute read - linux

Psi+ - редактирование контактов в ростере

Столкнулся с проблемой - никоим образом не получалось отредактировать контакт в ростере, хотя горячая клавиша была назначена. В конференции psi-dev@conference.jabber.ru подсказали, посмотреть, а не залочен-ли ростер, оказалось - залочен, исправлять:

  • Настройки -> Дополнительно
  • далее находим опцию: options.ui.contactlist.lockdown-roster и ставим в true

Всё!

Aug 28, 2010 - 3 minute read - programming

Гоняем структуры по сети, часть вторая

Тут уже писал про проблему пересылки/приёмки структурированных данных по сети.

На нашей целевой платформе нельзя применять сторонние библиотеки (типа libpack, как в предыдущей статье), и, так вышло (лучи ненависти), что #pragma pack() то работает, то не работает, да ещё стоит условие, что данные должны быть преобразованы к сетевому виду (ntohs(), ntohl(), htons(), htonl()), поэтому я сделал на макросах такой фит ушами:

/**************************************************************************************************/
/* Паковка и распаковка данных, для передачи по сети ---------------------------------------------*/
/**************************************************************************************************/

// Распаковка массива в структуры
/**
 Начало блока распаковки массива данных, на которые указывает <br/>c ptr и размера <br/>c size
 */
#define unpack_begin(ptr, size) { <br/>
            size_t   __addr = 0; <br/>
            size_t   __size = (size_t)(size); <br/>
            uint8_t *__ptr  = (uint8_t*)(ptr); <br/>
            union { <br/>
                uint8_t        cc[8]; <br/>
                uint16_t       ii[4]; <br/>
                uint32_t       ll[2]; <br/>
                float          ff[2]; <br/>
                double         dd;    <br/>
            } __swapd; (void)(__swapd)

/**
 Распаковка очередной порции данных в <br/>c target
 */
#define unpack_next(target) <br/>
            pack_printf("Unpack <br/>"%s<br/>"... Size: %d, current offset: %d, current size: %d<br/>n", #target, __size, __addr, sizeof(target)); <br/>
            if ((__addr + (int)sizeof(target)) <= (__size)) <br/>
            { <br/>
                memcpy(&(target), __ptr + __addr, sizeof(target)); <br/>
                __addr += sizeof(target); <br/>
            } (void)(0)

/**
 Распаковка очередной порции данных в <br/>c target, с преобразованием из сетевого вида
 Сетевое преобразование работает для простых типов размерос 2 (short), 4 (int, float)
 и 8 (lint32_tlint32_t double) байтint16_t остальных данных
 */
#define unpack_net_next(target) <br/>
            unpack_next(target); <br/>
            switch(sizeof(target)) <br/>
            { <br/>
                case 2: <br/>
                    memcpy(&__swapd.ii[0], &target, 2); <br/>
                    __swapd.ii[0] = ntohs(__swapd.ii[0]); <br/>
                    memcpy(&target, &__swapd.ii[0], 2); <br/>
                    break; <br/>
                case 4: <br/>
                    memcpy(&__swapd.ll[0], &target, 4); <br/>
                    __swapd.ll[0] = ntohl(__swapd.ll[0]); <br/>
                    memcpy(&target, &__swapd.ll[0], 4); <br/>
                    break; <br/>
                case 8: <br/>
                    memcpy(&__swapd.dd, &target, 8); <br/>
                    __swapd.ll[0] = ntohl(__swapd.ll[0]); <br/>
                    __swapd.ll[1] = ntohl(__swapd.ll[1]); <br/>
                    memcpy(&target, &__swapd.dd, 8); <br/>
                    break; <br/>
            } (void)(0)

/**
 Конец блока распаковки
 */
#define unpack_end() } (void)(0)


// Паковка данных из элементов струтуры в массив данных
/**
 Начало блока паковки данных в <br/>c ptr размером <br/>c size
 */
#define pack_begin(ptr, size) unpack_begin(ptr, size)

// Внутренний вспомогательный макрос, как общая часть для pack_next()/pack_net_next()
#define _pack_next_intr(source, data) <br/>
            printf("Pack <br/>"%s<br/>"... Size: %d, current offset: %d, current size: %d<br/>n", #source, __size, __addr, sizeof(source)); <br/>
            if ((__addr + (int)sizeof(source)) <= (__size)) <br/>
            { <br/>
                memcpy(__ptr + __addr, &(data), sizeof(source)); <br/>
                __addr += sizeof(source); <br/>
            } (void)(0)

/**
 Пакует очередной элемент
 */
#define pack_next(source) <br/>
            _pack_next_intr(source, source)

/**
 Пакует очередной элемент, преобразовывая его в сетевой вид
 */
#define pack_net_next(source) <br/>
            switch(sizeof(source)) <br/>
            { <br/>
                case 2: <br/>
                    memcpy(&__swapd.ii[0], &source, 2); <br/>
                    __swapd.ii[0] = htons(__swapd.ii[0]); <br/>
                    _pack_next_intr(source, __swapd.ii[0]); <br/>
                    break; <br/>
                case 4: <br/>
                    memcpy(&__swapd.ll[0], &source, 4); <br/>
                    __swapd.ll[0] = htonl(__swapd.ll[0]); <br/>
                    _pack_next_intr(source, __swapd.ll[0]); <br/>
                    break; <br/>
                case 8: <br/>
                    memcpy(&__swapd.dd, &source, 8); <br/>
                    __swapd.ll[0] = htonl(__swapd.ll[0]); <br/>
                    __swapd.ll[1] = htonl(__swapd.ll[1]); <br/>
                    _pack_next_intr(source, __swapd.dd); <br/>
                    break; <br/>
                default: <br/>
                    pack_next(source); <br/>
                    break; <br/>
            } (void)(0)

/**
 Конец блока паковки данных
 */
#define pack_end()            unpack_end()

Можно ещё оптимизировать, тут оверхед с переменными вспомогательными, можно без них в большинстве случаев. Ну и, кажется, не совсем корректная работа с величинами больше 4 байт (double), но на серверной машине, по-моему, вообще залепа сделана, посмотрим как работать будет :)

Пример использования для отсылки данных:

struct Data {
  short     id;
  float      d;
  long      tm;
} data;

data.id = 0;
data.d  = 73.3;
data.tm = 0xFEFD;

int n;

size_t data_size = 2 + 4 + 4; // sizeof(short) + sizeof(float) + sizeof(long) - поля структуры
char *data_ptr;

data_ptr = calloc(data_size, sizeof(char));

pack_begin(data_ptr, data_size);
  pack_net_next(data.id);
  pack_net_next(data.d);
  pack_net_next(data.tm);
pack_end();

n = send(sock, data_ptr, data_size, 0);

Пример получения данных:

struct Data {
  short     id;
  float      d;
  long      tm;
} data;

int n;

size_t data_size = 2 + 4 + 4; // sizeof(short) + sizeof(float) + sizeof(long) - сколько данных получить нужно
char *data_ptr;

data_ptr = calloc(data_size, sizeof(char));

n = recv(sock, data_ptr, data_size, 0);

unpack_begin(data_ptr, data_size);
  unpack_net_next(data.id);
  unpack_net_next(data.d);
  unpack_net_next(data.tm);
unpack_end();

// Тут структура заполнена распакованными данными

Если преобразование в сетевой вид не нужно, используйте pack/unpack_next()