Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Про мнимые и реальные оптимизации в 10 раз, целительный SSE, и все такое

Время на прочтение6 мин
Количество просмотров38K
По мотивам одного вчерашнего поста про оптимизацию условных переходов при расчете x=sign(a,b)*min(abs(a), abs(b)) якобы в 10 раз. Краткая сводка:

  • оптимизация налицо, но размер мнимый: не в 10 раз, а 2.5 раза;
  • бенчмарки надо делать правильно: не надо мерить CPU stalls, RAM bandwidth итп вместо исследуемой функции;
  • бенчмарки надо делать правильно: иначе могут дико дрожать;
  • выставлять только приоритет прикольно, но на коротких бенчмарках зря: +0.5% скорости, -15% дрожания;
  • нужно мерить исследуемую функцию и только ее, только так получаешь корректные данные;
  • нужно греть проц, нужно считать минимум из N прогонов/секунд, только так побеждаешь дрожание;
  • нужно пользовать SSE, с ним получилось 8.6 раз, причем код… читается.

В общем, опять пачка классических методологических ошибок при бенчмарке. Кому интересно, как такие ошибки НЕ делать, подробности, детальный разбор полетов, оптимизация в еще несколько раз и, главное, исходники под катом.
Читать дальше →
Всего голосов 166: ↑153 и ↓13+140
Комментарии60

Ежедневная работа с Git

Время на прочтение40 мин
Количество просмотров880K
Я совсем не долго изучаю и использую git практически везде, где только можно. Однако, за это время я успел многому научиться и хочу поделиться своим опытом с сообществом.

Я постараюсь донести основные идеи, показать как эта VCS помогает разрабатывать проект. Надеюсь, что после прочтения вы сможете ответить на вопросы:
  • можно ли git «подстроить» под тот процесс разработки, который мне нужен?
  • будет ли менеджер и заказчик удовлетворён этим процессом?
  • будет ли легко работать разработчикам?
  • смогут ли новички быстро включиться в процесс?
  • можно ли процесс относительно легко и быстро изменить?


Конечно, я попытаюсь рассказать обо всём по-порядку, начиная с основ. Поэтому, эта статья будет крайне полезна тем, кто только начинает или хочет разобраться с git. Более опытные читатели, возможно, найдут для себя что-то новое, укажут на ошибки или поделятся советом.

Далее очень много букв случайным образом превратились в пост.
Всего голосов 200: ↑194 и ↓6+188
Комментарии44

События .NET в деталях

Время на прочтение9 мин
Количество просмотров150K
Если вы .NET программист, то вы наверняка объявляли и использовали события в своем коде. Несмотря на это, не все знают, как события работают внутри и какие особенности связаны с их применением. В этой статье я попытался описать работу событий как можно более подробно, включая некоторые частные случаи, с которыми редко приходится иметь дело, но про которые важно и\или интересно знать.
Читать дальше →
Всего голосов 59: ↑57 и ↓2+55
Комментарии16

Генератор Федеративного Фильтра Калмана с использованием Генетических Алгоритмов

Время на прочтение18 мин
Количество просмотров25K
В рамках своей научной активности реализовал так называемый Федеративный Фильтр Калмана (Federated Kalman Filter). В этой статье рассказывается о том, что такое «Федеративный ФК», чем он отличается от обобщенного, а также описывается консольное приложение, реализующее данный фильтр и генетические алгоритмы для подбора параметров его математической модели. Приложение было реализовано с использованием TPL (Task Parallel Library), поэтому пост будет интересен не только специалистам по цифровой обработке сигналов.

UPD1: после прочтения двух недавних статей решил тоже присоединиться к эксперименту/исследованию/авантюре (называйте как хотите). В конце статьи добавил еще один опрос — "Стали бы Вы поощрать рублем такие узко специализированные статьи на Хабрахабре?".

Под катом описание и ссылка на сорцы
Всего голосов 60: ↑57 и ↓3+54
Комментарии11

Путешествия во времени и программирование 2: парадоксы

Время на прочтение26 мин
Количество просмотров216K


