• Разоблачение рекламной статьи Intel
    +4
    У того же самого Intel-а в примерах декодера видео, построенного на Intel Media SDK, инкремент декодированных фреймов происходил в двух местах, в результате чего показывался в два раза больший fps. Несколько часов я потратил чтобы понять почему мой собственный пример на их компонентах выдает меньший fps чем их пример. Конечно, я думаю, что это была непреднамеренная ошибка.
  • Ликбез: методы ресайза изображений
    0
    Вы вот это www.4p8.com/eric.brasseur/gamma.html имеете в виду?

    Уменьшение изображения
    image

    в два раза большинством программ дает результат
    image

    хотя корректно было бы так:
    image
  • Во всём виноват компилятор
    +12
    Забавно, что в Google C++ Style Guide написана обратная рекомендация:
    Use sizeof(varname) instead of sizeof(type) whenever possible. Use sizeof(varname) because it will update appropriately if the type of the variable changes. sizeof(type) may make sense in some cases, but should generally be avoided because it can fall out of sync if the variable's type changes.

    google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=sizeof#sizeof
  • Yet another factory
    +1
    У вас статический объект для регистрации будет инициализирован для каждой единицы трансляции в которую включен заголовочный файл с макросом UF_REGISTER_DERIVED в результате регистрация может быть вызвана несколько раз.

    чтобы избежать этого можно воспользоваться приемом который называется счетчик Шварца (Jerry Schwarz counter)

    template<class T>
    class AutoRegistrer
      {
      public:
        AutoRegistrer(const QString& name)
        {
          if (registered_++ == 0)
            factory()->registerClass<T>(name);
        }
      private:
        static int registered_;  
    };
    
    template<class T> int AutoRegistrer<T>::registered_= 0;
    

  • «Конкурс параллельного программирования Accelerate 2012» или «6 ультрабуков и 10 SSD хватит всем!»
    +1
    в readme:
    A large input file is available from:
    intel-software-academic-program.com/contests/ayc/early2012/test_input_1.tar.bz2

    Homo Sapiens оттуда, там файл так называется )
  • «Конкурс параллельного программирования Accelerate 2012» или «6 ультрабуков и 10 SSD хватит всем!»
    0
    Уточните пожалуйста соотношение размеров и количества ref и input данных.

    В примере лежит Homo_sapiens.GRCh37.66.dna.chromosome.19.fa размером 60 Мб и две последовательности примерно по 2Кб.

    То есть у нас есть одна большая ref строка и много (сколько примерно?) маленьких input последовательностей, важно то, что размер ref существенно больше чем размеры input. Правильно ли я все понял?
  • TeamLab Document Editor на canvas: стирая грани между desktop и online
    0
    Cloud9 IDE насколько я помню рендерит основной текст в DOM, на канве только правая часть — миниатюра
  • Tactoom. Как насчет мидл-блоггинга?
    +1
    Посмотрите статистику сколько человек покидает страницу с регистрацией. Мне кажется, заставлять вводить человека 6 интересов только для того чтобы зайти и попробовать что это такое — перебор. Можно попробовать сделать вход через аккаунты фейсбука/вконтакте и импорт интересов оттуда.
  • Компилирование заголовочных файлов или документация на халяву
    0
    под студию можно в проекте для всех хедеров указать в Build Tool C/С++ Compiler и откомпилировать их (разумеется, в таком виде проект подходит только для валидации)
  • Компилирование заголовочных файлов или документация на халяву
    0
    Я имел в виду, что придерживаться правила ставить хедер на первое место, иначе смысла нет, гарантировать никто не сможет. И штатно работать с pch время от времени проверяя компилируемость хедеров.
  • Компилирование заголовочных файлов или документация на халяву
    +1
    внутри pch включать опцию define-ом типа PROJECT_PCH_OFF и собирать тестовую сборку без них

    stdafx.h:
    #ifndef STDAFX_H_
    #define STDAFX_H_
    #ifndef PROJECT_PCH_OFF
    #include <boost/shared_ptr.hpp>
    //...
    #endif
    #endif

  • Ставим объекты на поток, паттерн фабрика объектов
    0
    К написанному добавлю, что часто возникает проблема как и когда регистрировать конкретные классы в фабрике.
    Обычно ситуация такая: у нас есть базовый класс и мы добавляем по мере необходимости и/или разработки конкретные экземпляры. Хотелось бы избавиться от глобальной функции регистрации, где все объекты добавляются в одном месте, т.е., грубо говоря, так делать не желательно:

    int main()
    {	
        TypeFactory factory;
        factory.add<Foo>(fooType);
        factory.add<Bar>(barType);
    }
    


    Нам придется все время следить и изменять этот код. Хотелось бы иметь возможность добавить .cpp и .h файл с новым классом и автоматически обеспечить регистрацию.
    Одно из решений — использовать так называемый счетчик Шварца. Приведу фрагмент кода, там фабрика немного по-другому реализована, но думаю, что все должно быть понятно.

    #include <map>
    #include <boost/shared_ptr.hpp>
    #include <boost/function.hpp>
    #include <boost/noncopyable.hpp>
    
    
    template <class IdType, class Base>
    class ObjectFactory : boost::noncopyable
    {
    public:
        typedef IdType IdTypeUsing;
    protected:
        typedef boost::shared_ptr<Base> BasePtr;
        typedef boost::function<BasePtr()> CreateFunc;
        typedef std::map<IdType, CreateFunc> FactoryMap;
    
    public:
        BasePtr create(const IdType & id) const
        {
            typename FactoryMap::const_iterator it = map_.find(id);
            return (it != map_.end()) ? (it->second)() : BasePtr();
        }
    
        void add(const IdType & id, CreateFunc func)
        {
            FactoryMap::iterator i = map_.find( id );
            if ( i == map_.end() )
                map_.insert(  FactoryMap::value_type(id, func) );        
            else
                i->second = func; // элемент уже есть: что то сделать, например, заменить
        }
    
    private:
        FactoryMap map_;
    };
    
    template <class T>
    class RegisterElement
    {
    public:
        typedef boost::shared_ptr<T> TPtr;
    public:
        template <class Factory>
        RegisterElement(Factory & factory, const typename Factory::IdTypeUsing & id)
        {
            if (class_registered_++ == 0) // Jerry Schwarz counter
                factory.add(id, &CreateElmImpl);            
        };
    private:
        static TPtr CreateElmImpl() { return TPtr( new T() ); }
        static int class_registered_;
    };
    
    template<class T> int RegisterElement<T>::class_registered_ = 0;
    


    Базовый класс, который будет использоваться, например, для чтения XML элеменов:
    class XmlElement {}; 
    ObjectFactory<std::string, XmlElement> XmlFactory;
    


    Файл XmlPic.h:
    class Pic : public XmlElement {}; 
    
    namespace  { 
    // элемент зарегистрируется гарантированно один раз
    RegisterElement<Pic> RegisterElementPic(XmlFactory, "pic");
    }
    


    файл XmlText.h
    class Text : public XmlElement {};
    namespace  {
    RegisterElement<Text> RegisterElementText(XmlFactory, "text");
    }
    
  • Принцип самурая
    0
    Изложенный принцип является частным случаем следования одной из гарантий безопасности исключений Абрахамса (базовой, строгой или отсутствия) а также призывает (неясно в каких случаях) обеспечивать нейтральность по отношению к исключениям.

    Обеспечение одной из гарантий является обязательным требованием для любого метода при написании хорошего кода, а нейтральность к исключениям требуется в основном в библиотеках. На практике, если функция обладает достаточными знаниями чтобы обработать исключение то она должна это сделать, иначе — преобразовать или прокинуть исключение наружу.
  • Утечку исходников KAV 8 допустил бывший сотрудник компании
    0
    BSD лицензия позволяет использовать код в проприетарных коммерческих продуктах
  • Шаблонная магия, метафункция IsValidExpression
    +2
    попробовал придумать решение не требующее C++0x, получилось что-то типа этого:
    только под msvc-8.0 и msvc-9.0 выдается результат 1010 (правильный), а под gcc 4.4.0 — 1000
    #include <iostream>
    
    typedef char Small;
    class Big {char dummy[2]; };
    
    template <size_t> struct ClassSelector {
        typedef Big type_;
    };
    
    template <> struct ClassSelector< sizeof(1)/sizeof(1) > {
        typedef Small type_;
    };
    
    #define DECLARE_IS_VALID_EXPRESSION( NAME, U_BASED_RUNTIME_EXPRESSION )\
    template< class T > \
    struct NAME\
    {\
        template< typename U > static typename ClassSelector< sizeof( U_BASED_RUNTIME_EXPRESSION, 1 ) / sizeof( U_BASED_RUNTIME_EXPRESSION, 1 )>::type_ F( void * );\
        template< typename U > static typename ClassSelector<0>::type_ F( ... );\
        enum {  is_valid =  ( sizeof( F<T>( NULL ) ) != sizeof( ClassSelector<0>::type_ ) ) };\
    };
    
    struct Foo{ void f(); };
    struct Bar{};
    
    DECLARE_IS_VALID_EXPRESSION(HasF,  ( ( U * ) NULL )->f() );
    
    DECLARE_IS_VALID_EXPRESSION(
        IsStreamSerializationSupported,
        ( (std::cout << *(U *)NULL), (std::cin >> *(U *)NULL) ) );
    
    int main(int argc, char *argv[])
    {
        std::cout  << HasF<Foo>::is_valid <<
                HasF<Bar>::is_valid <<
                IsStreamSerializationSupported<double>::is_valid <<
                IsStreamSerializationSupported<Bar>::is_valid ;
        return 0;
    }