Публикации

вчера в 11:52

Городские легенды о медленных вызовах виртуальных функций

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

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

В тексте выше ключевое слово «если». Что, если компилятор знает, какую функцию на самом деле надо вызывать?
14317
82
DmitryMe 62,4
вчера в 11:42

Подробности о новом движке рендеринга Microsoft для «Project Spartan» перевод

От редактора Smashing Magazine:

На прошлой неделе Microsoft сделала самое значимое объявление для веба с тех пор, как в 1995 году запустила Internet Explorer: новый браузер под кодовым названием “Project Spartan”. Что это означает для нас, как разработчиков и дизайнеров? Какой движок рендеринга будет использовать Spartan и как он будет влиять на нашу работу? Мы поговорили с Джейкобом Росси, старшим инженером в команде веб-платформы Microsoft о новом браузере, используемом движке рендеринга и о том, заменит ли он в последствии Internet Explorer. Эта статья, написанная Джейкобом, является результатом нашего обсуждения и проливает свет на некоторые аспекты браузера, которые могут быть вам полезны.



Project Spartan, новый браузер от Microsoft, официально объявленный на прошлой неделе.

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

Эта статья рассказывает внутреннюю историю движка рендеринга Spartan: как он появился и как 20-летняя история платформы Internet Explorer (Trident) помогла нам определиться с подходом к его проектированию.
26368
41
kichik 104,3
вчера в 15:03

Расширение для нормального выделения текста внутри ссылки в браузерах

Во вчерашнем посте про браузер Vivaldi опять всплыла тема нормального выделения текста внутри ссылки, как в старой Опере. Особенно она актуальна для браузеров на WebKit/Blink.

Для многих проблема решается установкой специального расширения для браузера.
11850
83
Makaveli 130,6
вчера в 12:49

Канделябр vs леденец

Не успела наша команда разработчиков Марьяжа для Android протрезветь после празднования нового 2015 года, как в отзывах на Google Play начали сыпаться единицы за “тормоза”. Единицы сыпались от пользователей достаточно мощных устройств вроде Nexus 5, 6 и 7. Единственное, что их объединяло — это операционная система: Android 5 (Lollipop).
14770
56
вчера в 11:57

Boost.DI: внедрение зависимости в С++ перевод tutorial

«Не звони нам. Мы позвоним тебе сами.» — принцип Голливуда

Внедрение зависимости (Dependency Injection — DI) означает передачу (внедрение) одной или более зависимости какому-либо объекту (клиенту, компоненту) таким образом, что после внедрения эта зависимость становится частью состояния объекта. Это немного напоминает паттерн проектирования Стратегия, с той лишь разницей, что стратегия задаётся лишь однажды — в конструкторе. DI позволяет создавать более слабо-связанную архитектуру приложения, которая лучше поддаётся поддержке и тестированию.

Итак, ещё раз плюсы:
  • Уменьшает связность компонент (отделяет бизнес-логику от создания объекта)
  • Позволяет писать более поддерживаемый код (в одни и те же объекты мы легко можем внедрять разные зависимости)
  • Позволяет писать более тестируемый код (мы можем легче использовать стабы и моки)


Без внедрения зависимости С внедрением зависимости
class example {                         
public:  
    example()                           
        : logic_(new logic{})           
        , logger_(                      
            logger_factory::create()    
          )                             
    { }  
         
    int run() const;                    
         
private: 
    shared_ptr<ilogic> logic_;          
    shared_ptr<ilogger> logger_;        
};                             

 class example {
 public:
     example(shared_ptr<ilogic> logic
           , shared_ptr<ilogger> logger)
       : logic_(logic), logger_(logger)
     { }

     int run() const;

 private:
     shared_ptr<ilogic> logic_;
     shared_ptr<ilogger> logger_;
 };


5855
111
tangro 131,3
вчера в 18:20

Еще одно маленькое инженерное расследование или плач Ярославны

«Я знал, что будет плохо, но не знал, что так скоро» (В.Цой)

Не знаю, что послужило причиной написания данного поста, наверное просто наболело, но конкретным побудительным мотивом стало два события — одно ИЗ-ЗА рубежа, а другое отечественного происхождения. Неизвестно, какое хуже, но об этом судить читателю, так что начнем.

Все началось с того, что одно из изделий нашей фирмы не стало включаться при пониженной температуре. Поскольку используемый в данном изделии модуль питания фирмы Murata уже ранее применялся в других изделиях и проблем не создавал, долгое время приставали именно к нашей плате. Однако, после того, как были отброшены все возможные объяснения (в результате проверок и эспериментов), последний оставшийся вариант и является правильным, каким бы маловероятным он не казался (метод Шерлока Холмса).