Эпоха путешествий во времени еще не наступила, а человечество уже давно пытается разрешить сопутствующие им парадоксы. Мы поговорим о самом очевидном из них: что же все-таки произойдет при вмешательстве в ход истории? Существует несколько вариантов того, как поток времени реагирует на действия путешественника из будущего. Эти модели можно увидеть в фантастических фильмах, о них все больше начинают говорить ученые, но какая модель ближе к истине — единого мнения пока нет. Мы только начинаем проникать в тайны времени, и еще не обладаем возможностью экспериментировать с перемещениями в прошлое. Что же можно прояснить в данном вопросе уже сейчас? Под катом нас ждет экскурсия по основам механики времени, мы порассуждаем о парадоксах, и проведем небольшой эксперимент. Да, это будет испытание виртуальной машины времени, построенной на основе алгоритма «Жизнь»!
Читать дальше →
Всего голосов 371: ↑351 и ↓20+331
Комментарии440

8 фактов, которые вы, возможно, не знали о C#

Время на прочтение7 мин
Количество просмотров195K
Вот несколько необычных фактов о языке C#, о которых знают лишь немногие разработчики.

1. Индексаторы могут использовать params параметры


Мы все знаем, как обычно выглядят индексаторы x = something["a"], а так же код необходимый для его реализации:

public string this[string key]
 {
   get { return internalDictionary[key]; }
 }

Но знали ли вы, что для доступа к элементам вы можете использовать params параметры x = something["a", "b", "c", "d"]?
Просто напишите ваш индексатор следующим образом:
Читать дальше →
Всего голосов 108: ↑88 и ↓20+68
Комментарии66

Добавляем Web API для программы на C++ с помощью библиотеки POCO

Время на прочтение4 мин
Количество просмотров27K
В жизни любой достаточно большой программы наступает момент, когда нужно вывести наружу какой-нибудь API — для плагинов, для интеграции с другими системами, для автоматизации и т.д. Для этого есть много разных технологий, но как-то так исторически сложилось, что сейчас принято делать API в виде REST-сервисов. В принципе, если не гнаться за экономией каждого байта и микросекунды, то в этом есть смысл: HTTP-запрос сделать легко из любого языка, это хорошо работает и локально, и по сети, не нужно сильно глубоко погружаться в недры сетевых протоколов.
Давайте посмотрим, как к уже существующей программе на C++ можно быстренько прикрутить Web API, используя для этого библиотеку POCO.
Читать дальше →
Всего голосов 36: ↑30 и ↓6+24
Комментарии6

Захабренный договор на разработку сайта, дизайна, софта. Версия 1.1

Время на прочтение18 мин
Количество просмотров245K
На сайте немало постов о том, какие условия нужно включать в договор на создание сайтов и программ (краткий список ниже), но нет договора в формате, который можно взять за основу для составления своего договора. Мы изучили условия из постов (спасибо авторам), подумали над ними, переработали и учли в предлагаемой на ваш суд форме договора. Так что договор пока можно считать частично «захабренным».


Договор авторского заказа
Всего голосов 158: ↑147 и ↓11+136
Комментарии124

Фильтр Калмана

Время на прочтение10 мин
Количество просмотров427K


В интернете, в том числе и на хабре, можно найти много информации про фильтр Калмана. Но тяжело найти легкоперевариваемый вывод самих формул. Без вывода вся эта наука воспринимается как некое шаманство, формулы выглядят как безликий набор символов, а главное, многие простые утверждения, лежащие на поверхности теории, оказываются за пределами понимания. Целью этой статьи будет рассказать об этом фильтре на как можно более доступном языке.
Фильтр Калмана — это мощнейший инструмент фильтрации данных. Основной его принцип состоит в том, что при фильтрации используется информация о физике самого явления. Скажем, если вы фильтруете данные со спидометра машины, то инерционность машины дает вам право воспринимать слишком быстрые скачки скорости как ошибку измерения. Фильтр Калмана интересен тем, что в каком-то смысле, это самый лучший фильтр. Подробнее обсудим ниже, что конкретно означают слова «самый лучший». В конце статьи я покажу, что во многих случаях формулы можно до такой степени упростить, что от них почти ничего и не останется.
Читать дальше →
Всего голосов 178: ↑173 и ↓5+168
Комментарии84

Разработка MiniFilter драйвера

Время на прочтение10 мин
Количество просмотров29K
Довелось мне как-то на работе столкнуться с задачей управления доступа и перенаправления запросов к файловой системе в рамках определенных процессов. Реализовать необходимо было простое, легко конфигурируемое решение.

Решил разрабатывать MiniFilter драйвер, конфигурируемый при помощи текстового файла.

Рассмотрим, что из себя в общем виде представляет MiniFilter:

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

Читать дальше →
Всего голосов 34: ↑32 и ↓2+30
Комментарии5

А все ли в биткоине так хорошо, как заявляют его пропоненты?

Время на прочтение6 мин
Количество просмотров91K
Я, как обладатель аж целых 9-и биткоинов, конечно несказанно рад их резкому влету в цене. Однако же, лично мне непонятно всеобщее ликование по этому поводу, как и не понятны причины роста, нет, я хочу сказать что конечно же мне известны и понятны конкретные причины последнего пузыря, но мне непонятен именно настрой многих людей, что биткоины могут стать революцией которая подорвет все наши экономические устои (в хорошую сторону). Более того, я считаю, что заявленные биткоином, и расхвалеваемые многими свойства не являются истинными, например, я хочу показать что:
— биткоин вовсе не децентрализован
— в биткоине совсем не дешевые транзакции
— и да, что майнеры просто так прожигают реальные ресурсы

Прежде чем я перейду непосредственно к тому что же не так с биткоином, я хочу рассказать причину текущего пузыря, я не претендую на истину, так что судить вам, но тем не менее…

Расследования, интриги, под катом
Читать дальше →
Всего голосов 183: ↑136 и ↓47+89
Комментарии242

Несколько подробностей об std::string

Время на прочтение10 мин
Количество просмотров76K
Недавно заинтересовался реализацией std::string в libstdc++. Не в связи с принятием нового стандарта, а чтобы разобраться. Благо требования к строковму типу почти не изменились.

Основным средством для анализа кода несомненно является метод пристального вглядывания, но чтобы сузить область вглядывывания и сделать процедуру более захватывающей можно реализовать для строки идиому «трассер» подсмотренную в «C++ Templates: The Complete Guide». Трассировка позволяет выявлять подозрительные интересные операции над строками.

Как известно, std::string это псевдоним для
std::basic_string<char>
и нам ничего не мешает определить
std::basic_string<X>
. В X можно определить несколько статических счетчиков и итерировать их в конструкторе, деструкторе и остальных методах. Выполняя разные операции над такой строкой можно будет проследить эффективность применяемых алгоритмов в терминах количества операций.
Кроме того, в g++ для
std::string a(«entrails»); 
выражение
std::cout << reinterpret_cast<char*>(*((void**)(&a))); 

выведет содержимое строки. Т.е. std::string — является, по сути, указателем на char.
Вобщем, эти и другие шокирующие поднобности под катом.
Читать дальше →
Всего голосов 51: ↑42 и ↓9+33
Комментарии23

Коаны Гита

Время на прочтение3 мин
Количество просмотров38K
По мотивам «Коанов Вима».

Тишина
Что-то одно, но хорошо
Только богам
Хобгоблин
Длинное и короткое

Тишина


Python-программистка передала свой файл ~/.gitconfig мастеру Гиту. Среди строчек кода было следующее:

[alias]
; Явное лучше подразумеваемового. Если мы хотим выполнить слияние,
; нам следует сделать это самим.
pull = pull --ff-only

Мастер Гит кивнул. «git pull origin master», — сказала программистка.
Читать дальше →
Всего голосов 153: ↑130 и ↓23+107
Комментарии52

Pthread_cond_timedwait: проблема, решение, дискуссия

Время на прочтение4 мин
Количество просмотров15K
Здравствуйте, уважаемые Хабраюзеры!

Продолжая серию постов по многопоточному программированию, хочется коснуться одной фундаментальной проблемы использования сигнальных переменных в Linux, к сожалению, не имеющей пока красивого универсального решения (а может оно просто неизвестно мне). Многие, к сожалению, даже не догадываются о том, что такая проблема имеет место быть.

Рассмотрим простой пример использования сигнальной переменной:

struct timeval now;
struct timespec timeout;
gettimeofday(&now, 0);
timeout.tv_sec = now.tv_sec + 2;      // 2 sec
timeout.tv_nsec = now.tv_usec * 1000; // nsec

retval=0;
pthread_mutex_lock(&mutex);
while(!somethingHappens() && retval==0)
{
    retval=pthread_cond_timedwait(&condition, &mutex, &timeout);
}
pthread_mutex_unlock(&mutex);


Читать дальше →
Всего голосов 35: ↑30 и ↓5+25
Комментарии37

Ресурсы, о которых должен знать каждый Android-разработчик

Время на прочтение6 мин
Количество просмотров189K
Сегодня я хочу поделиться с вами моим вольным переводом статьи, написанной Сергеем Повзнером (Sergey Povzner). Сергей ведёт блог bongizmo.com и занимается разработкой туристических гидов под общим названием Citybot.

В то время как Android продолжает свой невероятный рост, всё больше и больше программистов начинают разрабатывать приложения на этой платформе. Если ты начинаешь свой путь сегодня, то ты определенно — счастливчик. За последние годы Android значительно повзрослел и избавился от множества детских болезней. Информации по платформе более чем достаточно. Я же расскажу о самых важных ресурсах.

Статья будет полезна как новичкам, так и опытным разработчикам. Это гид по миру Android-разработки.
Читать дальше →
Всего голосов 133: ↑128 и ↓5+123
Комментарии33

Видеозапись с помощью Directshow.NET

Время на прочтение9 мин
Количество просмотров36K
Добрый день, уважаемые хабрапользователи. Некоторое время назад мне пришлось работать над несложным windows-приложением, в котором требовалось производить аудио- и видеозапись с различных устройств. В частности, захват аудио нужно было производить с шести каналов карты MAudio, а захват hd видео — с двух карт захвата AverMedia, сигнал на которые приходил с видеокамер по компонентному входу. Также нужно было делать скриншоты с документ-камеры, подключенной по USB-интерфейсу. Приложение было решено писать на C#, а видеозапись производить при помощи библиотеки DirectShow.NET.

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

Читать дальше →
Всего голосов 28: ↑26 и ↓2+24
Комментарии6

Нельзя просто так взять и обратиться к фоновой странице

Время на прочтение9 мин
Количество просмотров45K
Всё дело — в политике безопасности, аналогичной кроссдоменной. Обращение к страницам других табов или к фоновой странице расширения сознательно ограничено, потому что они считаются страницами других доменов, имеют запреты на прямой доступ к скриптовому окружению, аналогично чужим окнам и фреймам. Механизм сообщений «спасает» как при кроссдоменном доступе между фреймами, как и в доступе к страницам расширений (фоновая, настройки, попап, ...).

В расширении браузера Google Chrome (и Chromium) наиболее важна по функциям — фоновая страница. Она имеет специальный URL вида chrome-extension://ciegcibjokpkcklhgbpnmnikpkmkhbjk/, где длинное имя домена — случайное имя, создаваемое в недрах браузера, которым именуется также каталог расширения где-то в служебной папке ОС. Из контентного скрипта (аналогичного юзерскриптам, исполняемым на странице браузера) можно получить доступ к файлам и картинкам расширения. Но нельзя выполнить много функций, путь к которым лежит через фоновую страницу: устроить хранилище, относящееся к группе реальных доменных имён; хранить настройки расширения, общие для всего расширения. Нужно лишь добраться в Мордор к фоновой странице. Однако, нельзя просто так, по URL, это сделать.
Как же добраться к фоновой странице?
Всего голосов 45: ↑35 и ↓10+25
Комментарии8

Краткое введение в boost::program_options

Время на прочтение5 мин
Количество просмотров42K
Занимаясь разработкой алгоритмов, постоянно одергиваю себя, а вдруг изменения, которые работают на небольшом примере, привнесут разброд и шатание в результаты на других, больших данных. Тогда мне на помощь приходит командная строка. Самое ужасное, что каждый раз реализовывать парсер аргументов уже надоело, а значит, не последним средством для C++ программиста оказывается пакет program_options из библиотеки boost.
Читать дальше →
Всего голосов 35: ↑33 и ↓2+31
Комментарии22

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность