Pull to refresh
0
@DFoozread⁠-⁠only

User

Send message

Композитор с долгой кратковременной памятью

Reading time14 min
Views7.2K

Автоматическое сочинение музыки



Почти сразу после того, как я научился программированию, мне хотелось создать ПО, способное сочинять музыку.

Я в течение нескольких лет предпринимал примитивные попытки автоматического сочинения музыки для Visions of Chaos. В основном при этом использовались простые математические формулы или генетические мутации случайных последовательностей нот. Добившись недавно скромного успеха в изучении и применении TensorFlow и нейронных сетей для поиска клеточных автоматов, я решил попробовать использовать нейронные сети для создания музыки.

Как это работает


Композитор обучает нейросеть с долгой кратковременной памятью (Long short-term memory, LSTM). LSTM-сети хорошо подходят для предсказания того, «что встретится дальше» в последовательностях данных. Подробнее о LSTM можно прочитать здесь.


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

Как собеседовать работодателя?

Reading time4 min
Views47K
У программистов обычно принято обсуждать собеседования с точки зрения (около)технических вопросов, которые им задает интервьювер.

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

Я хотел бы зайти в этой статье с другого конца и обсудить, во-первых, не техническую часть, а, во-вторых, вопросы, которые сам кандидат должен задать интервьюверу.

Читать дальше →

Как работает ИИ в игре Hitman (2016)

Reading time18 min
Views14K
Выпущенный компанией IO Interactive в 2016 году Hitman вернул франшизу к её корням: созданию богатых и интересных сценариев, в которых Агент 47 должен устранять свои цели, часто импровизированным и непрактичным способом. Для решения этой задачи внутри игры применяется множество систем ИИ, именно их мы и будем изучать. Мы углубимся в структуру систем ИИ, отвечающих в последнем поколении игр Hitman за различные функции: создание реагирующих на ситуацию NPC, телохранителей, системы толп, управляемые искусственным интеллектом анимации и многое другое.


Об игре Hitman


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

Рендеринг текста вас ненавидит

Reading time14 min
Views30K

Рендеринг текста: насколько сложным он может быть? Оказывается, невероятно сложным! Насколько мне известно, буквально ни одна система не выводит текст «идеально». Где-то лучше, где-то хуже.

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

В общем, сразу скажем: здесь нет последовательных правильных ответов, всё намного важнее, чем вы думаете, и всё влияет на всё остальное.

Мы обсудим темы, которые не объединяются в рамках какой-то единой концепции, это просто вопросы, с которыми мне пришлось столкнуться за несколько лет работы над рендерингом текста в Firefox. Например, не будем слишком подробно обсуждать проблемы сегментации текста или управления различными текстовыми библиотеками для конкретной платформы, поскольку этим я не слишком интересуюсь.
Читать дальше →

Как работает MAMR в HDD

Reading time3 min
Views12K
Уже в 2019-м году должны выйти новые жесткие диски с технологией MAMR. Эта технология позволит увеличить плотность записи до 4Тбит на квадратный дюйм, что в теории позволит создавать HDD объемом 40ТБ.
Читать дальше →

Путь к проверке типов 4 миллионов строк Python-кода. Часть 2

Reading time8 min
Views6.1K
Сегодня публикуем вторую часть перевода материала о том, как в Dropbox организовывали контроль типов нескольких миллионов строк Python-кода.



Читать первую часть
Читать дальше →

Колючие и острые, куда ни посмотри: механизм самозаточки зубов морских ежей

Reading time9 min
Views11K

Разговоры о зубах у людей чаще всего ассоциируются с кариесом, брекетами и садистами в белых халатах, которые только и мечтают сделать себе бусы из ваших зубов. Но шутки в сторону, ибо без стоматологов и установленных правил гигиены за полостью рта мы с вами питались бы только толченой картошкой и супчиком через трубочку. А всему виной эволюция, подарившая нам далеко не самые долговечные зубы, которые еще и не регенерируют, что наверное несказанно радует представителей стоматологической индустрии. Если же говорить о зубах у представителей дикой природы, то сразу вспоминаются величественные львы, кровожадные акулы и крайне позитивные гиены. Однако, несмотря на мощь и силу их челюстей, зубы у них не такие удивительные, как зубы морских ежей. Да, этот комок иголок под водой, наступив на который вы можете испортить себе добрую часть отпуска, обладает вполне себе неплохими зубками. Их, конечно, немного, всего пять, но они по-своему уникальны и способны затачивать себя сами. Как ученые выявили такую особенность, как именно протекает этот процесс и как это может помочь людям? Об этом мы узнаем из доклада исследовательской группы. Поехали.