То есть было высказано предположение, что дело действительно в стандартном модуле от известной фирмы. И действительно, эксперименты показали, что модуль питания при определенных значениях входного напряжения (находящихся внутри области работоспособности) и определенных значениях температуры модуля (тоже внутри допустимых) не может включиться при работе на емкостную нагрузку, превосходящую определенное значение (и при этом почти на порядок не дотягивающую до максимально допустимой).
11620
28
GarryC 30,7
вчера в 15:23

Панорамный пассивный радиолокатор из песочницы

В этой статье я хочу рассказать об очередном эксперименте с пассивным панорамным радиолокатором. Предыдущие эксперименты описаны в статьях «Радиотелескоп» и «СВЧ пассивный радиотеплолокатор в диапазоне 10 ГГц».

Первые панорамные радиоснимки были получены с помощью сетчатой параболической антенны диаметром 1,8 м установленной стационарно.

Следующий радиолокатор не был панорамным, т.е. он мог работать только в азимутальной плоскости. Зато он позволил поэкспериментировать, как в плане механики и электроники, так и в плане использования антенн малого диаметра. Сначала было не понятно – будут ли эффективны зеркала диаметром около 50 см при приёме собственных шумов объектов?

После первых экспериментов сразу стало ясно, что это вполне возможно и меня посетила мысль сделать небольшой мобильный панорамный радиолокатор с антенной диаметром 50 см.
10218
74
EvgenyR 25,1
вчера в 16:33

ReactJS для глупых людей из песочницы

Пытаясь разобраться с библиотекой от Facebook ReactJS и продвигаемой той же компанией архитектурой «Flux», наткнулся на просторах интернета на две занимательные статьи: «ReactJS For Stupid People» и «Flux For Stupid People». Решил поделиться с хабравчанами переводом первой (а чуть позже и второй) статьи. Итак, поехали.

ReactJS для глупых людей


TL;DR В течении долгого времени я пытался понять, что такое React и как он вписывается в структуру приложения. Это статья, которой мне в свое время не хватало.

Что такое React?


Чем отличается React от Angular, Ember, Backbone и других? Как управлять данными? Как взаимодействовать с сервером? Что, черт возьми, такое JSX? Что такое «component»?

СТОП.

Остановитесь прямо сейчас.

React — это ТОЛЬКО УРОВЕНЬ ПРЕДСТАВЛЕНИЯ.
9863
148
ElianL 23,8
вчера в 16:06

Новая уязвимость GHOST угрожает популярным дистрибутивам на базе Linux

image

Уязвимость в распространенных дистрибутивах Linux может позволить злоумышленнику получить удаленный контроль над системой. Под ударом оказались пользователи Debian 7 (wheezy), Red Hat Enterprise Linux 6 & 7, CentOS 6 & 7, Ubuntu 12.04.

Информация о новой уязвимости (CVE-2015-0235) в библиотеке glibc (GNU C Library) впервые была опубликована во французской рассылке. Некоторые специалисты считают, что это было сделано по ошибке, так как к тому моменту никто не успел подготовить обновления.

Подробное техническое описание уязвимости и эксплойт для уязвимости можно найти на Openwall, а первые описания были опубликованы в сообществе Rapid 7.
16648
70
ptsecurity 87,2
вчера в 17:50

Процедурная генерация текстур планет на основе алгоритма Diamond-Square, часть 1 tutorial

image

Доброго времени суток. Как со мной бывает, как только я разобрался в каком-то сложном для себя вопросе, я сразу хочу рассказать всем решение. Поэтому решил написать серию из двух статей по такой интересной теме, как процедурная генерация. А конкретнее, я буду рассказывать про генерацию текстур планет. В этот раз я подготовился основательнее и постараюсь сделать материал качественнее, чем в моем предыдущем посте «Простая система событий в Unity» (кстати, спасибо всем за ответные посты). Прежде чем продолжить, хочу обратить ваше внимание на несколько моментов:

1) Этот генератор не претендует на реалистичность, и писал я его для того, чтобы сгенерировать уникальные текстуры для сотни маленьких шариков, которые занимают 10% экрана и к тому же прикрыты облаками.
2) Но это не значит, что я не буду рад критике. Напротив, одна из причин написания этого поста — получить советы по улучшению алгоритма, я с радостью улучшу его.
3) Чисто технический момент: я пишу на C# под Unity3d, так что думать о том, как выводить в изображение с приемлимой скоростью вам придется самим, для каждого языка и платформы свои способы.
Итак, план таков: в первой статье я рассказываю о процедурной генерации планет типа «терра», потом получаю шквал критики, ради которого все и делалось, улучшаю алгоритм, дорабатываю для других типов планет и пишу вторую часть.

Готовы? Поехали.
4927
106
ArXen42 20,6