-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

ФСТЭК даёт «добро»

Четверг, 15 Июня 2017 г. 14:22 + в цитатник
Недавно центр обработки данных RUVDS в г. Королеве прошёл аттестацию на соответствие требованиям ФСТЭК России. ЦОД Rucloud спроектирован в соответствии с категорией надёжности TIER III согласно стандарту TIA-942 (резервирование N+1 с уровнем отказоустойчивости 99,98%). Получение аттестата ФСТЭК стало логичным шагом, соответствующим политике RUVDS: обеспечение защиты данных клиентов остается одним из важнейших направлений нашего развития. Что такое ФСТЭК и зачем нужна сертификация? Что это означает для нас и наших клиентов? Об этом – ниже.


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

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

Если, например, ФСБ «отвечает» за криптографию, а ФСТЭК – «за всё остальное» (межсетевые экраны, антивирусы, системы предотвращения вторжений и т. п.).

Сертификация ФСТЭК


Почему сертификация ФСТЭК? Именно ФСТЭК России, помимо прочей деятельности, осуществляет следующие полномочия: «организует в соответствии с законодательством Российской Федерации проведение работ по оценке соответствия (включая работы по сертификации) средств противодействия техническим разведкам, технической защиты информации, обеспечения безопасности информационных технологий, применяемых для формирования государственных информационных ресурсов, а также объектов информатизации и ключевых систем информационной инфраструктуры».


Сертификация — форма осуществляемого органом по сертификации подтверждения соответствия объектов требованиям технических регламентов, положениям стандартов, сводов правил или условиям договоров. В данном случае речь идет о РОСС RU.0001.01БИОО – «Системе сертификации средств защиты информации по требованиям безопасности информации».

Существуют различные требования ФСТЭК по защите тех или иных видов конфиденциальной информации. По итогам процедуры подтверждения соответствия того или иного программного или программно-аппаратного средства требованиям по безопасности выдается сертификат. Или не выдается – зависит от результата.

Оценка соответствия применяется во многих областях, и ИБ — не исключение. В зарубежной практике существует стандарт ISO IEC 15408:2009, специально предназначенный для описания критериев оценки ИТ с точки зрения информационной безопасности. В России действуют свои системы сертификации средств защиты.

Безопасность ЦОД


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



К ЦОД предъявляются требования 152-ФЗ «О персональных данных», 21-го, 17-го, 31-го приказов ФСТЭК России, требования ФСБ России по криптографической защите информации, требования Банка России, ФЗ-256 «О безопасности объектов топливно-энергетического комплекса». И это только основные требования.

Например, согласно 152-ФЗ «О персональных данных», системы обработки и хранения персональной информации россиян должны не только располагаться на территории нашего государства, но и соответствовать предъявляемым законодательством требованиям в области безопасности. Особенно это касается операторов коммерческих ЦОД, для которых сохранность и безопасность информации клиентов является одним из ключевых критериев оценки качества.

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

Согласно федеральному закону 149-ФЗ, все программное обеспечение в государственных, правоохранительных, финансовых и других структурах, обрабатывающих служебную информацию, подлежит сертификации ФСТЭК. Закон разрешает таким организациям использовать только сертифицированное ПО.

Если в коммерческом, корпоративном или государственном ЦОД хранятся персональные данные, из требований законодательства в числе прочего вытекают также необходимые меры по их физической защите. Конкретный набор таких мер зависит от уровня конфиденциальности, установленного для обрабатываемых данных. Исходя из этого, выбирается класс защищенности ЦОД по нормам ФЗ и ФСТЭК и обеспечивается необходимая защита, в том числе и физическая. Наиболее сбалансированный способ обеспечить физическую безопасность ЦОД — реализовать многоуровневую защиту (с несколькими периметрами безопасности). Как и при эшелонированной обороне, прорыв одного уровня не будет означать прорыва системы безопасности.

Наряду с организационными мерами и документирование комплекс мер по защите персональных данных предполагает внедрение технических средств защиты. По сложившейся практике это круглосуточное присутствие в ЦОД и на его территории специально обученной вооруженной охраны, а также средства видеонаблюдения, охватывающие внешний периметр ЦОД и внутренние помещения.
На организации, владеющие персональными данными граждан, накладывается ответственность и за сохранность этих данных. Необходимые меры физической защиты прямо или косвенно следуют также из других стандартов и нормативов – международных и национальных, таких как TIA-942, Sarbanes-Oxley, SSAE 16/SAS 70 и др.



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

Какие же именно системы и средства аттестованы в нашем дата-центре?

Что аттестовано?


В ЦОД RUVDS аттестованы автоматизированные рабочие места сотрудников (антивирусная защита, защита от взлома информационной системы), средства вывода (принтер), контроль доступа в помещение, средства защиты от прослушивания. В частности, аттестат системы контроля и управления доступом (СКУД) гарантирует надёжность физической безопасности серверов ЦОД.

Все действия постоянно протоколируются, активность за рабочим местом проверяется на подозрительную и при необходимости, может быть заблокирована с оповещением ответственных лиц. Используется сертифицированное программное обеспечение, начиная с сертифицированной ФСТЭК ОС Windows и специализированного ПО для контроля доступа и фильтрации трафика до антивирусной защиты и гипервизора.

Таким образом, защищается рабочее пространство, которое имеет прямое отношение к данным клиентов. Это делается средствами ОС на рабочих станциях, баз данных, специализированными защитными и антивирусными продуктами, межсетевыми экранами, средствами контроля доступа (СКУД), резервного копирования и восстановления, уничтожения данных и контроля удаления информации.

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

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

Что касается персональных данных, то наши серверы физически находятся в Российской Федерации, RUVDS имеет также лицензии Федеральной службы по надзору в сфере связи, информационных технологий и массовых коммуникаций №137295 от 30.10.2015 («Телематические услуги связи») и №137296 от 30.10.2015 («Услуги связи по передаче данных, за исключением услуг связи по передаче данных для целей передачи голосовой информации»), так что по поводу исполнения данного федерального закона вы можете быть спокойны.

Для чего сертифицируют ЦОД


Получение подтверждающих документов говорит о надёжности провайдера и предлагаемых им услуг. Сертификация, в первую очередь, подтверждает ответственность компании перед всеми клиентами (не только теми, кто работает с конфиденциальной информацией). Сам процесс лицензирования по нормативам ФСТЭК является длительным и довольно затратным. Его просто не могут себе позволить небольшие участники рынка или участники, заинтересованные в сиюминутной выгоде от проекта.



Получение лицензии ФСТЭК — это инвестиции в стратегическое развитие компании. Лицензия ФСТЭК не только подтверждает компетентность компании для работы с персональными данными, но и дает возможность предлагать услуги компаниям, в том числе из государственного сектора, которые обязаны соблюдать требования по защите конфиденциальной информации, например, сами обладают лицензией ФСТЭК и передают нам как провайдеру услуг данные, которые подлежат защите по нормативам ФСТЭК.
Помимо серьезной защиты и резервирования на уровне дата-центра и сертификации ФСТЭК, RUVDS заключила соглашение о страховании персональных данных и корпоративной информации третьих лиц. Кроме общего страхования, RUVDS совместно с AIG планирует предложить своим клиентам уникальные условия индивидуального страхования их деятельности и данных на виртуальных серверах компании.

И, конечно, в нашем дата-центре ваши ресурсы будут защищены от DDoS-атак: анализ сетевого трафика производится в режиме 24/7, а защита позволяет стабильно выдерживать атаки мощностью до 1500 Гбит/сек. Аналитическая система фильтрует входящий на ваш адрес трафик, удаляет вредоносную информацию, передавая на вашу сторону только легитимный безопасный трафик.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330964/


Метки:  

Дизайн интерфейса корпоративного инструмента BI для data mining

Четверг, 15 Июня 2017 г. 13:23 + в цитатник
Невозможно управлять тем, что нельзя измерить (древнеримская мудрость)

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

image

Что такое BI


Business intelligence (сокращенно BI) — это методы и инструменты для перевода необработанной информации в осмысленную, удобную форму. Эти данные используются для бизнес-анализа. Технологии BI обрабатывают большие объемы неструктурированных данных, чтобы найти стратегические возможности для бизнеса.

Бизнес-анализ как деятельность состоит из нескольких связанных между собой процессов:
  1. интеллектуальный анализ данных (data mining),
  2. аналитическую обработку в реальном времени (online analytical processing),
  3. получение информации из баз данных (querying),
  4. составление отчетов (reporting).



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

Причем, по гениальному определению Ханса Питера Луна, с которым я абсолютно согласен, “Важны не сами факты как таковые, а именно связи между ними”.

Зачем это нужно?


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

image

Дело лишь в том, что ранее проблемой качественной визуализации и презентации имеющихся в наличии данных никто всерьез не озадачивался, ибо знание как таковое уже было привилегией для очень небольших групп людей. Сейчас это звучит странно, но большую часть своей истории человечество было убеждено, что любые существующие знания нужны очень узкой и специализированной группе людей:
  • Астрономия и медицина только для шаманов (знахарей),
  • Библия — только на латинском для горстки священников,
  • грамота — только для одного на всю деревню писаря,
  • иностранный язык — для одного на всю страну толмача и т.д…

image

Данные же категории людей знающих, в свою очередь, не жалели времени и сил для постижения любых объемов знаний в любых количествах, разумно полагая именно эту деятельность гарантией своего высокого социального статуса и сытного питания. Им не требовалась инфографика и качественная визуализация, дизайн бар-чартов и вращающихся в трехмерном пространстве “пирогов” (pie chart), так как им доставало времени, сил и усердия для посвящения всей своей жизни для ежедневного наблюдения за всем небольших существующим в тот момент в наличии объемом данных.

Концепция, что “знания нужны всем и сразу” еще относительно молода и не обрела еще 100% сторонников даже в современном мире, ведь даже в общедоступном сегодня интернете с каждым днем нарастают тенденции ограничений, запретов, усложнений, манипуляций недостоверной информацией.

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

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

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

Но в тоже время при первичном бенчмаркинге быстро выяснилось, что именно “Таблица — королева данных”, так как наш типовой пользователь, глядя на самую качественную диаграмму, мгновенно хочет уточнить данные в таблице. Более того, настраивать сортировку, фильтрацию, задавать сложные выражения столбцам цифр ему также привычнее именно в табличном варианте. Спасибо за это десятилетиям доминирования картины мира от MS Excel.

Что мы имеем


Заточенность нашей будущей системы под конкретный формат данных конкретного предприятия позволило максимально упростить обработку данных из базы и качество формируемых OLAP-кубов. Кубы могли сливаться и позволять редактировать имеющиеся данные. Сама информация в кубах уже была четко разделена на Dimensions и Measures, и готовые технологии уже выявляли пустые или вырожденные наборы данных, чтобы скрывать их по умолчанию от пользователя.

Изучив огромное количество аналогов: MS Power BI, Dundas, Tableau, Qlik было с интересом обнаружено, что одну из самых простых для обучения и комфортных для работы систем разработала как раз отечественная компания “Полиматика”.

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

image

Три уровня качества дизайна


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

1 уровень — решение с помощью алгоритмов и полностью невидимый для стороннего наблюдателя интерфейс.

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

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

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

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

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

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

Именно так поступают в Яндекс.Метрике, эту же идею мгновенного формирования дашборда на основе существующих связей реализовали и у нас:

image

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

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

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

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


Третий и самый низкий уровень качества в моем понимании состоит из постоянных подсказок, оповещений, уведомлений, многоэкранных мастеров создания и длительного процесса onboarding. Здесь опять же качество дизайна не играет никакой роли, ибо смотреть пользователь будет в основном на текстовые рекомендации и стрелочки. Создавать подобный избыточно сложный интерфейс для системы работы с избыточно сложными данными — идея провальная априори. Да и медицинские примеры тут не совсем удачные: постоянные заговоры, наговоры и снятия порти вместо комплексного лечения.

Создание фундаментальных принципов будущей системы



1. Наглядность — данные видно всегда


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

2. Непрерывность (бесшовность) — взаимодействую там же, где получаю результат


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

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

3. Эмоциональность как основа быстрого восприятия


Мы пришли к пониманию, что выросший в абсолютно трехмерном мире человек должен будет потратить лишние милисекунды, чтобы перевести абстракцию чисел в окрашенную эмоциями и пониманием информацию, например:
здесь не просто так написано 32 456 рублей — это хороший выделенный цветом результат, это правильно, я молодец;
здесь не просто так написано 34% — это повод выделить цифру маркером, организовать собрание, устроить выговор и совершить давно планируемую перестановку в руководстве.

Без этих эмоциональных историй, генерируемых нашим сознанием, цифры остаются просто странными арабскими закорючками, информирующими об измерении тех или иных показателей.

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


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


Тут мы попались на авторитет всемирного эксперта в области дизайна Эдварда Тафти, который постоянно призывает помещать числовые данные в контекст, дополняя их нужной атмосферой и формируя, по сути, дополненную реальность. К сожалению, трудозатраты на качественное помещение многомерных OLAP-кубов в трехмерный мир оказались бы просто запредельными, а полезный эффект не столь очевиден.



4. Антимобильность


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

Скорее всего, следует четко разделять сложные конструкторы, высоконагруженные настройками, опциями и продвинутыми возможностями (см. кабину пилота) — от места расслабленного путешественника в страну Больших Данных в бизнес-классе у окна.

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

5. Ключевая роль таблицы


Очевидно, что важность и простоту табличного представления данных не стоит недооценивать. В то же время, собственные скромные исследования наглядно доказали, что людям довольно тяжело воспринимать таблицы уже из 4-5 колонок данных. Более того, выработалось внутреннее убеждение, что адекватно оценить информацию (сфокусироваться и увязать в последовательность из 3 и более умозаключений) обыватель способен лишь в том столбце, по которому данные в таблице (сколь угодно большого объема) были отсортированы.

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

Таким образом, получается парадокс, когда многомерные OLAP-кубы данных с 5-7 наборами сведений по 10-20 измерениям в идеале нужно адаптировать в целых ворох простейших таблиц с одним-двумя измерениями и парой наборов сведений, вырожденных в карточки.

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



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

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



6. Долой перетаскивания и промахи


Даже несмотря на модность и трендовость такой операции как drag&drop, на практике и в по-настоящему сложных системах от нее приходится периодически отказываться. Все дело в том, что перетаскивание “съедает” непростительно много времени и сил у юзера, заставляя его вместо типового клика:
  1. захватывать,
  2. тащить,
  3. целиться,
  4. отпускать,
  5. плеваться,
  6. снова брать и тащить уже точнее.


В моих исследованиях оказалось, что средний drag&drop небольшого поля с данными в таблицу\диаграмму\конструктор отнимает приблизительно две секунды времени. Иногда же эта утомительная операция отнимала и по полминуты, забирая у юзера концентрацию, калории и время от дальнейшего глубинного анализа полученных данных.

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



Основные проблемы


image

Так, шаг за шагом, при проектировании интерфейса удалось выделить несколько фундаментальных проблем:

а) Большие данные — действительно большие. У них много измерений, фактов, возможностей представления и до 7 одновременных настроек, которые постоянно создают визуальный перегруз для аналитика и не без скролла входят ни в горизонтальные строки, ни в вертикальные панели:

image

б) Постоянно перед глазами нужно держать справочник всех полей данных выбранного куба, что отнимает до четверти всего экрана;

в) Гайды Google material, адаптированные под управление соцсетями и контактами на небольшом смартфоне — категорически не подходят для сложной системы b2b;

г) Отсутствие прямой ассоциации между фактом и действием с ним. Сложность отображения связанных данных перекидыванием визуальных “мостиков” между ними;

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

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

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

з) обязательный инструмент для выделения любой области внутри таблицы (лассо) с выносом данных в отдельную визуальную сущность (таблицу или диаграмму);

и) работа в едином окне без перезагрузки страниц и затемнения их модальными окнами.



Устарели ли хот-кеи?


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

Так, каждое поле данных могло иметь лишь индикаторы текущего состояния, а все сортировки, формулы, фильтры или смена оси осуществлялись бы с помощью сочетаний S, F, Z, X, Y, Tab с кнопкой Ctrl, после выделения нужного факта\измерения мышкой. Естественно, такой подход требовал бы довольно длительного обучения и адаптации пользователя (высокий порог входа), но зато мог бы заметно разгрузить визуальную часть интерфейса.

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

image

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

image

Итоги всех мучений



image

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

На текущем этапе мне кажется, что ближе всех к идеалу подходит решение, условно названное нами концепцией “Тетрадь”:

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

Каждая строка здесь интерактивна и позволяет начать ввод названия Измерения, Значения, Фильтра прямо в любом указанном месте. А качественный автокомплит подскажет и ускорит ввод.



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

Слева всегда доступен справочник данных, а лассо (Ctrl+L) позволяет выделять из таблицы любую область.



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

Собственно, цель данной статьи и состоит в том, чтобы призвать на помощь многоуважаемых коллег, которые смогли бы добровольно и искренне помочь разрешить последнюю дилемму и добраться, наконец, до первого релиза.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330958/