Прорываемся сквозь защиту от ботов

Reading time9 min
Views14K


В последнее время на многих зарубежных сайтах стала появляться incapsula — система которая повышает защищённость сайта, скорость работы и при этом очень усложняет жизнь разработчикам программного обеспечения. Суть данной системы — комплексная защита с использованием JavaScript, который, к слову, многие DDOS боты уже научились выполнять и даже обходить CloudFlare. Сегодня мы изучим incapsula, напишем деобфускатор JS скрипта и научим своего DDOS бота обходить её!
Читать дальше →

О [[trivial_abi]] в Clang-е

Reading time9 min
Views3.9K
Наконец-то я написал пост про [[trivial_abi]]!

Это новая фирменная фича в транке Clang-а, новая по состоянию на февраль 2018. Это вендорское расширение языка C++, это не стандартный C++, она не поддерживается транком GCC, и нет активных предложений WG21 включить её в стандарт C++, насколько мне известно.



Я не принимал участие в реализации этой фичи. Я просто просматривал патчи в списке рассылки cfe-commits и тихо аплодировал про себя. Но это такая крутая фича, что я считаю, каждый должен про неё знать.
Читать дальше →

Решение задания с pwnable.kr 24 — simple login. Наложение стекового фрейма

Reading time3 min
Views1.9K
image

В данной статье решим 24-е задание с сайта pwnable.krи узнаем про наложение стекового фрейма.

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

Как я создал фильтр, не портящий изображение даже после миллиона прогонов — часть 2

Reading time7 min
Views6K
image

image

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

Он был немного более размытым и это устроит не всех. Однако он был лучше своих альтернатив — на самом деле именно этот фильтр использовался в оригинальной версии Bink 2. Из-за постоянной нагрузки на работе мне никогда не удавалось вернуться к нему снова и исследовать его подробнее.

Но теперь, когда я нашёл время для возврата к этому фильтру и написания статьи о нём, мне наконец стоит задаться вопросом: существует ли менее размывающий фильтр, который всё же сохраняет свойство «бесконечной стабильности»?

Предупреждение о спойлерах: правильный ответ — «вероятно, нет» и «определённо, есть». Но прежде чем мы дойдём до того, почему на этот вопрос есть два ответа и что они означают, давайте получше подготовим испытательный стенд.
Читать дальше →

End2End-подход в задачах Automatic Speech Recognition

Reading time10 min
Views25K
Что такое End2End-распознавание речи, и зачем же оно нужно? В чем его отличие от классического подхода? И почему для обучения хорошей модели на основе End2End нам потребуется огромное количество данных — в нашем сегодняшнем посте.

Классический подход к распознаванию речи


Прежде чем рассказать про End2End-подход, стоит сначала поговорить про классический подход к распознаванию речи. Что он из себя представляет?


Читать дальше →

Синтез регулятора методом обратной задачи динамики

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

Читать дальше →

Делись, рыбка, быстро и нацело

Reading time4 min
Views14K
image

Деление — одна из самых дорогих операций в современных процессорах. За доказательством далеко ходить не нужно: Agner Fog[1] вещает, что на процессорах Intel / AMD мы легко можем получить Latency в 25-119 clock cycles, а reciprocal throughput — 25-120. В переводе на Русский — МЕДЛЕННО! Тем не менее, возможность избежать инструкции деления в вашем коде — есть. И в этой статье, я расскажу как это работает, в частности в современных компиляторах(они то, умеют так уже лет 20 как), а также, расскажу как полученное знание можно использовать для того чтобы сделать код лучше, быстрее, мощнее.
Читать дальше →

Примеры дичи из заказов «приходите спасать» (разбор десятка инцидентов с примерами)

Reading time9 min
Views34K
Иногда бывает так:

— Приезжайте, у нас упало. Если сейчас не поднять — покажут по телевизору.

И мы едем. Ночью. На другой край страны.


Ситуация, когда не повезло: на графике показан резкий рост нагрузки на СУБД. Очень часто это первое, на что смотрят администраторы системы и это первый признак того, что наступила жопа

