...

суббота, 22 апреля 2017 г.

Потоки в Linux: Pthreads

YiiConf 2017, Москва

Этим летом, 16 Июня 2017, в Москве пройдёт конференция веб-разработчиков, посвящённая PHP фреймворку Yii.


YiiConf


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


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



С докладом приедет и Carsten Brandt (@cebe).


Вы тоже можете подать заявку на доклад или мастер-класс. Для докладчиков участие в Yiiconf и Devconf бесплатное.


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


Стоимость участия будет расти! Сейчас цена составляет от 4000 р. в зависимости от пакета: http://ift.tt/2owaUCi


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


За новостями конференции можно следить в твиттере по хештегу #yiiconf.


По всем вопросам можно писать на почту организаторам: 2017@devconf.ru


До встречи на YiiConf!

Комментарии (0)

    Let's block ads! (Why?)

    [Из песочницы] Scilab в свободном падении

    Библиотека компонентов как инструмент поддержания целостности вебсайта

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    Security Week 16: SWIFT под колпаком, в Magento снова дыра, подари Honeypot другу

    пятница, 21 апреля 2017 г.

    [Из песочницы] АMP. Что это и с чем его едят?

    Легальный вывод средств с Upwork в РФ

    slit — новое слово в мире PAGERов, либо как тратить меньше времени на просмотр логов

    Управление «силой мысли»: резидент акселератора Университета ИТМО

    Проект TuSion, резидент акселератора Future Technologies Университета ИТМО, разрабатывает программный алгоритм, позволяющий пользователям лучше распознавать собственные желания и эмоции, отслеживать поведение потребителя или настраивать гаджеты «умного дома» через нейроинтерфейс и связанное с ним приложение. О том, как это работает, расскажем ниже.

    Flickr / MattysFlicks / CC

    Как работает нейроинтерфейс


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

    Сейчас нейроинтерфейсы разрабатываются в первую очередь под проекты виртуальной реальности – для их обозначения иногда используется термин full dive VR (полное виртуальное погружение). Например, проект MindMaze, работающий по схеме нейроинтерфейс плюс ПО заявляет о создании нейроплатформы виртуальной реальности.

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

    Что касается разработки проекта TuSion, то ее готовят к использованию в самых разных целях – создатели компании считают, что потенциал разработки может быть раскрыт как в сфере виртуальной реальности, так и, например, в сфере «умного дома». Владимир Кублашвили, один из основателей проекта, отмечает: «Если мозг будет контролировать виртуальную действительность без каких-либо внешних манипуляторов, то это может быть даже более естественно для человека [по сравнению с джойстиками и другими дополнительными гаджетами]».

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

    Зачем нейроинтерфейсу нужно приложение


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

    Этот процесс в приложении визуализирован. На хакатоне по интеллектуальным системам и нейротехнологиям виртуальной реальности, который прошел в Санкт-Петербурге в прошлом году, команда проекта, используя нейроинтерфейсы Muse и NeuroSky, представила приложение, которое позволяло манипулировать арт-объектами на экране мобильного устройства за счет «напряжения мысли». Объекты на экране становились ярче или бледнее в зависимости от уровня концентрации пользователя.

    Сейчас команда проекта занимается получением дополнительной статистики взаимодействия пользователя с нейроинтерфейсом и проводит ранние тесты на добровольцах в Институте мозга человека им. Н.П. Бехтеревой. Такие исследования, по словам Владимира, помогают «навести мосты между мозгом человека и нейроинтерфейсом» – в том числе и для создания медицинских разработок.

    Кстати, исследования, связанные с использованием нейроинтерфейсов в медицине, проводятся довольно давно – при этом не всегда в данном случае под нейроинтерфейсом понимается легкий носимый гаджет: многое зависит от того, какая технология используется для считывания показателей работы мозга. Например, носимые гаджеты, использующиеся в проекте TuSion, обычно собирают данные электроэнцефалограммы. А нейроинтерфейсы, предназначенные для реабилитации пациентов после тяжелых травм, могут выглядеть намного более громоздкими и использовать технологию магнитной энцефалографии (или функциональной магнитно-резонансной томографии).

    В России проектов, работающих в сфере нейротехнологий, сейчас немного – в том числе потому, что направление это относительно новое. «На этом рынке пока что слишком много неизвестных: возникают вопросы медицинских ограничений использования нейротехнологий, стартапы не понимают, куда пойдет их технология, на какой рынок им выходить, с кем работать, как это будет выглядеть. Мы будем стараться исправлять эту ситуацию», — комментирует ситуацию Екатерина Егошина, директор Центра проектного управления и продвижения Университета ИТМО.

    Для этой цели Университет ИТМО запустил на кафедре Компьютерных образовательных технологий новую программу бакалавриата «Нейротехнологии и программирование» (на кафедре есть и близкая по тематике магистерская программа – «Моделирование когнитивных процессов в нейроинформационных системах»).

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

    P.S. Чтение по теме: Университет ИТМО начинает подготовку IT-специалистов в области нейротехнологий.

    Комментарии (0)

      Let's block ads! (Why?)

      Итоги второго раунда Russian Code Cup 2017

      image


      16 апреля прошёл второй квалификационный раунд Russian Code Cup 2017, на котором были побиты рекорды посещаемости за последние три года. По традиции чуть-чуть хвастаемся результатами и выкладываем разбор задач.


      A. Очень важные гости
      B. Наименьшее общее кратное
      C. Портим порядок
      D. Красно-чёрное дерево
      E. Изучение массива


      В этот раз зарегистрировалось 5262 программиста (из них 647 новых участников). В отборочный раунд мы взяли по результатам ещё 201 участника. Все пять задач успешно решили 10 человек. Первые три места ребята заняли с очень большим отрывом от остальных:


      1. На первом месте Andrei Popa из Румынии.
      2. Второе место занял Lam Nguyen, отстав всего на две минуты штрафного времени.
      3. На третьем месте с небольшим отрывом в пять минут оказался Владислав Епифанов из Нижнего Новгорода, Россия.

      Кроме того, в топ-10 попали:


      • Адам Бардашевич, Мозырь, Беларусь
      • Mahmoudian Arash, Рейна, Иран
      • Олег Давыдов, Санкт-Петербург, Россия
      • George Wu, Китай
      • Юрий Писарчук, Минск, Беларусь
      • Роман Удовиченко, Столбцы, Беларусь
      • Nguyen Trung, Вьетнам

      Мы поздравляем всех прошедших в отборочный раунд. Остальные же могут подготовиться к третьему квалификационному раунду, он пройдёт в субботу, 29 апреля, с 14:00 до 16:00 по московскому времени. Ну а теперь — разбор.


      A. Очень важные гости


      Ограничение по времени — 1 секунда
      Ограничение по памяти — 256 мегабайт


      На открытие нового кампуса Университета города N планируют прибыть nm очень важных гостей. Церемония будет проходить в зале, который имеет форму прямоугольника, места в зале организованы в n рядов по m мест, ряды пронумерованы от 1 до n, места в каждом ряду от 1 до m, j-е место в i-м ряду обозначается как (i, j).


      Организаторы церемонии открытия пронумеровали гостей от 1 до nm в соответствии с их важностью, чем больше — тем важнее. Самый важный гость — мэр города — имеет номер nm. Известно, что мэр планирует сесть на место (1, 1). Теперь необходимо рассадить остальных гостей. При этом гостей необходимо расположить так, чтобы гость с большим номером находился не дальше от мэра, чем гость с меньшим номером. Расстоянием между двумя местами (r1, s1) и (r2, s2) считается значение |r1 - r2| + |s1 - s2|.


      Помогите организаторам церемонии рассадить гостей.


      Формат входных данных


      Входные данные содержат несколько тестовых наборов. В первой строке задано количество тестов t (1 ≤ t ≤ 400).


      Каждый из тестов описывается двумя целыми числами: n и m (1 ≤ n, m ≤ 20).


      Формат выходных данных


      Для каждого теста выведите, как будет выглядеть зал после размещения там гостей.


      Выведите n строк, в каждой по m чисел, j-е число i-й строки должно быть равно важности гостя, который будет сидеть на месте (i, j).


      Если подходящих способов рассадить гостей несколько, выведите любой из них.


      Примеры


      Входные данные
      2
      2 3
      3 2


      Выходные данные
      6 4 2
      5 3 1
      6 4
      5 2
      3 1


      Разбор задачи

      Есть два способа решить эту задачу. Первый заключается в том, чтобы рассаживать гостей по диагоналям, начиная от позиции (1, 1). Требуется некоторая аккуратность в реализации, чтобы верно учесть случаи n < m и m < n. Второй способ позволяет не задумываться о том, в какую сторону вытянут прямоугольник. Просто запустим обход в ширину от места (1, 1) и будем рассаживать гостей, начиная от максимального номера, в порядке извлечения мест из очереди.


      B. Наименьшее общее кратное


      Ограничение по времени — 2 секунды
      Ограничение по памяти — 256 мегабайт


      Хорошо известно понятие наименьшего общего кратного — минимального числа, которое делится на каждое из заданных. Это понятие можно обобщить на другие математические понятия. Например, на обыкновенные дроби.


      Даны две дроби. Требуется найти их наименьшее общее кратное — такую наименьшую положительную несократимую дробь p / q, что при её делении на каждую из данных дробей в частном получается целое число.


      Формат входных данных


      Входные данные содержат несколько тестовых примеров. В первой строке входных данных задано число t — количество тестов (1 ≤ t ≤ 50 000).


      Каждый тест описывается одной строкой, которая содержит четыре числа a, b, c, d, которые задают дроби a / b и c / d (1 ≤ a, b, c, d ≤ 109). Гарантируется, что a / b и c / d — несократимые дроби.


      Формат выходных данных


      Для каждого теста выведите на отдельной строке наименьшее общее кратное дробей a / b и c / d — числитель и знаменатель искомой несократимой дроби через пробел.


      Примеры


      Входные данные
      2
      9 5 12 5
      1 10 3 100


      Выходные данные
      36 5
      3 10


      Разбор задачи

      Пусть p / q нацело делится на a / b и c / d, при этом все дроби несократимые. Тогда целыми числами являются (p / q): (a / b) = (p•b) / (q•a) и (p / q): (c / d) = (p•d) / (q•c).


      p•b делится на q•a. Поскольку b и a взаимно просты, p делится на a. p и q тоже взаимно просты, поэтому b делится на q. Аналогично p делится на с, d делится на q.


      Таким образом, p делится lcm(a, c), q делит gcd(b, d). Дробь lcm(a, c) / gcd(b, d) является наименьшей подходящей дробью, и она делится на a / b и c / d. Таким образом, ответ равен lcm(a, c) / gcd(b, d).


      C. Портим порядок


      Ограничение по времени — 2 секунды
      Ограничение по памяти — 256 мегабайт


      На ковре в комнате у Димы в ряд нарисовано n точек. По удивительному совпадению у него также есть n кубиков, весом 1, 2, ..., n грамм, соответственно. Дима наигрался с кубиками и выложил их в ряд, по одному на точку. Теперь он собирался переложить их так, чтобы они шли слева направо по возрастанию веса, но немного отвлёкся. В этот момент в комнату вошёл вредный мальчик Вадим, и решил напакостить Диме.


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


      Вадим — вредный мальчик, поэтому он хочет напакостить побольше. Он уже вытащил из ряда несколько кубиков и теперь хочет их расставить их обратно таким способом, чтобы Дима совершил максимальное число обменов. После возвращения кубиков те кубики, которые Вадим не вынимал, должны остаться на своих местах, около каждой точки должно оказаться ровно по одному кубику.


      Как именно ему следует расположить кубики?


      Формат входных данных


      Входные данные содержат несколько тестовых наборов. В первой строке задано количество тестов t.


      Каждый тест описывается следующим образом.


      В первой строке описания теста содержится число n — общее количество кубиков (1 ≤ n ≤ 105). В следующей строке содержится n чисел ai (0 ≤ ai ≤ n)


      Если ai равно 0, то на i-м месте пока ничего не стоит, этот кубик Вадим вынул. Иначе ai равно массе кубика, который стоит на i-м месте.


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


      Сумма n по всем тестам одних входных данных не превосходит 105.


      Формат выходных данных


      Для каждого теста выведите две строки.


      В первой строке выведите количество обменов, которые придётся совершить Диме для сортировки кубиков.


      Во второй строке выведите n чисел — массы кубиков в порядке слева направо, которые получатся при оптимальной расстановке кубиков Вадимом. Обратите внимание, что кубики, которые Вадим не вынул сразу, должны остаться на своих местах.


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


      Примеры


      Входные данные
      3
      2
      0 0
      4
      4 0 0 3
      5
      0 4 0 2 5


      Выходные данные
      1
      2 1
      3
      4 1 2 3
      2
      3 4 1 2 5


      Разбор задачи

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


      Для начала допустим, что мы уже сгенерировали какую-то перестановку и хотим узнать, сколько обменов совершит сортировка выбором. Для этого будем рассматривать перестановку как набор циклов. Рассмотрим цикл, в котором содержится минимальное число, стоящее не на своём месте. Длина этого цикла больше чем 1. Нетрудно заметить, что при одном обмене длина соответствующего цикла уменьшается на один и появляется новый цикл длины 1. Теперь заметим, что цикл длины L уменьшит свою длину ровно L – 1 раз в процессе сортировки, из чего следует, что суммарно длины циклов уменьшатся ровно на n – c, где c — количество циклов.


      Таким образом, нам нужно дополнить массив до перестановки так, чтобы количество циклов получилось минимальным. Для этого рассмотрим перестановку как ориентированный граф, где если a[i] = j, то в графе есть ребро из вершины i в вершину j. Граф разбился на циклы и цепочки. Все циклы, которые есть в этом графе, сохранятся и после добавления недостающих элементов, а все имеющиеся цепочки (вершину, не имеющую ни входящих, ни исходящих рёбер, будем считать цепочкой длины 0) можно объединить в один большой цикл. Пройдёмся по всем имеющимся цепочкам и будем добавлять ребро из конца одной цепочки в начало другой. Когда все цепочки соединятся в одну, добавим ребро из её конца в начало, и она станет циклом.


      D. Красно-чёрное дерево


      Ограничение по времени — 3 секунды
      Ограничение по памяти — 256 мегабайт


      Знали ли вы, что в большинстве стандартных библиотек структура данных «множество» реализовано с использованием красно-черного дерева? В этой задаче вам необходимо найти количество способов покрасить заданное двоичное дерево так, чтобы оно стало красно-черным. Ответ необходимо вывести по модулю 109 + 7.


      Рассмотрим двоичное дерево. Если у вершины меньше двух детей, добавим на место недостающих детей фиктивные вершины. Дерево называется красно-черным, если выполняются следующие свойства:


      1. Каждая вершина покрашена в один из двух цветов: красный или черный.
      2. Корень дерева и все добавленные фиктивные вершины покрашены в черный цвет.
      3. Родитель вершины, покрашенной в красный цвет, покрашен в черный цвет.
      4. Все пути от корня до добавленных фиктивных листьев содержат одинаковое количество черных вершин.

      Обратите внимание, что родитель вершины, покрашенной в черный цвет, может быть покрашен в черный цвет.


      Две раскраски дерева называются различными, если существует вершина, которая покрашена в разные цвета в этих раскрасках.


      На рисунке приведены два способа покраски дерева из второго теста.


      image


      Формат входных данных


      В первой строке содержится одно целое число n — количество вершин в дереве (1 ≤ n ≤ 500 000).


      Следующие n строк описывают дерево. В i-й строке содержатся два целых числа li и ri — индексы вершин, являющихся левым и правым детьми i-й, либо 0, если соответствующий ребенок отсутствует (li = 0 или i < li ≤ n; ri = 0 или i < ri ≤ n). Корень дерева имеет номер 1. Гарантируется, что во вводе описано корректное дерево.


      Формат выходных данных


      Выведите одно целое число — число способов покрасить заданное дерево, чтобы оно стало красно-черным. Ответ необходимо вывести по модулю 109 + 7.


      Примеры


      Входные данные
      3
      2 3
      0 0
      0 0


      Выходные данные
      2


      Входные данные
      6
      2 4
      3 0
      0 0
      5 6
      0 0
      0 0


      Выходные данные
      2


      Разбор задачи

      Заметив тонкий намёк в первом предложении условия, легко доказать (или проверить в любой книге по структурам данных), что в любом красно-чёрном дереве с n вершинами на пути от корня до листьев O(logn) чёрных вершин. Воспользуемся этим фактом в решении.


      Назовём почти красно-чёрным дерево, в котором выполняются все свойства красно-чёрного дерева, но корень дерева покрашен в красный цвет.


      С помощью динамического программирования посчитаем для каждого поддерева количество способов покрасить вершины в нём так, чтобы поддерево было красно-чёрным и количество чёрных вершин на пути от корня до листьев равнялось h — или чтобы дерево было почти красно-чёрным и количество чёрных вершин на пути от корня до листьев равнялось h.


      Сохраним это количество способов в массиве d[v][h][t], где v — номер вершины, являющейся корнем поддерева, h — количество чёрных вершин на пути от корня до листьев, а t обозначает тип покраски: если t = 0 — там хранится количество покрасок, чтобы поддерево стало красно-чёрным, а если t = 1 — чтобы поддерево стало почти красно-чёрным.


      Тогда d[v][h][0] равняется произведению по всем u, являющимся детьми v, значений (d[u][h – 1][0] + d[u][h – 1][1]). А d[v][h][1] равняется произведению по всем u, являющимся детьми v, значений d[u][h][0].


      Ответ на задачу будет равен сумме по всем d[1][h][0].


      Теперь заметим, что h для всех допустимых раскрасок поддеревьев ограничено некоторой величиной C = O(log(n)), и при всех h > C количество покрасок гарантированно будет равняться нулю.


      Значит, необходимо всего O(nlog(n)) состояний, из каждого из которых идёт O(1) переходов. Следовательно, решение будет работать за O(nlog(n)).


      E. Изучение массива


      Ограничение по времени — 2 секунды
      Ограничение по памяти — 256 мегабайт


      Вася обожает массивы. Поэтому родители на день рождения подарили ему массив a, состоящий из чисел 1 и  - 1. Вася сразу же начал его изучать.


      Так как Вася также очень любит нули, он решил брать разные подотрезки a[li, ..., ri] массива a и искать в них длину максимального подотрезка с суммой 0. Если такого подотрезка нет, он считает ответ равным 0. Вася написал на бумажке q отрезков [li, ri] и теперь хочет найти сумму ответов на них.


      Приведем ответы на выбранные Васей подотрезки в тестовом примере:


      • подотрезок [1, 5]: максимальный подотрезок с суммой 0 — [2, 5];
      • подотрезок [1, 3]: максимальный подотрезок с суммой 0 — [2, 3];
      • подотрезок [2, 4]: максимальный подотрезок с суммой 0 — [2, 3];
      • подотрезок [3, 4]: подотрезка с суммой 0 нет;
      • подотрезок [3, 5]: максимальный подотрезок с суммой 0 — [4, 5].

      Итого, суммарная длина всех искомых подотрезков в этом тесте равна 4 + 2 + 2 + 0 + 2 = 10.


      Формат входных данных


      Входные данные содержат несколько тестовых наборов. В первой строке задано количество тестов t (1 ≤ t ≤ 1000).


      Каждый из следующих t тестов описывается следующим образом: в первой строке описания теста содержится число n — количество элементов массива (1 ≤ n ≤ 105).


      В следующей строке содержится n целых чисел ai — элементы массива (ai =  - 1 или ai = 1).


      В следующей строке содержится число q — количество подотрезков, выписанных Васей (1 ≤ q ≤ 105).


      В каждой из следующих q строк содержится два числа li, ri — левая и правая границы i-го подотрезка соответственно (1 ≤ li ≤ ri ≤ n)


      Гарантируется, что сумма n во всех тестах одних входных данных не превосходит 105, а также сумма q во всех тестах одних входных данных не превосходит 105.


      Формат выходных данных


      Для каждого теста выведите ответ на него — сумму ответов для всех q подотрезков.


      Примеры


      Входные данные
      1
      5
      1 -1 1 1 -1
      5
      1 5
      1 3
      2 4
      3 4
      3 5


      Выходные данные
      10


      Разбор задачи

      Поскольку ограничения на n и q совпадают, будем использовать n вместо max(n, q). Сделаем несколько наблюдений.


      Первое наблюдение: ответ на запрос — максимальная длина отрезка [L, R], такого, что prefL – 1 = prefR, где prefi = a1 + a2 + ... + ai — префиксная сумма массива a (pref0 = 0). Далее будем считать, что мы работаем с массивом pref0, pref1, ..., prefn и по запросу [l, r] требуется найти максимальный по длине подотрезок [L, R] отрезка [l – 1, r], такой, что prefL = prefR.


      Второе наблюдение: prefi — довольно маленькие (–n ≤ prefi ≤ n).


      Будем решать задачу офлайн. Воспользуемся методом, во многом похожим на алгоритм Мо. Разобьём все запросы на группы, где в i-й группе содержатся запросы [li, ri], такие, что i•K ≤ li < (i + 1)•K (K — константа, приблизительно равная sqrt(n)). В каждой группе отсортируем запросы по правой границе. Теперь решим задачу отдельно для каждой группы запросов.


      Рассмотрим i-ю группу [Li, Ri]. Будем идти подряд по запросам слева направо (т. е. по неубыванию правой границы). Также будем поддерживать два массива, mostLeft[p] и mostRight[p]: текущее самое левое вхождение префиксной суммы p, которое также левее Ri, и текущее самое правое вхождение префиксной суммы p. Поддерживая эти два массива, также несложно поддерживать ответ на отрезке [Ri + 1, r], где r — правая граница текущего запроса. Для ответа на запрос [l, r] посчитаем за O(K) ответ на [l, min(r, R)], используя информацию из массива mostRight, и сравним это значение с текущим ответом на отрезке [R + 1, r].


      Итого на запросы каждой группы в сумме мы тратим O(K•ci + n) времени, где ci — количество запросов в группе. Так как групп всего O(n / K), получаем суммарное время работы O(sumi = 1… n / K(K•ci + n)) = O(K•sum(ci) + n2 / K). При K = sqrt(n) получаем время работы O(n•sqrt(n)).


      Все на третий раунд!


      Ещё раз напоминаем: третий раунд начнётся 29 апреля с 14:00 по московскому времени. Более пяти тысяч участников уже зарегистрированы. Будет с кем посоревноваться!


      Присоединяйтесь!

      Комментарии (0)

        Let's block ads! (Why?)

        О карте МегаФона — технические подробности, часть 2

        Продолжаем рассказывать про технические особенности реализации проекта по выпуску и обслуживанию банковских карт «МегаФона». В предыдущих постах мы говорили о карте как о финансовом продукте, о ее возможностях и об устройстве программного обеспечения, которое обеспечивает работу системы. В этом посте мы затронем вопросы, связанные с интеграцией  IT-систем «банка Раунд» — партнера «МегаФона» по проекту — с IT-системами оператора. Технологическим партнером по созданию интеграционного решения, объединяющего IT-системы банка и «МегаФона», стала компания «Неофлекс» — системный интегратор с более чем двенадцатилетним опытом работы на IT-рынке.

        Проект проходил в несколько этапов:

        • Команда «Неофлекс» изучила бизнес-процессы, спроектированные на стороне МегаФона.
        • Совместно с ИТ-архитекторами банка мы предложили решение, которое позволило положить эти процессы в основу SOA-архитектуры, с учетом обеспечения стабильности и устойчивости системы.
        • Затем были сформулированы требования к будущему интеграционному решению, которое также было разработано «Неофлекс».
        • Следующий этап — разработка и тестирование, его делали итерационно, разбивая функциональность на логические блоки.

        Мы понимали, что важно не ошибиться при проектировании дизайна потоков данных. Возможно, это звучит банально, но для данного проекта этот аспект был критическим, поскольку интеграция затронула IT-ландшафты двух разных индустрий. И телеком, и банкинг имеют свои правила и исторически сложившиеся особенности, которые необходимо было учесть и «бесшовно» объединить в единый процесс по обмену данными. Мы предпочли взять паузу на старте проекта и совместно с архитекторами банка и оператора разработать дизайн по интеграции, выявить необходимые сервисы, проанализировать бизнес-процессы, внести в них изменения, чтобы затем переложить их на концепцию SOA. Дизайн действительно удалось проработать качественно, изменения конечно были, но они были минорные и не влияли потом на архитектуру интеграционного решения.

        Одним из самых сложных аспектов проекта еще на этапе планирования работ являлось наличие большого количества поставщиков и подрядчиков. Выполнение такого проекта классическим водопадом привело бы нас к увеличению сроков, что было недопустимо. Из-за того, что работы выполнялись в динамическом режиме, фиксировать scope на начальном этапе было практически нереально. Работать классическим scrum мы тоже не могли, так как многие контрольные точки зависели от поставщиков других систем. Мы применили спиральный подход: совместно с банком мы проанализировали приоритеты других поставщиков, общие задачи проекта и выделили блоки функциональности. Эта модель и определила для нас состав итераций по разработке проекта. Как результат, когда прошла половина срока на выполнение всего проекта, мы начинали аналитику по сервисам для IVR и личного кабинета клиента, при этом на тестовом окружении уже стояло интеграционное решение, обеспечивающее процесс выпуска карт. Это позволяло на ранней стадии определить, какие изменения и улучшения внести в процесс, а команды АБС и фронта по выпуску карт могли проводить сквозное тестирование новой функциональности.

        Коротко о главном


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

        В качестве основной платформы для обеспечения интеграции выбрали решение Oracle Service Bus. Это промышленная интеграционного платформа от одного из мировых лидеров IT-отрасли, которая предназначена для построения инфраструктуры доступа к бизнес-сервисам и их виртуализации. Как и ряд других промышленных платформ, OSB обладает развитым средством разработки и отладки решений, большим объемом документации, также можно отметить возможности для быстрого и удобного создания сложных трансформаций данных, поддержку из коробки большого числа различных транспортных протоколов, эффективное управление большим количеством запросов, удобное управление изменениями. Компания «Неофлекс» уже имела успешный опыт выполненных программ проектов на платформе OSB, поэтому мы были уверены в решении и понимали, как его оптимально использовать для решения задач проекта Банковская карта Мегафона, как минимизировать затраты на написание кода, фактически концентрируясь только на бизнес функционале.

        Опытным путем


        На стороне «МегаФона» проект затронул шлюз электронной коммерции для списания и пополнения лицевого счета, систему для управления услугами, подключенными к телефонам клиентов, IVR, а также личный кабинет абонента. Также на стороне оператора активно используется «Система продаж и обслуживания»,  через которую отправляются запросы на оформление и выдачу карт. На стороне банка решение интегрируется с процессинговой системой, АБС, системой валидации клиентов. Со всеми системами, кроме биллинга, мы интегрировались напрямую, используя стандартные для индустрии технологии — SOAP и REST. Взаимодействие с биллинговой системой было настроено с использованием шлюза от компании InPlat, который обеспечивает единую точку входа для всех партнеров «МегаФон» и предоставляет доступ к услугам электронной коммерции.

        Часть функциональности проекта включала не только необходимость создания транспортных потоков, но и сложную бизнес-логику с поддержкой асинхронных транзакционных вычислений. Для реализации таких задач в рамках проработки архитектуры мы решили вынести эту функциональность в отдельное масштабируемое решение на java компонентах, в основу которого были положены как принципы java enterprise, так и MSA (micro service architecture). Выбранный подход позволяет добиться легкого и недорогого масштабирования решения по нагрузке с возможностью оперативно вносить необходимые изменений в функциональность.

        Исходя из нашего опыта, мы понимали, что критически важной частью такого решения является система мониторинга состояния инфраструктуры и компонентов решения и система аудита обрабатываемых сообщений. В качестве средства сбора и обработки данных о состоянии инфраструктуры банк использует Zabbix, и мы решили интегрироваться в него, имея опыт его использования в сложных проектах. При проектировании и создании системы мы закладывали точки мониторинга, всего их было создано несколько десятков, они позволяют контролировать количество используемых ресурсов (потоки обработки, соединения с базой данных, соединений с внешними системами) и анализировать показатели по обработке сообщений, например, количество неуспешных запросов за последнее время, количество обработанных запросов и прочее. Разработанная система аудита обработанных сообщений позволяет через удобный пользовательский интерфейс просматривать полную информацию обо всех запросах с использованием фильтров и поиска. При этом различные сообщения в рамках одного бизнес процесса объединяются в одну цепочку. Естественно информация о запросах, доступная в мониторинге, проходит предварительную обработку, чтобы удовлетворять политикам безопасности банка и требованиям PCI DSS, но указанного средства банку достаточно, чтобы разобрать максимально быстро любую спорную ситуацию. Для интеграции это очень важно, т.к. в процесс вовлечено много систем и даже несколько организаций.

        Естественно на самой разработке жизнь системы не заканчивается. В настоящий момент мы сопровождаем разработанную систему и реализовываем изменения в рамках развития решения. Особо хочется отметить, что время, потраченное на тщательную проработку и разработку средств мониторинга, с лихвой окупает себя сейчас во время сопровождения решения. Сообщения удобно искать по различным данным, проследить всю цепочку сообщений в рамках бизнес операции, посмотреть обмены с конечными системами. Это позволяет быстро понять, в какой системе проблема, так как по опыту разработки интеграционных решений – львиная доля обращений относятся не к ошибкам интеграции, к интегрируемым системам. И самое трудоемкое – это локализация.

        Комментарии (0)

          Let's block ads! (Why?)

          Как я писал предложение к стандарту С++

          Это будет история младшего разработчика из Яндекс.Паспорта о появлении предложения в стандарт С++, разработанного в соавторстве с Антоном antoshkka Полухиным. Как часто бывает в жизни, что-то новое началось с боли, а точнее — с желания её прекратить.

          Жила-была библиотека у меня на поддержке. Всё у неё было хорошо: собиралась под Linux, работала, не падала. Однажды пришли люди с просьбой (требованием) собрать её под Windows. Почему бы и нет? Но с первого раза не получилось. Корнем зла оказалась рукописная криптография, которая в какой-то момент умножала два 64-битных целых числа. Для сохранения результата такого умножения потребуется число на 128 бит, и в библиотеке использовался тип __int128. Он прекрасен: имеет естественный интерфейс, поддерживается несколькими компиляторами (gcc, clang), работает без аллокации памяти, но главное — он есть.

          Разработчики компилятора из Microsoft поддержку этого типа не обеспечили, аналогов не придумали — или я их не нашёл. Единственное пришедшее на ум кроссплатформенное решение — Big Numbers из OpenSSL, но оно несколько другое. В итоге конкретно эту проблему я решил «велосипедом»: нужен был только uint128_t с ограниченным набором операций. Из нескольких чужих решений собрал класс UInt128, положил его в исходники библиотеки. «Велосипед» — как раз и есть та самая боль. Задача была решена.

          Вечером того же дня пошёл развеяться на мероприятие, где люди из «Рабочей Группы 21» (РГ21) рассказывали о том, как они обрабатывают напильником С++. Я послушал и написал на cpp-proposal@yandex-team.ru короткое письмо из двух предложений на тему «нужен int128 в сpp». Антон Полухин в ответ поведал о том, что разработчики стандарта хотят решить эту проблему раз и навсегда. Логично: сейчас мне потребовалось число на 128 бит, а кому-то надо работать с числами на 512 бит — и этот кто-то тоже захочет удобный инстумент.

          Ещё Антон поведал, что есть два пути к решению: через ядро языка и через библиотеку. Существует мнение, и я его разделяю, что синтаксис языка и так достаточно сложен: добавить в язык конструкцию, которая обеспечит кроссплатформенную и эффективную возможность использовать числа разной точности, будет очень непросто. А вот в рамках библиотеки справиться вполне реально: шаблоны — наше всё. «Нужен работающий прототип, — сказал Антон. — И желательно с тестами». А ещё выяснилось, что тип должен быть plain old data (POD), чтобы понравиться большему количеству людей.

          И я пошёл делать прототип. Название wide_int выбрал осознанно: устойчивых ассоциаций с таким названием нет, во всяком случае — распространённых. Например, big_number мог ввести в заблуждение — мол, он хранит значение в куче (heap) и никогда не переполняется. Хотелось получить тип с поведением, аналогичным поведению фундаментальных типов. Хотелось сделать тип, размер которого будет продолжать их прогрессию: 8, 16, 32, 64… 128, 256, 512 и т. д. Через какое-то время появился работающий прототип. Сделать его оказалось несложно: он должен был компилироваться и работать, но необязательно по-настоящему эффективно и быстро.

          Антон его изучил, сделал ряд замечаний. Например, не хватало преобразования к числам с плавающей точкой, надо было пометить максимальное число методов как constexpr и noexcept. От идеи так ограничивать выбор размера числа Антон меня отговорил: сделал размер, кратный 64. После этого мы совместно с Антоном написали текст самого предложения. Оказалось, что писать документ гораздо сложнее, чем писать код. Ещё немного шлифовки — и Антон (как единственный понимающий, что делать дальше) начал показывать наше предложение людям из комиссии по стандартизации.

          Критиковали немного. Например, кто-то высказал желание сделать целочисленный тип, который не переполняется. Или тип, размер которого можно задать с точностью до бита (и получить, например, размер в 719 бит!). Предложение отказаться от привязки к количеству бит, а задавать количество машинных слов, мне показалось самым странным: бизнес-логике всё равно, сколько слов в числе на какой-то платформе, — ей важно однозначно определять одни и те же числа на разных платформах. Скажем, уникальный идентификатор пользователя — беззнаковое целое число из 64 бит, а не из одного unsigned long long.

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

          Защита прошла успешно: наше предложение взяли в работу — другими словами, оно будет рассматриваться на заседаниях и дальше. Был высказан ряд замечаний; сейчас мы вносим нужные исправления. В частности, комиссия всё-таки попросила в wide_int оперировать количеством машинных слов. Аргументация проста: тип так или иначе будет реализован, но если использовать эти самые машинные слова, то выйдет эффективнее. У меня остаётся надежда, что удобный алиас uint128_t попадёт в стандарт — тогда я смогу выкинуть свой тип UInt128, пока его не увидел кто-то ещё. =)

          Актуальную версию имплементации можно найти здесь. Ещё есть документ и небольшое обсуждение на stdcpp.ru. Всего со дня отправки первого письма на cpp-proposal@yandex-team.ru прошло около четырёх месяцев. Из них около 40 часов нерабочего времени мною было потрачено на это предложение. На момент написания статьи имплементация распухла на 1622 строки, да ещё тесты добавили 1940 строк.

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

          Во-вторых, я могу изменить C++ в ту сторону, которая мне нравится. Конечно, тут важно помнить, что для реализации любой крупной идеи нужны единомышленники. Например, есть идея сделать интерфейс для контейнеров и строк чуть более выразительным и очевидным: я хотел добавить контейнерам operator bool(). Но неравнодушные к C++ коллеги дали понять, что я неправ.

          В-третьих, я много нового для себя узнал о шаблонах в С++.

          В-четвёртых, говорят, что это как-то усилит моё резюме… Пока не проверял, но поверю опытным коллегам на слово.

          В-пятых, когда Бьярне Страуструп где-то в переписке, посвящённой обсуждению твоей работы, пишет кому-то «+1» — это весело. =) Даже если он поддерживает чью-нибудь критику.

          Напоследок скажу, что про новости и мероприятия РГ21 С++ можно узнавать, подписавшись в Твиттере на канал stdcppru.

          Комментарии (0)

            Let's block ads! (Why?)

            [Перевод] Исследование пропорций более 1 000 000 лиц: правило золотого сечения или правило третей?


            Перевод поста Майкла Тротта (Michael Trott) "Profiling the Eyes: ϕaithful or ROTen? Or Both?".
            Код, приведенный в статье, можно скачать здесь.

            Выражаю огромную благодарность Полине Сологуб за помощь в переводе и подготовке публикации



            Содержание


            Исследование проявления золотого сечения в положении человеческих лиц на картинах и фотографиях
            Уровень линии глаз на старых картинах — скорее ROT, чем φaithful
            Высота линии глаз в современных картинах
            Высота линии глаз в работах профессиональных фотографов
            Высота линии глаз в селфи
            Фото из профилей LinkedIn
            Лица с обложек еженедельных журналов последних трех десятилетий
            Обложки комиксов
            Ежедневные газеты и журналы мод
            Знаменитости из киноиндустрии
            Кино: линия глаз в движении
            Выводы

            Исследование проявления золотого сечения в положении человеческих лиц на картинах и фотографиях


            Существует огромное количество литературы, посвященной золотому сечению в природе, в физиологии и психологии, а также в произведениях искусства (см. эту статью о золотом сечении, и вот эти: о золотом сечении в искусстве, в природе и в человеческом теле, и еще — о структуре творческого процесса в науке и искусстве). В последние годы нарастает скептицизм по поводу распространенности золотой пропорции в этих областях. Были пересмотрены более ранние исследования. Смотрите, например, исследования греческих храмов Фотакиса, Марковского, Фостера, Холланда и Бенджафилда, и Свободовой и др. — по физиологии человека.

            В моем посте "Пропорции в искусстве. Есть ли что-то лучше золотого сечения? Исследование более 1 000 000 старых и современных картин" (перевод на Хабре) я проанализировал пропорции более миллиона старых и новых картин. На волне психологических экспериментов второй половины девятнадцатого века (например, Фехнер, 1870-е гг.), было бы логично ожидать появления множества картин с отношением высоты к ширине, равным золотому сечению. Однако анализ большого количества картин не подтвердил эту гипотезу.

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

            Сегодня мы будем анализировать коллекции картин, фотографий и обложек журналов, на которых изображены человеческие лица. Мы будем также анализировать лица в нескольких выбранных фильмах.

            Литература по истории искусства и эстетике фотографии традиционно предлагает разделение холста на трети по горизонтали и по вертикали. При изображении человеческих лиц часто упоминаются два правила:

            • правило третей: линия глаз должна проходить на уровне 2/3 (≈0.67) от общей высоты лица.
            • правило золотого сечения: линия глаз должна проходить на уровне 1/(золотое сечение) (≈0.62) от подбородка.

            Правило третей сокращенно пишется ROT (rule of thirds). В 1998 году Фраскари и Жирардини (в духе Адольфа Цейзинга — отца так называемого золотого нумеризма) ввели термин "φaithful" (греческий символ ϕ используется для обозначения золотого сечения) для обозначения неограниченной веры в примат золотого сечения. Некоторые считают правило третей аппроксимацией правила золотого сечения. Насчет соотношения этих двух правил ведутся многочисленные дискуссии. Чтобы почитать об использовании правила третей до 18 века, см. Нафиси). Смотрите также современную историю использования этого правила. Правило третей в живописи и фотографии — см. Amirshahi и др.

            Так как мы не можем определить, какое правило является более распространенным, давайте посмотрим на некоторые данные.

            Уровень линии глаз на старых картинах — скорее ROT, чем φaithful


            Давайте начнем с картин. Как и в предыдущем моем исследовании, мы будем использовать несколько различных источников данных. Нас интересуют четыре коллекции живописи: из Викимедиа, Смитсоновского музея, британской Your Paintings и Саатчи.

            Если мы хотим проанализировать расположения лиц на картинах, необходимо сначала определить их местонахождение. Для этого нам пригодится функция FindFaces. Хотя она обычно используется для фотографий, она неплохо зарекомендовала себя и для картин. Вот несколько случайно выбранных фотографий из Wikimedia. Для начала изображения импортируются и лица подсвечиваются желтым полупрозрачным прямоугольником. Мы видим различное количество горизонтального пространства вокруг лица, при этом расширение по вертикали оказывается довольно однородным от подбородка до линии волос.

            Более детальный осмотр показывает, что линия глаз находится примерно на уровне 60% от высоты лица (обратите внимание, что это примерно 1/ϕ). Чтобы продемонстрировать корректность правила 60% для нескольких случайно выбранных изображений из Википедии, мы показали итоговую линию глаз красным цветом и провели две линии на 5% выше и ниже.

            Независимо от пола и прически 60% — хорошая аппроксимация для линии глаз. Конечно, не все лица на фотографиях расположены ровно. Если голова наклонена, глаза не будут находиться на горизонтальной линии. Но, в общем, правило 60% работает неплохо.

            В целом мы видим, что линия глаз располагается примерно на одном урове в пределах нескольких процентов от вертикальной высоты лица прямоугольника. Погрешность полученной оценки высоты линии глаз в большинстве случаев оказывается около ≤2%. Этого мало, чтобы отличить золотую пропорцию от правила третей (на интервале [0,1] расстояние между 1/ϕ и 2/3 — около 5%).

            Начнем с изображений картин из Wikimedia.

            Используя коэффициент 0,6 для высоты линии глаз, мы получаем следующее распределение идентифицированных лиц. На 8000 изображений было обнаружено около 12000 лиц. Синяя кривая показывает статистику по всем лицам, а оранжевая кривая относится к лицам, которые вместе с прямоугольниками, окружающими их, занимают более 1/12 от общей площади картины (далее эти лица будем называть большими). Мы видим четкий максимум на уровне 2/3, что соответствует правилу третей (две черные вертикальные линии — это высота линии глаз для правила третей и золотой пропорции).

            Так как анализируемые нами изображения могут быть обрезаны, в наших данных могут появляться ошибки. Анализ, приведенный в прошлой записи, показал, что эти эффекты усредняются, так что ошибки появляются менее чем в 1% случаев для 10 000 картин.

            Вот две «тепловые карты»: одна для всех лиц, а другая — только для больших. Теперь накладываем прямоугольники с лицами друг на друга, а цвет будет указывать долю всех лиц в заданном положении. Видно, что человеческие лица появляются в левой и правой половинах изображения с одинаковой частотой. Для обеспечения возможности сравнения расположения лиц на картинах с различными соотношениями сторон ширина и высота всех картин была пересчитаны так, чтобы они вписывались в квадрат. Центр каждого лица прекрасно попадает в диапазон [2/3, 1/ϕ] (код Wolfram Language для создания графика и тепловая карта даны ниже).

            Ниже представлена короткая анимация, показывающая, как формируется пик на распределении лиц, когда все больше и больше картин накладываются друг на друга.

            Повтор анализа изображений с Wikimedia на основе выборки из 4000 портретов из коллекции http://ift.tt/2obcbyN[1]=!set_name%3A»Catalog+of+American+Portraits"&edan_q=portrait&edan_local=1&edan_fq[]=online_visual_material%3Atrue&op=Search" target="_blank">Смитсоновского музея дает аналогичный результат. На этот раз кривая демонстрирует более четко локализованный пик, потому что мы с самого начала выбрали портреты.

            Британский сайт Your Paintings обладает гораздо большей коллекцией картин. На 58000 картин мы обнаружили в общей сложности 76000 лиц.

            Среднее значение и стандартное отклонение для всех высот линии глаз — 0,64 ± 0,19, а медиана равна 0,69.

            Наши результаты показывают, что более крупные лица расположены в среднем ниже. Даже при очень маленьких относительных размерах лица линия глаз находится на уровне между 1/ϕ и 2/3.

            Последнее изображение требует также создания графика относительного размера лиц на картине. Средняя площадь прямоугольника, обозначающего зону лица, равна 3,9% от всей площади картины (стандартное отклонение 5,5%).

            Вот соответствующее кумулятивное распределение всех вариантов расположений линии глаз для лиц больше данного относительного размера. Две плоскости в плоскости уz — это 1/ϕ и 2/3.

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

            Мы провели повторный анализ с картинами, на которых изображено только одно лицо. Теперь мы видим более широкий максимум, который охватывает диапазон от 1/ϕ до 2/3.

            Если посмотреть на сегментированные, а не на сглаженные данные в области глобального максимума, мы увидим два хорошо различимых максимума: один — соответствующий правилу третей, и другой — соответствующий золотому сечению.

            Теперь, когда мы проделали всю работу, связанную с поиском лиц, мы можем, например, совместить их. В результате мы получаем усредненное лицо, полученное из 11000 лиц, изображенных на британских картинах девятнадцатого века. Совмещенные изображения десятков тысяч лиц также дают нам некоторую уверенность в надежности и качестве процесса экстракции лица.

            На кого же из известных ныне живущих людей похожи люди с картин 19-го века? Использование функции Classify[«NotablePerson», ...] позволит нам найти некоторые неожиданные сходства. Функция findSimilarNotablePerson использует в качестве аргумента сокращенный URL страницы с сайта Your Paintings, а затем импортирует картину, извлекает лицо, и, наконец, находит наиболее похожего известного человека из встроенной базы данных.

            Вот здесь показаны еще несколько подобных пар (см. прикрепленный документ для просмотра разных пар изображений).

            Высота линии глаз в современных картинах


            Теперь давайте посмотрим на некоторые более современные картины. Мы нашли больше 15000 современных портретов в Saatchi. Лица на современных портретах часто выглядят довольно абстрактно, но с помощью функции FindFaces все равно можно найти некоторое их количество. Вот несколько примеров.

            А вот коллаж из 144 случайно выбранных лиц с современных картин. На расстоянии можно распознать человеческие лица, однако из-за стилистических различий отклонения становятся менее заметными.

            Если мы снова совместим все лица, мы получим вполне нормальное человеческое лицо. Это обобщенное лицо имеет более женские черты (например, более плавную линию подбородка и полные губы) по сравнению с картинами девятнадцатого века. Если смотреть на коллаж выше, удивительно, что обобщенное лицо выглядит вполне нормальным.

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

            Теперь затронем главный вопрос этой статьи: как расположены лица на этих современных портретах? Оказывается, они следуют правилу золотой пропорции, а не правилу третей. На 30% больше картин имеют линию глаз на уровне 1/φ ± 1% по сравнению с 2/3 ± 1%.

            Среднее значение и стандартное отклонение для всех высот линии глаз составляет 0,60 ± 0,16, а медиана равна 0,62.

            А если мы построим график высоты линии глаз в зависимости от размера лица, мы увидим пятно, означающее расположение линии глаз на высоте 2/3 при соответствующей площади лица, составляющей 20% от общей площади картины.

            И вот соответствующая 3D графика, которая достаточно ярко демонстрирует высоту линии глаз на уровне 1/ϕ для относительно крупных лиц.

            Чтобы подтвердить, что современным картинам свойственно расположение линии глаз на уровне, соответствующем правилу золотого сечения, необходимо проверить полученные данные на других данных. Сайт Fine Art America предлагает тысячи портретов современных знаменитостей. Здесь размещено около 5000 таких изображений (примерно поровну политиков, актеров, музыкантов и спортсменов). И опять мы ясно видим на графике максимум, соответствующий 1/ϕ, а не 2/3.

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

            Вот несколько примеров (мы использовали около 150 портретов одного человека.)

            Неожиданно, но лицо Джимми Хендрикса почти полностью соответствует правилу золотого сечения, а лицо Мика Джаггера оказалось ближе к правилу третей. Лица Обамы и Иисуса подчиняются правилу третей в его классической форме.

            Высота линии глаз в работах профессиональных фотографов


            Теперь давайте посмотрим на набор фотографий и определим положение лиц на них. Давайте начнем с профессиональных портретных фотографий. В Getty Image collection собраны лучшие фотографии. В отличие от картин, максимум для крупных лиц гораздо ближе к 2/3 (ROT), чем к 1/ϕ для 200000 случайно выбранных портретов.

            И опять построим распределение по высоте линии глаз/относительному размеру лица. Для очень больших относительных размеров лица наиболее распространенная высота линии глаз опускается даже ниже 1/ϕ.

            А вот соответствующая тепловая карта, созданная путем наложения 300000 лиц.

            А что насчет других фотографий, эстетически менее совершенных, чем Getty Images? На сайте Shutterstock выложено множество фотографий. Мы видим, что в данном случае максимум графика высоты линии глаз приходится на значение 2/3 (то есть речь опять идет о правиле третей). На этот раз мы приводим результаты для портретов, помеченных одинаковыми тегами.

            Ниже вы видите распределение по высоте линии глаз и наложение 100000 мужских и женских портретов (относительно узкий пик в структуре двойного пика получился из-за фотографий, на которых изображено не все лицо полностью).

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

            Далее показаны результаты анализа фотографий с тегами счастье и грусть.

            Все фотографии, помеченные каждым из шести типов тегов (мужчина, женщина, ботаник, борода, счастье, грусть) демонстрируют замечательную устойчивость в положении максимума линии глаз. Она всегда находится в интервале [1/φ, 2/3] с тенденцией к 2/3 (правило третей).

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

            Далее мы посмотрим на высоту линии глаз в работах двух профессиональных фотографов: Пегги Сироты и Марио Тестино. Поскольку оба фотографа часто снимают моделей, на фото будет изображено все тело, что сместит интересующий нас показатель значительно выше 2/3 (мы вернемся к этому явлению позже).

            Высота линии глаз в селфи


            После анализа профессиональных фотографий мы должны, конечно, взглянуть также на вершину современной любительской съемки — селфи (чтобы почитать про историю селфи — см. Зальц; для детального изучения повышения популярности селфи на три порядка за последние три года см. Соуз и соавт). С помощью «Flickr» мы можем сразу загрузить образцы селфи. Вот пять селфи, сделанные на прошлой неделе в районе Эйфелевой башни. Однако не все изображения, помеченные как селфи, — лица, снятые крупным планом.

            Каждый день в Instagram добавляется более 100000 селфи (можно посмотреть их здесь), — это идеальный источник селфи. Вот распределение высоты линии глаз для 100000 селфи.

            В отличие от профессиональных фотографий, мы видим, что максимум распределения по высоте линии глаз явно выше 2/3 для фотографий, на которых лицо занимает больше 1/12 площади фотографии. Так что в следующий раз, когда вы будете делать селфи, разместите лицо немного ниже в кадре, чтобы лучше подчиняться правилам ROT и ϕ (систематические отклонения селфи от эстетических фотографических принципов уже рассматривались Бруно и др.).

            Высота линии глаз в селфи изменяется значительно меньше по сравнению с профессиональными фотографиями.

            И, опять же, соответствующая тепловая карта.

            Максимум общей площади лица на селфи связан с длиной человеческой руки или телескопической палки для селфи, ограниченной одним метром. Так что селфи с мелкими изображениями лица — более редкое явление, чем аналогичные фотографии или картины.

            Как выглядит усредненное лицо с селфи-фотографий? Левое изображение — усредненный вариант всех лиц, среднее — все мужские лица, а правое изображение — усредненный вариант женских лиц (гендеры были определены эвристически путем сопоставления мужских и женских имен с именами пользователей). Усредненное селфи напоминает женское лицо, потому что женщины гораздо чаще делают селфи. Это также было обнаружено в недавнем исследовании Мановича и соавт.

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

            Теперь мы можем всего за минуту получить среднюю высоту линии глаз людей, чьи имена у всех на слуху (каждый результат основан на анализе 600 портретных снимков): леди Гага, Тэйлор Свифт, Брэд Питт и Дональд Трамп. Высота линии глаз Леди Гага почти идентична той, что получилась при анализе селфи. А вот максимум графика линии глаз Тейлор Свифт, как и в случае с современными картинами, приходится на 1/ϕ.

            Так можно проанализировать и многие другие типы фотографий. А мы на этом закончим и оставим дальнейшие исследования читателю.

            Фото из профилей LinkedIn


            На многих страницах LinkedIn размещены фотографии владельцев страниц. Эти фотографии — еще один источник данных для наших исследований высоты линии глаз. Проанализировав фотографии из профилей 25000 мужчин и 25000 женщин, мы получили следующие результаты. Поскольку подавляющее большинство фотографий в LinkedIn сняты крупным планом, кривая для лиц, занимающих более 1/12 всей площади, очень похожа на кривую всех лиц, и поэтому мы продемонстрируем только кривую распределения всех лиц. На этот раз желтая кривая показывает все лица, которые занимают от 10% до 30% от общей площади фотографии.

            Этот график демонстрирует высоту линии глаз 10000 мужчин-пользователей LinkedIn.

            Интересно отметить, что глобальный максимум распределения высоты линии глаз проходит явно ниже 1/ϕ — результат, противоположный полученному при анализе селфи выше. Глобальный максимум соответствует значению высоты линии глаз 1/ϕ. Низкий глобальный максимум появляется из-за фотографий, на которых область лица занимает более 30% от общей площади. На типичной фотографии профиля в LinkedIn лицо занимает более 20% от общей площади фотографии, а уровень линии глаз находится на уровне, соответствующем правилу золотого сечения.

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

            Учитывая большое количество пользователей LinkedIn, можно попытаться найти высоту линии глаз для различных людей с одинаковыми именами. Мы выбрали три имени: Джош, Радж и Мэй. Совместив для каждого имени 2500 фотографий, мы получаем следующие распределения и усредненные варианты лиц:

            Полученные распределения достаточно хорошо согласуются с соответствующими гендерными распределениями выше.

            После наблюдения за замечательным пиком высоты линии глаз на 1/ϕ мне стало интересно, подчиняется ли внешность кого-то из моих сотрудников правилу золотого сечения. И действительно: я обнаружил, что высота линии глаз моих коллег-мужчин отвечает правилу золотого сечения. Это касается и нашего дизайн-директора. Следующий шаг — импорт фотографий из профилей LinkedIn других сотрудников Wolfram; мы видим красную линию на высоте 1/ϕ.

            Давайте сравним полученные результаты с результатами, полученными при анализе фотографий нынешних членов Конгресса. Мы импортируем фотографии всех членов Конгресса.

            Вот примеры фотографий:

            Подобно фотографиям из профилей LinkedIn, максимум линии глаз оказывается несколько ниже, чем 2/3. А вот усредненное лицо члена Конгресса.

            Лица с обложек еженедельных журналов последних трех десятилетий


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

            Нужно просто загрузить обложки, а затем найти и извлечь лица.

            Вот два итоговых распределения для высот линии глаз:

            Максимум оказывается на высоте менее 1/2. Это главным образом вызвано тем, что название журнала размещается в верхней части обложки. В новых изданиях название журнала и изображения частично накладываются друг на друга. Следующий график показывает среднее значение высоты линии глаз с течением времени (по годам). С 1980-х гг. наблюдается тенденция к более высоким позициям линии глаз на обложке.

            Если рассчитать высоту линии глаз со всех выпусков за последние двадцать пять лет, мы увидим совсем другое распределение с бимодальной структурой. Один из пиков почти точно приходится на 1/ϕ.

            А вот усредненные лица по декадам. Мы видим также, что обложки первых двух десятилетий выпуска журнала были черно-белыми.

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

            И опять из-за того, что в верхней части обложки размещается название журнала, линия глаз оказывается на относительно низком уровне (≈0.56).

            Тепловая карта расположения лиц достаточно ясно демонстрирует это.

            Принимая во внимание то, что название журнала «SPIEGEL», как правило, занимает около 13% от высоты обложки, и что в нижней ее части есть пробелы, перенормированный пик высоты линии глаз оказывается почти ровно на 1/ϕ.

            В качестве третьего примера мы выбрали менее политизированный журнал Rolling Stone. У них тоже есть коллекция обложек до 2013 года. Распределение по высоте линии глаз снова оказывается бимодальным, с пиком на 1/ϕ. Так что лица с обложек Rolling Stone соответствуют правилу золотого сечения.

            Если посмотреть на отрезки времени, то можно увидеть определенные закономерности в изменении средней линии глаз в каждый из восьмилетних периодов.

            Совокупная средняя высота линии глаз близка к 1/ϕ, а средняя высота до 2013 года отклоняется от 1/ϕ всего на 0,4%.

            Вот усредненные лица по десятилетиям.

            Обложки комиксов


            Обложки комиксов — еще один интересный источник изображений для анализа. На сайте Comic Book Database размещена большая коллекция обложек комиксов. Пока что мы ограничимся Marvel Comics и DC Comics с их 72000 обложек. Так как комиксы — это не фотографии, распознавание лиц теперь становится более сложным делом. Но даже в таких условиях мы успешно распознали около 90 тысяч лиц.

            Дальше — все как обычно (высота линии глаз, тепловая карта, усредненное лицо) для Marvel Comics.

            И то же самое для DC Comics.

            Все три характеристики демонстрируют замечательную согласованность между двумя издателями комиксов.

            Ежедневные газеты и журналы мод


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

            Например, вот средние данные для всех изображений (с размером больше 200 пикселей) с сайта газеты The New York Times от 8 февраля 2016 года. Пик графика находится между 2/3 и 1/ϕ.

            А вот данные для еженедельной немецкой газеты: Die Zeit. На этот раз максимум графика для больших изображений лиц находится на уровне 2/3.

            Вот данные по 1000 изображений из CNN.

            Высота линии глаз в журналах мод дает совершенно другое распределение. Вот результаты для 1000 изображений из журнала Vogue. Так как на сайте размещают фотографии стильно одетых моделей в полный рост, голова получается маленькой, и линия глаз оказывается очень высоко. В результате мы получаем высокий узкий пик синей кривой.

            Анализ фото с обложек GQ Magazine также показывает пик высоты линии глаз на 2/3 для лиц, снятых крупным планом.

            Максимум для линии глаз лиц с обложки журнала People снова находится на уровне 2/3 для больших поверхностей.

            А вот результаты для журнала Ebony. На этот раз пик на графике высоты линии глаз для лиц, снятых крупным планом, находится на уровне 1/ϕ.

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

            Проанализировав данные журнала Allure, мы получаем лицо с более сглаженными чертами с максимумом выше, чем 2/3.

            А лица готов из журнала Gothic Beauty в основном отвечают правилу золотого сечения.

            Журнал 20/20 специализируется на очках. Довольно ожидаемо, что усредненное лицо также оказывается с темными очками, а высота глаз получается больше, чем 2/3.

            Знаменитости из киноиндустрии


            Еще один хороший источник для анализа — киноафиши. На сайте Movie Posters размещено 35000 плакатов

            Более интересено, как меняется график среднего значения с течением времени. До 1980-х годов высота линии глаз стремилась к центру афиши. После этого средняя позиция линии глаз все чаще оказывалась в интервале [1/φ, 2/3].

            Сдвиг средней высоты линии глаз на киноафишах еще более отчетливо виден на соответствующих тепловых картах.

            Вот усредненное лицо со всех афиш за последние пять лет.

            Кино: линия глаз в движении


            Последнюю заметку мы завершили графиками пропорций в кино, и сейчас мы также закончим анализом некоторых фильмов. На сайте Internet Archive размещена коллекция из 20000 фильмов, которые доступны для скачивания. Мы будем смотреть на расположения лиц двух хорошо известных классиков: Бастера Китона из Генерала 1926 года и Фрица Ланга из Метрополиса 1927 года. Начнем с Генерала. Среднее значение для всех лиц (без учета их размера) находится на 2/3, а для снятых более крупным планом — ниже.

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

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

            Метрополис Фрица Ланга, вышедший в прокат всего на год позже Генерала, был снят в совершенно ином стиле. Даже быстро прокрутив кино, можно увидеть, что лица появляются гораздо выше в кадре. Это впечатление подтверждается фактическими данными о расположении линии глаз.

            График, построенный на основе всех данных о линии глаз, показывает, что лица, снятые крупным планом, появляются в кадре особенно высоко.

            Теперь совместим полученные нами результаты с результатами анализа девятой серии девятого сезона «Теории большого взрыва» под названием «Платоновская перестановка». Большинство лиц появляется на уровне выше 2/3.

            Однако пик графика, демонстрирующий положение линии глаз для лиц, снятых крупным планом, близок к 2/3.

            А вот график, созданный на основе эпизода сериала Человек в высоком замке. Пик графика, отражающего высоту линии глаз, ближе к 1/ϕ, чем к 2/3.

            Наконец, третий и последний пример сериала — восьмой эпизод шестого сезона Ходячих мертвецов. Для лиц, снятых крупным планом, мы видим хорошо выраженное бимодальное распределение по высоте линии глаз с двумя максимумами на 1/φ и 2/3.

            Выводы


            Во второй части нашего исследования золотого сечения в искусстве мы рассматривали высоту линии глаз и положение лиц. С помощью функции FindFaces и правил для определения высоты линии глаз мы провели вычисления с более чем миллионом лиц.

            Максимумы распределения высот линии глаз для фотографий и картин находятся преимущественно в диапазоне от 0,6 до 0,67. Для старинных картин и современных фотографий характерны максимумы в районе 2/3, что соответствует правилу третей. Интересно, что современные художественные портреты демонстрируют пик высоты линии глаз на графике на уровне 1/ϕ для лиц, снятых крупным планом («большие» лица — занимающие > 1/12 от общей площади). Пик графика, обозначающего положение линии глаз для селфи, составляет около 0,7 (выше, чем для живописи и многих профессиональных фотографий). Лица с обложкек журналов, которые мы проанализировали (особенно за последние несколько десятилетий) имеют тенденцию к соответствию золотой пропорции. Фотографии с сайтов различных газет — тоже. В случае с фотографиями профилей из LinkedIn были обнаружены четкие гендерные различия между позициями высоты линии глаз: лица мужчин оказались более соответствующими правилу золотого сечения. Анализ фильмов показывают, что лица, особенно мелкие, оказываются на высоте значительно выше 2/3. Зато анализ современных сериалов показывает, что высота линии глаз персонажей отвечает то правилу третей, то золотому сечению, а иногда — сразу обоим.

            Комментарии (0)

              Let's block ads! (Why?)