Метки:  

Сохранить данные и веру в человечество: большая миграция кластера ElasticSearch

Четверг, 15 Июня 2017 г. 13:23 + в цитатник


В этом материале я продолжаю делиться полевым опытом работы с системой сбора логов на базе Heka и ElasticSearch.


На этот раз рассказ пойдет про миграцию данных между двумя кластерами ElasticSearch 2.2 и 5.2.2, которая стоила немалых нервов лично мне. Как-никак, предстояло перевезти 24 миллиарда записей, не сломав уже работающую систему.


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


Если обратиться к официальной документации ElasticSearch (далее просто ES), то в первую очередь вы увидите строгое предупреждение «Don't cross 32 gb». Превышение грозит проседанием производительности вплоть до моментов полной остановки, пока garbage collector выполняет пересборку в духе «stop the world». Рекомендация производителя по памяти на сервере: 32 ГБ под heap (xms/xmx) и еще 32 ГБ свободного места под кэш. Итого 64 ГБ физической памяти на одну дата-ноду.


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


LXD (Linux Container Daemon) – так называемый «контейнерный легковизор». В отличии от «тяжелых» гипервизоров не содержит эмуляции аппаратуры, что позволяет сократить накладные расходы на виртуализацию. К тому же имеет продвинутый REST API, гибкую настройку используемых ресурсов, возможности переноса контейнеров между хостами и другие возможности, более характерные для классических систем виртуализации.


Вот такая вырисовывалась структура будущего кластера.


К началу работ под рукой было следующее железо:


  • Четыре работающих дата-ноды ES в составе старого кластера: Intel Xeon 2x E5-2640 v3; 512 ГБ ОЗУ, 3x16 ТБ RAID-10.


  • Два новых пустых сервера аналогичной предыдущему пункту конфигурации.

По задумке, на каждом физическом сервере будет две дата-ноды ES, мастер-нода и клиентская нода. Кроме того, на сервере разместится контейнер-приёмник логов с установленными HAProxy и пулом Heka для обслуживания дата-нод этого физического сервера.


Подготовка нового кластера


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


Снимем с четвертой дата-ноды нагрузку, запретив размещение на ней новых индексов:


{
  "transient": {
    "cluster.routing.allocation.exclude._host": "log-data4"
  }
}

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


{
    "transient": {
        "cluster.routing.rebalance.enable": "none"
    }
}

Собираем список индексов с освобождаемой дата-ноды, делим его на три равные части и запускаем перемещение шардов на оставшиеся дата-ноды следующим образом (по каждому индексу и шарду):


PUT _cluster/reroute

{
    "commands" : [ {
        "move" :
            {
              "index" : "service-log-2017.04.25", "shard" : 0,
              "from_node" : "log-data4", "to_node" : "log-data1"
            }
        }
}

Когда перенос завершится, выключаем освободившуюся ноду и не забываем вернуть ребалансировку обратно:


{
    "transient": {
        "cluster.routing.rebalance.enable": "all"
    }
}

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


{
    "transient": {
        "cluster": {
            "routing": {
                "allocation": {
                    "cluster_concurrent_rebalance": "10"
                }
            }
        }
    }
}

Пока старый кластер постепенно приходит в себя, собираем на трёх имеющихся серверах новый на базе ElasticSearch 5.2.2, с отдельными LXD-контейнерами под каждую ноду. Дело это простое и хорошо описанное в документации, поэтому опущу подробности. Если что – спрашивайте в комментариях, расскажу детально.


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


  • Мастер-ноды: 4 ГБ


  • Клиентские ноды: 8 ГБ


  • Дата-ноды: 32 ГБ


  • XMS везде устанавливаем равным XMX.

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


Синхронизируем кластеры


Итак, у нас есть два кластера:


  1. Старый – три дата-ноды, каждая на железном сервере.


  2. Новый, с шестью дата-нодами в LXD контейнерах, по две на сервер.

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


[Service1Output_Mirror]
type = "ElasticSearchOutput"
message_matcher = "Logger == 'money-service1''"
server = "http://newcluster.receiver:9200"
encoder = "Service1Encoder"
use_buffering = true

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


Перенос индексов между кластерами


Так как официальной процедуры миграции данных между кластерами ES на момент выполнения проекта не существует, а изобретать «костыли» не хочется – используем Logstash. В отличии от Heka он умеет не только писать данные в ES, но и читать их оттуда.


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

На время миграции полезно увеличить размер буфера памяти под индексы с 10% по умолчанию до 40%, которые выбраны по среднему количеству свободной памяти на работающих дата-нодах ES. Также нужно выключить обновление индексов на каждой дата-ноде, для чего добавляем в конфигурацию дата-нод следующие параметры:


memory.index_buffer_size: 40%
index.refresh_interval: -1

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


{
    "default": {
        "order": 0,
        "template": "*",
        "settings": {
            "index": {
                "number_of_shards": "6",
                "number_of_replicas": "0"
            }
        }
    }
}

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


Для Logstash получилась следующая конфигурация:


input {
    elasticsearch {
    hosts => [ "localhost:9200" ]
    index => "index_name"
    size => 5000
    docinfo => true
    query => '{ "query": { "match_all": {} }, "sort": [ "@timestamp" ] }'}
    }

output {
    elasticsearch { hosts => [ "log-new-data1:9200" ]
    index => "%{[@metadata][_index]}"
    document_type => "%{[@metadata][_type]}"
    document_id => "%{[@metadata][_id]}"}}
    }

В секции input описываем источник получения данных, указываем системе, что данные нужно забирать пачками (bulk) по 5000 записей, и выбираем все записи, отсортированные по timestamp.


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


  • document_type – тип (mapping) документа, который лучше указать при переезде, чтобы имена создаваемых mappings в новом кластере совпадали с именами в старом – они используются в сохранённых запросах и дашбордах.


  • document_id – внутренний идентификатор записи в индексе, который представляет собой уникальный 20-символьный хэш. С его явной передачей решаются две задачи: во-первых, облегчаем нагрузку на новый кластер не требуя генерировать id для каждой из миллиардов записей, и во-вторых, в случае прерывания процесса нет необходимости удалять недокачанный индекс, можно просто запустить процесс заново, и ES проигнорирует записи с совпадающим id.

Параметры запуска Logstash:


/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/migrate.conf --pipeline.workers 8

Ключевыми параметрами, влияющими на скорость миграции, являются размер пачек, которые Logstash будет отправлять в ES, и количество одновременно запускаемых процессов (pipeline.workers) для обработки. Строгих правил, которые определяли бы выбор этих значений, нет – они выбирались экспериментальным путем по следующей методике:


  • Выбираем небольшой индекс: для тестов использовался индекс с 1 млн многострочных (это важно) записей.


  • Запускаем миграцию этого индекса с помощью Logstash.


  • Смотрим на thread_pool на приёмной дата-ноде, обращая внимание на количество «rejected» записей. Рост этого значения однозначно говорит о том, что ES не успевает проиндексировать поступающие данные – тогда количество параллельных процессов Logstash стоит уменьшить.


  • Если резкого роста «rejected» записей не происходит – увеличиваем количество bulk/workers и повторяем процесс.

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


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


  • Список индексов на переезд разделил на три примерно равные части.


  • В /etc/logstash/conf.d/migrate.conf оставил только статическую часть конфигурации:


    input {
    elasticsearch {
    hosts => [ "localhost:9200" ]
    size => 5000
    docinfo => true
    query => '{ "query": { "match_all": {} }, "sort": [ "@timestamp" ] }'}
    }
    output {
    elasticsearch { hosts => [ "log-new-data1:9200" ]
    index => "%{[@metadata][_index]}"
    document_type => "%{[@metadata][_type]}"
    document_id => "%{[@metadata][_id]}"}}
    }

  • Собрал скрипт, который читает имена индексов из файла и вызывает процесс logstash, динамически подставляя имя индекса и адрес ноды для миграции.


  • Всего нужно запустить три экземпляра скрипта, по одному на каждый файл: indices.to.move.0.txt, indices.to.move.1.txt и indices.to.move.2.txt. После этого данные уходят в первую, третью и пятую дата-ноды.

Код одного из экземпляров скрипта:


cat /tmp/indices_to_move.0.txt |  while read line
do

 echo $line > /tmp/0.txt && /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/migrate.conf --pipeline.workers 8 --config.string "input {elasticsearch { index => \"$line\" }} output { elasticsearch { hosts => [ \"log-new-data1:9200\" ] }}"

done;

Для просмотра статуса миграции пришлось «на коленке» собрать ещё один скрипт, и запустить в отдельном процессе screen (через watch -d -n 60):


#!/bin/bash 

regex=$(cat /tmp/?.txt)
regex="(($regex))"
regex=$(echo $regex | sed 's/ /)|(/g') 

curl -s localhost:9200/_cat/indices?h=index,docs.count,docs.deleted,store.size | grep -P $regex |sort > /tmp/indices.local

curl -s log-new-data1:9200/_cat/indices?h=index,docs.count,docs.deleted,store.size | grep -P$regex | sort > /tmp/indices.remote

echo -e "index\t\t\tcount.source\tcount.dest\tremaining\tdeleted\tsource.gb\tdest.gb"

diff --side-by-side --suppress-common-lines /tmp/indices.local /tmp/indices.remote | awk '{print $1"\t"$2"\t"$7"\t"$2-$7"\t"$8"\t"$4"\t\t"$9}'

Процесс миграции занял около недели. И честно скажу – спалось мне эту неделю неспокойно.


После переезда


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


Из старого кластера взял еще один освободившийся сервер и поставил на него два контейнера с дата-нодами ES под кластер новый. Все остальное железо отправилось в резерв.


Итоговая структура получилась точно такой, какой планировалась на первой схеме:


  • Три мастер-ноды.


  • Две клиентские ноды.


  • Восемь дата-нод (по две на сервер).


  • Четыре log-receiver (HAProxy + Heka Pools, по одному на каждый сервер).

Переводим кластер в production режим – возвращаем параметры буферов и интервалы обновления индексов:


memory.index_buffer_size: 10%
index.refresh_interval: 1s

Кворум кластера (учитывая три мастер-ноды) выставляем равным двум:


discovery.zen.minimum_master_nodes: 2

Далее нужно вернуть значения шард, принимая во внимание, что дата-нод у нас уже восемь:


{
    "default": {
        "order": 0,
        "template": "*",
        "settings": {
            "index": {
                "number_of_shards": "8",
                "number_of_replicas": "1"
            }
        }
    }
}

Наконец, выбираем удачный момент (все сотрудники разошлись по домам) и перезапускаем кластер.


Нашардить, но не смешивать


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



С точки зрения ES кластера – всё хорошо: индекс разбит на шарды по количеству дата-нод, каждый шард имеет реплику, primary и replica шарды хранятся на разных нодах.


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


Поэтому разработчики ES предложили инструмент для управления размещением шард в пределах одного кластера – Shard Allocation Awareness (SAA). Этот инструмент позволяет при размещении шард оперировать не дата-нодами, а более глобальными структурами вроде серверов с LXD-контейнерами.


В настройки каждой дата-ноды нужно поместить ES атрибут, описывающий физический сервер, на котором она находится:


node.attr.rack_id: log-lxd-host-N

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


{
    "persistent": {
        "cluster": {
            "routing": {
                "allocation": {
                    "awareness": {
                        "attributes": "rack_id"
                    }
                }
            }
        }
    }
}

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


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


node.attr.rack_id: log-lxd-hostN
node.attr.dc_id: datacentre_name

{
    "persistent": {
        "cluster": {
            "routing": {
                "allocation": {
                    "awareness": {
                        "attributes": "rack_id, dc_id"
                    }
                }
            }
        }
    }
}

Казалось бы, все в этом разделе очевидно. Но именно очевидное и вылетает из головы в первую очередь, так что отдельно проверьте – тогда после переезда не будет мучительно больно.


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

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330952/


Метки:  

Mониторинг Nginx Plus в Zabbix

Четверг, 15 Июня 2017 г. 13:19 + в цитатник

Метки:  

Некоммерческий сертификат официального сайта Кубка конфедераций

Четверг, 15 Июня 2017 г. 12:44 + в цитатник
В ближайшие дни на территории России стартуют матчи Кубка конфедераций-2017.
Открываем их официальный сайт confederationscup.net
И смотрим на сертификат. Выдан некоммерческой организацией Let's encrypt и срок действия сертификата с 10 мая по 8 августа 2017 года.

Информация о сертификате:

Является ли Кубок Конфедераций не коммерческой организацией, раз он получил такой сертификат, или программисты слишком торопились, что не смогли купить нормальный (платный) сертификат SSL?
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330954/


[Перевод] 40 необычных вопросов, задаваемых на собеседовании в Apple

Четверг, 15 Июня 2017 г. 12:36 + в цитатник
Apple одна из самых престижных компаний в мире, очевидно, что получить работу в ней очень непросто. Среди вопросов, которые задают кандидатам на собеседовании, встречаются как технические, так и ошеломляющие головоломки.



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

  • Собеседование на позицию Product Design Engineer:


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

  • Собеседование на позицию Software Engineer:


«Если у вас есть 2 яйца, и вы собираетесь выяснить, с какого максимального этажа здания вы можете бросить яйцо, не разбив его, как вы это сделаете? Предложите оптимальное решение»

«У вас есть 100 монет, лежащих на столе. У каждой из них есть две стороны: «орел» и «решка». 10 монет «орлом» вверх и 90 «решкой» вверх. Вы не можете почувствовать, увидеть или как-то распознать, где какая сторона. Вам нужно поделить все монетки на две части так, чтобы в каждой из них было равное количество монеток, которые лежат «орлом» вверх»

«Было ли такое, что вы не соглашались с решением менеджера? Приведите конкретный пример и объясните, как вы решили вопрос. Каков итог спора и как человек, с которым вы спорили, описал бы вас сейчас»

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

«Почему вы хотите присоединиться к компании «Apple» и что вы потеряете в своей нынешней работе, если мы наймем вас?»

«Опишите интересную проблему и как вы ее решили»

«Вы креативны? Расскажите о какой-нибудь свей креативной идее?»

  • Собеседование на позицию научного сотрудника:


«Как проверить, является ли двоичное дерево зеркальным отражением левого и правого поддеревьев?»

  • Собеседование на позицию сотрудника розничного магазина Apple:


«Каким супергероем вы хотели бы быть. Почему?»

«Опишите не самый приятный опыт в вашей жизни»

  • Собеседование на позицию в команду поддержки Apple Genius:


«Объясните пятилетнему ребенку, что такое оперативная память»

  • Собеседование на позицию Lead Systems Engineer:


«Как работает крыло самолета?»

  • Собеседование на позицию Hardware Test Design Lead:


«Нарисуйте внутреннее строение iPhone»

«Как бы вы спланировали поездку в Северную Корею для ваших коллег?»

  • Собеседование на позицию Hardware Engineer:


«Назовите 5 способов измерить, сколько бензина находится в машине»

  • Собеседование на позицию менеджера глобальной сети снабжения:


«Как бы вы могли снизить стоимость этой ручки?»

  • Собеседование на позицию домашнего консультанта:


«Объясните 8-летнему ребенку, что такое модем расскажите о его функциях»

  • Собеседование на позицию Software QA Engineer:


«Как бы вы протестировали свое любимое приложение?»

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

«62 — 63 = 1; Измените только один элемент (цифру или операнда), чтобы утверждение стало правильным»

«Как бы вы протестировали тостер?»

  • Собеседование на позицию специалиста:


«Сценарий: вы столкнулись с сердитым клиентом, который ждет помощи уже 20 минут и начинает скандалить. Клиент угрожает, что уйдет и купит компьютер у конкурентов. Предложите решение проблемы»

«Почему компания «Apple» изменила название с «Apple Computers Incorporated» на «Apple Inc.?»

«Когда вы посещаете Apple Store в качестве клиента, что вы замечаете в магазине? Как вы себя чувствуете, когда вы впервые входите?»

  • Собеседование на позицию Build Engineer:


«Вы умный/-ая?»

  • Собеседование на позицию инженера-механика:


«Вы ставите стакан воды на проигрыватель и начинаете медленно увеличивать скорость. Что произойдет первым — стакан с водой соскользнет, перевернется или вода расплескается?»

  • Собеседование на позицию Software Engineering Manager:


«Расскажите, что вы сделали в своей жизни такого чем особенно гордитесь»

«Каковы ваши неудачи и чему они вас научили?»

  • Собеседование на позицию консультанта колл-центра:


«Что более важно, устранение проблемы клиента или хорошо налаженные процессы при работе с клиентами?»

«Звонит человек, у которого очень старый компьютер и он не работает. Что вы предложите?»

  • Собеседование на позицию Family Room Specialist:


«Вы выглядите довольно позитивно, что может вас огорчить?»

  • Собеседование на позицию College At-Home Advisor:


«Покажите мне, как вы продемонстрируете клиенту желание помочь, используя только голос»

  • Собеседование на позицию ведущего аналитика:


«Вам дают банку с перемешанными настоящими и фальшивыми монетами. Вы вытаскиваете одну монету, подбрасываете ее 3 раза и получаете последовательность: орел, орел, решка. Каковы шансы, что вы вытащили настоящую/фальшивую монету?»

  • Собеседование на позицию Engineering Project Manager:


«Расскажите о лучшем дне за последние 4 года и о худшем.»

  • Собеседование на позицию Technical Lead:


«Если вы подниметесь в горы и спуститесь в то же самое время, только на следующий день, окажетесь ли вы в том же месте в то же время?»

  • Собеседование на позицию специалиста по оказанию услуг:


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

  • Собеседование на позицию специалиста по планированию спроса:


«Как вы создадите эффективную модель цепочки поставок?»

  • Собеседование на позицию специалиста по техническим вопросам:


«Опишите случай, когда вы обидели друга и как вы с этим справились?»

  • Собеседование на позицию управляющего финансами:


«Какие данные вы хотели бы получить, перед выходом iPhone на новый рынок?»
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330932/


Метки:  

Два года с Dart: о том, как мы пишем на языке, который ежегодно «хоронят» (часть 1)

Четверг, 15 Июня 2017 г. 12:33 + в цитатник

«А он еще не умер?»,- спрашивают нас про Dart на каждой фронтенд-конференции. «А как Google поддерживает язык?», «как вы нанимаете разработчиков в команду?», «а почему не TypeScript, если вам нужна типизация?»

Мы решили объединить наиболее частые вопросы и задать их в интервью Игорю Демьянову, менеджеру по разработке Wrike.

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

Игорь, продукту уже больше 10 лет, а что было до того момента, как вы начали использовать Dart для разработки фронтенда Wrike?

До Dart мы писали на ExtJS 3 и частично на ExtJS 4. Плюс у нас был небольшой самодельный фреймворк, который написал один из бывших сотрудников. Этот «велосипед» нам сейчас скорее мешает, и мы от него потихоньку избавляемся. На данный момент в проекте более 2,5 млн строк клиентского кода, новый функционал мы уже года два пишем на дарте и потихоньку избавляемся от легаси на ExtJS.

В какой момент и почему пришло понимание, что надо переставать писать на JS?

Оно пришло, когда Wrike начал активно расти. Когда у нас в команде было 11 человек — мы еще как-то могли использовать JavaScript, более-менее понимать, кто какой код пишет, помнить все нюансы старого кода. Но сейчас в команде фронтенда у нас около 50 человек, разработчики распределены более чем по 10 scrum-командам, и правило личных договоренностей уже не работает. Задач много, разработчиков много, кода много.

Много кода — это сколько?

На клиент мы в данный момент грузим около 10 мегабайт сжатого кода, раньше было 5 или 6. И раньше эта цифра выглядела страшно, сейчас и подавно. Но мы тут ничего не можем сделать -продукт активно растет функционально. Разумеется, мы стремимся, чтобы отдельные куски кода грузились по требованию, но в каких-то случаях приходится подгружать весь код сразу, чтобы весь функционал Wrike был доступен клиенту мгновенно.

Так а почему Dart?

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

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

Да, сейчас примерно эти же возможности есть у Typescript или JS+Flow, но нам нравится Dart. У языка простой и понятный синтаксис, а главное — он позволяет нам концентрироваться на идеях, экономить время, которое бы мы тратили на рефакторинг или, скажем, на переход с ES5 на ES6, фреймворки и т.п.



Сейчас ведется какая-то разработка компонентов продукта на JS?

В отдельных исключительных случаях мы можем вносить изменения в легаси-код на JS, если видим какой-то critical bug. В остальных случаях пишется новый код на Dart — он либо заменяет старый код, либо добавляет новый функционал.

Какой фреймворк вы используете?

Примерно год назад мы перешли с Polymer на Angular2. Сейчас планируем переход на Angular3, а к концу года — на Angular4. Во многих компаниях бизнес в этом отношении довольно тяжело идет навстречу R'n'D — такие миграции сопровождаются долгими спорами и убеждениями. То, что мы используем самые новые инструменты — не только заслуга фронтенд-разработчиков, но и наших тестировщиков-автоматизаторов, которые хорошо помогают нам с регрессионными тестами и QA Manual. Когда мы переходили на Dart, то получили поддержку всех технических команд Wrike, поэтому этот переход нам дался относительно безболезненно. Так же и с Angular — прогнозируем, что переход между версиями затянется на 1-2 месяца, вряд ли больше.

Сейчас мало знают о языке Dart, но 2 года назад информации же вообще не было. Как вообще вам удалось по живому в работающем проекте все переделать? Трудно представить, что бизнес на это вообще пошел.

Я сам начал использовать Dart с версии 0.8, когда он был еще только в бете. На момент внедрения в Wrike Dart уже был официально зарелижен, появилась спецификация, стандарты и т.п., то есть мы были уверены, что принципиально в языке ничего не будет меняться. Мы знали, с каким языком будем иметь дело, все проанализировали и получили первые результаты, которыми смогли аргументированно доказать необходимость изменений. Главным доводом в пользу дарта был Tree Shaking — умение дарта выпиливать неиспользуемый код вплоть до методов. А это при нашем объеме legacy критично.

Почему не TypeScript?

Если бы мы, допустим, портировали Wrike на TypeScript, это было бы, наверное, «дешевле». С другой стороны, у нас столько кода, что портирование на TS, нам скорее всего ничего бы не дало — остался бы тот же объем подгружаемого легаси, только на TypeScript. Dart же заставляет нас писать лаконично и правильно, и не дает допустить простых ошибок в проектировании, это его плюс, но в этом, конечно, и его строгость.

Если вернуться к бизнесу, то да, здесь мы получили поддержку. Наш CEO Андрей Филев — сам в прошлом разработчик, и разговор с ним можно вести на одном языке. Плюс, репутация Google как разработчика языка о многом говорит. В конце концов, эти изменения были необходимы и самому бизнесу, чтобы максимально быстро разрабатывать и выпускать фичи, позволяющие нам оставаться одними из лидеров рынка. В общем, бизнес поддержал, и сейчас мы очень быстро движемся, а бизнес доволен нашей скоростью.

Но вот те 11 человек, которые писали на JS и вынуждены были переходить на Dart, наверно, не так радостно восприняли эту новость?

Ребята, которые поработали с каким-то другим языком, кроме JavaScript, очень легко переходили на Dart. Они, наоборот, были довольны, что дарт решает их проблемы с чужим кодом и упрощает коммуникацию. Конечно, были и те, кто знал только лишь один JavaScript, и, как и любой «старовер», в штыки воспринимал изменения.





Сейчас в JavaScript-мир довольно низкий порог вхождения, очень много в сообществе новичков, которые осваивают язык, но едва ли понимают, как проектируются большие продукты. У моего коллеги Евгения Гусева есть доклад на эту тему, который не так давно вызвал немалую полемику среди JS-разработчиков.

Любой язык можно рассматривать только в контексте его применения, поэтому тут споры и холивары бессмысленны. Например, JavaScript всем хорош для прототипирования — как бы вы ни написали код на JS, вы его скорее всего запустите. Нет понятия “плохой JavaScript” — либо он работает, как вам нужно, либо он работает не так, как вам нужно, и все.



С Dart сложнее. У вас, как в Java и как в .net, есть анализатор, который вам говорит: «Знаешь, дружок, как бы не так. Так нельзя делать. Нельзя создавать динамические классы и т.п.». То есть язык просто не позволит самому себе выстрелить в ногу, как бы вы ни хотели.

Если вы посмотрите, многие создатели Dart, работали с серьезными объекто-ориентированными языкам, V8 делали, даже кто-то из Java у них есть. Они подошли к проектированию языка с точки зрения больших приложений, поэтому Dart – это язык для средних, больших, и очень больших приложений. Он по дефолту предлагает одно, но самое эффективное решение, и оно идет «из коробки». Вы в один клик можете сделать отложенную загрузку/загрузку по требованию, язык сам будет «выпиливать», оптимизировать код – это те бонусы, которые нужны большим приложениям. На маленьких приложениях вы практически никакого заметного эффекта по сравнению с JS не увидите.

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

Мы будем благодарны за вопросы в комментариях и, если потребуется, напишем более подробные технические статьи о работе с Dart на их основе.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330832/


Метки:  

«Когда с базами данных происходит критическая авария, это всегда случается несколько эпически» — Илья Космодемьянский

Четверг, 15 Июня 2017 г. 12:23 + в цитатник
Сегодняшнее интервью дает Илья Космодемьянский, CEO Data Egret, ведущего PostgreSQL-консалтинга, и сооснователь PG Day Russia. За 15 лет работы Илья прошел путь от разработчика и DBA до руководителя собственной компании, оказывающей услуги поддержки баз данных. Сегодня Илья занимается формированием и реализацией стратегии развития Data Egret, продвигает бренд компании в российском и международном сообществе, курирует направление подбора докладчиков для конференции.

На PG Day'17 Russia Илья проведет интенсивный учебный курс по PostgreSQL для системных администраторов и DevOps.

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




PG Day: Компания, которую ты основал, предоставляет поддержку для PostgreSQL. Почему именно PostgreSQL, а не MS SQL Server или ORACLE?

Илья: Поскольку мы начали заниматься Postgres-ом, до того как это стало модно, можно честно сказать, что это был осознанный выбор. Сейчас о Postgres-е не говорит только ленивый, а в те времена это была хорошая open source-ная база, но не более того.

Мне есть с чем сравнивать: я работал довольно много с Oracle-ом и немного — с MySQL. Oracle — это крутая база, но достаточно в SQL*Plus залогиниться, чтобы понять, что многие вещи там сделаны очень давно и они не очень удобны. При технологическом превосходстве Oracle, Postgres привлекал именно простотой использования, несмотря на то, что это полноценная база данных с серьезными возможностями.

С другой стороны, это open source, и ты строишь свой бизнес немного по другим законам, которые отличаются от поддержки коммерческого продукта. Ты зависишь от сообщества. Кому-то от этого становится не по себе, но при этом нет привязки к коммерческому производителю. Что ты будешь делать, если вдруг Oracle решит, что все его продукты должны поддерживать только сертифицированные партнеры?

Коммерческие базы данных — это кот в мешке, который постоянно меняется не по твоей воле, ты никак не можешь это контролировать и предвидеть. Open source в этом смысле намного приятней.

Поддержка открытого исходного кода — это довольно интересное направление. Сейчас на рынке коммерческих баз данных можно наблюдать примерно то же самое, что когда-то происходило на рынке операционных систем. Были очень дорогие коммерческие операционные системы (Novell Netware, HP UX, Solaris), которые были сильно переоценены и стоили очень больших денег. И сейчас, когда появились бесплатные десктопные операционные системы, а на серверах Linux сильно потеснил своих конкурентов, то же самое происходит с базами данных. Коммерческим производителям приходится что-то менять в своих подходах, в ценах на лицензии. Я не утверждаю, что Postgres захватит мир завтра, я бы даже опечалился, если бы это произошло, потому что “да здравствует конкуренция”. Но перспектив у него в этом смысле — огромное количество, и он меняет этот рынок у нас на глазах.

PG Day: На твой взгляд, PostgreSQL может заменить коммерческие СУБД по своим техническим возможностям?


Илья: Конкретно в такой формулировке — да, конечно, может и активно заменяет. Но это не значит, что PostgreSQL технологически круче чем Oracle. Далеко не всем проектам нужны какие-то супер-фичи, которыми обладает Oracle, такие как работа на голом железе без файловой системы. Это такие вещи которые присущи только Oracle — они супер высокотехнологичны, но требуют приобретения очень дорогих лицензий. Далеко не везде эта технологическая мощь нужна. Я много раз сталкивался с ситуацией, когда очень дорогая лицензия на Oracle покупается для небольшого проекта просто потому что в компании привыкли, что так можно делать. «У нас есть Oracle, мы не хотим иметь дело с дешевыми лицензиями, мы привыкли к хорошему Oracle EE”, при том что проект без проблем может работать на PostgreSQL.

PostgreSQL достаточно хорош для таких задач, он прекрасно с ним справляется, проще в эксплуатации, не требует затрат на лицензирование. Это очень широкий спектр ситуаций, когда Postgres действительно может замещать коммерческие СУБД. При этом задач, где Oracle лучше подходит технически, становится все меньше. В большинстве случаев цены на лицензии не оправдывают того технологического превосходства, которое Oracle имеет для этих проектов.

PG Day: CEO часто отрываются от каждодневной технической работы. Скажи, насколько ты близок к решению технических задач в компании?

Илья: Есть такая фраза: хочу сделать успешный стартап, нанять туда CEO и работать там программистом. Такие схемы, к сожалению, в реальной жизни не работают. Чтобы все это двигалось вперед, технические задачи приходится отодвигать на второй план. Другой вопрос, что мы занимаемся, прежде всего, техподдержкой и консалтингом — вся наша организация подчинена техническим вопросам. Невозможно построить лучшую в мире техническую поддержку баз данных PostgreSQL, не вникая в технические детали и задачи, которыми занимаются DBA, не участвуя в разборках происшествий с базами. Моя задача — организовывать взаимодействие людей, которые этим занимаются. Хоть я и не занимаюсь администрированием баз данных непосредственно, во все эти вопросы приходиться вникать, чтобы понять, что вообще происходит, в какую сторону нам нужно двигаться и так далее.

PG Day: Расскажи самый эпический случай из твоей практики, который хорошо бы проиллюстрировал надпись на твоем Twitter профиле — " Быть ДБА это также легко как ездить на велосипеде, только велосипед в огне, ты в огне, все в огне и ты в аду”?

Илья: Вряд ли найдется много DBA, будут радостно рассказывать самые эпические эпизоды в своей практике. Всякое случалось. Когда с базами данных происходит какая-то критическая авария, это всегда случается несколько эпически, хоть мы и стараемся везде соломки подстелить.

Звонят в два часа ночи, говорят что у нас все упало, ничего не работает, база данных накрылась, потому что у нее закончились transaction id и что-то было не так настроено. При этом все администраторы, которые должны были за ней следить в этот момент, в доску пьяны, на дворе два часа ночи, у звонящего кончается батарейка на телефоне, и надо что-то сделать. Такие случаи регулярно встречаются, поэтому фраза про велосипед — это наш девиз.

PG Day: Ты часто ездишь на конференции. Чем отличаются сообщества в России, Европе и Америке? Насколько сильно чувствуется наличие сообщества PostgreSQL на конференциях в России и за границей?

Илья: Это два больших отдельных вопроса. Многие конференции за границей — community-driven, их делают энтузиасты, ориентируясь на развитие community, а не непосредственный заработок (хотя было бы неправильно утверждать, что они совсем не преследуют такие цели).

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

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

И еще один момент. В Северной Америке никто не воспринимает посещение конференции как способ развеяться, потусоваться со знакомыми. Большинство людей, слушатели и докладчики, рассматривает это как серьезное обучение и повышение квалификации. Приезжая на мероприятие, они выкладываются по полной. На американской конференции допустимо начать доклады и в девять утра — слушатели приходят туда работать, а не скрываться от офисной рутины.

PG Day: Чего ты ожидаешь от PG Day Russia? Требования к аудитории — какой минимум знаний должен быть, может, порекомендуешь что-то почитать?

Илья: Я ожидаю, что у нас получится сделать хорошее событие, причем посвященное не только Посгресу, но и базам данных в общем. Я всегда беспокоюсь за то, чтобы всем технарям, которые работают с базами данных, было интересно поучаствовать. Чтобы программа была высокого уровня, наполненная интересными техническими докладами.

У нас есть такая идея, что нельзя привозить только хороших иностранных спикеров и показывать, мол, «вот, ребята, смотрите как бывает». Нам нужно растить наше Российское сообщество изнутри. Мы зовем известных в мировом сообществе спикеров, чтобы они задавали планку. Приглашаем наших проверенных российских товарищей, которые могут много чего интересного рассказать, и всегда пытаемся найти новых докладчиков, которые раньше не выступали на широкой публике. Не самый простoй подход, но, тем не менее, в последние годы нам это удавалось.

В этот раз у нас еще более серьезная заявка: помимо основного ядра про PostgreSQL у нас планируется несколько дополнительных потоков. С потоком по MySQL и другим открытым базам данных нам очень помогает Percona, привлекает спикеров и аудиторию. Будет также поток по системному администрированию. Все мы знаем, что Postgres-овые админы и разработчики очень плотно погружены в эти темы, поэтому могут какие-то пограничные вещи тоже послушать.

И организуем два необычных потока. Сейчас много всяких переживаний: лучше ли Postgres чем Oracle? Когда Postgres наконец-то победит Oracle? Чтобы разобраться, мы решили сделать поток по коммерческим базам данных, предоставить возможность и “ораклистам” и “посгресистам” посмотреть на другие технологии. И еще у нас поток по computer science. Он включает в себя пограничные вещи между эксплуатацией баз данных и теми тенденциями, что происходят сейчас в этой науке. Ожиданий много, и главное мое беспокойство как организатора — чтобы всем было интересно и хорошо.

Требований к аудитории на самом деле никаких нет, мы рассчитываем, что каждый найдет себе интересную тему. Доклады у нас разноплановые: не только для профессионалов, которые уже все знают. Есть и для тех, кто считает свой уровень чуть ближе к среднему, и для новичков. Достаточно посмотреть на наши мастер-классы. Будет, например, очень интересный вводный курс по MS SQL Server-у и по анализу производительности Oracle. По Посгресу мой workshop будет вводный, а мастер-класс Алексея Лесовского — очень интенсивный, с расчетом на очень серьезную аудиторию. Каждый сможет найти себе по интересу и по уровню.

PG Day: К слову о твоем вводном курсе по PostgreSQL для системных администраторов и DevOps. Он всегда привлекает большое количество слушателей. Почему этот мастер-класс так популярен?

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

Лично мне не очень нравится устройство нашей документации. Она устроена как reference-мануал, информация структурирована по разделам. Человеческое мышление так не работает. Людям хочется получить ответ, как решить более обширную задачу: установить PostgreSQL и начать с ним работать. Документация для этого не предназначена, ее надо читать целиком. Есть руководства в wiki, но они зачастую не актуальны. Поэтому такие курсы очень востребованы, поскольку основаны на практическом опыте, они ближе к практическим задачам администраторов.

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

PG Day: Твои мастер-классы и доклады всегда очень детальны. Скажи, каким образом ты поддерживаешь актуальность технической информации?

Илья: Во-первых, я всегда слежу за коммитфестом и процессом разработки. Когда feature list уже более-менее “устаканился”, я проверяю, какие изменения произошли и как они работают. Это несложный процесс, который, естественно, не добавляет большого количества деталей.

Я советуюсь с коллегами DBA, которые каждый день работают “в поле”. Я слежу за нашей внутренней системой знаний и о том, что происходит в клиентской поддержке. Уже привычные к такому делу DBA знают материал моих слайдов и говорят: «так, слушай, вот этот слайд нужно обновить, тут уже все поменялось». Это кропотливый труд, много подготовительной работы, которую я один сделать никогда бы не осилил.

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

PG Day: Твои доклады доступны в Интернете. Так ли необходимо посещать мастер-класс, ведь можно просто скачать презентацию?

Илья: Презентации необходимы — люди любят их посмотреть и какую-то информацию для себя оттуда извлечь. Скажу честно, я не очень умею и люблю делать самодостаточные презентации. Я не понимаю, зачем тогда нужен доклад? Например, есть на слайде какая-то схема, как что-то устроено в PostgreSQL или в Linux, и эта схема требует моих пояснений. Если я вынесу эти пояснения на несколько соседних слайдов, будет не очень понятно что происходит. Появится много текста, презентация станет перегружена. Поэтому я обычно показываю и рассказываю на докладе голосом, с помощью указки или как-то иначе.

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

PG Day: Специалистам какого профиля в первую очередь стоит посетить твой мастер-класс? Смогут ли слушатели с разным уровнем подготовки почерпнуть для себя что-то полезное?

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

Буквально две недели назад меня попросили послушать доклад по производительности PostgreSQL. Я послушал и вспомнил какие-то моменты, которые уже давно забыл. Мы обсуждали особенности swap’инга разных страниц из памяти в Linux, и я понял, что на этот момент не обращал внимания, а людям он далеко не всегда понятен. Поэтому я сам люблю послушать, чтобы навести порядок в голове, и другим советую.

Особенно рекомендую посетить мастер-класс людям, которые не занимаются профессиональным администрированием PostgreSQL и не планируют становиться крутыми DBA. Это материал будет особенно полезен для людей, которые занимаются DevOps, разрабатывают приложения. У них нет возможности иметь в штате квалифицированного DBA, и приходится самим разбираться со всем этим. Я попытаюсь дать полную инструкцию, что делать, куда смотреть. Пользуясь этими знаниями, слушатели смогут начать эффективно использовать PostgreSQL.

PG Day: Спасибо, Илья!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330946/


Метки:  

Совет по открытым данным: раскрытие транспортных данных

Четверг, 15 Июня 2017 г. 12:22 + в цитатник
image

Источник фото: сайт Открытого Правительства

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

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

1. Открытые данные Минтранса

В ведении Минтранса находятся две информационные системы, одна из них относится к обеспечению транспортной безопасности, данные из нее, по понятным причинам не могут раскрываться, а вторая — это ПО для функционирования сайта mintrans.ru. На сайте Минтранса созданы раздел “Открытые данные” и форма обратной связи. Формирование и актуализация датасетов производятся вручную. На сегодняшний день доступно 35 наборов данных, информацией о приложениях (сервисах), созданных на базе открытых данных Минтранс не располагает, запросы от СМИ и референтных групп не поступали. Поэтому, если вы делаете проекты на основе их данных или вам нужны какие-то датасеты, можете смело об этом писать в форму обратной связи — тем более, со слов докладчика, они открыты к диалогам с разработчиками.

Потенциально готовыми для раскрытия являются следующие наборы:

  • общий реестр регулярных автобусных маршрутов между субъектами РФ;
  • реестр регулярных международных автобусных маршрутов;
  • перечень пунктов пропуска через государственную границу РФ.

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

Самое интересное было в комментариях, которые последовали после доклада:

Во-первых, по версии Минтранса, опубликовано все, что они должны были опубликовать, но (!) этот список может быть дополнен по запросам программистов.

Во-вторых, по мнению одного из участников заседания, Москва лучше Лондона, потому что в Москве 80 транспортных приложений, а в Лондоне всего 60. Интересный вопрос — как связана привлекательность городов или даже уровень развития транспортной системы с количеством транспортным приложений?

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

2. Открытые данные Росавтодора

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

Есть несколько систем, сведения из которых не могут быть опубликованы для общего пользования, например, данные из Единого государственного реестра автомобильных дорог не могут быть открыты, потому что “за предоставление сведений, содержащихся в ЕГРАД, взимается плата в порядке, установленном приказом…”.

На сегодняшний день опубликовано 150 датасетов, количество просмотров которых превышает 44 тысячи, а вот скачиваний всего 308. На мой взгляд, стоит задуматься или об актуальности публикуемых датасетов, или об интуитивной понятности интерфейса.

Примеры опубликованных данных:

  • Дорожный граф с указанием государственного органа и предприятия, ответственного за содержание участков и объектов транспортной инфраструктуры;
  • Транспортно-эксплуатационное состояние автомобильных дорог общего пользования федерального значения;
  • Сведения об автомобильных дорогах общего пользования федерального значения, переданные в доверительное управление ГК “Автодор”;
  • Ключевые объекты социальной инфраструктуры;
  • Перечень автомобильных дорог общего пользования федерального значения (классификация);
  • Планы ремонтных работ.

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

Вопросы обеспечения транспортной безопасности;
Информация о развитии инновационной деятельности Росавтодора;
Общедоступные сведения из информационных систем Федерального дорожного агентства.

К актуальным проблемам Росавтодор относит необходимость удаления сведений ограниченного доступа. По их мнению, после этого ценность данных снижается, и наборы становятся не востребованными. С определением востребованности у представителей Росавтодора и правда сложно: например, в обсуждении доклада прозвучала удивительная мысль о том, что открытые транспортные данные, по мнению докладчика, вообще никому не нужны и перед публикацией открытых данных “хочется понимать пользователя открытых данных: кто и как их будет использовать?”. Ответ М. Абызова снова соответствовал международной практике: “Открывайте все, что не ограничено (open by default)или предоставьте результаты грамотного социологического исследования о востребованности данных”.

3. Открытые данные Росжелдора

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

На сегодняшний день опубликовано 7 наборов данных, содержащих в сумме 52 показателя и 15 000 строк. Всего с Портала открытых данных поступало три запроса, два из которых не относились к компетенции Росжелдора, а в третьем запрашивалась информация в текстовом виде (в этом тексте по-моему опять содержится призыв к запросу интересующих вас данных).

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

Своеобразны и изящны предложения Росжелдора по повышению эффективности деятельности по открытости:

Во-первых, некоторые приоритетные социально-значимые наборы данных эффективнее запрашивать в органах, осуществляющих их консолидацию: экономическую деятельность ФОИВов — у Минфина России и Казначейства из системы “Электронный бюджет”, перечень государственных услуг — у Минэкономразвития из федерального реестра, сведения о доходах, расходах, об имуществе и обязательствах имущественного характера госслужащих — у Минкомсвязи из “Единой ИС управления кадровым составом государственной гражданской службы РФ”, данные по закупкам — у Федерального Казначейства, а данные по государственному планированию — из Портала госпрограмм Минэкономразвития.

Во-вторых, Росжелдор был бы рад не дублировать датасеты на своем сайте (а размещал бы их только на Портале ОД РФ), поэтому необходимо, чтобы АИС “Мониторинг госсайтов” начислял бы баллы за размещение датасетов на федеральном портале (очередное подтверждение тому, что в России рейтинги — одна из основных мотиваций для открытости).

4. Открытые данные Росморречфлота

Одной из основных информационных систем Росморречфлота является “КИИС “МоРЕ”. Она предназначена для интеграции информационных ресурсов в области безопасности судоходства, мониторинга, учета и классификации судов. Система “МоРЕ” взаимодействует с более чем 40 отраслевыми, национальными и международными информационными системами, при этом не имеет статуса государственной, а ее финансирование осуществляется из внебюджетных источников. На данный момент прорабатывается вопрос возможности анонимизации данных о физических лицах и компаниях для публикации сведений из этой системы.

Разработка еще одной системы, предназначенной для дипломирования членов экипажей морских судов, была начата Росморречфлотом совместно с Рострудом в рамках Хакатона 3.0 (мне не известны другие примеры участия госорганов в хакатонах в качестве разработчиков, а не организаторов или партнеров).

Что касается текущей работы и планов по открытости, на данный момент актуализируется и обновляется раздел “Открытые данные”, ведется работа по автоматической синхронизации сайта с федеральным порталом открытых данных, планируется опубликовать 28 наборов данных, провести отраслевой хакатон, а также в среднесрочной перспективе внедрить механизмы открытости и публикации наборов данных подведомственными организациями.

5. Открытые данные Ространснадзора

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

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

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

image
Структура Ведомственного плана мероприятий Ространснадзора в области открытых данных

6. Разное

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

Вместо выводов

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

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

В целом, посещение каждого заседания оставляет легкое недоумение — совет курирует раскрытие данных федеральным госорганами, но свои данные открывать не спешит: стенограммы заседаний и материалы к заседаниям не публикуются вообще, а протоколы доступны только для отдельных заседаний. Было бы неплохо, если открытость совета по ОД являлась бы примером и стандартом де-факто для работы других госструктур.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330864/


Метки:  

Cloud Expo Asia Hong Kong – отчет с крупнейшей в Азии выставки ИТ-технологий

Четверг, 15 Июня 2017 г. 11:23 + в цитатник

Метки:  

Банковские отделения будущего и кому они нужны

Четверг, 15 Июня 2017 г. 11:07 + в цитатник
С развитием мобильных приложений и вебсайтов подавляющее большинство банковских услуг сегодня стали доступны из дома или с мобильного телефона. Однако, будет ошибкой полагать, что в этой связи все физические подразделения будут или должны быть закрыты. Об этом красноречиво свидетельствует стремление практически всех крупнейших финансово-технологических компаний, работающих исключительно онлайн, создавать собственные сети физических отделений. Эти компании видят необходимость в том, чтобы их клиенты имели возможность лично общаться с квалифицированными специалистами и получать ответы на свои вопросы. Они понимают, что для принятия решения клиентам необходимо «дотронуться» до продуктов, «почувствовать» их.



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

Физические и цифровые каналы дополняют друг друга


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

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

Дополнительная коммерческая отдача


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

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

О том, каким образом банки могут переосмыслить работу своих отделений, и какие цифровые сервисы лучше всего работают в физическом окружении – на нашем сайте (англ.) и в наших будущих публикациях.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330516/


Метки:  

Оптическое распознавание символов на микроконтроллере

Четверг, 15 Июня 2017 г. 10:26 + в цитатник


На сегодняшний день оптическое распознавание символов является частью решения таких прикладных задач, как распознавание и оцифровка текстов, распознавание документов, распознавание автомобильных номеров, определение номеров банковских карточек, чтение показаний счетчиков учета, определения номеров домов для создания карт (Google Street View) и т.д.
Распознавание символа означает анализ его изображения с целью получения некоторого набора признаков для сравнения их с признаками класса [ 1 ]. Выбор такого набора и способы его определения отличают разные методы распознавания, но для большинства из них необходима одномоментная информация обо всех пикселях изображения.
Последнее обстоятельство и достаточно большой объем вычислений делают невозможным использования маломощных вычислительных устройств (микроконтроллеров) для оптического распознавания символов. «Да и зачем?» — воскликнет информированный читатель, «мощности вычислительных устройств постоянно растут, а их цена падает!»[2, 3]. Допустим, что ответ будет такой: просто интересно, возможно ли упростить метод распознавания до такой степени, чтобы можно было бы использовать микроконтроллер?
Оказалось можно, более того, оказалось возможным то, что кажется относится к области фантастики, а именно:

  • распознавание независимо от шрифта;
  • распознавание строки символов без разделения на отдельные символы;
  • распознавание «экранированных» символов, например, символ в символе;
  • распознавание «разорванных» символов;
  • распознавание символов, состоящих из нескольких частей;
  • распознавание без изменения признаков при повороте до 15°. Возможность
    распознавания повернутых символов на больший угол за счет изменения его признаков;
  • распознавание символов в видеопотоке с одного кадра;
  • распознавание рукописных символов;
  • ограниченное количество признаков для описания класса символов, для арабских цифр
    и латиницы — один, для кириллицы — максимум два (например, для некоторых
    вариантов написания Ж);
  • простое «ручное» определение признаков для нового класса;
  • автоматическое определение признаков для нового класса;
  • расширение классов символов простым добавлением в базу его признаков;

И все это на микроконтроллере.

Основная идея метода



Теперь поподробнее о самом методе. Рассмотрим, например, различные начертания символа А:



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



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



то это не обязательно будут буквы прописные А, возможны, например Д, Я,R, строчная рукописная А,..:



Однако использование областей в качестве элементов символа позволяет сформировать достаточные признаки, причем, для подавляющего числа алфавитно-цифровых символов можно сформировать единственный достаточный признак! Его очень просто сформировать для каждого класса и, в отличие от структурных признаков, используемых ABBYY при распознавании рукописных символов [ 1 ], его вариативность очень низкая и его возможно формировать автоматически! Другими словами, такие признаки хорошо работают как для печатных, так и для рукописных символов.

Устройство для распознавания



Первая проверка метода была описана в статье [ 4 ]. Метод проверялся на одиночных цифрах, получаемых примитивной камерой от мыши с семисегментного индикатора или напечатанных на бумаге. После первого успеха возникло естественное желание проверить возможность распознавания последовательности символов, а для этого нужно использовать другую камеру. Мы использовали камеру OV7670 (0.3Мп). Остальные главные компоненты схемы остались без изменения — это Arduino и ESP8266, но изменились их функции. Arduino теперь используется для инициализации камеры, в качестве задающего генератора, приема распознанных символов и их отображения на индикаторах. ESP8266 занимается получением изображения с камеры и его распознаванием, кроме того он обеспечивает передачу данных на Ардуино для отображения и передачу распознанной информации через WiFi на внешние устройства, например, смартфон. Используемая электрическая схема устройства приведена на рисунке:



Изображение попадает в устройство через щель в его нижней части и, отражаясь от зеркала, поступает на камеру. Подсветка изображения осуществляется светодиодом через то же зеркало. Механическая схема устройства приведена на рисунке.



Фото рабочего прототипа

Первый вариант рабочего прототипа:







Второй вариант рабочего прототипа:










Получение изображения на на ESP8266



Настройки камеры при инициализации взяты из [5]. Частота кадров приблизительно 0,4 кадр/с.Так как количество пинов у ESP8266 недостаточно, то обрабатываются только 6 старших бит каждого яркостного байта изображения (камера настроена в режиме YUV). Для получения изображения используется конечный автомат (машина состояний).



Согласно даташит камеры OV7670 [6]




можно выделить следующие состояния камеры, условия и сигналы во время ее работы:

Имя состояния,номер Описание состояния Сигнал к переходу
в другое состояние
camoff,0 камера
не готова к работе
vzz
(vsync=1,href=
0,pclk=0)
frapause, 1 пауза
между кадрами. ожидание начала кадра.
zzz (vsync=0,href=0,pclk=0)
framebeg, 2 чтение
кадра. ожидание начала строки в кадре.
zhz (vsync=0,href=1,pclk=0)
framebeg, 2 чтение
кадра. ожидание конца кадра после чтения
последнего пикселя
vzz
(vsync=1,href=
0,pclk=0)
fbyteread, 3 яркостный
байт прочитан. ожидание начала паузы
перед цветоразностным байтом.
zhz (vsync=0,href=1,pclk=0)
fpause, 4 пауза
перед цветоразностным байтом. ожидание
начала чтения цветоразностного байта.
zhp
(vsync=0,href=
1,pclk=1)
sbyteread, 5 цветоразностный
байт прочитан. ожидание начала паузы
перед яркостным байтом.
zhz (vsync=0,href=1,pclk=0)
spause, 6 пауза
перед яркостным байтом. ожидание
окончания строки.
zzz
(vsync=0,href=
0,pclk=0)
spause, 6 пауза
перед яркостным байтом. ожидание начала
чтения яркостного байта.
zhp
(vsync=0,href=
1,pclk=1)


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

user_main.c
#include "ets_sys.h"
#include "osapi.h"
#include "os_type.h"
#include 
#include "driver/uart_register.h"
#include "user_config.h"
#include "user_interface.h"
#include "driver/uart.h"
#include "readCam.h"
#define DELAY 5000 /* milliseconds */
LOCAL os_timer_t cam_timer;
uint16_t frN;
extern uint8_t pixVal;
uint8_t rN[10];

LOCAL void ICACHE_FLASH_ATTR getNFrame(void *arg){
  uint16_t sig, sV,sH,sP;
  uint16_t pVal;
  uint16_t d7,d6,d5,d4,d3,d2;
  stateMashine camSM;
  ets_uart_printf("getNFrame...\r\n");
  initSMcm(&camSM);
  while(frN<20){
	  system_soft_wdt_feed();
	  pVal= *GPIO_IN;
	  sV=((pVal&(1UL<>VSYNC);
	  sH=((pVal&(1UL<>HREF);
	  sP=((pVal&(1UL<>PCLK);
	  sig=4*sV+2*sH+sP*sH;
	  d7=((pVal&(1UL<>D7);
	  d6=((pVal&(1UL<>D6);
	  d5=((pVal&(1UL<>D5);
	  d4=((pVal&(1UL<>D4);
	  d3=((pVal&(1UL<>D3);
	  d2=((pVal&(1UL<>D2);
	  pixVal=128*d7+64*d6+32*d5+16*d4+8*d3+4*d2;
	  exCAM(&camSM,sig,&frN,rN);
	 }
}
uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;
    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 8;
            break;
        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;
        case FLASH_SIZE_16M_MAP_512_512:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_32M_MAP_512_512:
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }
    return rf_cal_sec;
}

void ICACHE_FLASH_ATTR user_init(void){
	void (*cbGetFrame)(void *arg);
	cbGetFrame=(void*)getNFrame;
	UARTInit(BIT_RATE_921600);
	user_gpio_init();
	os_timer_disarm(&cam_timer);
	os_timer_setfn(&cam_timer, (os_timer_func_t *)cbGetFrame, NULL);
	os_timer_arm(&cam_timer, DELAY, 0);
}



readCam.h

#ifndef INCLUDE_READCAM_H_
#define INCLUDE_READCAM_H_
#define GPIO_IN 				((volatile uint32_t*) 0x60000318)
#define WP 		320
#define HP 		240
#define PIXTYP 0
//image __________________________________________
#define IMAGEY0 60
#define IMAGEH HP/3
//____________________pins_____________________
#define VSYNC 15
#define HREF 13
#define PCLK 3
#define D7 4
#define D6 12
#define D5 0
#define D4 14
#define D3 2
#define D2 5
//*************signals OV7670*****************
#define ZZZ 0
#define VZZ 4
#define ZHZ 2
#define ZHP 3
//*************states OV7670*******************
#define CAMOFF 0
#define FRAPAUSE 1
#define FRAMEBEG 2
#define FBYTEREAD 3
#define FPAUSE 4
#define SBYTEREAD 5
#define SPAUSE 6

#define SSCC 40//max state_signal_condition count
#define STATE_L 5
#define STATE_V 0x1F
#define SIG_L 8
#define SIG_V 0xFF

typedef struct {
	uint8 pix[WP] ;
}linePixel;

typedef struct gen{
	uint8_t state;
	uint8_t sig;
	uint8_t stateX;
	void *fp;
}gen;
typedef struct stateMashine{
	uint8_t count;
	uint16_t ssc[SSCC];
	uint8_t stateX[SSCC];
	void *fPoint[SSCC];
	void *fpd;
}stateMashine;

#endif /* INCLUDE_READCAM_H_ */




readCam.c
#include "ets_sys.h"
#include "osapi.h"
#include "os_type.h"
#include 
#include "driver/uart_register.h"
#include "user_config.h"
#include "user_interface.h"
#include "driver/uart.h"
#include "readCam.h"

void sendLine(uint16_t lN);
void ICACHE_FLASH_ATTR sendFramMark(void);
void ICACHE_FLASH_ATTR sendCtr3Byte(uint8_t typ,uint16_t len);
void user_gpio_init(void);
void sendByte(uint8_t bt);
void  ICACHE_FLASH_ATTR initSMcm(stateMashine *psm);
void exCAM( stateMashine *psm,uint8_t sig,uint16_t *frameN,uint8_t *rN);
int   indexOf(stateMashine *psm,uint16_t ssc);

linePixel lp;
uint8_t pixVal;

void exCAM( stateMashine *psm,uint8_t sig,uint16_t *frameN,uint8_t *rN){
	 int16_t ind;
	 uint16_t lN;
	 uint16_t pN;

	 static uint8_t state=CAMOFF,stateX=CAMOFF;
	 static void (*pfun)()=NULL;
	 uint16_t stateSigCond=0;
	 stateSigCond|=((state&STATE_V)<<(16-STATE_L))|((sig&SIG_V)<<(16-STATE_L-SIG_L));
	 ind=indexOf(psm,stateSigCond);
	 if(ind>-1)	 stateX=(*psm).stateX[ind];
	 if(ind>-1)	 pfun=(*psm).fPoint[ind];
	 else pfun=(*psm).fpd;
	 pfun(frameN,&lN,&pN,rN);

	 state=stateX;
}

void  _cm0(){}
void  _cm1(uint16_t *fN,uint16_t *lN,uint16_t *pN){//new frame
	sendFramMark();
	sendCtr3Byte(PIXTYP,0);
	(*lN)=0;
}
void  _cm2(uint16_t *fN,uint16_t *lN,uint16_t *pN){//frame end
	if(*lN==HP-1)(*fN)++;
}
void  _cm3(uint16_t *fN,uint16_t *lN,uint16_t *pN){//new line
	uint16_t pixN;
	 (*pN)=0;
	 //	pixN=(*pN);//right image
	 pixN=WP-1-(*pN);//revers image
	 (lp).pix[pixN]=pixVal;
	 (*pN)++;
}
void  _cm4(uint16_t *fN,uint16_t *lN,uint16_t *pN){// first byte
	uint16_t pixN;
//	pixN=(*pN);//right image
	pixN=WP-1-(*pN);//reverse image
	(lp).pix[pixN]=pixVal;
//	if(pixN/right image
	if(pixN)(*pN)++;//reverse image
}
void  _cm5(uint16_t *fN,uint16_t *lN,uint16_t *pN,uint8_t *rN){//end line
    uint16_t lineN;
    lineN=(*lN);
	sendLine(lineN);
	if((*lN)/0#1
			{FRAPAUSE,ZZZ,FRAMEBEG,_cm1},//1#2
			{FRAMEBEG,VZZ,FRAPAUSE,_cm2},//2#1
			{FRAMEBEG,ZHZ,FBYTEREAD,_cm3},//2#3
			{FBYTEREAD,ZHP,FPAUSE,_cm0},//3#4
			{FPAUSE,ZHZ,SBYTEREAD,_cm0},//4#5
			{SBYTEREAD,ZHP,SPAUSE,_cm0},//5#6
			{SPAUSE,ZHZ,FBYTEREAD,_cm4},//6#3
			{SPAUSE,ZZZ,FRAMEBEG,_cm5},//6#2
			{FPAUSE,ZZZ,FRAMEBEG,_cm5},//5#2
		};
	(*psm).count=count;
	for(i=0;i>UART_TXFIFO_CNT_S)
					& UART_TXFIFO_CNT;
	}
		buf[lenBuff] =bt;
		uart0_tx_buffer(buf, lenBuff + 1);
}

void  sendLine(uint16_t lN){
	uint16_t j;
	uint8_t sByt;
	for(j=0;j(IMAGEY0+IMAGEH))sByt=0xFF;
		sendByte(sByt);
	}
}

void ICACHE_FLASH_ATTR user_gpio_init(void) {
	ets_uart_printf("GPIO  initialisation...\r\n");

	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
	gpio_output_set(0, 0, 0, BIT0); // Set GPIO0 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
	gpio_output_set(0, 0, 0, BIT2); // Set GPIO2 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
	gpio_output_set(0, 0, 0, BIT3); // Set GPIO3 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
	gpio_output_set(0, 0, 0, BIT4); // Set GPIO4 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
	gpio_output_set(0, 0, 0, BIT5); // Set GPIO5 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
	gpio_output_set(0, 0, 0, BIT1); // Set GPIO13 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
	gpio_output_set(0, 0, 0, BIT14); // Set GPIO14 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13); // Set GPIO13 function
	gpio_output_set(0, 0, 0, BIT13); // Set GPIO13 as input
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
	gpio_output_set(0, 0, 0, BIT15); // Set GPIO15 as input
	ets_uart_printf("...init done!\r\n");
}

void ICACHE_FLASH_ATTR sendFramMark(void){
	sendByte(42);
	sendByte(42);
}
void ICACHE_FLASH_ATTR sendCtr3Byte(uint8_t typ,uint16_t len){
	uint8_t lLen,hLen;
	sendByte(typ);
	lLen=len&0xFF;
	hLen=(len&(0xFF<<8))>>8;
	sendByte(lLen);
	sendByte(hLen);
}



Обработка изображения



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

Визуализация процесса распознавания



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





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



Также распознавание не происходит при неправильном позиционировании текста:



Для визуализации использовалась небольшая программа, написанная на Java Script с использованием nodeWebkit.

app.js
*для работы с COM портом необходимо собрать модуль nodeJS «serialport» под nodewebkit
var btn = document.getElementById('com');
var gui = require("nw.gui");
var select_com = document.getElementById('select_com');
var bdr = document.getElementById('bdr');
var canvas = document.getElementById('canvas');
var dev = document.getElementById('dev');

var ctx = canvas.getContext('2d');

var width = 320,
    height = 240;
var byteCount = (width * height)/3;
var lastStr=byteCount-width;

var dataArr;
var dataStr;
var indArr = 0;
var dataArrLen = 0;
var byteCounter = 0;
var newStr = 0;
var sendTyp=0;

document.addEventListener('DOMContentLoaded', function() {
    btn.addEventListener('click', function() {
        connectCom(function(vector) {
            drawImg(vector);
        });
    });
    dev.addEventListener('click', function(){

             var win = gui.Window.get();
             win.showDevTools();
    });
});

function drawImg(imgArr) {
    var imgData = ctx.createImageData(width, height);
    var ind; 
     for (var i = 0; i < imgArr.length; i++) {

            imgData.data[4 * i] = imgArr[i];
            imgData.data[4 * i + 1] = imgArr[i];
            imgData.data[4 * i + 2] = imgArr[i];
            imgData.data[4 * i + 3] = 255;

        if(ilastStr){ //red line
            imgData.data[4 * i] = 255;
            imgData.data[4 * i + 1] = 0;
            imgData.data[4 * i + 2] = 0;
            imgData.data[4 * i + 3] = 255;
        }
        if(i<2*byteCount&&i>byteCount+lastStr){ //green line
            imgData.data[4 * i] = 0;
            imgData.data[4 * i + 1] = 255;
            imgData.data[4 * i + 2] = 0;
            imgData.data[4 * i + 3] = 255;
        }  
        if(i<3*byteCount&&i>2*byteCount+lastStr){ //blue line
            imgData.data[4 * i] = 0;
            imgData.data[4 * i + 1] = 0;
            imgData.data[4 * i + 2] = 255;
            imgData.data[4 * i + 3] = 255;
        }       
    }
    ctx.putImageData(imgData, 0, 0);
    imgArr.length=0;
}

function connectCom(callback) {

    const PIXTYPE=0,BINTYPE=1,FIGTYPE=2;
    var imgTyp=PIXTYPE;
    var  serialport = require('serialport');
    var imgArr = [];
    
    var framCount=0,strNum,colNum;
    var pix=false;

    var comm = 'COM' + select_com.value;
    var boudrate = +bdr.value;
    var SerialPort = serialport.SerialPort;
    var port = new SerialPort(comm, {
        baudRate: boudrate,
        dataBits: 8,
        stopBits: 1,
        parity: "none",
        bufferSize: 65536,
        parser: SerialPort.parsers.byteLength(1)
    });
    port.on('open', function() {
        console.log('Port ' + comm + ' Open');
    });

    port.on('data', function(data) {
        
        if(imgTyp==PIXTYPE||imgTyp==BINTYPE){
            if (data[0] == 42 && newStr == 0) {
                newStr = 1;
                data[0]=255;
            }
            if (newStr == 1 && data[0] == 42) {
                newStr = 2;
            }
            if (newStr == 2 && byteCounter <2*byteCount) {
                colNum=byteCounter%width;
                strNum=(byteCounter-colNum)/width;
    
                if(strNum%2==0){
                    imgArr[(strNum/2)*width+colNum]=data[0];
                }
                if(strNum%2==1){
                    imgArr[((strNum-1)/2)*width+byteCount+colNum]=data[0];
                }               
                 byteCounter++;
            }
            if (newStr == 2 && byteCounter == 2*byteCount) {
                newStr = 0;
                byteCounter = 0;
                framCount++;
                console.log('Frame Num ', framCount);
                imgTyp=FIGTYPE;
             }
        }
          if(imgTyp==FIGTYPE){
            if (data[0] == 42 && newStr == 0) {
                newStr = 1;
                data[0]=255;
            }
            if (newStr == 1 && data[0] == 42) {
                newStr = 2;
            }
            if (newStr == 2 && byteCounter < byteCount) {
                imgArr[byteCounter+2*byteCount] = data[0];
                byteCounter++;
            }
            if (newStr == 2 && byteCounter == byteCount) {
                newStr = 0;
                byteCounter = 0;
                framCount++;
                console.log('Frame Num ', framCount);
                imgTyp=PIXTYPE;
                 callback(imgArr);
            }            
        }

    });
    port.on('error', function() {
        alert('Ошибка подключения к порту СОМ');
    });

}




Пример работы устройства показан в коротком видеоролике.

Видео с прототипом №1





Видео с прототипом №2





Заключение



Полученные результаты показывают высокую эффективность метода распознавания на устройствах, казалось бы, совершенно для этого не предназначенных. Небольшое усовершенствование метода, связанное с использованием информации из нескольких кадров для дополнительного «всматривания» в интересующие области, позволит поднять качество распознавания до уровня коммерческих продуктов.
Также понятен подход для анализа и распознавания многопризнаковых объектов, таких как строки рукописного текста или иероглифы, однако для этого нужны устройства с большим, чем у нашего esp (512K, объем программы более 250К) объемом памяти.
Спасибо за внимание.

Ссылки:

1. Распознавание текста в ABBYY FineReader (2/2)
2. Omega2: самый маленький в мире микрокомпьютер с Linux и Wi-Fi
3. Orange Pi 2G-IoT — идеальный одноплатник для IoT
4. Распознавание цифр на микроконтроллере
5. Скетч Arduino для работы с камерой OV7670
6. Даташит камеры OV7670
7. Отражение динамики в модели СКУД
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330936/


В MIT разработали фотонный чип для глубокого обучения

Четверг, 15 Июня 2017 г. 10:21 + в цитатник
Системы глубокого обучения, основанные на имитации накопления знаний искусственными нейронными сетями, получили возможность усваивать информацию значительно быстрее и эффективнее. Совместная команда исследователей из Массачусетского технологического института (MIT) и других стран разработала новый подход к обучению с использованием света вместо электричества. Результаты их исследований были описаны 12 июня в журнале Nature Photonics научным сотрудником MIT Йиченом Шеном (Yichen Shen), аспирантом Николасом Харрисом (Nicholas Harris), профессорами Марином Солжачиком (Marin Soljacic) и Дирком Энглундом (Dirk Englund).

/ фото Bill Benzon CC

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

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

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

Схема фотонного чипа для глубокого обучения

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

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

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

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

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

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

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

Джон Тиммер (John Timmer), научный редактор Ars Technica, утверждает, что у концепции есть ряд существенных ограничений. Главное из них — размер оптических микросхем: для решения ряда коммерческих задач, их нужно делать или большими, или пропускать через них свет несколько раз. В последнем случае нужно будет разработать грамотный алгоритм для вычислений. Из-за этого в контексте более сложных операций может быть потеряна большая часть заявленных преимуществ, однако если исследователи смогут преодолеть препятствия, а также повысить точность обучения, система, по мнению Тиммера, сможет поддерживать глубокое обучение, используя в 100 тыс. раз меньше энергии, чем традиционные GPU.

P.S. Несколько других интересных материалов из Первого блога о корпоративном IaaS:

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330574/


Метки:  

[Перевод] Компилируем, как будто на дворе 1992 год

Четверг, 15 Июня 2017 г. 09:53 + в цитатник
image

Я изучал ванильный исходный код игры Wolfenstein 3D 1992 года. Несмотря на то, что ей уже 25 лет, и она совершенно устарела для современных платформ, её всё равно можно скомпилировать, если воссоздать окружение.

Для этого требуется всего лишь:
  • Исходный код Wolfenstein 3D.
  • DosBox.
  • Компилятор Borland C++ 3.1.
  • Wolfenstein 3D shareware (чтобы позаимствовать ресурсы).

Настройка файловой системы


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

   cd ~
   mkdir system
   cd system
   mkdir c
   mkdir a
   cd ~

Скачиваем файлы


  • Скачиваем Borland 3.1 в system/a.
  • Скачиваем исходный код Wolfenstein 3D в system/c
  • Скачиваем файлы VGA в system/c (в конце статьи я объясню, зачем это нужно).

    cd system/a
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/BCPP31.zip    

    cd ../c
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsrc.zip
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/vgafiles.zip

Теперь все файлы находятся в файловой системе. Просто чтобы проверить, введём:

   cd ..
   find ~/system

У вас должно получиться следующее:

    /Users/fabiensanglard/system
    /Users/fabiensanglard/system/a
    /Users/fabiensanglard/system/a/BCPP31.zip
    /Users/fabiensanglard/system/c
    /Users/fabiensanglard/system/c/vgafiles.zip
    /Users/fabiensanglard/system/c/wolfsrc.zip

Распаковываем всё



    cd ~/system/a
    unzip BCPP31.zip

    cd ~/system/c
    unzip vgafiles.zip
    unzip wolfsrc.zip

DosBox


Скачаем и запустим DosBox:



Монтируем


Смонтируем файловую систему, по одной папке для каждого из дисков:

   Z:/> mount c ~/system/c 
   Z:/> mount a ~/system/a

Устанавливаем компилятор


Настало время установить Borland C++ 3.1:

    Z:\> a:
    A:\> cd BCPP31
    A:\> install



Нажмите «ввод» при выборе исходного диска (должен быть выбран диск A)



Оставим все параметры по умолчанию и выберем «Start Installation»:



Уведомления предупреждают, что не удаётся найти папку Microsoft Windows, но она нам не нужна, просто нажмём «ввод».







Устанавливаем исходный код Wolfenstein 3D


Система работает и в ней есть компилятор: настало время распаковывать (снова) исходный код.

  A:\> c:
  C:\> cd\
  C:\> install



Введём «C»



Оставим путь по умолчанию: \WOLFSRC


Подтвердим («Y») создание директории.

Устанавливается!



Компилируем


Запускаем Borland C++ 3.1:

     C:\> cd\
     C:\> cd borlandc
     C:\> cd bin
     C:\> bc.exe




После нажатия на OK, используем мышь или горячие клавиши, чтобы выбрать Project -> Open Project ..\..\WOLFSRC\WOLF3D.PRJ:



Выберем Options -> Directories и изменим значение следующим образом:

    Include Directories: C:\BORLANDC\INCLUDE

    Library Directories: C:\BORLANDC\LIB

    Ouptput Directories: OBJ

    Source Directories:  C:\WOLFSRC



Попробуем скомпилировать: Compile -> Build All



Мы получим ошибку: «Cannot find executable TASM»



Выйдем из Borland C++, нужно настроить PATH:

     C:\> CD ..
     C:\> PATH=C:\BORLANDC\BIN
     C:\> BC.EXE

Снова попробуем скомпилировать (Compile -> Build All):



Компилирование выполнилось, но возникла ошибка компоновки: «Unable to find OBJ file», потому что путь к SIGNON.OBJ и GAMEPAL.OBJ в проекте указан неверно.

Они отмечены в C:\SOURCE\WOLF\:



Удаляем их из проекта (Выберем Projext -> Delete item). Добавим их снова через PROJECT -> Add Item…. Добавляем WOLFSRC\OBJ\SIGNON.OBJ и WOLFSRC\OBJ\GAMEPAL.OBJ



Попробуем скомпилировать снова (Compile -> Build All)



Сработало! Но запустится ли игра?



Достаём ресурсы


Скачайте shareware-версию, или даже лучше: купите как полную версию Wolfenstein 3D.

    cd ~/system/c
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/1wolf14.zip
    unzip 1wolf14.zip

Вернёмся в DosBox и установим игру в C:\WOLF3D.

  C:\> c:
  C:\> cd \
  C:\> cd 1wolf14
  C:\1WOLF14> install

После установки игры скопируем только что скомпилированный файл .EXE в папку игры,

    C:\> c:
    C:\> cd wolf3d
    C:\WOLF3D> copy WOLF3D.EXE WOLF3D.OLD
    C:\WOLF3D> copy ../WOLRSRC/WOLF.EXE

Запускаем игру


Попробуем запустить:

    C:\> cd wolf3d
    C:\WOLF3D> copy WOLF3D.EXE WOLF3D.OLD
    C:\WOLF3D> copy ../WOLRSRC/OBJ/WOLF3D.EXE .
    C:\WOLF3D> WOLF3D.EXE

Хм, выглядит странно…



Ой…



Что?



Не припомню, чтобы игра была такой…



Так, где-то возникла ошибка!

Что случилось?


Дело в конвейере производства игры и в том, как он использовался движком. Когда Адриан Кармак и Кевин Клауд заканчивали работу над всеми графическими файлами, они использовали инструмент IGRABed для их упаковки. В результате получалось 3+2 файла.

  • VGAHEAD.WL1
  • VGAGRAPH.WL1
  • VGADICT.WL1

Файл VGAHEAD — это индекс, содержащий указатели на VGAGRAPH, в котором хранятся данные, сжатые алгоритмом Хаффмана. VGADICT содержит словари Хаффмана для распаковки данных.

Два других созданных файла:

  • GRE.H
  • GRE.EQU

компилируются в движок, как показано на рисунке ниже:



Для чего нужны файлы .H и .EQU? Если вкратце, то они позволяют получать доступ по имени. Когда IGRABed собирает все файлы, он также создаёт перечисление (enum) с соответствующими индексами:

GRE.H

            enum{ 
            H_WOLFLOGOPIC
            GETPSYCHEDPIC
            L_GUYPIC
            .
            .
            } graphicnums

GRE.EQU

            H_WOLFLOGOPIC  = 0
            GETPSYCHEDPIC  = 1
            L_GUYPIC       = 2

Таким образом, когда движок запрашивает нужный ресурс, он может использовать логическое имя (L_GUYPIC), а не «магическое число» (2).

Это значит, что движок выпускался с жёстко заданными индексами изображений в файлах VGA. Поскольку ресурсы и база кода эволюционировали после выпуска wolf3D shareware (в Spear of Destiny), новые скомпилированные индексы игры не совпадают с расположением исходных файлов ресурсов.

Запускаем игру (снова)


К счастью, у этой проблемы есть простое решение: кто-то сгенерировал ресурсы VGA заново, чтобы они совпадали с индексами в файлах .H и .EQU, выпущенных с исходным кодом. Просто скопируем эти файлы (если вы используете ресурсы из shareware-версии, то нужно будет изменить расширение файлов с .WL6 на .WL1).

  C:\> copy C:\vgafiles\VGADICT.WL6 C:\WOLF3D\VGADICT.WL1
  C:\> copy C:\vgafiles\VGAGRAPH.WL6 C:\WOLF3D\VGAGRAPH.WL1
  C:\> copy C:\vgafiles\VGAHEAD.WL6 C:\WOLF3D\VGAHEAD.WL1

Попробуем снова:

  C:\WOLF3D> WOLF3D.EXE

Работает!



Но мы всё ещё не закончили!

Буфер кадров VGA и соотношение сторон экрана


Это может быть неочевидно для людей, никогда не видевших оригинальную игру, но представленная выше картинка из DosBox не совсем совпадает с тем, что видели игроки в 1992 году. Буфер кадров VGA имел размер 320x200, но у ЭЛТ-мониторов соотношение сторон равно 4:3. Это значит, что буфер кадров при отправке на монитор вертикально растягивался. В DosBox есть опция для компенсации этого:

     vi ~/Library/Preferences/DOSBox\ 0.74\ Preferences
  
    [render]
    # frameskip: количество кадров, пропускаемых DOSBox при отрисовке кадра.
    # aspect: выполнять коррекцию соотношения сторон. Если способ вывода не поддерживает масштабирование, то это может привести к замедлению работы!
    # scaler: используется для расширения/улучшения режимов низкого разрешения.
      # Если использована опция 'forced', то scaler используется, даже когда результат может оказаться неправильным.
      # Возможные значения: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, ...

    frameskip=0
    aspect=false
    scaler=normal2x

Поменяем значение aspect на true.

Попробуем снова:

  C:\WOLF3D> WOLF3D.EXE


Наконец-то заработало!




Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330940/


Метки:  

«Управление в ИТ»: Что такое ITSM и платформа ServiceNow

Четверг, 15 Июня 2017 г. 09:24 + в цитатник
В определенный момент развития компании руководство ИТ-подразделения может столкнуться с ситуацией, когда решение инцидентов занимает слишком много времени, пользователи оказываются недовольны предоставляемыми услугами, а внутренняя организация работы представляет собой полный хаос. Одним из вариантов решения этих проблем является внедрение ITSM (Information Technology Service Management). В рамках этого поста, которым мы решили открыть свой блог на Хабре, мы поговорим о том, что такое ITSM, и рассмотрим некоторые возможности платформы ServiceNow.

Marco Verch / CC / Flickr

Что такое ITSM?


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

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

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

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

Реализация ITSM — ServiceNow


Сегодня, согласно отчету Gartner, одним из самых популярных ITSM-сервисов на рынке является платформа ServiceNow. «ИТ Гильдия» — официальный партнер компании ServiceNow Ltd., мирового лидера среди поставщиков ПО для управления службой поддержки, достаточно давно работает с платформой ServiceNow, обеспечивая интеграцию, администрирование и техническое сопровождение. Поэтому мы на собственном опыте убедились, что ServiceNow — это гибкая платформа, предоставляющая большие возможности конфигурации под процессы клиента.

За последние годы компания ServiceNow немного изменила вектор развития своего продукта, который теперь выходит за рамки ИТ. Сервис позволяет управлять большинством бизнес-направлений. Процессы, которые бизнес использует для управления, очень похожи на процессы, происходящие в ИТ-отделе. Изменяются лишь задачи, однако архитектура межэлементных взаимосвязей и отношения между исполнителем и потребителем остаются прежними. Со структурой решения ServiceNow можно познакомиться в этом видео:




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

Управление ИТ и управление рисками (GRC)


GRC (Governance, Risc, Compliance) — это совокупность процессов и продуктов, участвующих в определении и достижении бизнес-целей и одновременно снижающих риски. GRC в ServiceNow реализована тремя приложениями, полностью интегрированными в основную платформу.

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



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

Второе приложение — это Policy and Compliance Management, и оно обеспечивает централизованный процесс создания и управления политиками, стандартами и процедурами внутреннего контроля. Например, модуль Complience содержит обзорную информацию о соответствиях, а также списки официальных документов и ссылок компании.



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

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

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

Управление разработкой ПО (Agile Development)


Платформа ServiceNow также включает в себя приложения для гибкой разработки. Решение ServiceNow Agile Development (SDLC) позволяет управлять методами гибкой разработки Scrum при работе над программным обеспечением и его сопровождением на протяжении всего жизненного цикла. Приложение Agile Development представляет собой последовательный процесс для среды разработки программного обеспечения.

Платформа дает возможность проводить ежедневные совещания (Daily Scrum) с членами команды с целью обсуждения текущих проектов, запланированных работ и затруднений. Здесь также имеется возможность вести бэклог продукта, представляющий собой список пользовательских историй, упорядоченных по степени важности. Product Backlog можно регулярно просматривать и дополнять по мере появления новых требований и пересмотра приоритетов.

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

Управление ИТ-инфраструктурой (IT Operations Management)


IT Operations Management (ITOM) позволяет справиться с задачей централизации управления и упорядочивания возникшего хаоса в ИТ-подразделениях компании. Основное внимание в ITOM уделяется управлению ИТ-инфраструктурой, формирующей основу для предоставления услуг. Программное обеспечение ITOM помогает автоматизировать процессы, связанные с предоставлением инфраструктуры, распределением мощностей, управлением производительностью и текущим обслуживанием всех элементов ИТ-инфраструктуры.

Основной задачей внедрения ITOM является достижение наглядности и контроля за различными элементами ИТ-инфраструктуры компании с целью легкого и гибкого управления. Это позволяет предоставлять услуги согласно SLA, использовать ИТ-инфраструктуру наиболее эффективно, гибко реагировать на внешние и внутренние потребности и лучше осуществлять обслуживание и поддержку.

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



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

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

P.S. Материалы по теме из блога IT Guild:

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330928/


Метки:  

Hard Reverse или особенности реверса файлов для архитектуры PowerPC Big-Endian

Четверг, 15 Июня 2017 г. 09:08 + в цитатник
Задания на reverse engineering — обязательная часть любых CTF, и NeoQUEST в этом плане не исключение. В каждое задание мы добавляем «изюминку», которая, с одной стороны, несколько затрудняет участникам прохождение задания, а с другой — позволяет на практике разобраться с тем, с чем еще не приходилось работать.

Если говорить об «изюминках», то задание online-этапа NeoQUEST-2017 планеты Endian «Спасение экипажа» — практически кекс! Добро пожаловать под кат, в самые дебри реверса: поговорим об архитектуре PowerPC Big-Endian и немного — о QEMU!

А мы напоминаем, что 29 июня в Петербурге состоится «Очная ставка» NeoQUEST-2017: доклады, воркшопы, конкурсы, призы, отличное времяпровождение и свободный вход при регистрации на сайте — всё для тебя! Подробнее о том, что войдет в программу «Очной ставки», читай тут и на сайте!


С чего начать? С легенды!


Итак… Пока космические корабли бороздили просторы вселенной, участники NeoQUEST очутились на планете «Endian» и «обнаружили корабль прошлой экспедиции, той самой, которая считалась пропавшей без вести!». Уже неплохо! И приятно знать, что и в космосе тоже используют IP-адреса.

Читаем внимательно легенду и получаем следующую информацию:
  1. IP-адрес бортового компьютера 213.170.100.211
  2. «Специальный» файл 1_8139.rom
  3. Некий PowerPC Big-Endian бинарник 2_quest.cod_data

Первым делом вбиваем данный IP-адрес в адресную строку браузера и погнали!



Название вкладки сразу же даёт первую подсказку. Каким-то образом здесь используется QEMU. Мысленно ставим галочку, чтобы не забыть, регистрируемся и грузим файл 1_8139.rom.



Что же происходит? Выводится скриншот, по-видимому, из виртуальной машины qemu, на скриншоте — просьба ввести пароль. Однако, как его ввести? Всё, что мы можем – подгружать странный файл, хотя… SeaBIOS и Booting from ROM… Те, кто работал с QEMU, уже, наверное, догадались, что это за файл мы загружаем. Но в целях чистоты эксперимента попробуем натравить на него команду file.



Таким образом, получается, что наш файл 8139 — это BIOS ROM Extension или PCI Expansion ROM.
Если попробовать загрузить произвольный файл, вот какой вывод у нас будет:



Похоже, что проверяются первые 3 байта. Ну, это не проблема — ставим первые три байта, как просят, иии… Ничего! То же самое. Как так? А дело в том, что если файл будет не в формате PCI Expansion ROM, то qemu его просто не запустит. А судя по заданию, там еще и подпись есть какая-то. Будем разбираться дальше.

PCI Expansion ROM


Что это за зверь такой? PCI Expansion ROM – специальный кусочек кода инициализации логического PCI устройства, обычно хранимый либо в BIOS’е, либо на чипе PCI-устройства. Одно из самых распространенных вариантов использования – реализация механизма network boot (PXE). Если хотите увидеть, как это происходит, — запускаем qemu без параметров, и после того, как попытка загрузки с CD/HDD произойдет неудачно, qemu покажет вам PXE.



Мы определились с типом файла, давайте рассмотрим его структуру.



Под x86 у PCI ROM отводится первые 2 байта на сигнатуру 0x55aa, третий байт указывает на размер модуля (размер PCI ROM = значение 3 байта * 512), с четвертого байта идет уже исполняемый код. В большинстве PCI ROM, если не во всех, это обычный jump на код инициализации.

Ах да, чуть не забыл: так как это довольно старая технология, и использовалась она еще до времен UEFI, то весь код у нас 16-бит Real Mode.

Далее байты 0x18 указывают на смещение PCIR структуры, а 0x1A – структура PnP. Эти структуры носят служебный характер и несут основную информацию о модуле PCI ROM.
Внимательный читатель заметит, что вендор и девайс id как раз соответствуют сетевой карточке reltek 8139. Именно её модуль был взят за основу.

Из этих структур наибольший интерес представляет PnP. В ней находятся интересные поля, типа checksum и bootstrap entry.

Bootstrap entry указывает на код, на который передается управление при попытке загрузиться с этого девайса. В данном случае он имеет такой вид:



И, как видим, очень похоже на наш скриншот, значит, мы на верном пути! Теперь все, что нужно – заNOPить процедуру проверки пароля и попробовать скормить модифицированный файл вебке.

Не забываем, что у нас есть поле checksum в структуре PnP. Как считается чексумма? Все просто – изначально она ставится в 0x00 и считается сумма байтов файла. Затем полученная сумма вычитается из 0x100. Вот и получаем необходимое нам значение. Почему 0x100? Потому что чексумма однобайтовая. Дело в том, что сумма всех байтов при проверке должна показать 0x0. То есть, если сумма байтов нам показала 0x10, значением чексуммы будет 0xF0.

Понятно, что при загрузке модуля он запускается в qemu. Но ничего не мешает нам попробовать также использовать команду qemu -option-rom 1_8139.rom

Если все сделано правильно( патчим ROM и правим чексумму), то этот ROM просто будет возвращать управление BIOS’у. Пробуем в вебке… Успех! Появилось что-то новенькое:



Read CRC? Еще одна чексумма? Хорошо, хоть строка намекает на то, что у нас используется именно CRC (а значит, XOR) для проверки модуля. Найдем это значение в модуле.



Почти самый конец файла. Место мы знаем, теперь осталось понять алгоритм подписи CRC. Или хотя бы найти полином, а дальше можно и перебрать варианты. По заданию нам дают некий PowerPC Big-endian. Не надо пугать нас всякими PPC, мы и так пуганые. Берем IDA Pro, HEX-редактор, и вперед!

Размер файла довольно большой, поэтому решение «в лоб» вряд ли здесь уместно. Попробуем искать по зацепкам, которые у нас есть: алгоритм CRC и сообщение «CRC error». Для начала, найдем сообщения об ошибке, здесь нам поможет утилита strings.



Отлично! Все есть, но почему 2 раза? Разберемся! Смотрим в HEX-редакторе или в IDA.



Строку мы нашли, а заодно и остальные сообщения об ошибках. А еще — посмотрите внимательно! — перед каждым сообщением об ошибке у нас 2 байта, причем очень схожие. Ну а 0xFFFF (или -1 ) расставляет все на свои места. Это ассоциативный массив сообщений об ошибках. Создадим структуру в IDA Pro и получим вот такую красоту:




Теперь, следуя логике, весь этот код использует коды об ошибках. Однако у нас 2 попадания — код ошибки 0x1604 и 0xA04. Что ж, будем смотреть оба.

0x1604


Ищем в IDA упоминания 0x1604:



Отлично, 2 попадания. Смотрим!



Этот код проверяет корректность CRC. Для удобства сразу обозначим вызов функции по адресу 0x42944 как crc_1604 и запомним, что функция возвращает значение через регистр R3. В регистре R29, скорее всего, хранится записанное значение CRC, а в регистре R0 – посчитанное значение CRC. Это становится понятно после просмотра кода функции crc_1604:



Небольшая функция, вот только она не похожа на CRC. Никакого полинома здесь нет, а используется обычный побайтовый XOR! Отсюда сразу же становится понятно, что код 0x1604 – для однобайтовой псевдо-CRC. А еще понятно, что посчитанное значение возвращается через R3 в вызывающую функцию, и, скорее всего, CRC надо сравнивать либо с записанным ранее, либо CRC должно быть нулевым. Вот два наиболее распространенных варианта проверки целостности.
Ну и отсюда следует, что нам нужен код 0xA04 – смотрим!

0xA04


Аналогично ищем в IDA упоминания 0x1604:



О, всего одна функция, нам везёт!



Итак, что же видно? Код 0xA04 устанавливается, только если регистр r3 не равен нулю. А значит, функция по адресу 0x229c8 – наш клиент!



Сразу обращаем внимание на эти участки кода! И да, здесь тоже используется обычный XOR, только уже 4хбайтовый. Если подробно разбирать функцию, можно найти некоторые условия, которые накладываются на проверяемый файл. Но нам это не нужно, так как формат файла у нас есть, и нам нужен только механизм подписи. Мы это нашли! Обычный XOR по 4 байта.
Особенно неверующим можно показать примерную декомпиляцию данного участка (спасибо retdec.com).



Осталось только написать подсчет CRC и идти за ключом! Пишем заветные строки кода а-ля while(size--) {crc ^= *input++;} и заменяем значение в конце файла PCI ROM. Не забываем поменять чексумму, иии… Мы чемпионы!



На «Очной ставке» тоже будет интересно!


Делая это задание, мы слегка ударились в ностальгию и вспомнили времена, когда макбуки были на PowerPC, ведь не одним Intel'ом прекрасен и разнообразен мир!

Участников финального соревнования hackquest 29 июня в Петербурге ждет множество разнообразных заданий, в которых, помимо реверса, потребуются также знания стеганографии, криптографии, умение проводить OSINT, работать с «рогатыми зелёными монстрами» (это мы, конечно же, про Android) и многое-многое другое!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330004/


[Перевод] Наслаждайтесь миллиардами цветов с 10-битным HEVC

Четверг, 15 Июня 2017 г. 08:34 + в цитатник
Человеческий глаз способен видеть намного больше цветов, чем показывают ему современные видео дисплеи. Можно сказать, что возможности глаза безграничны, в то время как компьютеры могут воспроизвести лишь конечное количество цветов. В этой статье мы расскажем об использовании 10-битной глубины увета в сравнении с 8-битной, исходя из функционала процессоров Intel Core седьмого поколения и оптимизирующих возможностей Intel Software Tools. В статье вы также найдете ссылку на пример программы, реализующей 10-битное HEVC кодирование.



Глубина цвета


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

Количество битов в изображении включает в себя набор битов на канал для каждого типа цвета в пикселе. Количество цветовых каналов в пикселе зависит от используемого цветового пространства. Например, цветовые каналы в цветовом пространстве RGBA — красный ( R), зеленый (G), синий (B) и альфа (A). Каждый дополнительный бит удваивает количество информации, которое мы можем хранить для каждого цвета. В 8-битном изображении общее количество доступных цветов пикселя равняется 256. В Таблице 1 показано возможное количество доступных цветов для каждой соответствующей глубины цвета.
Глубина канала Оттенков на канал на пиксель Общее количество возможных оттенков
8-бит 256 16.78 миллионов
10-бит 1024 1.07 миллиарда
12-бит 4096 68.68 миллиардов
Большинство мониторов и телевизоров способны отображать лишь 8-битный контент, 10-битные изображения в них преобразуются в 8-битные. Однако преимущества 10-битной глубины имеют место уже сейчас:
  • при обработке изображений или видео после съемки
  • при использовании High Dynamic Range (HDR) мониторов или камер.

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

Эффект цветовых полос


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

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

Неоткалиброванный дисплей может также вызвать эффект полос. Чтобы этого избежать, воспользуйтесь утилитой Intel Graphics Control Panel.


Рисунок 1. Сравнение 8-битного (слева) и 10-битного (справа) изображения. Слева виден эффект полос.

Рисунок 1 показывает разницу между 8-битным и 10-битным изображениями применительно к эффекту цветовых полос. На левом изображении необходимая цветовая детализация не была передана сенсором, что привело у меньшему, чем надо, количеству цветов и цветовым полосам. На правом фото цветовой информации достаточно и переход между цветами получился плавным. Для обеспечения плавности цветовых переходов необходим более широкий цветовой диапазон, описанный в стандарте BT2020.

Стандарт BT. 2020


Седьмое поколение процессоров Intel Xeon и Core поддерживает стандарт BT. 2020 (известный также как Rec. 2020) в таких случаях как создание/воспроизведение 4K Ultra-high definition (UHD) контента, использование HDR с поддержкой 10 битов и т.д. UHD-мониторы имеют разрешение 3840*2160 при различной диагонали. Поддержка стандарта BT.2020 улучшает качество картинки при столь высоком разрешении.


Рисунок 2. Сравнение цветовых пространств BT.2020 и BT.709

Рекомендации The International Telecommunications Union (ITU) BT.2020 представляют значительно больший диапазон цветов, чем ранее используемые BT.709. Сравнение соответствующих цветовых пространств показано на Рисунке 2, представляющим диаграмму цветности CIE 1931. Оси X и Y показывают относительные координаты цветности с длинами волн соответствующих цветовых пространств (синий шрифт). Желтый треугольник покрывает цветовое пространство по стандарту BT. 709. Черный треугольник показывает цветовое пространство BT. 2020, значительно большее по размеру и, следовательно, содержащее большее количество цветов для плавных переходов. BT. 2020 также определяет различные аспекты UHD TV такие как разрешение дисплея, частоту кадров, цветовую субдискретизацию и глубину цвета в добавление к цветовому пространству.

Процессоры Intel 7 поколения поддерживают профили HEVC Main 10 profile, VP9 Profile 2 и High Dynamic Range (HDR) видео рендеринг с использованием стандарта BT.2020.

Профиль HEVC Main 10


High Efficiency Video Coding (HEVC), также известный как H.265 — стандарт видео сжатия, наследник хорошо известного стандарта H.264/AVC. По сравнению с предшественниками, HEVC использует более сложные алгоритмы сжатия. Больше информации о стандарте можно узнать здесь. Профиль Main 10 позволяет использовать 8-битный или 10-битный цвет с цветовой субдискретизацией 4:2:0.

Поддержка декодирования HEVC 10b появилась начиная с 6 поколения процессоров Intel. Команда ниже показывает, как тестовая утилита sample_decode из набора примеров кода Intel Media SDK может быть использована для получения сырых кадров из простейшего HEVC потока.

sample_decode.exe h265 -p010 -i input.h265 -o raw_farmes.yuv -hw

Используемый выше входной поток (input.h265) может быть взят здесь. Выходной поток (raw_frames.yuv) должен быть в формате P010, используемом как исходный материал для утилиты sample_encode.

Аппаратная поддержка кодирования/декодирования HEVC 10b внедрена начиная с 7 поколения процессоров Intel. Кодирование 10-битного HEVC реализовано с помощью дополнительного кода modified_sample_encode, специально измененного для этой конкретной функциональности. Данный пример работает с Intel Media SDK 2016 R2. Инструкция по сборке приведена в руководстве по примерам медиа в образцах кода Intel Media SDK.

Ниже показан пример 10-битного кодирования с использованием sample_encode из добавленной modified_sample_encode.

sample_encode.exe h265 -i raw_frames.yuv -o output.265 -w 3840 -h 2160 -p010 -hw


Рисунок 3. Скриншот утилиты Video Quality Caliper, показывающий, показывающий, что кодированный поток имеет 10 бит на пиксель.

Профиль VP9 2


VP9 — формат видео кодирования, разработанный Google как наследник VP8. Платформы Intel седьмого поколения поддерживают аппаратное ускорение декодирования VP9 10-бит, тогда как кодирование пока комбинированное, софтово-хардварное.

Высокий динамический диапазон (High Dynamic Range, HDR)


Динамический диапазон — это отношение значения самой светлой к самой темной точке на изображении. Видео высокого динамического диапазона (HDR) позволяет получить лучший динамический диапазон, чем обычное (SDR) видео, использующее нелинейные операции для кодирования и декодирования уровня освещенности.

Видео контент HDR поддерживается при использовании кодека HEVC Main 10 или VP9.2, аппаратно ускоренных начиная с 7 поколения процессоров Intel. Для передачи контента HDR, система должна быть оснащена портом DisplayPort 1.4 или HDMI 2.0a. Данная функциональность пока находится на стадии тестирования и не включена в общедоступные релизы.

Заключение


Как мы выяснили, разработчики сейчас имеют возможность создавать красивое, реалистичное видео в самых современных форматах, расцвеченных ярками красками 10-битного цвета, идеальным для HD/UHD дисплеев. Используя процессоры Intel седьмого поколения для создания контента стандарта BT.2020, а также возможности оптимизации Intel Media SDK, мы уже сейчас можем заглянуть за пределы разрешения 4K UHD и стандартной на сегодня кадровой скорости. В дальнейшем область применения современных аппаратно-ускоренных видео кодеков будет расширяться.

В этой статье упоминались следующие программные средства (со ссылками для скачивания):

  • Программное обеспечениеIntel Media SDK 2016 R2
  • Входной видео поток — MHD_2013_2160p_ShowReel_R_9000f_24fps_RMN_QP23_10b.hevc из Бесплатные потоки H.265/HEVC
  • Кодек — H.265/HEVC
  • Средство анализа — Video Quality Caliper (VQC), компонент Intel Media Server Studio Professional Edition и Intel Video Pro Analyzer
  • Тестовый стенд:
    • ЦПУ: Intel Core i7-7500U CPU @ 2.70GHz
    • ОС: Microsoft Windows 10 Professional 64-bit
    • Графика: Intel HD Graphics 620

Полезные ссылки


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330568/


Метки:  

Чего не хватает Gmail. 4 бесплатные возможности Deskun

Четверг, 15 Июня 2017 г. 08:22 + в цитатник
Почтовый сервис Gmail в прошлом году достиг отметки в 1 миллиард пользователей и с тех пор только увеличивает аудиторию. Популярность сервиса настолько велика, что даже Microsoft вынуждены в почтовом клиенте для Windows 10 открывать пользователям Google возможности, которые раньше были доступны только в Outlook.com. Это вполне объяснимо, так как Gmail полностью бесплатен, имеет лучшую в мире защиту от спама и дополнительные возможности для автоматизации и удобства переписки. Однако, обычным пользователям недоступны несколько очень важных функций, без которых сложно представить комфортную работу. Особенно это касается тех, кто привык работать с клиентами через веб-интерфейс Gmail. Например, уведомление о прочтении письма доступно только в корпоративном аккаунте. А ведь в современном мире люди настолько привыкли к мессенджерам, что отправлять письма «в пустоту» непривычно и неправильно. Обратная связь должна быть обязательно.





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

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

Именно для таких пользователей мы рассмотрим четыре самые важные функции, которые недоступны в базовом функционале Gmail — таймер для отложенной отправки писем, возможность отложенного прочтения с напоминанием, отчеты о прочтении и шаблоны для быстрых ответов. Все они есть в сервисе-расширении Deskun, которое работает в браузерах Chrome и Yandex.

Установите расширение. Gmail при этом откроется автоматически. Подтвердите доступ и начинайте работать.

Отслеживание прочтения (Mail tracking)


Самая важная функция, которой недостает пользователям Gmail, — отслеживание прочтения (mail tracking). В любом современном мессенджере вы всегда видите, прочитал ли ваш собеседник сообщение, и ожидаете ответа. В Gmail вы отправляете письма и ждете, когда же на него отреагируют. Для работы такое положение вещей неприемлемо. Можно установить почтовую программу, но это лишние движения. Сейчас человек привык работать в одном браузере и выходить из него в крайних случаях. Можно купить корпоративный аккаунт, но это потраченные деньги и время. В Deskun эта возможность реализована совершенно бесплатно.

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

Для удобства в папке «Отправленные» автоматически создаются отдельные страницы со списками отслеживаемых писем — страница для прочитанных и для еще не прочитанных.





Отложенная отправка (Send later)


Эта функция очень полезна менеджерам по работе с клиентами. Часто возникает ситуация, когда человек не успевает обработать поток входящей корреспонденции в рабочее время. Ему приходится работать вечерами и ночами, готовить документы и отправлять письма. Но вот отправлять их в нерабочее время — моветон. В результате приходится сохранять черновики и с утра тратить время на отправку. Еще есть такие варианты развития событий, когда письмо должно быть отправлено в строго обозначенное время. Например, это может быть важный пресс-релиз. Менеджеру приходиться сидеть и ждать обозначенного времени, чтобы сделать эту рассылку.

В Deskun есть отложенная отправка. Вы подготавливаете письмо и выставляете для него время отправления: хоть через 5 минут, хоть на следующей неделе. Этой функцией можно воспользоваться при создании нового письма. На панели внизу нажмите на зеленый значок отложенной отправки, выберите время и дату, а затем нажмите «Отправить». Письмо попадет в папку «Черновики», где его можно отредактировать, изменить время отправления или же удалить.




Засыпание (Snooze)


Функция «Засыпания» (Snooze) будет полезна тем, кто работает с большим входящим потоком почты. Вы выбираете любое письмо и прикрепляете к нему таймер. Через указанное время оно появится в исходной папке как непрочитанное. Таким образом можно использовать Gmail, чтобы управлять задачами. Например, если необходимо вернуться к важному письму клиента и вы боитесь забыть об этом, то необязательно создавать в сторонней программе заметку об этом и выставлять напоминания. Просто «усыпите» это письмо.

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

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





Шаблоны сообщений (Message templates)


Если «Засыпание» полезно использовать, когда у вас много входящих писем, то шаблоны помогут тем, кто много пишет и отвечает. Создавайте готовые шаблоны текста и быстро вызывайте, когда пишете письма. Нажмите на кнопку «Выбрать шаблон» на панели внизу и выберите нужный из заранее подготовленного списка. Текст подгрузится в письмо. Создать новый шаблон можно в личном кабинете Deskun в разделе «Шаблоны сообщений».






4 в 1


Мы рассказали о четырех бесплатных функциях Deskun, которые способны значительно ускорить работу с электронной почтой Gmail. Эти возможности реализованы и в других расширениях, но вам придется устанавливать их по отдельности и платить за них. В таком случае всегда есть риск значительно замедлить работу браузера и компьютера. К тому же, расширение Deskun не ограничивается этими бесплатными функциями. Это полноценная система поддержки пользователей и система управления задачами внутри Gmail с необходимым для этого функционалом: тикетами, назначением агентов поддержки, ранжированием заявок по приоритету, установкой дедлайнов, автоматическим ответом на заявки и т.д. Таким образом, используя платные возможности Deskun, любая команда может продуктивно работать с электронной почтой и организовывать работу внутри компании.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330852/


Метки:  

Java: автоматически формируем SQL-запросы

Четверг, 15 Июня 2017 г. 04:25 + в цитатник
В этой статье я опишу создание фреймворка для автоматической генерации SQL-запросов на основе классов и объектов Java. Я понимаю, что уже существует множество готовых подобных решений, но мне захотелось реализовать это самому.

Для создания фреймворка будем использовать Java-аннотации и Java Reflection API.

Итак, начнем.


Начнем, пожалуй, с примеров использования


Пример №1


Допустим, у нас есть некий класс Person:
public static class Person {
    public String firstName;
    public String lastName;
    public int age;
}

Следующий вызов выдаст SQL-запрос для создания таблицы на основе этого класса:
System.out.println(MySQLQueryGenerator.generateCreateTableQuery(Person.class));

Запустив, получим в консоли следующий вывод:
CREATE TABLE  `Person_table` (
`firstName` VARCHAR(256),
`lastName` VARCHAR(256),
`age` INT);

Пример №2


Теперь пример посложнее, с использованием аннотаций:
@IfNotExists // Добавлять в CREATE-запрос IF NOT EXISTS
@TableName("persons") // Произвольное имя таблицы
public static class Person {
    @AutoIncrement // Добавить модификатор AUTO_INCREMENT
    @PrimaryKey // Создать на основе этого поля PRIMARY KEY
    public int id;
    @NotNull // Добавить модификатор NOT NULL
    public long createTime;
    @NotNull
    public String firstName;
    @NotNull
    public String lastName;
    @Default("21") // Значение по умолчанию
    public Integer age;
    @Default("")
    @MaxLength(1024) // Длина VARCHAR
    public String address;
    @ColumnName("letter") // Произвольное имя поля
    public Character someLetter;
}

На основе данного класса получим следующий SQL-запрос:
CREATE TABLE IF NOT EXISTS `persons` (
`id` INT AUTO_INCREMENT,
`createTime` BIGINT NOT NULL,
`firstName` VARCHAR(256) NOT NULL,
`lastName` VARCHAR(256) NOT NULL,
`age` INT DEFAULT '21',
`address` VARCHAR(1024) DEFAULT '',
`letter` VARCHAR(1),
PRIMARY KEY (`id`));

Пример №3


Так же я создал класс MySQLClient, который умеет подключаться к серверу базы данных и отправлять туда сгенерированные SQL-запросы.
Клиент содержит следующие методы: createTable, alterTable, insert, update, select.
Используется он примерно так:
MySQLClient client = new MySQLClient("login", "password", "dbName");
client.connect(); // Подключаемся к БД

client.createTable(PersonV1.class); // Создаем таблицу
client.alterTable(PersonV1.class, PersonV2.class); // Изменяем таблицу

PersonV2 person = new PersonV2();
person.createTime = new Date().getTime();
person.firstName = "Ivan";
person.lastName = "Ivanov";
client.insert(person); // Добавляем запись в таблицу

person.age = 28;
person.createTime = new Date().getTime();
person.address = "Zimbabve";
client.insert(person);

person.createTime = new Date().getTime();
person.firstName = "John";
person.lastName = "Johnson";
person.someLetter = 'i';
client.insert(person);

List selected = client.select(PersonV2.class); // Извлекаем из таблицы все данные
System.out.println("Rows: " + selected.size());
for (Object obj: selected) {
    System.out.println(obj);
}

client.disconnect(); // Отключаемся от БД


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


Сперва алгоритм с помощью Reflection API перебирает все public и не-static поля класса. Если поле при этом имеет поддерживаемый алгоритмом тип (поддерживаются все примитивные типы данных, их объектные аналоги, а так же тип String), то из объекта Field создается объект Column, содержащий данные о поле таблицы базы данных. Конвертация между типами данных Java и типами MySQL происходит автоматически. Так же из аннотаций поля и класса извлекаются все модификаторы таблицы и ее полей. Затем уже из всех Column формируется SQL-запрос:
public static String generateCreateTableQuery(Class clazz) throws MoreThanOnePrimaryKeyException {
        List columnList = new ArrayList<>();
        Field[] fields = clazz.getFields(); // получаем массив полей класса

        for (Field field: fields) {
            int modifiers = field.getModifiers();
            if (Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers)) { // если public и не static
                Column column = Column.fromField(field); // преобразуем Field в Column
                if (column!=null) columnList.add(column);
            }
        }

        /* из полученных Column генерируем запрос */
}

/***************************/

public static Column fromField(Field field) {
    Class fieldType = field.getType(); // получаем тип поля класса
    ColumnType columnType;
    if (fieldType == boolean.class || fieldType == Boolean.class) {
        columnType = ColumnType.BOOL;
    } /* перебор остальных типов данных */ {
    } else if (fieldType==String.class) {
        columnType = ColumnType.VARCHAR;
    } else { // Если тип данных не поддерживается фреймворком
        return null;
    }

    Column column = new Column();
    column.columnType = columnType;
    column.name = field.getName();
    column.isAutoIncrement = field.isAnnotationPresent(AutoIncrement.class);
    /* перебор остальных аннотаций */
    if (field.isAnnotationPresent(ColumnName.class)) { // если установлено произвольное имя таблицы
        ColumnName columnName = (ColumnName)field.getAnnotation(ColumnName.class);
        String name = columnName.value();
        if (!name.trim().isEmpty()) column.name = name;
    }

    return column;
}

Аналогичным образом формируются запросы ALTER TABLE, INSERT и UPDATE. В случае двух последних помимо списка Column из объекта так же извлекаются значения его полей:
Column column = Column.fromField(field);
if (column!=null) {
    if (column.isAutoIncrement) continue;
    Object value = field.get(obj);
    if (value==null && column.hasDefaultValue) continue; // есть один нюанс: для корректной работы значений по умолчанию предпочтительно использовать объектные типы вместо примитивных
    if (column.isNotNull && value==null) {
        throw new NotNullColumnHasNullValueException();
    }
    String valueString = value!=null ? "'" + value.toString().replace("'","\'") + "'" : "NULL";
    String setValueString = "`"+column.name+"`="+valueString;
    valueStringList.add(setValueString);
}

Так же в фреймворке есть класс ResultSetExtractor, метод которого extractResultSet(ResultSet resultSet, Class clazz) автоматически создает из resultSet список объектов класса clazz. Делается это довольно просто, так что расписывать принцип его действия я здесь не буду.

На github можно посмотреть полный исходный код фреймворка. На этом у меня все.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330938/


Метки:  

И грянет страшный русский firewall

Четверг, 15 Июня 2017 г. 01:13 + в цитатник

После статьи ValdikSS о блокировке сайтов по тухлым доменам РКН мне не давала покоя мысль о том, что произойдёт, если реестр начнёт резольвится в очень большое число IPv4-адресов. Проводить полноценные "учения" мне кажется сомнительным делом, т.к. они могут случайно обернуться умышленным нарушением связности рунета. Поэтому я ограничился поиском ответов на два вопроса:


  • добавляют ли провайдеры автоматически IPv4-адреса из DNS в таблицы маршрутизации?
  • корректно ли обрабатывают подобные пополняющие RIB системы большие DNS-ответы, содержащие тысячи записей?

Я нагрепал и зарегистрировал несколько свободных доменов из списка, поднял DNS сервер и поставил писаться трафик в pcap...


Домены для регистрации были выбраны следующим образом: два домена присутствующие в выгрузке с https-ссылками, два домена с http ссылками и два "голых" домена без ссылок. Сделано это для проверки гипотезы о равенстве всех доменов перед фильтром. IPv4 адреса, на которые указывают эти домены, были выбраны из существующих в реестре, чтоб не повышать нагрузку на фильтры. Адреса отсутствующие в реестре выделены в настоящий момент моим виртуальным машинам, поэтому DoS-атаки в данном эксперименте не содержится.


Можно пойти по открытым спискам Looking Glass разных провайдеров и посмотреть, какие из крупных около-российских провайдеров имеют на своих маршрутизаторах маршруты с маской /32 на адреса из реестра, т.к. эти провайдеры имеют риск пострадать от атаки на переполнение таблицы маршрутизации. Таких провайдеров находится не так уж мало: Эквант aka GIN aka Orange Business Services, Beeline, Ростелеком, Транстелеком, Obit и, что немного забавно, Федеральная университетская компьютерная сеть России (шутка про академическую свободу и независимость университетов).


Проверим, что IP-адрес, который мы планируем внести "под блок" не присутствуют в таблицах маршрутизации на этих же LG: 1, 2, 3, 4, 5, 6. Если кто-то будет воспроизводить этот эксперимент предельно чисто, то стоит также проверить все IPv4 и IP адреса, которые планируется добавить в таблицу. Я предполагаю, что с ними ситуация аналогичная.


14 июня в 15:00 по Москве я добавил адреса некоторых из своих серверов в файлы DNS-зон и стал наблюдать, что происходит в pcap-файлах, пока резольверы обновляли записи.


Разнообразие


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


Из сети с abuse-контактом на netup.ru резольвятся только те домены, которые в списке указаны с URLом, при этом домен с 2048 записями получает запросов примерно в 5 раз больше. AS ФГУП Электросвязь с тем же контактом исправно ходит в DNS для всех "маленьких" доменов раз в 8 минут, но почему-то не присылает ни одного запроса на "большие" домены, ровно как и ижевский РадиоЛинк. Tele2 резольвит https и "безурловый" dns, но не резольвит http, предположительно весь http там завёрнут на proxy. Железногорский Сигнал и екатеринбургский Miralogic наоборот — резольвят только http. SPNet из Сергиевого Посада — URLы не резольвит вообще, только "голые" домены. Московский citytelecom — наоборот, только https и, как ФГУП Электросвязь, даже не пытается порезольвить "большие" домены, что позволяет предположить наличие альтернативного способа распространения чёрных списков с пред-резолвленными адресами.


      |         HTTPS          |         HTTP           |      Domain-only
 asn  | tiny | 2k/udp | 2k/tcp | tiny | 2k/udp | 2k/tcp | tiny | 2k/udp | 2k/tcp
------+------+--------+--------+------+--------+--------+------+--------+-------
50317 |  903 |   1416 |   1030 |  285 |   1295 |   1012 |    0 |      0 |      0
57835 |  207 |      0 |      0 |  200 |      0 |      0 |  200 |      0 |      0
38959 |   29 |      0 |      0 |   56 |      0 |      0 |   39 |      0 |      0
39475 |  155 |    217 |    217 |    0 |      0 |      0 |  151 |    209 |    209
42514 |    0 |      0 |      0 |  120 |    136 |     13 |    0 |      0 |      0
12668 |    0 |      0 |      0 |   95 |    103 |     18 |    0 |      0 |      0
43826 |    0 |      0 |      0 |    0 |      0 |      0 |   13 |     33 |     12
56705 |  415 |      0 |      0 |    0 |      0 |      0 |    0 |      0 |      0

Полное содержание статистики числа запросов за первые 16 часов можно увидеть в gist, обращаю внимание, что не все ASN принадлежат российским провайдерам.


EDNS & TFO


В pcap-ах практически не обнаружено запросов с опцией EDNS Client Subnet, таких запросов меньше 1%. Это не очень удивительно, т.к. google (практически единственный "поставщик" подобных запросов) раскрывает адреса клиентов только тем DNS-серверам, которые явно анонсируют поддержку данной опции, а мой DNS-сервер этого не делал. Указанный небольшой процент запросов — это, полагаю, и есть те попытки автоматического определения поддержки EDNS Client Subnet: каждый четвёртый запрос из AS гугла приходил с этой опцией.


Помимо гугла с Client Subnet пришло 4 запроса из Бразилии с резольвера, использующего "хак" с bit 0x20:


            ts             |      src      |        query         |    client4
---------------------------+---------------+----------------------+--------------
2017-06-14 04:47:41.231796 | 187.1.128.119 | udp A zenitbET66.CoM | 200.248.248.0
2017-06-14 04:47:41.748585 | 187.1.128.119 | tcp A ZenItbET66.cOm | 200.248.248.0
2017-06-14 04:47:42.274296 | 187.1.128.119 | udp A zEnItbET66.coM | 200.248.248.0
2017-06-14 04:47:42.798544 | 187.1.128.119 | tcp A zeNitBET66.com | 200.248.248.0

Хак с битом 0x20 относительно популярен – с ним приходит порядка 5% запросов от 2.5% резольверов (если считать уникальные резольверы по ASN).


Другой интересной опцией EDNS является EDNS UDP payload size, анонсирующая максимальный размер DNS-пакета, который клиент готов принять. Помимо четверти запросов, которые не анонсируют поддержку EDNS и 55% запросов установивших эту опцию в 4096 байта, есть несколько других интересных значений.


2% запросов говорят, что UDP-пакеты увеличенного размера им ни к чему и используют минимальное допустимое значение 512. Примером такого резольвера может служить irc.kristel.ru из Минусинска, который изменяет эту опцию после первого "большого" ответа, который пришлось получать по TCP. Аналогичное поведение наблюдается и на некоторых других резольверах, включая сброс размера обратно в 512 байт через некоторое время.


            ts             | proto | qtype |       qname        | udpsz
---------------------------+-------+-------+--------------------+------
2017-06-14 12:41:59.678401 | udp   | A     | zenitbet66.com     |   512
2017-06-14 12:41:59.898596 | tcp   | A     | zenitbet66.com     |   512
2017-06-14 12:42:32.14485  | udp   | A     | m.zenitbet66.com   |  4096
2017-06-14 12:44:40.532815 | udp   | A     | www.kisa54.com     |  4096
2017-06-14 12:56:54.083849 | udp   | A     | diplom-lipetsk.com |  4096
2017-06-14 12:56:54.311013 | tcp   | A     | diplom-lipetsk.com |  4096
2017-06-14 13:06:38.524876 | udp   | A     | www.cool-sino.com  |  4096

Также в логи попали пара сканеров, которые могли искать DNS amplification, т.к. выставили клиентский размер в 65527 байта, что является максимальным значением. Интересно, что "большие" ответы powerdns отправляет без каких-либо ответных resource records, ставя флаг truncated в заголовке, что вынуждает резольвер перейти на TCP. Так powerdns избегает DNS amplification при работе с большими ответами по UDP.


Я был немного удивлён, что ни одного DNS-запроса по TCP не пришло с использованием TCP Fast Open. Конечно, отсутствие этой фичи можно объяснить тем, что если беспокоиться о скорости, то прежде всего не следует отдавать большие DNS ответы, вынуждающие резольвер переходить на TCP.


DNS и маршрутизация


За 10 часов на вышеперечисленных looking glass не появилось /32 маршрута ни на один из "добавленных" в DNS IPv4 адресов. Но, если провести измерения с помощью RIPE Atlas, то можно найти некоторое количество транзитных провайдеров, которые, вероятно, выполняют резольвинг и заносят маршруты на фильтр, получив 2049 A записей в ответ:


  • ДатаЛайн – в traceroute начинает светиться filter01.dtln.ru,
  • Ростелеком – в traceroute по выходу из AS8997 добавляются ростелекомовские хопы 188.254.78.25 и 95.167.93.150 на маршрутах к "заРКНеным" IP, которых не наблюдается на десятках других трейсов к соседним хостам из той же /24 сети, т.е. вряд ли это артефакт балансировки,
  • ReTN – аналогичная история с удлинением маршрута на три хопа к "выделенным" хостам, о фильтре на транзите в сети ReTN на хабре уже писал @amarao.

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


  • как влияет на спецэффекты порядок DNS resource records в ответе? Задать его можно, например, с помощью sortlist или непосредственно ручной геренации ответа в LUA коде
  • как быстро добавляется в маршруты IPv4-адрес, попавший "под резолв"?
  • выполняется ли резольвинг IPv6 адресов?
  • какие ещё интересные выводы можно сделать из подобных данных?

Если кто-то хочет посмотреть на данные самостоятельно, то в RIPE Atlas это измерения 8844224, 8844225, 8844226, 8844227, 8844228, 8844229, 8844230, 8844231, 8844232, 8844233, 8844234, 8844235. Запросы за первые 16 часов эксперимента доступны в виде дампа postgres:9.6. Гигабайты pcap-ов могу отгрузить по отдельному запросу.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330934/



Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1007 1006 [1005] 1004 1003 ..
.. 1 Календарь