ABOUT US

Our development agency is committed to providing you the best service.

OUR TEAM

The awesome people behind our brand ... and their life motto.

  • Neila Jovan

    Head Hunter

    I long for the raised voice, the howl of rage or love.

  • Mathew McNalis

    Marketing CEO

    Contented with little, yet wishing for much more.

  • Michael Duo

    Developer

    If anything is worth doing, it's worth overdoing.

OUR SKILLS

We pride ourselves with strong, flexible and top notch skills.

Marketing

Development 90%
Design 80%
Marketing 70%

Websites

Development 90%
Design 80%
Marketing 70%

PR

Development 90%
Design 80%
Marketing 70%

ACHIEVEMENTS

We help our clients integrate, analyze, and use their data to improve their business.

150

GREAT PROJECTS

300

HAPPY CLIENTS

650

COFFEES DRUNK

1568

FACEBOOK LIKES

STRATEGY & CREATIVITY

Phasellus iaculis dolor nec urna nullam. Vivamus mattis blandit porttitor nullam.

PORTFOLIO

We pride ourselves on bringing a fresh perspective and effective marketing to each project.

  • «Косвенно тезисы Сноудена подтверждает опрос IT-специалистов, проведенный нами в конце 2014 года. 46% респондентов сообщили, что потеря их мобильного устройства и последующая кража корпоративной информации из его памяти подвергнут риску их компании», — сообщил «Газете.Ru» Оськин.
     А я в рамках проекта KalpaCloud давно именно об этом и говорил. Основа безопасности лежит в архитектуре программных систем.
    Вы построили мир на вебе, публичной почте. Вы гоняете данные на сторону клиента, которые хранятся во внутренних кешах браузера.
    Что же вы еще хотите? Безопасности?
  • Сравнение WiredTiger c Postgres (домашний тест)

    Сравнение WiredTiger c Postgres (домашний тест)

    Когда говорят интересно и показывают фигуры о прекрасном всегда хочется почесать затылок и понять что же есть на самом деле. Не скрою, я весьма воодушевился сообщением о выходе мотора баз данных WiredTiger. Он, как говорят, настолько хорош, что его взяли на вооружение в MongoDB.

    Значит надо проверить.

    Учинил простой тест. Создается таблица из двух полей. Ключ - строка, значение- строка. Ключ, понятное дело, primary key. Для поля "value" строится индекс. В варианте с Pg получается два индекса. (Как рулит первичным ключем  WT еще надо разбираться. Но фактически  WT создает только 2 файла а Pg 3(один с данными и 2 с индексами. Значит Pg будет оперировать собственно таблицей и двумя индексами, что всяко сложно)
    Добавляемые строки - случайные UUID

    В WT создание таблицы выглядит вот так.

    ret = session->create(session, "table:access", key_format=S,value_format=S,columns=(key, value)");
    ret = session->open_cursor(session, "table:access", NULL, NULL, &cursor);
    session->create(session, "index:access:value", "columns=(value)");
    Тест для Wt
    QTime tm;
        tm.start();
        for(int i=0; i<1000000 font="" i="" nbsp="">{
            QByteArray keyarray=QUuid::createUuid().toString().remove('{').remove('}').toLocal8Bit();
            QByteArray valuearray=QUuid::createUuid().toString().remove('{').remove('}').toLocal8Bit();
            cursor->set_key(cursor, keyarray.data());
            cursor->set_value(cursor, valuearray.data());
            ret = cursor->insert(cursor);
       
        }
     

      qDebug()<<"Insert million of pairs"<

    Тест для Pg
     for(int i=0; i<1000000 br="" i="" nbsp="">            Command.prepare("insert into test(id, value) values(:id, :value)");
                Command.bindValue(":id",    QUuid::createUuid().toString());
                Command.bindValue(":value", QUuid::createUuid().toString());
                Command.exec();
                 }
    WT использует отложенную модель записи, потому в PG отключим fsync.


    Запускаем тест несколько раз и замерим время работы процедуры на пространстве возрастающих данны По итогу пяти прогонов для WiredTiger получил такие результаты в секундах
    1. 97    (Круто)
    2. 316  (Прилично)
    3. 743
    4. 1188
    5. 2193
    Для Postgres получил
    1. 500
    2. 690
    3. 1000
    4. 1196
    5. 955
    На пятом миллионе WT скис окончательно спустившись до 2193 секунд. При этом Postgres дает стабильные и прогнозируемые результаты.
    Давайте не будем забывать, что WiredTiger это ядро, менеджер записей, а Postgres - полновесная база данных со всем набором вытекающих из этого сложностей.

    Для очистки совести я добавил шестой миллион записей в Pg в одной транзакции. Получил результат 611.
    Честно не очень понимаю что за фигуры показывают на презентации свидетели Wt и Mongo. 

    Вывод. Конечно я не великий спец в тестировании и со своими драными лаптями зря полез в эту тему, но мне все же кажется, что лучшее - враг хорошего.потому, сижу спокойно на Postgresql иногда поглядывая на новомодные штуки.
  • WiredTiger. Просто взгляд.[update]

    WiredTiger. Просто взгляд.[update]

    Открыл для себя  WiredTiger. Говорят это очень крутой NoSql мотор, который начали использовать в MongoDb. Решил попробовать и я, для чего прям из примера написал программку.


        WT_CONNECTION *Volume1Connection;
        //    WT_CONNECTION *Volume2Connection;
        WT_CURSOR *cursor;
        WT_SESSION *session;
        const char *key, *value;
        int ret;
    
    
        if ((ret = wiredtiger_open("./Volume", NULL, "create", &amp;Volume1Connection)) != 0 ||
                (ret = Volume1Connection-&gt;open_session(Volume1Connection, NULL, NULL, &amp;session)) != 0)
        {
            fprintf(stderr, "Error connecting to %s: %s\n",
                    ".", wiredtiger_strerror(ret));
        }
    
    
        ret = session-&gt;create(session, "table:access", "key_format=S,value_format=S");
        qDebug()&lt;&lt;ret;
        ret = session-&gt;open_cursor(session, "table:access", NULL, NULL, &amp;cursor);
    
    
        QHash&lt;QUuid, QUuid&gt; TempArray;
        for(int i=0; i&lt;10; i++)
            TempArray.insert(QUuid::createUuid(), QUuid::createUuid());
    
    
    
    
        QHashIterator&lt;QUuid, QUuid&gt; i(TempArray);
        while (i.hasNext())
        {
            i.next();
            qDebug()&lt;&lt; i.key() &lt;&lt; ": " &lt;&lt; i.value();
    
    
            cursor-&gt;set_key(cursor,  i.key().toString().remove('{').remove('}').toLocal8Bit().data());        /* Insert a record. */
            cursor-&gt;set_value(cursor,i.value().toString().remove('{').remove('}').toLocal8Bit().data());
            ret = cursor-&gt;insert(cursor);
        }
    
    
        ret = cursor-&gt;reset(cursor);            /* Restart the scan. */
        while ((ret = cursor-&gt;next(cursor)) == 0)
        {
            cursor-&gt;get_key(cursor, &amp;key);
            cursor-&gt;get_value(cursor, &amp;value);
            printf("Got record: %s : %s\n", key, value);
        }
    
    
        i.toFront();
        while (i.hasNext())
        {
            i.next();
            qDebug()&lt;&lt; i.key() &lt;&lt; ": " &lt;&lt; i.value();
            cursor-&gt;set_key(cursor, i.key().toString().remove('{').remove('}').toLocal8Bit().data());
            const char* val;
            if(cursor-&gt;search(cursor)==0)
            {
                cursor-&gt;get_value(cursor, &amp;val);
                qDebug()&lt;&lt;"---- key"&lt;&lt;i.key()&lt;&lt;"value from base"&lt;&lt;val;
            }
            else
                qDebug()&lt;&lt;"key not found";
            //cursor-&gt;search()
        }
    
    
        cursor-&gt;close(cursor);
        ret = Volume1Connection-&gt;close(Volume1Connection, NULL);


        quit();

    В результате прогона программки получаем в базе мусор. Я как-то к этому не привык. Да и не хочется верить в то, что мотор не работает.
    Конечно это я где-то что-то делаю не так.
    Кто знает! Кто пробовал! Подсобите!
    _______________
    Разобрался. Строки для передачи курсору надо много тщательней готовить принимая во внимание особенности api.
    Должен отметить, что это очень интересный инструмент. И хоть я и готов даже говорить о замене существующего (пусть и неспешного) комфорта постгреса, но явно использовать в некоторых местах буду.
    Ну а там, видно будет.
  • Сказка тысячи и одной ночи.

    Сказка тысячи и одной ночи.

    Давайте представим, что некий условный программист-фантазер решил поставить перед собой практически невыполнимую задачу. Он хочет рассмотреть, исследовать и изучить процесс создания очень большой информационной системы. Но ему не хочется брать на вооружение уже изученные архитектуры систем, да и далеко не все авторы больших систем рады делиться своими даже теоретическими наработками.

    Разумеется такой опыт некоторым покажется более чем странным. Вместо того, чтобы вооружаться PHP, Ruby on Rails, Java и JS он собирается понять как пройти этот путь дорогой, которую ему подскажет судьба, сладчайшая неопределенность и его личный вкус.
    Да, странное желание. Но это желание того самого условного программиста и разве оно может касаться кого-либо? Некоторые в качестве хобби пишут медленные и унылые (и даже операционные) системы на JavaScript, некоторые создают свои CMS, некоторые просто пьют пивцо, администрируя маленькую корпоративную сеточку. А вот условному программисту хочется понять как можно спроектировать, создать и научить работать информационную систему масштаба Google. Ну а задачи для нее конечно найдутся в предостаточном количестве.

    Вот например. Смешно же когда работники органов государственной власти и корпоративного управления обмениваются документами через публичные почтовые службы. О безопастности и удобстве решений на веб даже уже и говорить не вполне прилично. Разве что немного постаревшая молодежь по-инерции рассуждает о прелестях разработки для веб. (Как говорится, на что учились) Или вот кризис на дворе. В этих условиях очень хочется строить виртуальные рабочие пространства и оставлять работников дома. А как же это сделать если все работают через веб, да с файлами. Помилуйте! О каком режиме конфиденциальности можно говорить если документы свободно гуляют по сети. Я уже не говорю о том, что на дворе век мобильных приложений и все вернулось на круги своя.

    К чему это я? Так вот если кто спросит условного программиста почему, мол, ты вот так решил поступить и так а не вот эдак. Дык вот условный программист и ответит, что пишет лишь свой фантазийный роман с орками, гоблинами, веселыми играми и прекрасными принцессами. Кстати, а может и фантастика научная получится или философский роман? Кто знает.
    А кому не нравится, пусть читают свои детективчики на PHP или шпионские романы на Java и проходят мимо. Книжный магазин велик. Романов на всех хватит.

    Посему, "торжественно клянусь, что замышляю только шалость!"
  • Сказка о setStyleSheet (тот который в Qt)

    Сказка о setStyleSheet (тот который в Qt)


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

    Разумеется и я в числе таких. Раньше я цеплял на кнопочки картинки, но по сети их гонять (как мне казалось) - только создавать дополнительный трафик. Как еще больше снизить объем передаваемых данных? С помощью шрифтов! Есть замечательный проект fontello который из картинок генерит шрифт. Оный шрифт уже можно использовать.

    И сделал я свой шрифт KalpaSymbols, и загрузил его на сервер, и научил его загружаться в клиент и становиться доступным для использования. Для этого есть средство 
    QFontDatabase::addApplicationFontFromData
    И все вроде хорошо, и грузится шрифт на сторону клиента и символы нужные показывает. И вот проверил я работу этой штуки на Винде. И тут обнаружилась странность. Нет, не то чтобы метод не работает. Работает, но  (как бы это сказать) иногда. Причем закономерности в распознании нужного fontFamily я не выявил. Особенно противно когда много раз приложение стартует штатно, с нормальными шрифтовыми иконками, 


    а потом РАЗ, и не работает. Или пустота, или какой-то совершенно левый шрифт загрузит.


     А шрифт для символа я определяю
    setStyleSheet("QLabel{ color: #38363A; font-size: 12px; font-family: \"kalpa_symbols\"; }");
     Проверял я всяко. И смотрел регистрируется ли шрифт в списке доступных гарнитур, и вшивал шрифт непосредственно в клиент. Ничего не помогает. 

    Попробую сейчас отказаться от setStyleSheet и определить явно загрузив шрифт через setFont. Может получится что.

    Друзья, если у кого есть мысли на сей счет, буду очень признателен за совет. Ужели возвращаться к картинкам?
  • Поиск по этому блогу

    Copyright (c) Oleg Shall. Технологии Blogger.

    WHAT WE DO

    We've been developing corporate tailored services for clients for 30 years.

    CONTACT US

    For enquiries you can contact us in several different ways. Contact details are below.

    Oleg_old

    • Street :Road Street 00
    • Person :Person
    • Phone :+045 123 755 755
    • Country :POLAND
    • Email :contact@heaven.com

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation.