Архив за 04 сентября 2013 - 2

Компания Sony представила смартфон Xperia Z1, ранее известный под условным наименованием Honami.

Водонепроницаемый смартфон Sony Xperia Z1 оснащен камерой разрешением 20,7 Мп

Читать полностью »

Компания Sony представила смартфон Xperia Z1, ранее известный под условным наименованием Honami.

Водонепроницаемый смартфон Sony Xperia Z1 оснащен камерой разрешением 20,7 Мп

Читать полностью »

Доброго времени суток!

Задача

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

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

Исходные данные

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

class IFactoryBasic
{
public:
    IFactoryBasic() {}
    virtual ~IFactoryBasic() {}
    virtual Test* create(const QString &key, const QString &args)=0;
};

где Test — некий базовый класс

class Test
{
protected:
    QString _word;
public:
    Test(const QString &word):_word(word) {}
    virtual ~Test() {}
    virtual void test(){ qDebug()<<"test "<<_word; }
};

class TestChild: public Test
{
public:
    TestChild(const QString &word): Test(word) {}
    virtual void test() { qDebug()<<"test child"<<_word; }
};

TestChild — наследник Test
Оба класса принимают в конструкторе строковый параметр word, который потом мы можем верифицировать в функции test().

Первый способ

Способ простой. Он основан на создании шаблонного каркаса для будущей фабрики.

template<class T, class C, class A>
class IFactory
{
    QMap<QString, C* (T::*)(const A&) > handler;
protected:
    void add(const QString &key, C *(T::*func)(const A &))
    {
        handler[key]=func;
    }

public:
    IFactory() {}
    virtual ~IFactory() {}
    C *make(const QString &key, const A &args)
    {
        if(handler.contains(key))
        {
            T* inheritor = dynamic_cast<T*>(this);
            if(inheritor)
                return (inheritor->*handler[key])(args);
        }
        return 0;
    }
};

Здесь есть маленькое обязательство для пользователей класса. Первый шаблонный параметр должен быть классом, который наследуется от IFactory. Далее будут пояснения, для чего это было нужно.
handler в классе IFactory — ассоциативный контейнер, содержащий ключ и соответствующую функцию создания объекта. Сигнатура функции порождения описывается как C* (T::*)(const A&), то есть возвращаемое значение будет иметь указатель на некий класс C, как аргумент функции передается ссылка на объект типа A.
Функция add(...) добавляет в контейнер пару ключ-функция <key,func>.
Функция make(...) вызывает функцию порождения, если она имеется в контейнере (предварительно динамически преобразовав тип указателя this к типу наследника, иначе нельзя вызвать функции, которые там были определены).
Это основной каркас фабрики, осталось описать конкретную фабрику

class FactoryFst: public IFactory<FactoryFst, Test, QString>, public IFactoryBasic
{
    Test *createOrigin(const QString &args){ return new Test(args); }
    Test *createChild(const QString &args) { return new TestChild(args); }
public:
    FactoryFst()
    {
        add("test", &FactoryFst::createOrigin);
        add("testchild", &FactoryFst::createChild);
    }

    Test *create(const QString &key, const QString &args) { return make(key, args); }
};

Нетрудно догадаться, что мы используем множественное наследование для удовлетворения требованиям интерфейса IFactoryBasic. Для другого родителя мы явно указываем наследника FactoryFst, возвращаемый указатель будет указателем на объект класса Test, и в качестве аргумента передается ссылка на объект QString.
В соответствии с этим определением создаются функции, генерирующие объекты типа Test и TestChild:
Test *createOrigin(const QString &args){ return new Test(args); } — создает объект типа Test, передавая ему в конструктор аргумент QString.
Test *createChild(const QString &args) { return new TestChild(args); } — аналогично создает объект типа TestChild.
Остается только в конструкторе FactoryFst зарегистрировать данные функции и определить функцию create(...) интерфейса IFactoryBasic.

Второй способ

Этот метод в большей степени использует шаблоны.
Для построения фабрики нам нужна небольшая подготовка. Для начала нужно определить некоторые используемые фабрикой классы.

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

Прошло уже почти два месяца с момента моего последнего поста об образовании. Мне начали писать разные люди и интересоваться, как идут дела. Я специально ничего не публиковал до тех пор, пока все не будет более-менее утрясено. Но теперь я рад официально анонсировать запуск проекта «Фабрика Знаний» в Сокатово.

image
Читать полностью »

Некоторое время назад мы узнали, что Sony готовит любопытные автономные объективы DSC-QX10 и DSC-QX100. Устройства, по сути, являются практически полноценными камерами, лишёнными дисплеев. Их роль будут выполнять смартфоны пользователей.

Читать полностью »

От переводчика: предлагаю вашему вниманию вольный перевод статьи из блога Code Climate под названием 7 Patterns to Refactor Fat ActiveRecord Models.
Code Climate — мощное средство анализа качества кода и безопасности Ruby on Rails — приложений.

Введение

Когда разработчики начинают использовать Code Climate для улучшения качества их Rails-кода, им приходится избегать «распухания» кода их моделей, так как модели с большим количеством кода создают проблемы при сопровождении больших приложений. Инкапсуляция логики предметной области в моделях лучше, чем помещение этой логики в контроллеры, однако такие модели обычно нарушают Принцип единственной обязанности (Single Responsibility Principle). К примеру, если поместить в класс User все что относится к пользователю — это далеко не единственная обязанность.
Читать полностью »

Миниатюрные компьютеры SolidRun CuBox-i, один из которых показан на иллюстрации, построены на однокристальных системах серии Freescale i.MX6. Доступны модификации с одноядерным, двухъядерным и четырехъядерным процессором ARM Cortex A9, работающим на частоте до 1,2 ГГц (в сводной таблице спецификаций на сайте компании приведено значение 1 ГГц). Стоимость младшей модификации CuBox-i1 равна $45, старшей CuBox-iPro — $120. Помимо компьютера, покупатель получает карточку памяти microSD объемом 4 ГБ с ОС Ubunti и адаптер питания.

При разработке игр или приложений у каждого девелопера возникают вопросы о монетизации. Естественно сразу же приходит на ум AdMob, хотя таких систем намного больше, и возможно, в некоторых случаях имеет смысл даже отказаться от него. Ведь баннерная реклама обычно достаточно навязчива и “бьет наугад”, куда интересней более персонализированная реклама, в таком случае и рекламодатель, паблишер и самое главное конечный пользователь останутся в выигрыше.
Мы составили список необычных рекламных систем, которые могут помочь разработчикам в монетизации их приложений. А также краткий обзор услуг и цен для рекламодателей.
Не AdMob ом единым. Обзор интересных рекламных сетей и не только
Читать полностью »

Смартфонов Nokia больше не будет

Название бренда Nokia, одного из самых легендарных марок в мобильной индустрии, больше никогда не будет украшать другой смартфон.
В соответствии с условиями приобретения Нокии Microsoft за $7,2 млрд торговые марки «Lumia» и «Asha» перейдут к Редмонду, марка же «Nokia» останется у финнов и будет использоваться только на «бабушкофонах», работающих на платформах 30- и 40-series — так записано в 10-летнем лицензионном соглашении (Самой Nokia запрещено использовать бренд Nokia на любых мобильных устройствах до 31 декабря 2015 года). Это значит, что смартфоны в дальнейшем будут выпускаться под брендом «Microsoft», а Nokia говорит «Прощай» рынку смартфонов, который когда-то помогла создать.

«Lumia» и «Asha» теперь принадлежат Microsoft


Читать полностью »

В предыдущей статье я рассказал, как добавить проверку одноразовых кодов при логине на свой сервер по SSH. Статья завершалась словами «если ходим по ключу — двухфакторная аутентификация не работает (не используется PAM)».

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

Двухфакторная аутентификация в OpenSSH: ключ+одноразовый код + Двухфакторная аутентификация в OpenSSH: ключ+одноразовый код

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js