воскресенье, 9 декабря 2012 г.

Сам себе профайлер (сниппет)

Нужно измерить производительность программы ? ищешь тормоза в коде ? интерфейс замерзает ?

Хороший профайлер и трезвая голова - помогает.
Но иногда 1-го пункта может не оказаться: или под нужную платформу или под рукой или он дорогой.

Тогда мне помогает пункт 2-й и небольшой сниппет

#include <time.h>

clock_t cl = clock();

// some code

std::cout << "Code duration: " << (double) ( clock() - cl ) / ( CLOCKS_PER_SEC / 1000 ) << " ms" << std::endl;

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

Увлекательно, но метод заставляет думать, а не наблюдать :) иногда это бывает полезнее, коллегам понравился... может быть понравится и тебе.

Со временем, начинаешь понимать сколько должна длиться та или иная операция. За сколько времени обрабатывается гигабайт информации и за сколько времени он может обработаться. Приходит понимание времени и осознания масштабов миллисекунд и тактов. I like it.

суббота, 10 ноября 2012 г.

Использование Poco из Qt и MinGW

Подключить Poco для QMAKE проекта дело несложное но с особенностями.

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

INCLUDEPATH += путь к Poco инклудам
INCLUDEPATH += путь к Poco::Net инклудам
INCLUDEPATH += путь к Poco::XML инклудам INCLUDEPATH += путь к Poco::Util инклудам
Для простоты все инклуды я скинул в одну папку.

Добавляем пути к либам:

QMAKE_LIBDIR += путь к папке к либам
А теперь сама либа:

LIBS += -lPocoFoundation

ЗЫ: Если либ несколько одновременно - важен порядок !

Я всё это вынес в отдельный .pri файл. И когда я работаю с Poco - инклудю его целиком. В моем случае он выглядит так:
INCLUDEPATH += $$PWD/1.4.4_mingw_32/include
QMAKE_LIBDIR += $$PWD/1.4.4_mingw_32/lib
#Always the first
LIBS += -lPocoNet
#Always the second
LIBS += -lPocoUtil
#Always the third
LIBS += -lPocoFoundation
#windows specific defines
#getaddrinfo
LIBS += -lWs2_32
#GetAdaptersInfo
LIBS += -lIphlpapi
Всё.

Сборка Poco под MinGW

Собирается Poco по этой инструкции несложно.

1. Если MSYS не стоит, то ставим MSYS с сайта MinGW.

2. В MinGW shell переходим в папку с распакованным Poco

3. Вызываем :
configure

4. Потом :
make

5. Если не вышло, с ошибкой: "что то там -mno-cygwin". Идем в каталог {mingw_home}\build\config
В файле MinGW удаляем ключ -mno-cygwin.

6. Повторяем пункты 3, 4

7. У меня тесты не пошли но либы появились в папке lib.


Note: для сборки без зависимостей я делал 3й пункт через:
configure --omit=NetSSL_OpenSSL,Crypto,Data/ODBC,Data/MySQL

пятница, 9 ноября 2012 г.

Переход с SVN на GIT

Сегодня я покинул кампанию сомневающихся и перевел свои проекты на Git.

Весь процесс (2 шага) у меня занял не более 15 минут.

  • sudo apt-get install git-svn
  • git svn clone АдресРепозитория АдресКудаКлонировать

В моем случае 2й шаг выглядел так:

git svn clone file:///home/serg/repositary/ .

После конвертации gitk показал такую картинку:

gitk linux svn to git

Авторы коммитов, дата и весь код сохранился успешно.

вторник, 19 июня 2012 г.

QML виджет верхнего уровня & повернутый градиент

Вчера писал гуй для GTD клиента. В рамках спортивного программирования и качания скиллов в декларативном Qt/QML. На старте нарисовались 2 задачи, притом не решаемые без угнетающих костылей. Например:
Изображение Hint для програмирования на QML
Фактически это Hint на QML
Вроде бы и ничего страшного ? закругленный прямоугольник размером с childrect внутри image + text привязанные друг к другу, появляются по событию мыши. 2 минуты работы и ... хинт оказывается под следующим компонентом:
Z-order у хинта
Кажется тут и пригодится ранее неиспользуемое мной свойство визуальных компонентов: координата z... а вот не тут то было :)... ничего не меняется!. Хотя гугл, форумы и все все все говорят использовать его... хмм. Читаем внимательно и вдумчиво мануал, ага z-order учитывается только для sibling компонентов. А у меня хинт - чайлд кнопки, кнопка - чайлд панели (иголка в яйце, яйцо в зайце, заяц в шоке), а уже сама тулпанель sibling для правого компонента... вобщем на глаза грабля правильной архитектуры ;). Изменение z координаты для всей панели дало ожидаемый результат, но это не совсем то, что нужно. В конкретно данном случае, работает, а если 2 панели рядом - уже нет...

Выход ? сделать хинт - потомком Root`a. Архитектура получается жесть :) Это не наш путь. Выход №3 ? создать на root компоненте глобальный Loader и грузить в него компонент нашего хинта, но тогда anchor`ы использовать низя, а вместо них гораздо более медленные бинды, и добавляется лишний загрузчик картинки которого можно было бы (и хочется) избежать. Больше ничего не придумывается. Может быть, однажды, ToolTip переберется из симбиан в десктоп, а пока будем экспериментировать дальше.

А теперь страшная и неожиданная новость намбер ту: градиенты в QML бывают только сверху вниз :) и что бы сделать градиент слева направо рисуем его в отдельном Rectangle и применяем к нему нехитрые трансформации поворота и переноса :) Как по мне - это бессовестный костыль учитывая какие возможности имеются у обыкновенных Qt виджетов по рисованию градиентов.

Вместо:
Rectangle {

...
        gradient: Gradient {
            GradientStop {
...
            }
            GradientStop {
...
            }
}
}

пишем:
Rectangle {
...

//
выходим из ситуации при помощи дополнительно объекта
    Rectangle{

        // поворот
        rotation: 90

        // меняем ширину с высотой
        width: parent.height
        height: parent.width


        // передвигаем
        x: height

        // ... и сам градиент
        transformOrigin: Item.TopLeft
        gradient: Gradient {
            GradientStop {
...
            }
            GradientStop {
...
            }
        }

    }


четверг, 31 мая 2012 г.

Определить день недели по дате C / C++

Всем привет,
Сегодня хорошее настроение по программировать ночью. (Играюсь тестовым заданием на вакансию в Binary Studio) Наткнулся на нераскрытую тему сисек  православного определения дня недели по дате.

Гугл до 3й страницы предлагает страшные велосипеды основанные на:
  1. Формуле Зеллера (сегодня впервые узнал о ней) тыц
  2. Win API пары функций:
    SystemTimeToFileTime(&st, &ft);
    FileTimeToSystemTime(&ft, &st);
  3.  предлагали использовать SQL запрос :) 
В тоже время красивое и кроссплатформенное решение достигается использованием пары функций gmtime() для UTC времени и localtime() для локального времени. Вывод текущего дня недели будет таким:
 
char * weekday[] = { "Sun", "Mon", "Tue", "We", "Thu", "Fri", "Sat"};

    // текущее время в UTC:
    time_t currentTime( ::time( NULL ) );

    // Определение дня недели и дня года:
    struct tm * ptm;
    ptm = ( localtime( &currentTime ) );
    // Вывод
    std::cout << weekday[ptm->tm_wday] << std::endl;

Вот так все просто решается :) Надеюсь кому нибудь пригодится.
Первое сообщение, оно же и тестовое. Интересно проверить что здесь и как работает. Куда щелкать и тд.