Но чаще речь идёт про какие-то типовые вещи. Например, заказчик столкнулся с низкой производительностью системы документооборота. По понедельникам и вторникам система падала, они перезагружали сервер, и потом всё поднималось. Захлёбывалась база данных. Хотели докупить оборудования (что долго и дорого), позвали нас просчитать смету. Мы им посчитали смету и заодно предложили разобраться, что же именно тормозит. За три-четыре часа локализовали источник проблемы. Выяснили, что это медленные запросы в базу данных и неоптимальные схемы индексирования. Создали недостающие индексы, поковырялись с оптимизатором запросов в Оракле, некоторые проблемы потребовали изменения кода — поменяли условия поиска (без изменения функциональности), заменили часть запросов на использование предрассчитанных представлений. Если бы у них был нормальный человек по БД — могли бы сделать то же и сами. Но вместо нормального человека был аудит базы данных раз в полгода крутыми ораклистами — они выдавали общие рекомендации по настройкам и железу.
Читать дальше →

Data Science проект от исследования до внедрения на примере Говорящей шляпы

Reading time25 min
Views31K


Месяц назад Лента запустила конкурс, в рамках которого та самая Говорящая Шляпа из Гарри Поттера определяет предоставивших доступ к социальной сети участников на один из четырех факультетов. Конкурс сделан неплохо, звучащие по-разному имена определяются на разные факультеты, причем схожие английские и русские имена и фамилии распределяются схожим образом. Не знаю, зависит ли распределение только от имен и фамилий, и учитывается ли как-то количество друзей или другие факторы, но этот конкурс подсказал идею этой статьи: попробовать с нуля обучить классификатор, который позволит распределять пользователей на различные факультеты.

Читать дальше →

Разработка монолитной Unix подобной OS — Куча (4)

Reading time7 min
Views3.1K
В предыдущей статье мы с вами реализовали системный журнал ядра. Теперь пришло время реализовать менеджер динамической памяти.
Читать дальше →

noexcept-ctcheck или несколько простых макросов, чтобы компилятор помогал при написании noexcept кода

Reading time9 min
Views3.4K

При разработке на C++ время от времени приходится писать код, в котором исключения не должны возникать. Например, когда нам нужно написать не бросающий исключений swap для собственных типов или определить noexcept move-оператор для своего класса, или вручную реализовать нетривиальный деструктор.


В С++11 в язык был добавлен модификатор noexcept, который позволяет разработчику понять, что из помеченной noexcept-ом функции (или метода) исключения вылететь не могут. Поэтому функции с такой пометкой могут смело использоваться в контекстах, где исключения не должны возникать.


Например, если у меня есть вот такие типы и функции:


class first_resource {...};
class second_resource {...};

void release(first_resource & r) noexcept;
void close(second_resource & r);

и есть некий класс resources_owner, который владеет объектами типа first_resource и second_resource:


class resources_owner {
   first_resource first_resource_;
   second_resource second_resource_;
   ...
};

то я могу написать деструктор resources_owner следующим образом:


resources_owner::~resources_owner() noexcept {
   // Функция release() не бросает исключений, поэтому просто вызываем ее.
   release(first_resource_);

   // А вот функция close() может бросать исключения, поэтому
   // обрамляем ее try-catch.
   try{ close(second_resource_); } catch(...) {}
}

В каком-то смысле noexcept в C++11 сделал жизнь C++ разработчика легче. Но у текущей реализации noexcept в современном C++ есть одна неприятная сторона...


Компилятор не помогает контролировать содержимое noexcept функций и методов

Читать дальше →

Алгоритмы обнаружения контуров изображения

Reading time20 min
Views27K
В статье представлены четыре самых распространённых алгоритма обнаружения контуров.

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

Данные алгоритмы будут игнорировать все «дырки» в паттерне. Например, если у нас есть паттерн, подобный показанному на Рисунке 1, то обнаруженный алгоритмами контур будет похож на показанный на Рисунке 2 (синими пикселями обозначен контур). В некоторых областях применения это вполне допустимо, но в других областях, например, в распознавании символов, требуется обнаружение внутренних частей паттерна для нахождения всех пробелов, отличающих конкретный символ. (На Рисунке 3 показан «полный» контур паттерна.)

image


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

image
Читать дальше →

Information

Rating
Does not participate
Registered
Activity