Pull to refresh
136
0
Вадим Марковцев @markhor

Head of Analytics

Send message

Эксперименты с malloc и нейронными сетями

Reading time 7 min
Views 26K


Больше года назад, когда я работал антиспамщиком в Mail.Ru Group, на меня накатило, и я написал про эксперименты с malloc. В то время я в свое удовольствие помогал проводить семинары по АКОСу на ФИВТе МФТИ, и шла тема про аллокацию памяти. Тема большая и очень интересная, при этом охватывает как низкий уровень ядра, так и вполне себе алгоритмоемкие структуры. Во всех учебниках написано, что одна из основных проблем динамического распределения памяти — это ее непредсказуемость. Как говорится, знал бы прикуп — жил бы в Сочи. Если бы оракул заранее рассказал весь план по которому будет выделяться и освобождаться память, то можно было составить оптимальную стратегию, минимизирующую фрагментацию кучи, пиковое потребление памяти и т.д. Отсюда пошла возня с ручными аллокаторами. В процессе раздумий я натолкнулся на отсутствие инструментов логирования malloc() и free(). Пришлось их написать! Как раз про это была статья (а ещe я изучал macOS). Были запланированы две части, однако жизнь круто повернулась и стало не до malloc(). Итак, пора восстановить справедливость и реализовать обещанное: ударить глубоким обучением по предсказанию работы с кучей.


Внутри:


  • Совершенствуем libtracemalloc, перехватчик malloc().
  • Строим LSTM на Keras — глубокую рекуррентную сеть.
  • Обучаем модель на примере работы реального приложения (vcmi/vcmi — а вы думали, причем здесь Heroes III?).
  • Удивляемся неожиданно хорошим результатам.
  • Фантазируем про практическое применение технологии.
  • Исходники.

Интересно? Добро пожаловать под кат.


Читать дальше →
Total votes 72: ↑72 and ↓0 +72
Comments 15

Тематическое моделирование репозиториев на GitHub

Reading time 9 min
Views 12K
word cloud
Тематическое моделирование — подраздел машинного обучения, посвященный извлечению абстрактных «тем» из набора «документов». Каждый «документ» представлен мешком слов, т.е. множеством слов вместе с их частотами. Введение в тематическое моделирование прекрасно описано проф. К. В. Воронцовым в лекциях ШАД [PDF]. Самая известная модель ТМ — это, конечно, Латентное размещение Дирихле (LDA). Константину Вячеславовичу удалось обобщить все возможные тематические модели на основе мешка слов в виде аддитивной регуляризации (ARTM). В частности, LDA тоже входит в множество моделей ARTM. Идеи ARTM воплощены в проекте BigARTM.

Обычно тематическое моделирование применяют к текстовым документам. Мы в source{d} (стартап в Испании) перевариваем биг дату, полученную из GitHub репозиториев (и скоро примемся за каждый публично доступный репозиторий в мире). Естественным образом возникла идея интерпретировать каждый репозиторий как мешок слов и натравить BigARTM. В этой статье пойдет речь о том как мы выполнили по сути первое в мире тематическое исследование крупнейшего хранилища open source проектов, что из этого получилось и как это повторить. docker inside!
Читать дальше →
Total votes 26: ↑26 and ↓0 +26
Comments 3

Эксперименты с malloc

Reading time 12 min
Views 36K
image

Как известно, в современных архитектурах x86(_64) и ARM виртуальная память процесса линейна и непрерывна, ибо, к счастью, прошли времена char near* и int huge*. Виртуальная память поделена на страницы, типичный размер которых 4 KiB, и по умолчанию они не отображены на физическую память (mapping), так что работать с ними не получится. Чтобы посмотреть текущие отображённые интервалы адресов у процесса, в Linux смотрим /proc/<pid>/maps, в OS X vmmap <pid>. У каждого интервала адресов есть три вида защиты: от исполнения, от записи и от чтения. Как видно, самый первый интервал, начинающийся с load address (соответствующий сегменту .text у ELF в Linux, __TEXT у Mach-O в OS X), доступен на чтение и исполнение — очень логично. Ещё можно увидеть, что стек по сути ничем не отличается от других интервалов, и можно быстро вычислить его размер, вычтя из конечного адреса начальный. Отображение страниц выполняется с помощью mmap/munmap, а защита меняется с помощью mprotect. Ещё существуют brk/sbrk, deprecated древние пережитки прошлого, которые изменяют размер одного-единственного интервала «данных» и в современных системах эмулируются mmap’ом.

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

  • оптимально управляет уже выделенной памятью;
  • значительно уменьшает количество обращений к ядру (ведь mmap / sbrk — это syscall);
  • вообще абстрагирует программиста от виртуальной памяти, так что многие пользуются malloc’ом, вообще не подозревая о существовании страниц, таблиц трансляции и т. п.

Довольно теории! Будем щупать malloc на практике. Проведём три эксперимента. Работа будет возможна на POSIX-совместимых операционках, в частности была проверена работа на Linux и на OS X.
Читать дальше →
Total votes 59: ↑58 and ↓1 +57
Comments 11

Находим опечатки в **kwargs

Reading time 5 min
Views 8.9K
По мере разрастания проекта, в котором я сейчас принимаю активное участие, стал все чаще встречаться с подобными опечатками в именах аргументов у функции, как на картинке справа. Особенно дорого в отладке обходились подобные ошибки в конструкторе класса, когда при длинной цепочке наследования передавался неправильный параметр базового класса, или вообще не передавался. Перекраивание интерфейсов на специальные пользовательские структуры вроде namedtuple вместо **kwargs имело несколько проблем:

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

Решение, к которому я в итоге пришел, не может защитить в 100% всех возможных случаев, однако в тех необходимых 80% (в моем проекте, 100%) прекрасно справляется со своей задачей. Если кратко, оно заключается в анализе исходного (байт)кода функции, построении матрицы расстояний между найденными «настоящими» именами и переданными извне и печати предупреждений по заданным критериям. Исходники.
Читать дальше →
Total votes 8: ↑6 and ↓2 +4
Comments 14

Визуализация клонов в проекте на Python

Reading time 6 min
Views 9.4K

Недавно в нашем проекте потребовалось настроить мониторинг качества кода. Качество кода — понятие субъективное, однако давным-давно придумали множество метрик, позволяющих провести мало-мальски количественный анализ. К примеру, цикломатическая сложность или индекс поддерживаемости (maintainability index). Измерение подобного рода показателей — обычное дело для языков вроде Java или C++, однако (складывается впечатление) в питоньем сообществе редко когда кто-то об этом задумывается. К счастью, существует замечательный radon с xenon-ом, который быстро и качественно вычисляет упомянутые выше метрики и даже некоторые другие. Конечно, для профессиональных enterprise инструментов маловато, но все необходимое присутствует.

Кроме вычисления метрик, бывает также полезно провести анализ зависимостей. Если в проекте задекларирована архитектура, то между отдельными частями должны существовать определенные связи. Самый частый пример: приложение построено вокруг библиотеки, предоставляющей API, и весьма нежелательно выполнять действия в обход этого API. Другими словами, нехорошо ioctl-ить в ядро когда libc есть. Для питона есть несколько пакетов, строящих граф зависимостей между модулями, и snakefood показался мне самым удачным.

Помимо анализа зависимостей, не менее полезно определять копипасту, особенно, если в проекте задействованы джуниоры или другие люди, любящие «срезать углы болгаркой». Об этом собственно и пойдет речь в статье.
clonedigger
Total votes 17: ↑16 and ↓1 +15
Comments 4

os.urandom, CPython, Linux и грабли

Reading time 5 min
Views 21K


Хочу поведать поучительную историю ошибки в реализации функции urandom из модуля os в CPython на UNIX-подобных ОС (Linux, Mac OS X, etc.).

Цитата из документации по тройке:
Return a string of n random bytes suitable for cryptographic use.

This function returns random bytes from an OS-specific randomness source. The returned data should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation. On a Unix-like system this will query /dev/urandom, and on Windows it will use CryptGenRandom().
Документация по двойке добавляет:
New in version 2.4.
Другими словами, к примеру, под Linux, urandom читает и возвращает байты из системного устройства /dev/urandom. Напомню, что в этой ОС существуют два типичных устройства-источника энтропии: /dev/random и /dev/urandom. Как известно, первое устройство «медленное» и блокирующее, а второе «быстрое», и вопреки распространенному мнению, оба они криптостойкие источники (псевдо-)случайных чисел. Сразу скажу, КДПВ к статье отношения не имеет и речь пойдёт совсем не о криптографии, безопасности и об OpenSSL с Heartbleed-ом.

Казалось бы, как можно ошибиться в реализации столь простой рутины? Как это часто бывает, дооптимизировались…
Читать дальше →
Total votes 64: ↑59 and ↓5 +54
Comments 26

Исключение для библиотек времени исполнения GCC или почему в Clang до сих пор отсутствует поддержка OpenMP

Reading time 2 min
Views 8.4K
Используете GCC в проекте с закрытым исходным кодом? Применяете OpenMP? Вы же в курсе, что библиотека libgomp, с которой компонуются все OpenMP программы, распространяется на условиях GPLv3? Будьте так добры, откройте ваши исходники…
Читать дальше →
Total votes 29: ↑25 and ↓4 +21
Comments 9

Вышел любительский мод к Heroes 3 — Horn of the Abyss

Reading time 1 min
Views 4.9K


Фанаты серии радуются — появилась возможность поиграть в «свежак» Heroes of Might and Magic III Horn of the Abyss, довольно качественный аддон к оригинальным The Shadow of Death.
Читать дальше →
Total votes 76: ↑64 and ↓12 +52
Comments 52

OpenStreetMap в помощь велосипедистам

Reading time 5 min
Views 72K

Вступление


Представьте, что сейчас лето, солнце светит, у вас отпуск, и вы с друзьями — заядлые велосипедисты. Возникает мысль о велосипедном походе куда-нибудь далеко. В этой статье я расскажу о том, как OpenStreetMap-технологии и некоторые другие сервисы упрощают жизнь в такой ситуации, решают проблемы планирования и позволяют быстро и просто поделиться впечатлениями. Упор делается на online, я упоминаю ресурсы:
Читать дальше →
Total votes 55: ↑53 and ↓2 +51
Comments 17

Подключаем PC к телевизору по HDMI со звуком

Reading time 3 min
Views 157K

Проблема


Я — владелец компьютера с видеокартой NVIDIA, у которой есть только два DVI выхода, и звуковой карты с оптическим (TOSLINK) выходом. Недавно купил большой LCD телевизор и захотел организовать домашний кинотеатр. Однако жена сказала, что колонки 5.1 во-первых некуда ставить, а во-вторых — дорогие они, если брать хорошие. Поэтому озаботился проблемой, как же мне подключить комп к телевизору, чтобы помимо картинки он играл звук с аудио карты. Очевидно, требовалось устройство следующего плана:



И оно, к счастью, нашлось!
Дальше будет обзор этого девайса.
Total votes 56: ↑44 and ↓12 +32
Comments 67

Хак Bada IDE: собираем как хотим

Reading time 4 min
Views 2.4K
Привет!
Эта небольшая статья адресована разработчикам приложений под мобильную платформу Samsung Bada, которые не желают мириться с мыслью, что Samsung «знает лучше, что надо», а также людям, занимающимся сборкой кода под ARM с помощью GNU Compiler Collection.
Читать дальше →
Total votes 14: ↑10 and ↓4 +6
Comments 5

Тест на поддержку UTF-8

Reading time 2 min
Views 13K
Недавно натолкнулся на следующий текстовый файл: ссылка (если сайт не выдержит, искать так) авторства Dr Markus Kuhn из Кембриджа. По сути это просто текст в кодировке UTF-8, однако вся соль в том, что в нем содержатся различные «фишки» кодировки, вроде combining characters. Как вы увидите, даже «простой текст» браузеры отображают кое-где по-разному и кое-где вообще не отображают. Сводная таблица прохождения теста для некоторых известных имен (под Windows 7 64-bit, шрифты по умолчанию):



Стоит заметить, что в Chrome, Firefox, IE моноширинным шрифтом по умолчанию является Courier New, в Opera — Consolas.
Читать дальше →
Total votes 89: ↑72 and ↓17 +55
Comments 83

Разработка приложений на платформе Samsung Bada — Часть 2

Reading time 4 min
Views 3.1K


Привет всем, эта статья — продолжение первой части. Я расскажу о своем опыте работы с Samsung Apps Store, какие могут быть затруднения и каков сухой остаток. Сначала будет теория, затем практика. Я постарался дать как можно больше советов, которые могут пригодиться.
Читать дальше →
Total votes 49: ↑43 and ↓6 +37
Comments 22

7-Zip из .NET или как я делал open source проект на CodePlex

Reading time 9 min
Views 16K


Эта статья с одинаковым успехом может быть отнесена к блогам ".NET", «Open source» и «Я пиарюсь». После того. как я написал материал, стало ясно, что больше всего в ней «Open source»… Просьба сильно не бить, если я ошибся.

Итак, ниже пойдет рассказ о моем полуторагодичном опыте разработки библиотеки SevenZipSharp с открытыми исходниками, выложенной на CodePlex в феврале 2009. Эта библиотека — обертка над 7-Zip, позволяющая с легкостью его использовать в .NET.
Читать дальше →
Total votes 175: ↑152 and ↓23 +129
Comments 46

Тестируем Bada-приложения с помощью RTL

Reading time 3 min
Views 1.2K


Эта статья не является продолжением " Разработка приложений на платформе Samsung Bada — Часть 1", а служит кратким введением в тестирование приложений Bada на удаленном железе, используя механизм Remote Testing Labs (RTL), появившийся в статусе Beta в составе только что вышедшего Bada SDK 1.0.0. Сразу напишу: это бесплатно. Во всяком случае пока.
Читать дальше →
Total votes 4: ↑3 and ↓1 +2
Comments 6

LLVM изнутри: как это работает

Reading time 10 min
Views 26K
Приветствую хабраюзеров, в этой статье пойдет речь о внутреннем устройстве компилятора LLVM. О том, что LLVM вообще такое, можно прочитать здесь или на llvm.org. Как известно, LLVM (условно) состоит из трех частей — байткода, стратегии компиляции и окружения aka LLVM infrastructure. Я рассмотрю последнее.

Содержание:
  • Сборка LLVM
  • Привязка к Eclipse
  • Архитектура окружения
  • LLVM API
  • Оптимизация Hello, World!
Читать дальше →
Total votes 59: ↑54 and ↓5 +49
Comments 18

Разработка приложений на платформе Samsung Bada — Часть 1

Reading time 5 min
Views 8.1K
Недавно компания Samsung представила новую мобильную платформу Bada и выпустила смартфон на этой платформе, Samsung Wave. Для разработчика смысл ее в том, что она предоставляет некий стандартный набор API поверх системы на основе GNU/Linux или собственной проприетарной ОС.

В первой части статьи рассказано, с чего начать, сделан обзор Bada SDK, описаны его особенности, подводные камни, варианты решения проблем, — все основано целиком на собственном опыте. Во второй части будет рассказано про упаковку приложения (т.н. deployment), магазин Samsung Apps, продажу приложения на Bada с авторскими замечаниями и советами.

Желающим поиграться с Bada: писать код придется на C/C++, без сбора мусора и прочих благ цивилизации. Если вас это не пугает, прошу под кат.
Читать дальше →
Total votes 44: ↑35 and ↓9 +26
Comments 213

Программисту .NET: как быстро показать LaTeX

Reading time 4 min
Views 7.9K
В этой статье описаны несколько способов отображения LaTeX документов в программах на .NET. Информация пригодится в первую очередь программистам, работающим в сфере образования. Все, о чем идет речь, проверено на собственном опыте разработки на кафедре высшей математики одного из ведущих московских технических ВУЗ-ов.

Задача

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

Казалось бы, если все равно в конце документ придется печатать, что невозможно без установки TeX, то к чему подчеркивать независимость от TeX-а? Дело в специфике программного комплекса, разрабатываемого автором.

Решения

  • В лоб — компилировать LaTeX в нечто PDF-подобное, используя дистрибутив TeX, и показывать во внешнем просмотрщике
  • Похитрее — показывать LaTeX сразу, в браузере (т.е. в компоненте WebBrowser), используя Integre techexplorer — ActiveX плагин к Internet Explorer
  • Еще хитрее — конвертировать LaTeX в MathML и показывать в поддерживающем этот стандарт браузере (т.е. соответствующем компоненте .NET)

Какой же способ выбрать?
Читать дальше →
Total votes 44: ↑30 and ↓14 +16
Comments 8

Broadcom Crystal HD: аппаратное ускорение HD видео «от А до Я»

Reading time 5 min
Views 76K
image

Думаю, многие знают, что HD (720p) H.264 видео так просто на нетбуке не посмотришь. Мощности Intel Atom просто не хватает на декодирование. Я использую свой Acer Aspire One в качестве видеоплеера во время командировок и длинных поездок и тоже с этим сталкивался. Есть несколько способов решить эту проблему:
  • перекодировать с более низким разрешением/битрейтом
  • использовать программные ухищрения
  • использовать аппаратное ускорение

Первый способ слишком медленный и унизительный (т.к. типичен для портативных плееров вроде iPod и т.п.).

Второй — не универсален и ограничен. Мне известны два способа — установка кодека CoreAVC и опережающий воспроизведение буфер Crystal Player-а (см. Настройка нетбука на максимальную производительность для HDTV). В принципе, это вполне сносное решение для 720p. Однако, есть два больших минуса: 100% загрузки процессора и полная несостоятельность в случае с 1080p.

Третий кажется мне наиболее «правильным». Можно сразу купить нетбук с Nvidia ION — универсальное решение, которое дает дополнительные плюшки вроде вычислений CUDA и возможности играть в 3D игры (впрочем, удовольствие на маленьком экранчике сомнительное). К сожалению, Nvidia ION-powered нетбуки появились лишь недавно и пока еще дороги. Да и что поделать, если уже купил себе нетбук без всяких «понтов»?

Есть выход! Называется он Broadcom Crystal HD, и «ускорить» им свой EEE PC или Aspire One вполне реально и дешево.
Читать дальше →
Total votes 85: ↑78 and ↓7 +71
Comments 93

Information

Rating
Does not participate
Location
Madrid, Madrid, Испания
Date of birth
Registered
Activity