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

Поиск сообщений в 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 ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

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

[Из песочницы] [CppCon 2017] Herb Sutter: Метапрограммирование и кодогенерация в C++

Понедельник, 02 Октября 2017 г. 22:46 + в цитатник



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

Читать дальше ->

https://habrahabr.ru/post/339186/


Парсим на Java

Понедельник, 02 Октября 2017 г. 21:58 + в цитатник


Решил я как-то перенести своего Телеграм-бота с Python на Java, дабы подтянуть свой скилл. Все перенес, осталось только самое сложное — HTML-парсинг. На Хабре постов про парсинг на Java не нашел, так почему бы не написать свой?

Читать дальше ->

https://habrahabr.ru/post/339182/


Метки:  

[CppCon 2017] Ларс Кнолл: C++ фреймворк Qt: История, Настоящее и Будущее

Понедельник, 02 Октября 2017 г. 21:38 + в цитатник

Содержание цикла обзора выступлений CppCon 2017:



Обзор выступления Ларса Кнолла (Lars Knoll), являющегося техническим директором Qt Company. Не ждите от этого выступления слишком многого. В квадратных скобках курсивом мои примечания.




Читать дальше ->

https://habrahabr.ru/post/339180/


Метки:  

[Перевод] Вышел GitLab 10.0: Авто-DevOps и групповые доски задач

Понедельник, 02 Октября 2017 г. 19:26 + в цитатник

Вышел GitLab 10.0 с Авто-DevOps, групповыми досками задач, новой навигацией и множеством других фич.


КПДВ


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


Читать дальше ->

https://habrahabr.ru/post/339174/


Дайджест событий для HR-специалистов в IT-области на октябрь 2017

Понедельник, 02 Октября 2017 г. 19:24 + в цитатник
image

Октябрь — середина осени, хочется надеть пушистый свитер, налить большую чашку горячего чая и… сесть в уютное кресло, чтобы слушать полезные вебинары, которых в октябре будет очень много. Кроме того, нас ожидает первая в России конференция по поиску ИТ-специалистов INDEX-TECH. И, конечно, митапы — возможность встретиться с коллегами и обсудить актуальные проблемы поиска и удержания ИТ-специалистов.
Читать дальше ->

https://habrahabr.ru/post/338958/


Метки:  

Текстовая трансляция со дня открытых дверей Лаборатории Касперского – Open Day 2017

Понедельник, 02 Октября 2017 г. 18:37 + в цитатник
Kaspersky_Lab сегодня в 18:37 Разработка

Текстовая трансляция со дня открытых дверей Лаборатории Касперского – Open Day 2017

    Всем привет! Сегодня мы ведем текстовую трансляцию со дня открытых дверей Лаборатории Касперского – Open Day 2017.

    Видео-стрим:





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

    image

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

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

    https://habrahabr.ru/post/339162/


    Метки:  

    Как я проходил сертификацию в Xamarin University

    Понедельник, 02 Октября 2017 г. 18:13 + в цитатник
    Schvepsss сегодня в 18:13 Разработка

    Как я проходил сертификацию в Xamarin University

      Привет, Хабр! Мы периодически рассказываем о разработке на Xamarin, и даже создали колонку #xamarincolumn для интересующихся. Сегодня настало время историй (точнее, одной истории). Под катом вы узнаете про обучение в Xamarin University и прохождение сертификационного экзамена из первых рук.



      Передаю слово Саше Алексееву (он же небезызвестный в Xamarin-сообществе Jasper7).

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

      Начнем, пожалуй, с того, что у меня есть опыт программирования C# 5 лет и Xamarin 2+ года, поэтому мне удалось пройти все довольно быстро.

      Xamarin University


      Зарегистрировался я на портале Xamarin University c того момента как появился триал-доступ. В триал входит посещение нескольких начальных лекции (2 или 3) для получения представления о том, как проходят онлайн-занятия в Xamarin University.

      Занятия бывают 2 типов:
      • самообучение;
      • онлайн-классы.

      Самообучение


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

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



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

      Самое важное если завершить все доступные лекции для самообучения, то это 50% пути до получения сертификата.

      Онлайн-занятия


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

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

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

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

      И так, вернемся к практике на онлайн-занятии. Она бывает двух видов.

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

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

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

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

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

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

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

      Не забываем про сертификационный трек


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

      По мимо сертификационного трека есть и много других интересных лекции по C#, F#, Azure, Enterprise, UWP и тестированию. Некоторые лекции идут очень редко 1-2 раза в месяц поэтому лучше занять место на них заранее.

      Время занятий


      Так как Xamarin это американская компания и базируются они в США, то некоторые онлайн-лекции проходят не в совсем удобное время, например, полночь, 3 часа ночи и даже 4. Есть и дневные лекции и их достаточно, но когда нужный тебе урок в 4 часа ночи, а в следующий раз его будут проводить только через 2 недели, то приходится вставать, чтобы не провести в ожидании единственного урока.



      Кстати в Xamarin University есть возможность запросить лекцию в особое время, но мне не пришлось ею пользоваться.

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

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

      Офисный час


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

      Переходим к практике: как я проходил лекции и сертификацию


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

      Лайфхак, чтобы ускорить процесс обучения смотрел видеозаписи на ускорении, хватало скорости 1.25х и 1.5х.

      Пройдя все самообучение, только после этого оформил подписку, на июль 2017 она стоила 83$ в месяц. Зашел в календарь занятий и распланировал по 2-3 лекции в день.
      Скажу сразу, одна онлайн лекция занимает от 1.5 до 3 часов, поэтому в день у меня уходило прилично времени на обучение + после каждой лекции дорабатывал задания, которые не успел сделать или приложения не работали корректно. Как уже писал выше, некоторые лекции проходил поздней ночью или ранним утром.

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

      Сертификационный экзамен


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

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

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

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

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

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

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

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

      После такого провала конечно проставил лекции по темам в которых были сложности.

      Попытка №2


      И так спустя 2 недели, я снова вернулся к тесту, странно, но снова последи ночи, вот как приспичило мне в полночь проходить тестирование)

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

      И вот жму заветную кнопку завершения теста и получаю результат 87%. Сам от себя не ожидал, что подниму свой результат на 10%!

      На почту сразу прилетает письмо с поздравлениями.

      Помимо поздравлений письмо содержит:
      • ссылку на форму для отправки мне подарка;
      • предложение зарегистрироваться в DevConnect – сеть разработчиков Xamarin;
      • ссылку на официальную LinkedIn группу сертифицированных разработчиков;
      • ссылку на сертификат в формате PDF;
      • ссылку на проверку статуса Xamarin Certified Developer.

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



      Итог


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

      Если у тебя плохой английский или хочешь сэкономить – начни с прохождения самообучения и начальных классов (доступны в триал подписке)

      Какую же пользу мне принесла сертификация?
      1. Получил 3 предложения о работе в течении недели с HeadHunter.
      2. Одну заявку на Upwork.
      3. 1 письмо с DevConnect о консультации.
      4. 2 предложения о менторстве.

      И буквально 3 дня назад получил свои подарки от Xamarin, обезьянку и значок.



      Если остались вопросы, пиши в комментариях или же мне в Telegram. Желаю успешного прохождения сертификации. :)

      P.S. Кстати после недавнего обновления добавился статус Xamarin Certified Mobile Professional – получить его можно после прохождения всех материалов для самообучения и сдачи экзамена. Мне статус был назначен автоматически в личном кабинете:


      Об авторе


      Александр Алексеев — Xamarin-разработчик, фрилансер. Работает с .NET-платформой с 2012 года. Участвовал в разработке системы автоматизации закупок в компании Digamma. C 2015 года ушел во фриланс и перешел на мобильную разработку с использованием Xamarin. В текущее время работает в компании StecPoint над iOS приложением.

      Ведет ресурс XamDev.ru и сообщества «Xamarin Developers» в социальных сетях: VK, Facebook, Telegram.
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/339164/


      Метки:  

      Донаты стримерам и настоящие деньги для ненастоящей жизни: подведены итоги QIWI API Contest

      Понедельник, 02 Октября 2017 г. 18:01 + в цитатник
      d_garmashev сегодня в 18:01 Разработка

      Донаты стримерам и настоящие деньги для ненастоящей жизни: подведены итоги QIWI API Contest

        Современное правило ценности гласит: «Ценность любой платформы для пользователей определяется количеством приложений, под неё написанных». Поэтому, выложив в августе этого года API QIWI Кошелька с новой аутентификацией, мы не стали откладывать вовлечение аудитории в творческий процесс создания приложений в долгий ящик, и провели в сентябре конкурс идей QIWI API Contest, в котором поучаствовал даже сам Хабр.

        image

        Из 20 полученных прототипов мы отобрали 6 лучших команд, попавших в финал. А затем выбрали два проекта, заслуживших наши такие разные, но по-своему замечательные призы: поездку на Финтех фестиваль в бананово-лимонный Сингапур и личное знакомство с основателем и CEO компании QIWI Сергеем Солониным.

        Победителей мы выбирали не единолично: нам очень сильно помогли Олег Дронов из фонда AD.ru и Нигяра Мардалиева из компании SkyEng, которые вместе с нами просмотрели все презентации, задавали вопросы и помогли с выбором победителей, за что большое им спасибо.

        В результате, призовую поездку на Singapore FinTech Festival получил Максим diakov2100 Дьяков с проектом «ЯСтрим» — сервисом для обработки донатов на стримах.

        Мы выбрали его проект, потому что:

        • представленный продукт хорошо проработан (наличие приложений для Windows и Mac, отдельное — для стримера, мобильное приложение и веб-форма для зрителя);
        • хорошее понимание целевой аудитории и проблематики продукта;
        • качество презентации идеи на финальной части конкурса;
        • выбор подходящих методов API QIWI Кошелька для пользовательских задач;
        • YouTube — новый телевизор, а стримеры — новые телеведущие. Выбор перспективного направления с долгосрочным трендом на рост интереса.

        Кроме того, проект Максима Дьякова имеет потенциал международного масштабирования, поэтому важно пообщаться с передовыми людьми в индустрии финтеха на Fintech Festival 2017. Именно поэтому мы приняли решение, что он должен отправиться в Сингапур.

        Призовой завтрак с CEO QIWI Ltd. Сергеем Солониным достался Сергею serjeyX Десятскому за проект QIWI LIFE SIMULATOR.

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

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

        Почётные упоминания


        Также в рамках финала команда, состоящая из Сергея Машковцева, Кирилла Данилова и Марии Даниловой представила «Календарь платежей» — интегрированное решение на базе API Google Calendar и QIWI Кошелька. Теперь в календаре со встречами и планами появилась возможность создавать события, связанные с платежами. Календарь не позволит забыть что-то оплатить или совершить перевод денег. Как правило, сейчас у многих есть календарь «для всего сразу», поэтому это более удобное решение, чем вести календарь платежей в интерфейсе каждого финансового сервиса.

        Александр Десятов научил iPhone понимать голосовые команды — проверять баланс кошелька, оплачивать сотовую и переводить деньги. Эта опция относительно недавно появилась в iOS 11 — теперь Siri может взаимодействовать не только с нативными приложениями Apple, но и написанные сторонними разработчиками. У Александра получилось создать SDK — уже готовый кусок программы, который другие разработчики смогут интегрировать в свои приложения. Конечно, у жюри конкурса возникли вопросы по безопасности такого сервиса — но есть возможность запускать голосовые команды только после разблокировки телефона.

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

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

        Хочется отметить, что мы увидели интересные идеи и их реализации как среди участников самого QIWI API Contest, так и на этапе «конкурса идей». К сожалению, некоторые достойные идеи не попали в финал, но все равно они достойны упоминания.

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

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

        В целом о QIWI API Contest


        В целом, заданная тема «автоматизируй свой кошелек» не особо вдохновила разработчиков. Их больше интересовал OAuth доступ к кошелькам конечных пользователей к их приложениям. Не помог даже запрет на копирование токенов wallet_API из интерфейса qiwi.com/api в интерфейс приложения участника конкурса. Это как с табличкой «по газонам не ходить» — многим, видя такую надпись, сразу хочется пройтись по газону и еще на нем поваляться. Почему мы вообще вводили подобные ограничивающие условия? Разработка безопасного процесса выпуска токенов для сторонних приложений — одна из приоритетных задач для QIWI Кошелька и мы не могли проигнорировать этот аспект в ходе QIWI API Contest. Как итог, необходимых решений было не очень много и, к сожалению, те, кто понимал все ограничения условий конкурса, не смогли представить работающий продукт.

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

        А для тех, кто предпочитает один раз увидеть, мы подготовили суммирующий видеосюжет о том, как состоялся и прошёл QIWI API Contest:



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

        https://habrahabr.ru/post/339144/


        [Из песочницы] t1ha

        Понедельник, 02 Октября 2017 г. 17:35 + в цитатник
        yleo сегодня в 17:35 Разработка

        t1ha

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


        Вместо Disclaimer

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


        Банальности

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


        Ещё немного занудства

        Для стройности изложения необходимо определить понятия «качества» хэш-функции и остальные требования чуть более детально:


        • Базовое качество: Изменение одного или более произвольных бит в произвольном наборе исходных данных, приводит к изменению каждого бита результата с вероятностью 1/2 .
        • Необратимость (стойкость к восстановлению прообраза): Невозможность получения исходных данных или отдельных битов по результату хеширования.
        • Устойчивость к подбору хэша (стойкость к коллизиям первого рода): Сложность поиска/подбора исходного набора данных с целью получения заданного результата или даже отдельных его битов.
        • Устойчивость к подбору сообщений (стойкость к коллизиям второго рода): Сложность поиска/подбора двух разных наборов данных, которые давали бы одинаковый результат или совпадение отдельных битов.

        Опуская цитирование доказательств и прочие выкладки можно констатировать:


        • Надлежащее выполнение всех пунктов, одновременно с обеспечением производительности, является достаточно трудной задачей, решение которой даёт хорошую криптографическую хэш-функцию. Но мы пока заниматься этим не будем.
        • Обеспечение базового качества требует достаточно большого количества операций АЛУ. Проще говоря, качество всегда конфликтует со скоростью.
        • Получение качественного результата с разрядностью больше разрядности операций АЛУ требует более чем кратного увеличения количества перемешиваний, а следовательно базовых операций АЛУ.
        • В целом, создание быстрой кэш-функции предполагает достижения взвешенного компромисса между скоростью, качеством и разрядностью результата.

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


        Базовый вариант t1ha является (самой) быстрой переносимой хэш-функцией для построения хэш-таблиц и других родственных применений. Поэтому базовый вариант t1ha ориентирован на 64-битные little-endian архитектуры, принимает 64-битное подсаливающее значение (seed) и выдает 64-битный результат, который включает усиление длиной ключа и seed-ом. Стоит отметить, t1ha намеренно сконструирована так, чтобы возвращать 0 при нулевых входных данных (ключ нулевого размера и нулевой seed).


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


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


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


        На самом деле

        Мы просто берем пример в statistical prove с коллег из Google ;)




        Бенчмарки


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


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


        Кроме этого, на сайте проекта приведены таблицы с результатам замеров производительности посредством доработанной версии SMHasher от Reini Urban. Соответственно, все цифры можно перепроверить и/или получить результаты на конкретном процессоре при использовании конкретного компилятора.


        Здесь же можно привести сопоставление с некоторыми ближайшими конкурентами t1ha.


        Хэширование коротких ключей (среднее для 1..31 байта).
        Смотрим на правую колонку «Cycles/Hash» (чем меньше значение, тем быстрее):


        Function MiB/Second Cycles/Hash
        t1ha 12228.80 35.55
        FastHash64 5578.06 43.42
        CityHash64 11041.72 51.77
        xxHash64 11123.15 56.17
        MetroHash 11808.92 46.33

        Хэширование длинных ключей (256 Кб).
        Смотрим на среднюю колонку «MiB/Second» (чем больше значение, тем быстрее):


        Function MiB/Second Cycles/Hash
        t1ha 12228.80 35.55
        FarmHash64 12145.36 60.12
        CityHash64 11041.72 51.77
        xxHash64 11123.15 56.17
        Spooky64 11820.20 60.39



        Варианты t1ha


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


        Затем потребовалась максимально быстрый вариант хэш-функции, который давал-бы сравнимый по качеству результат, но был максимально адаптирован на целевую платформу. Например, базовый вариант t1ha работает с little-endian порядком байт, из-за чего на big-endian архитектурах требуется конвертация с неизбежной потерей производительности. Так почему-бы не избавиться от лишних операций на конкретной целевой платформе? Таким же образом было добавлено ещё несколько вариантов:


        • Упрощенный вариант для 32-битных платформ, как little, так и big-endian.
        • Вариант с использованием инструкций AES-NI для процессоров без AVX.
        • Два варианта с использованием инструкций AES-NI с использованием AVX.

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


        • t1ha0() — максимально быстрый вариант для текущего процессора.
        • t1ha1() — базовый переносимый 64-битный вариант t1ha.
        • t1ha2() — переносимый 64-битный вариант с чуть большей заботой о качестве.
        • t1ha3() — быстрый переносимый 128-битный вариант для получения отпечатков.
        • и т.д.

        В этой схеме предполагается, что t1ha0() является диспетчером, который реализует перенаправление в зависимости от платформы и возможностей текущего процессора. Кроме этого, не исключается использование суффиксов «_le» и «_be» для явного выбора между little-endian и big-endian вариантами. Таким образом, под «вывеской» t1ha сейчас находиться несколько хеш-функций и это семейство будет пополняться, в том числе с прицелом на отечественный E2K «Эльбрус».


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


        Simple bench for x86 (large keys, 262144 bytes):
                      t1ha1_64le:   47151 ticks,  0.1799 clk/byte,  16.679 Gb/s @3GHz
                      t1ha1_64be:   61602 ticks,  0.2350 clk/byte,  12.766 Gb/s @3GHz
                      t1ha0_32le:   94101 ticks,  0.3590 clk/byte,   8.357 Gb/s @3GHz
                      t1ha0_32be:   99804 ticks,  0.3807 clk/byte,   7.880 Gb/s @3GHz
        
        Simple bench for x86 (small keys, 31 bytes):
                      t1ha1_64le:      39 ticks,  1.2581 clk/byte,   2.385 Gb/s @3GHz
                      t1ha1_64be:      42 ticks,  1.3548 clk/byte,   2.214 Gb/s @3GHz
                      t1ha0_32le:      51 ticks,  1.6452 clk/byte,   1.824 Gb/s @3GHz
                      t1ha0_32be:      54 ticks,  1.7419 clk/byte,   1.722 Gb/s @3GHz
        
        Simple bench for AES-NI (medium keys, 127 bytes):
             t1ha0_ia32aes_noavx:      72 ticks,  0.5669 clk/byte,   5.292 Gb/s @3GHz
               t1ha0_ia32aes_avx:      78 ticks,  0.6142 clk/byte,   4.885 Gb/s @3GHz
              t1ha0_ia32aes_avx2:      78 ticks,  0.6142 clk/byte,   4.885 Gb/s @3GHz
        
        Simple bench for AES-NI (large keys, 262144 bytes):
             t1ha0_ia32aes_noavx:   38607 ticks,  0.1473 clk/byte,  20.370 Gb/s @3GHz
               t1ha0_ia32aes_avx:   38595 ticks,  0.1472 clk/byte,  20.377 Gb/s @3GHz
              t1ha0_ia32aes_avx2:   19881 ticks,  0.0758 clk/byte,  39.557 Gb/s @3GHz



        Немного о внутреннем устройстве

        Если говорить чуть более детально, то t1ha построена по схеме Меркла-Дамгарда (в варианте «wipe-pipe») с упрочнением от размера данных и подсаливающего значения. Внутри основного сжимающего цикла используется 256-битное состояние, с аналогичным размером входного блока. Причем для каждого операнда данных реализуется две точки инъекции с перекрестным опылением. По завершению сжимающего цикла выполняется сжатие 256-битного состояния до 128 бит.


        При выполнении описанных действий используются 64-битные операции, комбинирующие миксеры ARX (Add-Rotate-Xor) и MUX/MRX (Mul-Rotate-Xor). Немаловажно, что все эти вычисления выстроены так, чтобы обеспечить возможность параллельного выполнения большинства операция и плотной укладки u-ops как в конвейер, так и в исполняющие устройства x86_64. За счет этого достигается достаточно хорошее качество при практически предельной скорости хэширования длинных ключей.


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


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


        Следует отметить, что используемый миксер на основе широкого умножения и исключающего ИЛИ не идеален. Несмотря на то, что t1ha проходит все тесты SMHasher, у автора есть представление о последствиях неинъективности. Тем не менее, результирующее качество представляется рационально-достаточным, а в планах развития линейки t1ha уже отражено намерение предоставить чуть более качественный вариант.


        Остальное здесь.


        Спасибо за внимание. Всем добра.

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

        https://habrahabr.ru/post/339160/


        Метки:  

        [recovery mode] Закрепление проекта за партнером и новые отчеты колл-центра 3CX

        Понедельник, 02 Октября 2017 г. 17:14 + в цитатник
        snezhko сегодня в 17:14 Администрирование

        Закрепление проекта за партнером и новые отчеты колл-центра 3CX

        Закрепление проекта 3CX за партнером


        Сегодня мы поговорим о, на первый взгляд, второстепенном, нетехническом, но важном вопросе, который упускают из внимания интеграторы нашей системы.  
        Начиная с 3CX v15, мы предоставляем возможность интегратору закрепить за собой конкретную инсталляцию 3CX, причем как уже выполненную, так и текущую, и даже будущую! Иными словами, «защитить проект». Закрепление пользователя за партнером, разрабатывающим проект, имеет несколько важных преимуществ:

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



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

        Связывание из интерфейса 3CX


        Если 3CX уже установлена, на Главной странице в разделе Информация обратите внимание на строку Партнер (Reseller). Если данная инсталляция не привязана к партнеру, рядом вы увидите запись Не связана – связать (Not Linked – Link). Кликните на зеленом поле и укажите ваш ID партнера.



        Связывание во время установки


        В этом случае вы должны указать ID партнера на этапе ввода параметров регистрации лицензии в окне Параметры регистрации (Registration Details).



        Связывание потенциальных пользователей


        Если вы получаете потенциальных пользователей (лиды) с вашего сайта, e-mail рассылки или просто рассказываете им о системе, и в этом случае стоит связать таких пользователей с партнерским аккаунтом. Для этого предоставьте им персональную ссылку загрузки, включающую ваш ID партнера:


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

        Новые отчеты колл-центра 3CX


        Во второй части статьи поговорим о новых отчетах колл-центра, которые помогут руководителю компании или супервайзеру визуализировать важную статистику. Эта информация используется для повышения качества работы колл-центра в целом.
        В 3CX V15.5 SP1 мы добавили 4 новых отчета:
        • Распределение вызовов по времени (Call Distribution)
        • Среднее время ожидания клиента в Очереди вызовов (Average Queue Waiting Time)
        • Активность операторов по времени (User Activity)
        • Отвеченные / неотвеченные вызовы в Очереди вызовов по времени (Queue Answered / Unanswered Calls)

        Обратите внимание, отчеты доступны только в редакциях 3CX V15.5 SP1 PRO и ENT.
        Для генерации отчетов, в интерфейсе управления 3CX перейдите в раздел Отчеты и нажмите кнопку Добавить. Новые отчеты находятся в секции Расширенные отчеты. В любом отчете присутствует несколько общих параметров: частота генерации, диапазон времени, формат отчета PDF, HTML или CSV) и другие.
        После того, как отчет будет сгенерирован, вы получите e-mail с ссылкой на загрузку файла отчета в соответствующем формате. Также вы можете просмотреть отчет непосредственно из раздела Отчеты в интерфейсе 3CX, после того как этот отчет будет готов. Рассмотрим отчеты подробнее.

        Гистограмма Распределение вызовов по времени



        Гистограмма показывает количество вызовов, прошедших через транки, шлюзы и межстанционные мосты 3CX. По умолчанию отчет включает и вызовы в Очередях (если соответствующая опция не отключена). Также включаются вызовы, сделанные на Группы вызовов, и внутренние вызовы (если установлена опция отчета Включить внутренние вызовы).

        График Среднее время ожидания абонента (клиента) в Очереди вызовов



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

        Гистограмма Действия пользователей (Активность операторов) по времени



        График показывает активность пользователя 3CX (оператора колл-центра) по времени, и, соответственно, относительный прогресс. Руководитель видит, какой период дня, месяца или года был наиболее активным. Отчет включает вызовы в Очереди и внутренние вызовы (если установлена соответствующая опция).

        Гистограмма Отвеченные / неотвеченные вызовы Очереди по времени



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

        https://habrahabr.ru/post/339072/


        Иногда они возвращаются. Мобильный банкер BankBot снова в Google Play

        Понедельник, 02 Октября 2017 г. 16:41 + в цитатник
        esetnod32 сегодня в 16:41 Администрирование

        Иногда они возвращаются. Мобильный банкер BankBot снова в Google Play

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

          В течение года BankBot эволюционировал, его версии появлялись в Google Play и на неофициальных площадках. Наконец, 4 сентября мы обнаружили в Google Play первый вариант, сочетающий все черты эволюции: улучшенную обфускацию кода, усложненные функции для доставки основных компонентов, сложный механизм заражения, использующий службу специальных возможностей Android Accessibility Service.



          Возможность использования Android Accessibility Service ранее демонстрировало несколько троянов, распространявшихся преимущественно вне Google Play. Недавние исследования SfyLabs и Zscaler подтвердили, что операторы BankBot добавили в Google Play приложение, использующее специальные возможности, но без компонента банкера.

          «Сложившийся паззл» с функцией банкера проник в Google Play под видом игры Jewels Star Classic. Важно отметить, что атакующие воспользовались названием популярной легитимной линейки игр разработчика ITREEGAMER, не связанного с вредоносной кампанией.

          Мы уведомили службу безопасности Google о вредоносном приложении. Тем не менее, приложение установили примерно 5 000 пользователей прежде, чем оно было удалено.

          Принцип работы


          Когда пользователь скачивает Jewels Star Classic разработчика GameDevTony (рисунок ниже), он получает рабочую игру для Android со скрытыми дополнениями – компонентом банкера, скрывающимся среди ресурсов игры, и вредоносной службой, ждущей своего часа после предустановленного срока временной задержки.


          Рисунок 1. Вредоносное приложение в Google Play

          Вредоносная служба активируется через 20 минут после первого исполнения Jewels Star Classic. Зараженное устройство показывает сообщение с предложением включить что-то под названием Google Service (вредоносное уведомление появляется вне зависимости от текущей активности пользователя, без явной связи с игрой).

          Единственный способ убрать уведомление с экрана – нажать «ОК». После этого пользователя перенаправляют в меню специальных возможностей Android Accessibility, где происходит управление службами с данными функциями. Среди легитимных в списке появляется служба под названием Google Service, созданная малварью. Описание службы копирует оригинальное пользовательское соглашение Google.


          Рисунок 2. Уведомление, предлагающее пользователю включить Google Service


          Рисунок 3. Google Service в списке среди служб Android Accessibility


          Рисунок 4. Описание вредоносной службы, взятое из пользовательского соглашения Google

          Решив активировать службу, пользователь увидит список требуемых разрешений: наблюдение за вашими действиями, получение содержимого окна, включение Explore by Touch, включение улучшенной веб-доступности и управление жестами (рисунок 5).

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


          Рисунок 5. Разрешения, требуемые для активации Google Service

          На практике после принятия этих разрешений пользователю временно будет отказано в доступе к экрану по причине обновления Google Service; на самом деле, это не имеет отношения к Google и работает как процесс переднего плана (рисунок 6).


          Рисунок 6. Экран, скрывающий вредоносную активность

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

          • разрешает установку приложений из неизвестных источников
          • устанавливает BankBot из набора и запускает его
          • активирует права администратора для BankBot
          • устанавливает BankBot в качестве приложения для обмена SMS по умолчанию
          • получает разрешение для показа поверх других приложений

          После успешного выполнения этих задач малварь может начинать работать над следующей – кражей данных кредитной карты жертвы. В отличие от других вариантов BankBot, которые нацелены на приложения для мобильного банкинга и имитируют формы ввода логина и пароля, эта версия «специализируется» исключительно на Google Play — приложение, предустановленное на каждом устройстве на Android.

          Когда пользователь запускает приложение Google Play, вступает BankBot и перекрывает экран легитимного приложения фейковой формой для заполнения данных кредитной карты пользователя (рисунок 7).


          Рисунок 7. Имитация формы заполнения данных банковской карты пользователя

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

          Чем опасен BankBot


          В этой кампании злоумышленники соединили несколько техник, которые становятся все более популярны среди авторов вредоносного ПО для Android: использование службы Android Accessibility Service, маскировка под Google и настройка таймера, который откладывает выполнение вредоносной активности, чтобы обойти меры безопасности Google.

          Эти техники затрудняют своевременное распознавание угрозы жертвой. Так как малварь выдает себя за Google и ждет 20 минут, прежде чем показать первое уведомление, у пользователя мало шансов связать ее активность с недавно скачанным приложением Jewel Star Classic. Наконец, множество имен, используемых малварью в процессе заражения, затрудняют локализацию угрозы и ее удаление вручную.

          Как очистить зараженное устройство?


          Если вы часто скачиваете приложения с Google Play и других площадок, вам стоит проверить наличие/отсутствие BankBot на устройстве.

          Убедиться в отсутствии Jewels Star Classic недостаточно, так как атакующие часто меняют приложения, используемые для распространения BankBot. Чтобы узнать, не было ли устройство заражено, рекомендуем проверить следующие признаки:

          • Наличие приложения под названием Google Update (рисунок 8: находится в разделе меню Settings > Application manager/Apps > Google Update)
          • Активный администратор устройства под названием System update (рисунок 9: находится в Settings > Security > Device administrators).
          • Повторяющееся появление уведомления Google Service (рисунок 2)



          Рисунок 8. Вредоносные приложения в менеджере приложений


          Рисунок 9. BankBot, замаскированный под обновление системы в списке активных администраторов устройства

          Любой из этих признаков указывает на возможное заражение новым вариантом BankBot.
          Чтобы удалить малварь вручную, отмените права администратора устройства для System update, затем удалите Google Update и соответствующее троянизированное приложение.

          Поиск троянизированного приложения, которое запустило заражение (в нашем случае это Jewels Star Classic), затруднен по причине 20-минутной отсрочки начала вредоносной активности, а также потому что оно работает ожидаемым образом. Для обнаружения и удаления угрозы со всеми ее компонентами рекомендуем использовать надежное решение по безопасности мобильных устройств.

          Продукты ESET детектируют этот вариант BankBot как Android/Spy.Banker.LA.

          Как обезопасить себя?


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

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

          Образцы / Индикаторы компрометации


          Название пакета / Хэш
          com.mygamejewelsclassic.app B556FB1282578FFACDBF2126480A7C221E610F2F
          com.w8fjgwopjmv.ngfes.app 4D3E3E7A1747CF845D21EC5E9F20F399D491C724
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/339158/


          Метки:  

          [Из песочницы] Мотивированные установки из США (Android) — обзор вариантов, статистика, мнение

          Понедельник, 02 Октября 2017 г. 15:50 + в цитатник
          Twisan сегодня в 15:50 Маркетинг

          Мотивированные установки из США (Android) — обзор вариантов, статистика, мнение

          Предисловие: Я — самый обычный индивидуальный разработчик Android-приложений, одно из своих детищ я уже давненько опубликовал в Google Play, после чего усердно над ним работал. В какой-то момент я решил — «Почему бы не попробовать продвинуть приложение?». Для этого я принялся усердно читать различную литературу на эту тему. В последствии пришел к идее попробовать купить мотивированные установки (о том, что это читайте ниже). Было принято решение продвигаться конкретно в США. Собственно далее — то, что у меня получилось, что я попробовал.

          Глава 1. Мотивированные установки


          Мотивированные установки — заказанные установки вашего приложения другими пользователями с целью повышения позиций в категории.

          Ни для кого не секрет — чем больше людей скачивает приложение, тем выше оно будет при просмотре в категории. Идеал — добиться 1-3 места, ведь на них приходится самая большая часть установок и просмотров (почти никто не будет листать список категории до 300 приложения).

          Данный способ предназначен для «искусственного» повышения позиции в категории. Чтобы это произошло, судя по различным источникам, необходимо как можно больше установок получить за 2-3 суток для Google Play, как обстоят дела у Apple я не знаю, поэтому не буду врать.

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

          Глава 2. Где их взять и почему США?


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

          Если рассматривать Россию для мотивированных установок, то стоит вбить в гугл «Мотивированные установки Android», как вы тут же получите целую кучу вариантов. Но проблема в том, что почти ни одна из компании, в которые я обратился из этого списка, не предоставляют услуги мотивированных установок из других стран, либо предлагают — но это делается через партнеров и соответственно цена выходит довольно большая.

          Тогда я решил углубиться и найти компании, которые ориентированны на установки из США, но это оказалось не так просто, я провел много времени за поиском подходящих и относительно дешевых вариантов. Далее привожу список тех, которые я выбрал для своего приложения:

          1. www.waypedia.com
          2. www.cpimobi.com
          3. www.keyapp.top
          4. www.mopeak.com
          5. www.cpidroid.com

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

          Глава 3. Цели, бюджет, сроки


          Главной целью, которую я себе поставил получить больше 10 000 установок за 3 суток. В идеале хотелось 20к, но, как оказалось, данные компании не могут предложить за такой краткий срок такие объемы.

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

          Далее привожу таблицу того, сколько мне пообещали установок, сколько это денег потребовало и т.д. Пообещали — я связывался с менеджерами каждой компании и уточнял у них эту информации.
          Название компании Установок за 1 день Установок за 3 день Стоимость 1 установки Общая стоимость
          waypedia.com 200 600 0,1 $ 60 $
          cpimobi.com 200 600 0,083 $ 50 $
          cpimobi.com 2000 6000 0,09 $ 540 $
          mopeak.com ~260 800 0,121 $ 95 $
          cpidroid.com 600 1800 0,222 $ 400 $

          Глава 4. Процесс


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

          Все компании запускались в вечер пятницы(22.09.2017) и к вечеру понедельника ожидались результаты.

          waypedia.com
          Со своими обещаниями не справилась, привожу скриншот их статистики по установкам.
          В итоге я получил за 3 дня всего-ничего около 100 установок. Крайне был разочарован.

          image

          cpimobi.com
          Со своими обещаниями не справилась, привожу скриншот их статистики по установкам.
          В итоге я получил за 3 дня 4 установки, однако, как видно по графику количество установок сильно выросло в 4 и 5 день, возможно это связано с днем недели, так как планировались установки на выходных и возможно, люди предпочитают заниматься другим в это время.

          image

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

          image

          mopeak.com
          У этих господ нет панели управления, вы просто покупаете один из пакетов предложенных на их сайте и если хотите, чтобы установки были из конкретной страны — нужно связываться с менеджерами и сообщать им об этом, что я и сделал в пятницу, на что мне сказали «Ok».
          Однако после выходных они написали мне на почту, мол, на данный момент у вас идут установки по всему миру, вы точно хотите сократить их до США. На что я конечно же очень негодовал, т.к. обещали они мне в пятницу, что всё Ок.

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

          cpidroid.com
          Обещание своё выполнить не смогли, но держали уровень загрузок за первые три дня довольно большим. Скришот статистики прилагается. Однако, после 3 дня количество установок в день очень сильно снизилось, в итоге, я получил пока только половину обещанных установок.

          image

          Глава 5. Подводим итоги


          Что ж, пришло время подвести итоги. Что касается площадок для покупки мотивированных установок — можно пользоваться keyapp.top, cpidroid.com и cpimobi.com (если понять от чего зависит количество установок в день). Остальные же два я бы не советовал вам выбирать, если у вас есть необходимость за короткие сроки получить максимальное количество установок.

          Что говорит статистика Google Play
          К сожалению, определить точно с какой площадки сколько человек установило не получится (хотя были варианты на паре площадок с возможностью вставить ссылку с UTM и отслеживать установки, но я не стал париться с этим). Однако можно увидеть, сколько всего установок накапало за ~3 суток — около 6 000 установок + в будущие дни установки из некоторых площадок всё так же будут идти, но сколько в этом будет смысла — я не уверен.

          image

          Что это изменило для меня
          Пока что сложно говорить о полном преимуществе, которое дал мне этот способ. Однако уже сейчас по данным сайта www.appbrain.com позиция моего приложения в США в категории Работа поднялось из «самого дна» до 241 места.

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

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

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

          https://habrahabr.ru/post/339154/


          Методы приближенного поиска ближайших соседей

          Понедельник, 02 Октября 2017 г. 15:44 + в цитатник
          Chetter2 сегодня в 15:44 Разработка

          Методы приближенного поиска ближайших соседей


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


            Мы тоже столкнулись с необходимостью поиска ближайших соседей в задаче распознавания лиц. Там мы формируем векторные представления лиц при помощи нейросети и ищем ближайшие векторы уже известных людей. Изначально для поиска мы выбрали Annoy, как хорошо известный и проверенный алгоритм, используемый в том числе в Spotify. Но быстро поняли, что с его аппетитами по памяти мы либо не вмещаемся в RAM, либо сильно теряем в точности. Это привело к небольшому исследованию. О результатах которого пойдет речь ниже.


            Чтобы разбавить теорию практикой, в статье будет немного кода, где мы ищем ближайших соседей для слов. Получим их векторные представления, используя популярный word2vec. Этот алгоритм выдает близкие векторы для семантически похожих слов. В word2vec CBOW векторные представления получаются как побочный продукт обучения небольшой нейросети, которая предсказывает слово по его окружению. Любопытно, что с векторами можно проворачивать арифметические операции наподобие king + (woman – man) = queen.


            word embeddings


            Посмотрим, как с этим работать в коде.


            model = gensim.models.KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', binary=True)
            start = time.time()
            pprint.pprint(model.wv.most_similar(positive=['king']))
            print('time:', time.time() - start)
            print('king + (woman - man) = ', model.wv.most_similar(positive=['woman', 'king'], negative=['man'])[0])
            print('Japan + (Moscow - Russia) = ', model.wv.most_similar(positive=['Moscow', 'Japan'], negative=['Russia'])[0])

            Получаем:


                [(u'kings', 0.7138045430183411),
                 (u'queen', 0.6510956883430481),
                 (u'monarch', 0.6413194537162781),
                 (u'crown_prince', 0.6204219460487366),
                 (u'prince', 0.6159993410110474),
                 (u'sultan', 0.5864823460578918),
                 (u'ruler', 0.5797567367553711),
                 (u'princes', 0.5646552443504333),
                 (u'Prince_Paras', 0.5432944297790527),
                 (u'throne', 0.5422105193138123)]
                time: 0.236690998077
                king + (woman - man) =  (u'queen', 0.7118192911148071)
                Japan + (Moscow - Russia) =  (u'Tokyo', 0.8696038722991943)

            В примере выше использовалась библиотека для работы с текстом gensim и word2vec модель (1,5 Гбайт) от Google, которая насчитывает 3 миллиона слов и коротких фраз. В выводе кода видно, что к королю близки королевы, монархи и принцы. Также мы убедились, что арифметика с векторами работает. Однако четверть секунды на один запрос — не очень привлекательно, а ведь в gensim сравнительно хорошая реализация bruteforce-поиска (с подсчетом расстояний до всех известных объектов). Далее мы рассмотрим методы, позволяющие сократить это время в сотни раз лишь с небольшими потерями в точности.


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


            nbrs = NearestNeighbors(algorithm='brute', metric='cosine')
            nbrs.fit(model.wv.syn0norm)
            king_vec = model.wv['king'][np.newaxis, :]
            # замерим скорость поиска сосдей к королю без разделения пространства и заодно выведем результат
            start = time.time()
            idxs = nbrs.kneighbors(king_vec, return_distance=False, n_neighbors=10)[0]
            print('full search time:', time.time() - start)
            print([model.wv.index2word[idx] for idx in idxs])
            
            # выберем 2 случайных вектора и получем коэффициенты задающие плоскость между ними
            vec1_idx = random.randint(0, model.wv.syn0norm.shape[0])
            vec2_idx = random.randint(0, model.wv.syn0norm.shape[0])
            plane = model.wv.syn0norm[vec1_idx] - model.wv.syn0norm[vec2_idx]
            
            # в результате следующего умножения матрица-вектор, мы получим вектор. 
            # Знаки элементов этого вектора указывают с какой стороны разделяющей плоскости оказалось слово
            scalar = model.wv.syn0norm.dot(np.transpose(plane))
            
            # определим с какой стороны плоскости запрос и подготовим бинарную маску для выборки векторов по ту же сторону плоскости
            if king_vec.dot(plane) > 0:
                mask = scalar > 0
            else:
                mask = scalar < 0
            
            print('elements in mask:', mask.sum())
            
            half_nbrs = NearestNeighbors(algorithm='brute', metric='cosine')
            half_nbrs.fit(model.wv.syn0norm[mask])
            half_index2word = list(compress(model.wv.index2word, mask))
            
            start = time.time()
            idxs = half_nbrs.kneighbors(king_vec, return_distance=False, n_neighbors=10)[0]
            print('half search time:', time.time() - start)
            print([half_index2word[idx] for idx in idxs])

            Получаем:


                full search time: 20.3163180351
                [u'king', u'kings', u'queen', u'monarch', u'crown_prince', u'prince', u'sultan', u'ruler', u'princes', u'Prince_Paras']
                elements in mask: 1961204
                half search time: 9.15824007988
                [u'king', u'kings', u'queen', u'monarch', u'crown_prince', u'prince', u'sultan', u'ruler', u'princes', u'Prince_Paras']

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



            1. HNSW


            В 2013 году был опубликован один из лучших алгоритмов поиска ближайших соседей Navigable Small World (NSW). В 2016-м появился его наследник Hierarchical Navigable Small World (HNSW).


            Начнем с родительского алгоритма NSW. Он основан на графе «мир тесен». Эти графы имеют любопытную и полезную нам особенность: пара вершин с большой вероятностью не смежна, но они достижимы за сравнительно небольшое число шагов ($\log{N}$ в среднем). Такие графы встречаются довольно часто. К примеру, нейронные сети мозга, группы в социальных сетях и семантическая сеть WordNet — это графы SW. В нашем случае вершинами являются векторы, а ребра соединяют их с ближайшими. В графе также представлены ребра, соединяющие вершины на большом расстоянии.


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



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


            Псевдокод
            K-NNSearch(object q, integer: m, k)
            1 TreeSet [object] tempRes, candidates, visitedSet, result
            2 for (i<-0; i < m; i++) do:
            3    put random entry point in candidates
            4    tempRes<-null
            5    repeat:
            6       get element c closest from candidates to q
            7       remove c from candidates
            8       //check stop condition:
            9       if c is further than k-th element from result
            10          than break repeat
            11    //update list of candidates:
            12    for every element e from friends of c do:
            13       if e is not in visitedSet than
            14          add e to visitedSet, candidates, tempRes
            15
            16    end repeat
            17    //aggregate the results:
            18    add objects from tempRes to result
            19 end for
            20 return best k elements from result

            index = nmslib.init(space='cosinesimil', method='sw-graph')
            nmslib.addDataPointBatch(index, np.arange(model.wv.syn0.shape[0], dtype=np.int32), model.wv.syn0)
            index.createIndex({}, print_progress=True)
            start = time.time()
            items = nmslib.knnQuery(index, 10, king_vec.tolist())
            print(time.time() - start)
            print([model.wv.index2word[idx] for idx in items])

            Получаем:


                0.000545024871826
                [u'king', u'kings', u'queen', u'monarch', u'crown_prince', u'prince', u'sultan', u'ruler', u'princes', u'royal']

            Рассмотрим развитие описанной выше идеи в алгоритме Hierarchical Navigable Small World (HNSW). Он во многом схож с NSW, однако теперь мы имеем дело с иерархией графов: на нулевом слое представлены все объекты, а по мере увеличения слоя — все меньшая и меньшая их подвыборка. При этом все объекты на слое $n+1$ есть и на слое $n$.



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


            Псевдокод
            SearchAtLayer (object q, Set[object] enterPoints, integer: M, ef, layer)
            1  Set [object] visitedSet
            2  priority_queue [object] candidates (closer - first), result (further - first)
            3  candidates, visitedSet, result <- enterPoints
            7
            4  repeat:
            5     object c =candidates.top()
            6     candidates.pop()
            7     //check stop condition:
            8     if d(c,q)>d(result.top(),q) do:
            9        break
            10    //update list of candidates:
            11    for_each object e from c.friends(layer) do:
            12       if e is not in visitedSet do:
            13          add e to visitedSet
            14          if d(e, q)< d(result.top(),q) or result.size()ef do:
            17                result.pop()
            18 return best k elements from result
            
            K-NNSearch (object query, integer: ef)
            1 Set [object] tempRes, enterPoints=[enterpoint]
            2 for i=maxLayer downto 1 do:
            3    tempRes=SearchAtLayer (query, enterPoints, M, 1, i)
            4    enterPoints =closest elements from tempRes
            5 tempRes=SearchAtLayer (query, enterPoints, M, ef, 0)
            6 return best K of tempRes

            1.1. Pros & Cons


            + Алгоритм просто понять


            + Он показывает state-of-the-art результаты


            + Существует эффективная реализация в библиотеке nmslib


            + Небольшие дополнительные расходы памяти на хранение ребер графа


            – Алгоритм не поддерживает сжатие векторных представлений, которое мы рассмотрим далее


            index = nmslib.init(space='cosinesimil', method='hnsw')
            nmslib.addDataPointBatch(index, np.arange(model.wv.syn0.shape[0], dtype=np.int32), model.wv.syn0)
            index.createIndex({}, print_progress=True)
            start = time.time()
            items = nmslib.knnQuery(index, 10, king_vec.tolist())
            print(time.time() - start)
            print([model.wv.index2word[idx] for idx in items])

            Получаем:


                0.000469923019409
                [u'king', u'kings', u'queen', u'monarch', u'crown_prince', u'prince', u'sultan', u'ruler', u'princes', u'Prince_Paras']

            2. FAISS


            В марте 2017 года Facebook представила свое решение для ANN — библиотеку FAISS. Она объединяет множество методов и алгоритмов. В алгоритме, который мы рассмотрим ниже, расстояния до групп векторов будут приближаться расстоянием до опорной точки рядом с ними. Так мы можем выяснить расстояния от запроса до небольшого количества опорных точек, а затем полным перебором посчитать расстояния до векторов, принадлежащих опорной точке, которая ближе остальных к запросу. Разберем этот алгоритм по частям.


            2.1. ADC — asymmetric distance computation


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


            (0.1, 0.2) -> 1
            (0.5, -0.2) -> 2
            (0.1, 0.1) -> 1
            (0.6, -0.1) -> 2
            

            Векторы коллекции аппроксимируются своими центроидами $y \approx q_c(y)$, где $q_c:\mathbb{R}^d \rightarrow C_1 \subset \mathbb{R}^d$ и $C_1$ — множество центроидов. Тогда расстояние от запроса $x$ до $y$ может быть приближено $d(x, y) \approx d(x, q_c(y))$. Такой способ вычисления дистанции называют асимметричным. Простыми словами: мы разбили пространство на области и сказали, что расстояние от запроса до группы векторов, попавших в одну область, приблизительно равно расстоянию до центроида, образующего эту область.



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


            2.2. IVF — inverted file


            В IVF мы инвертируем присвоение. Теперь центроидам сопоставляются списки векторов.


            1 -> [(0.1, 0.2), (0.1, 0.1)]
            2 -> [(0.5, -0.2), (0.6, -0.1)]
            


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


            2.3. PQ — product quantizer


            Последняя составляющая, которой мы коснемся в статье, называется product quantizer. Она обеспечивает сжатие векторов с потерями и применяется, когда векторные представления не влезают в память. Предположим, что наши векторы имеют размерность 128 и мы хотим кодировать их 64 битами (всего 0,5 бита на компоненту), тогда нам придется заниматься квантованием с количеством центроидов, равным $k=2^{64}$. Это нетривиальная задача $O(iknd)$, которая также требует огромной обучающей выборки.


            Упростим задачу, разбив вектор на $m$ частей $y_1, y_2, ..., y_m \in \mathbb{R}^{d/m}$, и по традиции найдем 256 центроидов для каждой из частей. То есть вектор можно переписать как набор индексов центроидов — например $(134, 20, 244, ..., 12)$, а занимает это хозяйство $m$ байт.


            Такой вид кодирования будем применять к остаточным векторам $r(y) = y - q_c(y)$, $r(y) \approx q_r(r(y))$, и тогда $y \approx q_c(y) + q_r(y - q_c(y))$


            2.4. Поиск


            А теперь соберем все это в одной схеме.



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


            import faiss
            
            index = faiss.index_factory(model.wv.syn0norm.shape[1], 'IVF16384,Flat')
            index.verbose = True
            train = model.wv.syn0norm[np.random.binomial(1, 1./3, size=model.wv.syn0norm.shape[0]).astype(bool)]
            index.train(train)
            index.add(model.wv.syn0norm)
            index.nprobe = 100
            start = time.time()
            distances, items = index.search(king_vec, 10)
            print(time.time() - start)
            print([model.wv.index2word[idx] for idx in items[0]])

            Получаем:


                0.0048999786377
                [u'king', u'kings', u'queen', u'monarch', u'crown_prince', u'prince', u'sultan', u'ruler', u'princes', u'Prince_Paras']

            2.5. Pros & Cons


            + Поддержка сжатия


            + Малые накладные расходы на хранение центроидов


            + Возможность вычислений на GPU*


            – В пять раз медленнее HNSW на CPU


            * Мы не смогли быстро завести GPU-реализацию из коробки и решили не тратить время на это.


            3. ANNOY


            Идея деления пространства плоскостями хорошо реализована в Annoy. Алгоритм прекрасно описан автором в блоге, рекомендую прочесть, если хотите разобраться в деталях. Я попробую коротко изложить суть. В алгоритме мы рекурсивно делим пространство плоскостями, образуя бинарное дерево. В каждом узле дерева хранится вектор, задающий текущую плоскость. При поиске мы начинаем с корня и выбираем дочернюю ноду на основе положения запроса относительно плоскости. Так мы спускаемся к листовым элементам дерева, в которых хранятся векторы, оказавшиеся по одну сторону группы плоскостей (это небольшой кусочек пространства), они с высокой вероятностью окажутся искомыми ближайшими соседями. Посмотрим на достоинства и недостатки Annoy по сравнению с другими алгоритмами.


            3.1. Pros & Cons


            + Алгоритм просто понять


            – Он требует много памяти


            – Проигрывает в скорости работы


            Сравнение алгоритмов


            У каждого из алгоритмов есть набор параметров, будь то максимальное количество друзей для вершины (в NSW, HNSW) или количество центроидов (в FAISS). Эти параметры влияют на объем потребляемой памяти, качество и скорость поиска. Автор Annoy реализовал тесты для группы ANN алгоритмов в репозитории ann-benchmarks на разных параметрах. В них оценивается точность поиска десяти ближайших соседей в датасетах, полученных при помощи алгоритмов GloVe и SIFT.


            GloVe — это еще один способ получить векторные представления слов, он превосходит word2vec по всем показателям при обучении на корпусе одного размера. Датасет составлен из 1,2 миллиона векторных представлений слов, обученных на 2 миллиардах твитов. SIFT — старый алгоритм получения ключевых точек изображения и их векторных представлений, устойчивых к трансформациям. Он использовался для распознавания объектов, и важной частью этого распознавания был поиск похожих векторных представлений. Есть несколько вариаций датасетов, нас интересует SIFT 1M, содержащий миллион векторов.


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


            glove
            sift
            Видно, что HNSW уверенно лидирует. Однако на графиках нет FAISS. Facebook самостоятельно сравнил HNSW и FAISS в разных конфигурациях, результаты приведены в таблице.


            Method search time 1-R@1 index size index build time
            Flat-CPU 9.100 s 1.0000 512 MB 0 s
            nmslib (hnsw) 0.081 s 0.8195 512 + 796 MB 173 s
            IVF16384,Flat 0.538 s 0.8980 512 + 8 MB 240 s
            IVF16384,Flat (Titan X) 0.059 s 0.8145 512 + 8 MB 5 s
            Flat-GPU (Titan X) 0.753 s 0.9935 512 MB 0 s

            В таблице методы FAISS без сжатия, в частности IVF16384,Flat. Значит, используется IVFADC c 16 384 центроидами. Расходы памяти указаны для случая с миллионом векторов размерности 128 в float32. HNSW в пять раз быстрее при вычислениях на CPU, но на хранение ребер графа ($32*2*4*1000000/1024^2 = 244$) требуется больше памяти, чем на центроиды ($16384 * 128 * 4 / 1024^2 = 8$).


            4. Заключение


            Мы рассмотрели ряд алгоритмов, применяемых для быстрого поиска ближайших соседей. Annoy проиграл и по памяти, и по скорости работы, но идея хороша и может помочь в решении смежных задач. Например, удобный для чистки датасета алгоритм поиска аномалий isolation forest очень похож по своей задумке. FAISS — отличное решение при ограничениях по памяти, с ним вполне можно уложить миллиард векторных представлений в 60 Гбайт RAM, используя IVF16384, PQ64. Однако если память не узкое место, то стоит выбрать HNSW.


            P. S. Самыми интересными оказались публикации об алгоритмах в FAISS. Там, к примеру, можно прочесть об оптимизации под GPU, об улучшенном методе квантования (Optimized Product Quantization) и о более хитром способе построении индекса (inverted multi-index).


            P. P. S. Для себя мы выбрали HNSW.


            5. Литература


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

            https://habrahabr.ru/post/338360/


            Метки:  

            Submit the cool project: свой API-client с одного конфигурационного файла

            Понедельник, 02 Октября 2017 г. 15:43 + в цитатник
            dmytrostriletskyi сегодня в 15:43 Разработка

            Submit the cool project: свой API-client с одного конфигурационного файла


              Привет, Хабрахабр! Я тут недавно сделал тулзу, которая генерирует целую обертку-клиент над любым API, который ты только захочешь, с одного yml-файла, а потом сразу же загружает его в Python Package Index (PyPi). Да, результат можно установить в свой любой проект с помощью pip и начать пользоваться. Подробнее под катом!

              Пример


              Посмотрите на код вымышленных http-запросов на Game of Thrones API-сервер, который бы вы написали с помощью библиотеки requests.

              import requests 
              
              
              create_jon_snow_user = requests.post(
                  'https://gameofthrones.com/api/v1/user', 
                  params={
                      'id': 7,
                      'name': 'Jon',
                      'surname': 'Snow',
                  }
              )
              
              get_jon_snow_user = requests.get(
                  'https://gameofthrones.com/api/v1/user', params={'id': 7}
              )
              
              create_jon_snow_castle = requests.post(
                  'https://gameofthrones.com/api/v1/user/castle', 
                  params={
                      'id': 7,
                      'castle': 'Winterfell',
                  }
              )
              

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

              from gameofthrones_api import gameofthrones_api_client as got_api_client
              
              
              create_jon_snow_user = got_api_alient.user.create({
                  'id': 7,
                  'name': 'Jon',
                  'surname': 'Snow'
              })
              
              get_jon_snow_user = got_api_alient.user.get({'id': 7})
              
              create_jon_snow_castle = got_api_alient.user.castle.create({
                  'id': 7,
                  'castle': 'Winterfell',
              })
              

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


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

              pypi:
                username: dmytrostriletskyi
                password: d843rnd3
              
              acg:
                name: gameofthronesapi
                version: 0.1.5
              
                api: https://gameofthrones.com/api/v1
              
                services:
                  user:
                    url: /user
                    endpoints: create:post, get:get
              
                  user.castle:
                    url: /user/castle
                    endpoints: create:post
              

              Вы указываете свои PyPi логин и пароль, чтобы acg загрузил клиент на ваш аккаунт и этот пакет мог быть доступен для установки через pipacg вписывает параметры в файл .pypirc, который нужен для загрузки вашего пакета в Python Package Index (PyPi).

              Теперь к back-end серверу, к которому вы пишите клиент:

              • в .acg.yml доступно поле api, где нужно указать корень (адрес), от которого уже идут ответвления на различные запросы. Например, корнем является ваша API myapi.com, а ответвлением /users/all.
              • в services уже на любой вкус можно указать сколько угодно «путей», все они заканчиваются эндпоинтами (endpoints) и имеют в наличие адрес, к которому они «принадлежат».
              • endpoints в пункте acg в конфигурациях — это название метода и его тип запроса HTTP. Пример из конфигураций выше: user.castle.create, post-запрос, на адрес /user/castle. Наличие endpoint полезно, когда один путь поддерживает много типов запроса (get, post, delete для одного адреса). Например, apple.iphone.ten.account может поддерживать endpoints get (тип запроса get), delete (delete), create (post), modify (put) к адресу /apple/iphone/ten/account.
              • Множество эндпоинтов к одному адресу записываются в одну строку к пункту endpoints через запятую — get:get, delete:delete, create:post, modify:put (пример).

              Установка acg


              Установить acg можно с помощью pip.

              $ pip install acg
              

              Pip3:

              $ pip3 install acg
              

              Или собрать исходный код:

              $ python setup.py install
              

              Команда acg


              Создали .acg.yml, вписали туда свои настройки, открыли терминал в директории с конфигурациями:

              $ acg
              

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

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

              Как установить и использовать свой клиент


              Установка потребует знакомой вам команды `pip install {name}`, где названием пакета будет значение name в конфигурационном файле.

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

              Например, вы написали конфигурации под проект telegrambotapi.
              Тогда используйте клиент в Python-коде так:

              from telegrambotapi import telegrambotapi_client
              
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/339150/


              Метки:  

              Декомпиляция RNC ProPack длиной в 5 лет

              Понедельник, 02 Октября 2017 г. 15:40 + в цитатник

              Приветствую, друзья!



              В данном материале я расскажу Вам, как на протяжении нескольких лет занимался реверсом 46 КБ (кажется — всего то!) исполняемого файла от AmigaOS, узнал много нового для себя, испробовал множество разных технологий, и, в итоге, добился своего — превратил декомпилированный Motorola M68000 ассемблерный код в C-шный код, которым может воспользоваться любой желающий.

              Читать дальше ->

              https://habrahabr.ru/post/339138/


              Метки:  

              Важнейшее ИТ-событие осени: Dell EMC Forum 2017

              Понедельник, 02 Октября 2017 г. 15:26 + в цитатник
              DellEMCTeam сегодня в 15:26 Администрирование

              Важнейшее ИТ-событие осени: Dell EMC Forum 2017

                Вместе с началом осени приближается Dell EMC Forum 2017 – одно из самых важных мероприятий компании, которое пройдет 5 октября в Москве на территории «Крокус Экспо». Подробности под катом.



                Ежегодно тема Форума меняется вслед за новейшими мировыми IT-трендами. В этом году Dell EMC Forum пройдет под знаком «цифровой трансформации».

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

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

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

                Особое внимание посвящено не теряющей актуальность теме защиты от утери данных и порчи оборудования. Новые гибридные облачные решения для Microsoft Azure Stack помогут организовать защищенное облачное хранилище для резервного копирования. Будут продемонстрированы технологии защиты данных для популярных в российской бизнес-среде приложений Microsoft и Oracle. Dell EMC совместно с Intel анонсируют сверхзащищенные устройства для работы в экстремальных природных условиях и на опасном производстве.

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

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

                • Цифровая трансформация. Получите новые впечатляющие бизнес-результаты, используя адаптивное ПО, Интернет вещей (IoT) и аналитику Big Data.
                • Трансформация ИТ. Познакомьтесь с новейшими платформами, конвергентными системами и облачными технологиями на примере Microsoft Azure и SOHO-решений.
                • Трансформация рабочих мест. Обеспечьте своих сотрудников современными технологиями для работы в офисе и за его пределами.
                • Трансформация систем безопасности. Узнайте о новых способах борьбы с ИТ-угрозами, защите и восстановлении инфраструктуры.

                Дата проведения: 5 октября 2017.
                Место проведения: выставочный комплекс «Крокус Экспо».

                -> Подробная программа Dell EMC Forum 2017 на сайте форума
                -> Участие в мероприятии бесплатное, требуется обязательная регистрация
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/339100/


                Метки:  

                [Перевод] Новшества серверного рендеринга в React 16

                Понедельник, 02 Октября 2017 г. 15:21 + в цитатник
                ru_vds сегодня в 15:21 Разработка

                Новшества серверного рендеринга в React 16

                • Перевод
                Вышел React 16! Рассказывая об этом событии, можно упомянуть множество замечательных новостей (вроде архитектуры ядра Fibers), но лично меня больше всего восхищают улучшения серверного рендеринга. Предлагаю подробно всё это разобрать и сравнить с тем, что было раньше. Надеюсь, серверный рендеринг в React 16 понравится вам так же, как он понравился мне.



                Как работает SSR в React 15


                Для начала вспомним, как серверный рендеринг (Server-Side Rendering, SSR) выглядит в React 15. Для выполнения SSR обычно поддерживают сервер, основанный на Node, использующий Express, Hapi или Koa, и вызывают renderToString для преобразования корневого компонента в строку, которую затем записывают в ответ сервера:

                // используем Express
                import { renderToString } from "react-dom/server"
                import MyPage from "./MyPage"
                app.get("/", (req, res) => {
                  res.write("");
                  res.write("
                ");    res.write(renderToString());  res.write("
                ");  res.end(); });

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

                import { render } from "react-dom"
                import MyPage from "./MyPage"
                render(, document.getElementById("content"));

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

                Как же SSR выглядит в React 16?

                Обратная совместимость React 16


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

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

                Метод render() становится методом hydrate()


                Надо отметить, что переходя с React 15 на React 16, вы, возможно, столкнётесь со следующим предупреждением в браузере.


                Очередное полезное предупреждение React. Метод render() теперь называется hydrate()

                Оказывается, в React 16 теперь есть два разных метода для рендеринга на клиентской стороне. Метод render() для ситуаций, когда рендеринг выполняются полностью на клиенте, и метод hydrate() для случаев, когда рендеринг на клиенте основан на результатах серверного рендеринга. Благодаря обратной совместимости новой версии React, render() будет работать и в том случае, если ему передать то, что пришло с сервера. Однако, эти вызовы следует заменить вызовами hydrate() для того, чтобы система перестала выдавать предупреждения, и для того, чтобы подготовить код к React 17. При таком подходе код, показанный выше, изменился бы так:

                import { hydrate } from "react-dom"
                import MyPage from "./MyPage"
                hydrate(, document.getElementById("content"))


                React 16 может работать с массивами, строками и числами


                В React 15 метод компонента render() должен всегда возвращать единственный элемент React. Однако, в React 16 рендеринг на стороне клиента позволяет компонентам, кроме того, возвращать из метода render() строку, число, или массив элементов. Естественно, это касается и SSR.

                Итак, теперь можно выполнять серверный рендеринг компонентов, который выглядит примерно так:

                class MyArrayComponent extends React.Component {
                  render() {
                    return [
                      
                first element
                ,      
                second element
                   ];  } } class MyStringComponent extends React.Component {  render() {    return "hey there";  } } class MyNumberComponent extends React.Component {  render() {    return 2;  } }

                Можно даже передать строку, число или массив компонентов методу API верхнего уровня renderToString:

                res.write(renderToString([
                      
                first element
                ,      
                second element
                   ])); // Не вполне ясно, зачем так делать, но это работает! res.write(renderToString("hey there")); res.write(renderToString(2));

                Это должно позволить вам избавиться от любых div и span, которые просто добавлялись к вашему дереву компонентов React, что ведёт к общему уменьшению размеров HTML-документов.

                React 16 генерирует более эффективный HTML


                Если говорить об уменьшении размеров HTML-документов, то React 16, кроме того, радикально снижает излишнюю нагрузку, создаваемую SSR при формировании HTML-кода. В React 15 каждый HTML-элемент в SSR-документе имеет атрибут data-reactid, значение которого представляет собой монотонно возрастающие ID, и текстовые узлы иногда окружены комментариями с react-text и ID. Для того, чтобы это увидеть, рассмотрим следующий фрагмент кода:

                renderToString(
                  
                   This is some server-generated HTML.  
                );

                В React 15 этот фрагмент сгенерирует HTML-код, который выглядит так, как показано ниже (переводы строк добавлены для улучшения читаемости кода):

                 This is some  server-generated    HTML.

                В React 16, однако, все ID удалены из разметки, в результате HTML, полученный из такого же фрагмента кода, окажется значительно проще:

                 This is some server-generated HTML.

                Такой подход, помимо улучшения читаемости кода, может значительно уменьшить размер HTML-документов. Это просто здорово!

                React 16 поддерживает произвольные атрибуты DOM


                В React 15 система рендеринга DOM была довольно сильно ограничена в плане атрибутов HTML-элементов. Она убирала нестандартные HTML-атрибуты. В React 16, однако, и клиентская, и серверная системы рендеринга теперь пропускают произвольные атрибуты, добавленные к HTML-элементам. Для того, чтобы узнать больше об этом новшестве, почитайте пост Дэна Абрамова в блоге React.

                SSR в React 16 не поддерживает обработчики ошибок и порталы


                В клиентской системе рендеринга React есть две новых возможности, которые, к сожалению, не поддерживаются в SSR. Это — обработчики ошибок (Error Boundaries) и порталы (Portals). Обработчикам ошибок посвящён отличный пост Дэна Абрамова в блоге React. Учитывайте однако, что (по крайней мере сейчас) обработчики не реагируют на серверные ошибки. Для порталов, насколько я знаю, пока даже нет пояснительной статьи, но Portal API требует наличия узла DOM, в результате, на сервере его использовать не удастся.

                React 16 производит менее строгую проверку на стороне клиента


                Когда вы восстанавливаете разметку на клиентской стороне в React 15, вызов ReactDom.render() выполняет посимвольное сравнение с серверной разметкой. Если по какой-либо причине будет обнаружено несовпадение, React выдаёт предупреждение в режиме разработки и заменяет всё дерево разметки, сгенерированной на сервере, на HTML, который был сгенерирован на клиенте.

                В React 16, однако, клиентская система рендеринга использует другой алгоритм для проверки правильности разметки, которая пришла с сервера. Эта система, в сравнении с React 15, отличается большей гибкостью. Например, она не требует, чтобы разметка, созданная на сервере, содержала атрибуты в том же порядке, в котором они были бы расположены на клиентской стороне. И когда клиентская система рендеринга в React 16 обнаруживает расхождения, она лишь пытается изменить отличающееся поддерево HTML, вместо всего дерева HTML.

                В целом, это изменение не должно особенно сильно повлиять на конечных пользователей, за исключением одного факта: React 16, при вызове ReactDom.render() / hydrate(), не исправляет несовпадающие HTML-атрибуты, сгенерированные SSR. Эта оптимизация производительности означает, что вам понадобится внимательнее относиться к исправлению несовпадений разметки, приводящих к предупреждениям, которые вы видите в режиме development.

                React 16 не нужно компилировать для улучшения производительности


                В React 15, если вы используете SSR в таком виде, в каком он оказывается сразу после установки, производительность оказывается далеко не оптимальной, даже в режиме production. Это так из-за того, что в React есть множество замечательных предупреждений и подсказок для разработчика. Каждое из этих предупреждений выглядит примерно так:

                if (process.env.NODE_ENV !== "production") {
                  // что-то тут проверить и выдать полезное
                  // предупреждение для разработчика.
                }

                К сожалению, оказывается, что process.env — это не обычный объект JavaScript, и обращение к нему — операция затратная. В итоге, даже если значение NODE_ENV установлено в production, частая проверка переменной окружения ощутимо замедляет серверный рендеринг.

                Для того, чтобы решить эту проблему в React 15, нужно было бы скомпилировать SSR-код для удаления ссылок на process.env, используя что-то вроде Environment Plugin в Webpack, или плагин transform-inline-environment-variables для Babel. По опыту знаю, что многие не компилируют свой серверный код, что, в результате, значительно ухудшает производительность SSR.

                В React 16 эта проблема решена. Тут имеется лишь один вызов для проверки process.env.NODE_ENV в самом начале кода React 16, в итоге компилировать SSR-код для улучшения производительности больше не нужно. Сразу после установки, без дополнительных манипуляций, мы получаем отличную производительность.

                React 16 отличается более высокой производительностью


                Если продолжить разговор о производительности, можно сказать, что те, кто использовал серверный рендеринг React в продакшне, часто жаловались на то, что большие документы обрабатываются медленно, даже с применением всех рекомендаций по улучшению производительности. Тут хочется отметить, что рекомендуется всегда проверять, чтобы переменная NODE_ENV была установлена в значение production, когда вы используете SSR в продакшне.

                С удовольствием сообщают, что, проведя кое-какие предварительные тесты, я обнаружил значительное увеличение производительности серверного рендеринга React 16 на различных версиях Node:


                Рендеринг на сервере в React 16 быстрее, чем в React 16. Чем ниже столбик — тем результат лучше

                При сравнении с React 16, даже с учётом того, что в React 15 обращения к process.env были устранены благодаря компиляции, наблюдается рост производительности примерно в 2.4 раза в Node 4, в 3 раза — в Node 6, и замечательный рост в 3.8 раза в Node 8.4. Если сравнить React 16 и React 15 без компиляции последнего, результаты на последней версии Node будут просто потрясающими.

                Почему React 16 настолько быстрее, чем React 15? Итак, в React 15 серверные и клиентские подсистемы рендеринга представляли собой, в общих чертах, один и тот же код. Это означает потребность в поддержке виртуального DOM во время серверного рендеринга, даже учитывая то, что этот vDOM отбрасывался как только осуществлялся возврат из вызова renderToString. В результате, на сервере проводилось много ненужной работы.

                В React 16, однако, команда разработчиков переписала серверный рендеринг с нуля, и теперь он совершенно не зависит от vDOM. Это и даёт значительный рост производительности.

                Тут хотелось бы сделать одно предупреждение, касающееся ожидаемого роста производительности реальных проектов после перехода на React 16. Проведённые мной тесты заключались в создании огромного дерева из с одним очень простым рекурсивным компонентом React. Это означает, что мой бенчмарк относится к разряду синтетических и почти наверняка не отражает сценарии реального использования React. Если в ваших компонентах имеется множество сложных методов render, обработка которых занимает много циклов процессора, React 16 ничего не сможет сделать для того, чтобы их ускорить. Поэтому, хотя я и ожидаю увидеть ускорение серверного рендеринга при переходе на React 16, я не жду, скажем, трёхкратного роста производительности в реальных приложениях. По непроверенным данным, при использовании React 16 в реальном проекте, удалось достичь роста производительности примерно в 1.3 раза. Лучший способ понять, как React 16 отразится на производительности вашего приложения — попробовать его самостоятельно.

                React 16 поддерживает потоковую передачу данных


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

                Потоковый рендеринг может уменьшить время до получения первого байта (TTFB, Time To First Byte). Начало документа попадает в браузер ещё до создания продолжения документа. В результате, все ведущие браузеры быстрее приступят к разбору и рендерингу документа.
                Ещё одна отличная вещь, которую может получить от рендеринга в поток — это возможность реагировать на ситуацию, когда сервер выдаёт данные быстрее, чем сеть может их принять. На практике это означает, что если сеть перегружена и не может принимать данные, система рендеринга получит соответствующий сигнал и приостановит обработку данных до тех пор, пока нагрузка на сеть не упадёт. В результате окажется, что сервер будет использовать меньше памяти и сможет быстрее реагировать на события ввода-вывода. И то и другое способно помочь серверу нормально работать в сложных условиях.

                Для того, чтобы организовать потоковый рендеринг, нужно вызвать один из двух новых методов react-dom/server: renderToNodeStream или renderToStaticNodeStream, которые соответствуют методам renderToString и renderToStaticMarkup. Вместо возврата строки эти методы возвращают объект Readable. Такие объекты используются в модели работы с потоками Node для сущностей, генерирующих данные.

                Когда вы получаете поток Readable из методов renderToNodeStream или renderToStaticNodeStream, он находится в режиме приостановки, то есть, рендеринг в этот момент ещё не начинался. Рендеринг начнётся только в том случае, если вызвать read, или, более вероятно, подключить поток Readable с помощью pipe к потоку Writable. Большинство веб-фреймворков Node имеют объект ответа, который унаследован от Writable, поэтому обычно можно просто перенаправить Readable в ответ.

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

                // используем Express
                import { renderToNodeStream } from "react-dom/server"
                import MyPage from "./MyPage"
                app.get("/", (req, res) => {
                  res.write("");
                  res.write("
                ");  const stream = renderToNodeStream();  stream.pipe(res, { end: false });  stream.on('end', () => {    res.write("
                ");    res.end();  }); });

                Обратите внимание на то, что когда мы перенаправляем поток в объект ответа, нам необходимо использовать необязательный аргумент { end: false } для того, чтобы сообщить потоку о том, что он не должен автоматически завершать ответ при завершении рендеринга. Это позволяет нам закончить оформление тела HTML-документа, и, как только поток будет полностью записан в ответ, завершить ответ самостоятельно.

                Подводные камни потокового рендеринга


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

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

                https://habrahabr.ru/post/339148/


                Метки:  

                [Из песочницы] Как сделать веб-приложение для вашего собственного Bluetooth Low Energy девайса?

                Понедельник, 02 Октября 2017 г. 14:59 + в цитатник
                Несколько недель назад я, развлечения ради, собрал простенькую роботизированную руку (а-ля манипулятор) и решил прикрутить к ней управление со смартфона через Bluetooth. Опыта в разработке нативных мобильных приложений у меня пока нет, с Apache Cordova я уже знаком, а вот задействовать Web Bluetooth API было бы интересно, приправив фишками Progressive Web Apps.

                Картинка Для Привлечения Внимания
                Картинка Для Привлечения Внимания, ведущая под кат


                На первый взгляд может показаться, что статей по ключевым словам достаточно: есть спецификация Web Bluetooth, подробная статья в блоге Google Developers с примерами, есть подробный разбор Bluetooth Low Energy, примеры реверс-инжиниринга протоколов различных BLE устройств и даже моргания «умными» лампочками и получения данных от фитнес-браслетов прямо из браузера — что может пойти не так?
                Читать дальше ->

                https://habrahabr.ru/post/339146/


                Метки:  

                «Еще один шаг к блокчейну»: Bitfury Group представили Exonum 0.2

                Понедельник, 02 Октября 2017 г. 14:22 + в цитатник

                Метки:  

                Компьютерное зрение. Ответы экспертов Intel

                Понедельник, 02 Октября 2017 г. 14:17 + в цитатник
                saul сегодня в 14:17 Разработка

                Компьютерное зрение. Ответы экспертов Intel

                  Две недели назад мы предложили читателям Хабры задать свои вопросы создателям библиотеки компьютерного зрения OpenCV. Вопросов было задано много, причем, интересных — значит, эта тема интересует не только компанию Intel, но и широкие массы разработчиков. Без лишних слов переходим к публикации ответов и приглашаем к их обсуждению. А также объявляем авторов лучших вопросов! В самом конце поста.



                  Вопрос noonv

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

                  Анатолий Бакшеев. Несколько моих мыслей:

                  • everything learnable, minimum handcrafting
                  • новое – это хорошо забытое старое.

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

                  Вадим Писаревский. Мое видение достаточно стандартно. Ближайшее будущее (вообще-то уже настоящее) за глубоким/глубинным обучением, причем оно будет применяться все более изощренным и нетривиальным образом, что доказала прошедшая конференция CVPR 2017. 6 лет назад deep learning появился, точнее, возродился после статьи Крыжевского (Alexnet), и тогда он хорошо решал только одну задачу – распознавание класса объекта при условии нахождения одного доминирующего объекта в кадре, без определения его положения. 2 года назад про него уже говорили почти все в нашей области. Придумали первые сетки для детектирования объектов и сетки для семантической сегментации. До этого задача семантической сегментации считалась безнадежной, нерешаемой задачей, как доказательство теоремы Ферма.

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

                  1. попытаться применять deep learning для новых задач, все более и более сложных,
                  2. в-частности, применить к задачам, где трудно собрать огромные тренировочные базы.

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

                  Вопрос IliaSafonov

                  Нет ли планов добавить в OpenCV возможность обрабатывать 3D (volumetric) изображения? Работаю с томографическими изображениями размера порядка 4000х4000х4000. Существующие open-source библиотеки для 3D, мягко говоря, бедноваты и медленноваты по сравнению с OpenCV.

                  Вадим. Базовые поэлементные функции уже могут работать с такими данными. 3х-мерной фильтрации и каких-то других более сложных алгоритмов пока нет. Но, правда, есть глубокие сетки, которые могут делать некоторые преобразования над 3D массивами данных. Если есть список нужных операций, приглашаю подать запрос на расширение функциональности. Если будет хороший детальный запрос с описанием задачи, со ссылками, то, вполне возможно, что это станет одним из наших проектов для следующего Google Summer of Code (лето 2018).

                  Вопрос MaximKucherenko

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

                  Анатолий. Сложно ответить, не имея самих изображений. Можно попробовать сделать CNN которая бы как-то восстанавливала картинку. Посмотрите работы по CNN impainting, где сетка «додумывает» испорченные части изображения. Или CNN debluring, где сетка, по сути, пытается выучить классический Debluring алгоритм. То же можно попробовать сделать и вам.
                  В вашем случае сетка может быть в каком-то месте рекуррентной, чтобы учитывать предыдущие кадры для синтеза «чистого» изображения.

                  Вадим. Нужен какой-то вариант temporal filtering с учетом движения машин и камеры – т.е. надо собирать кадры из нескольких, мы говорим про некую вариацию на тему video superresolution, но без повышения разрешения. Берется временная окрестность каждого кадра, вычисляется плотный оптический поток между центральным кадром и соседними по времени, составляется некая функция штрафа для результирующего «улучшенного» изображения – оно одновременно должно быть гладким и похожим на все изображения из окрестности с учетом скомпенсированного движения. Потом запускается итеративный процесс оптимизации. Не уверен что такой алгоритм будет производить чудеса, особенно в экстремальных условиях (метель), но в ситуациях умеренной сложности, возможно, получится улучшить изображение на выходе. Но в самом начале, без такого алгоритма, можно попробовать функцию cv::equalizeHist(), может она что-то даст.

                  Вопрос uzh13

                  Какой язык лучше всего подходит для экспериментов с CV? Стоит ли разбираться с Erlang для этого?
                  Есть ли канонический набор книг или цикл статей, для быстрого старта с техническим зрением? Есть ли с кем пообщаться?

                  Вадим. В данный момент наиболее предпочтительные варианты:

                  1. C++ с хорошей средой разработки,
                  2. Python

                  В зависимости от обстоятельств Питон может быть предпочтительнее, чем C++ или наоборот. Erlang слишком экзотичен для этой области. Возможно, вы на нем что-то и напишете, но потом трудно будет найти единомышленников, чтобы этот код обсуждать и развивать вместе. Из книжек по классическому компьютерному зрению можно порекомендовать книгу R. Szeliski. Computer Vision, драфт которой доступен здесь. Есть множество книг по OpenCV, как правило, тоже на английском. С deep learning можно начать знакомство, используя следующий учебник. Насчет общения вопрос более сложный. Ну, собственно, интернет сейчас есть у всех, можно присоединиться к какому-нибудь проекту.

                  Анатолий. С++ и Python – это, по-моему классика для быстрого прототипирования и для серьезных решений никуда от этого не деться.

                  В дополнение к ответу Вадима рекомендую awesome репозитории на github:


                  Вообще видел awesome репозитории поддерживаемые энтузиастами для многих областей.

                  Вопрос ChaikaBogdan

                  Как начать свою карьеру в области CV, если ты не имеешь в нем опыта? Где набраться опыта решения реальных задач и стажа в этой области, который так любят HRы?

                  Немного TL;DR который является предысторией возникновения вопроса
                  Я отучился в ВУЗе, где не было такого направления и, естественно, пошел работать в другую область (программная инженерия, автоматизация). Будь у меня возможность и понимание, насколько потенциально круто работать в области CV, я бы поступил на него пусть даже в другой ВУЗ, но, увы, я узнал о нем слишком поздно. Переучиваться на второе высшее уже как-то непозволительно долго.

                  По долгу службы попалась задача детектирования с помощью Python+OpenCV, решил кое-как через template match (благо предметная область позволяла). Было весело, ново и вообще всем понравилось, особенно мне.

                  Начал изучать возможность самообучения, прошел курс Introduction to Computer Vision (Udacity-Georgia Tech) и начал практические от PyImageSearch.
                  Параллельно смотрел вакансии на Upwork и PyImageSearch Jobs, Fiverr и расстраивался, так как знаний явно не хватает для решения реальных задач (например, почти везде мешают light/shadow/angle conditions). Не уверен, что даже полное прохождение, скажем, Guru курса от PyImageSearch поможет найти достойную работу, ибо примеры уж очень «идеальные» и редко работают, как задумывались в реальных условиях.

                  На биржах типа Fiverr, Upwork, PyImageJobs большая конкуренция и требуется выполнение задач очень быстро. А хочется чего-то с небольшим порогом вхождения и взлетной learning-curve. Про удаленную работу вообще молчу. Плюс, везде еще хотят deep/machine learning вдогонку.

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

                  Анатолий. Я думаю, вы на правильном пути.

                  Вообще, если человек хочет работать в данной области, думаю, любой нормальный руководитель возьмет его к себе даже без навыков. Главное продемострировать желание работать, выраженное в конкретных действиях: показать алгоритмы, которые вы сделали для OpenCV, для caffe/tf/torch, показать ваши проекты на github, показать ваш рейтинг на Kaggle. У меня есть инженер, который ушел с предыдущей скучной не-CV работы, уехал в Тайланд и год нигде не работал. Через полгода ему там стало скучно, и он начал участвовать в Kaggle соревнованиях. Потом когда он пришел ко мне, его хороший рейтинг на Kaggle тоже сыграл свою роль даже без опыта в CV. Сейчас это один из сильнейших моих инженеров.

                  Вадим. У меня есть для вас «история успеха». Одно время в OpenCV была подана серия патчей с добавлением функциональности по распознаванию лиц. Конечно, сейчас задачу распознавания лиц решают с помощью deep learning, а тогда это были достаточно простые алгоритмы, но не суть. Автор кода был некий человек из Германии по имени Филипп. Он тогда на основной работе занимался скучными проектами, по его собственным словам, программировал DSP. Нашел время после работы заняться распознаванием лиц, подготовил патчи, мы их приняли. Естественно, он там был указан как автор. Через некоторое время он мне написал радостное письмо что в том числе благодаря такому наглядному «резюме» нашел работу, связанную со компьютерным зрением.

                  Конечно, это далеко не единственный путь. Просто если вам действительно нравится компьютерное зрение, приготовьтесь заниматься им сверхурочно на добровольных началах, нарабатывайте практический опыт. А насчет образования – как вы думаете, сколько человек из команды OpenCV получили образование в этой области? Ноль. Все мы по образованию математики, физики, инженеры. Важны общие навыки (которые развиваются практикой) изучать новый материал, в-основном на английском, программировать, общаться, решать математические и инженерные задачи. А конкретные знания – это преходящее. С появлением deep learning несколько лет назад большая часть наших знаний стала устаревшей, а через несколько лет может и deep learning станет устаревшей технологией.

                  Вопрос aslepov78

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

                  Вадим. Перефразируя Уинстона Черчилля, возможно, [современное] глубинное обучение — это плохой способ решать задачи компьютерного зрения, но все остальные известные нам – еще хуже. Но монополии на исследования нет ни у кого, слава богу, придумывайте свое. И на самом деле люди придумывают. Я сам был большим скептиком этого подхода несколько лет назад, но, во-первых, результаты налицо, а во-вторых, оказалось, что глубинное обучение можно применять не тупо (взял первую попавшуюся архитектуру, набрал миллион тренировочных примеров, запустил кластер и через неделю получил модель или не получил), а можно применять творчески. И тогда это становится поистине волшебной технологией, и начинают решаться задачи, к которым до этого вообще непонятно было, как подступиться. Например определение 3D поз игроков на поле с одной камеры.

                  Вопрос aslepov78

                  OpenCV превратился в склад алгоритмов из разных областей (вычислительная геометрия, обработка сигнала, machine learning и т.д.). А между тем, есть более продвинутые библиотеки по той же вычислительной геометрии (не говоря о нейросетях). Выходит, смысл OpenCV только в одном — все зависимости в одном флаконе?

                  Вадим. Мы делаем инструмент прежде всего для себя и наших коллег, а также интегрируем патчи от сообщества пользователей (не все, правда, но большую часть), т.е. то, что пользователи считают полезным для себя и других. Было бы хорошо, конечно, если бы в C++ была некая общая модель – как писать библиотеки так, чтобы они были друг с другом совместимыми, и их можно было бы легко использовать совместно и не было бы проблем с построением и конвертированием структур данных. Тогда, возможно, OpenCV могла бы быть безболезненно заменена серией более специальных библиотек. Но такой модели пока нет, и, может, и не будет. В Питоне есть подобная модель, построенная вокруг numpy и системы модулей и расширений, и питоновские обертки для OpenCV, как мне кажется, довольно органично туда встроены. Я думаю, если вы практически поработаете в области CV несколько лет, то придет понимание, зачем нужна OpenCV и почему она устроена так, как устроена. Или не придет.

                  Вопрос aslepov78

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

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

                  Вопрос vlasenkofedor

                  Расскажите, пожалуйста, об наиболее интересных проектах с оригинальным решением — OpenCV с микрокомпьютерами (Raspberry, ASUS ...)

                  Анатолий. У нас мало опыта работы с данными устройствами

                  Вопрос killla

                  Есть ли небольшие платы (уровня Raspberry Pi с процессором, заточенным под видеообработку OpenCV) и видеокамерой, подключенной напрямую к микропроцессору (микроконтроллеру) без всяких посредников в виде USB и его больших задержек? Чтобы можно было бы взять его и на коленке быстро сделать устройство для подсчета ворон на грядке или устройство для слежения за объектом (простейшая обработка изображения + реакция с минимальными задержками на раздражители).

                  Мой собственный опыт
                  Крайний раз пытался решать подобную задачу года 4 назад. 1) Все популярные доступные платы разработки не тянули обработку хорошего видео потока быстрее чем 1-2 раза в секунду, задействовать DSP без программирования на низких уровнях было нереально, да и достать контроллер с мощным хорошим документированным DSP и софтом у нему было непросто 2) все камеры во всех примерах цепляются по USB, соответственно на пустом месте огромные задержки + софтовая обработка камеры маломощным основным процессором. На распознавание процессорного времени уже почти не остается.

                  Вадим. Raspberry Pi, начиная со второго поколения, содержит ARM CPU с векторными инструкциями NEON. OpenCV довольно шустро должна работать на такой железке. Касательно скорости захвата видео – мы как-то из USB 2 выжимали 20-30 кадров/сек, не очень понятно о чем речь.

                  Вопрос killla

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

                  Вадим. OpenCV собирается под любой ARM Linux и в значительной степени оптимизирована с использованием NEON. Думаю, на Raspberry Pi стоит смотреть в первую очередь, например, вот опыт энтузиаста.

                  Вопрос killla

                  Обобщая, задам вопрос так: можно ли в 2017-2018 году студенту 2-3 курса IT-специальности с базовыми навыками программирования, уложившись в 10000 руб., достать железку уровня 2-3 летнего телефона, на которой за 2-4 недели изучения OpenCV и написания кода создать простейшее устройство: камеру на мотоподвесе с парой осей движения, которая будет висеть на балконе и следить за движением любимой собаки во дворе?

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

                  • как обрабатывать движения/колыхания самой камеры, какое поведение ожидается в темное время суток, туман, дождь, снег, как обрабатывать разные времена года,
                  • как обрабатывать разные условия освещения – пасмурно, солнце в зените, солнце на восходе-закате с большими тенями,
                  • как система должна обрабатывать появление другого объекта в области видимости (машины, человека, кошки, другой собаки, другой собаки такой же породы),
                  • какое качество считается допустимым (система выдает вам ложные сообщения о пропаже собаки каждые 5 минут, система сообщает о пропаже собаки через сутки после ее пропажи)
                  • и т.д.

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

                  Вопрос almator

                  Не работает функция model = cv2.ANN_MLP() на питоне.

                  Код функции
                  import cv2
                  import numpy as np
                  import math
                  class NeuralNetwork(object):
                  
                  def __init__(self):
                  self.model = cv2.ANN_MLP()
                  
                  def create(self):
                  layer_size = np.int32([38400, 32, 4])
                  self.model.create(layer_size)
                  self.model.load('mlp_xml/mlp.xml')
                  
                  def predict(self, samples):
                  ret, resp = self.model.predict(samples)
                  return resp.argmax(-1)
                  
                  model = NeuralNetwork()
                  model.create()

                  Ошибка AttributeError: 'module' object has no attribute 'ANN_MLP'

                  Вадим. Посмотрите пример letter_recog.py из поставки OpenCV.

                  Вопрос almator

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

                  Анатолий. В OpenCV не планируется тренировка сетей, только быстрый оптимизированный inference. У нас уже есть CNN Face Detector который может работать больше 100fps на современном Core i5 (правда выложить мы его в публичный доступ не можем). Думаю многие текущие алгоритмы будут постепенно инструментированы небольшими (>5000fps) вспомогательными сеточками, будь то featues или optical flow, или RANSAC, или любой другой алгоритм.

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

                  Вопрос almator

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

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

                  Вопрос WEBMETRICA

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

                  Анатолий. Я думаю, это произойдет еще не скоро. Более того, не существует метода достоверно сказать, как видят мир другие существа.

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

                  Вопрос WEBMETRICA

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

                  Вадим. Возможно все. Нужно идти от конкретной задачи, мне кажется.

                  Вопрос barabanus

                  Почему нельзя умножить матрицу на вектор (cv::Vec_) в OpenCV, но при этом можно умножить на точку? (cv::Point_) Получается, что проще манипулировать с точками тогда, когда математически это не точки, а вектора. Например, направление линии легче хранить как точку, а не как вектор — меньше преобразований типов в цепочке операций.

                  Анатолий. Мне известна эта проблема уже лет 8. Насколько я помню, это невозможно реализовать — можете сами попробовать. Там получается что-то вроде неоднозначности вызова конструктора для служебного промежуточного типа — компилятор не может сам решить, какой конструктор вызывать и выдает ошибку. Вам вручную придется преобразовать в точку через cv::Mat * Point_<...>(Vec_<...>).

                  Вадим. Предлагаю подать запрос. Возможно, что в данном конкретном случае просто пропустили эту функцию, или намеренно ее отключили, чтобы не запутать C++ компилятор во всем множестве перекрытых операторов ‘*’ – иногда это случается.

                  Вопрос barabanus

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

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

                  Вопрос perfect_genius

                  Пробует ли Intel создавать аппаратные нейросети для обработки изображений и есть ли результаты?

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

                  Вадим. На данном этапе нам известны попытки, и наши коллеги в них принимают активное участие, задействовать имеющееся железо (CPU, GPU) для ускорения выполнения сеток. Попытки довольно успешные. Ускоренные решения для CPU (библиотека MKL-dnn, и скомпилированный с ней Intel Caffe) и для GPU (clDNN) позволяют запускать большое количество популярный сетей, таких как AlexNet, GooLeNet/Inception, Resnet-50 и т.д. в реальном времени на обычном компьютере без мощной дискретной карты, на обычном ноутбуке. Даже OpenCV, хоть она пока и не использует эти оптимизированные библиотеки, позволяет запускать некоторые сетки для классификации, детектирования и семантической сегментации в реальном времени на ноутбуке без дискретной графики. Попробуйте наши примеры и убедитесь в этом сами. Эффективная работа сетей ближе, чем многим кажется.

                  Вопрос Mikhail063

                  Пользуюсь OpenCV не первый год, но столкнулся с такой интересной штуковиной. Есть камера, которая передает сигнал, и есть телеметрия, которая принимает сигнал, а еще есть тюнер, который декодирует сигнал в видео на компьютер. Так вот программы по захвату изображения работают на ура, но библиотека OpenCV при попытке вывести на экран изображение выдает черный экран, а при попытке выйти из программы, вываливается синий экран) ВОПРОС Почему это происходит?

                  Характеристики устройств: TV-тюнер EasyCap USB 2.0, Приемник FPV видеосигнала 5.8ГГц RC832, FPV камера с передатчиком 5.8ГГц 1000TVL.

                  Видео ошибки

                  Вадим. Потому что где-то какая-то ошибка, очевидно :) Надо начать с локализации.

                  Вопрос KOLANICH

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

                  Анатолий. Иногда классические фичи могут быть быстрым решением.

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

                  Вопрос vishnerevsky

                  Я использовал версию OpenCV 3.1.0, пользовался cv2.HOGDescriptor() и .setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()), остался под хорошим впечатлением. Но я хочу уменьшить количество ложных срабатываний и поэтому хочу узнать, какой набор данных использовался для обучения SVM классификатора и могу ли я получить доступ к этому набору? Также хотелось бы узнать, планируется ли создание модулей OpenCV для распознавания различных объектов на базе YOLO или Semantic Segmentation?

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

                  Вопрос iv_kovalyov

                  «Посоветуйте, как можно распознать штамп слева в изображении справа? Штампы не идентичны, но есть общие элементы.



                  Пробовал find_obj.py из примеров opencv, но в данной ситуации этот пример не помогает.

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

                  Эксперты Intel признали лучшими вопросы IliaSafonov об использовании OpenCV для 3D объектов и ChaikaBogdan о построении карьеры в области компьютерного зрения для новичка. Авторам этих вопросов достаются призы от Intel. Поздравляем победителей и благодарим Анатолия и Вадима за познавательные ответы!
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338926/


                  Метки:  

                  Поиск сообщений в rss_rss_hh_new
                  Страницы: 1437 ... 1169 1168 [1167] 1166 1165 ..
                  .. 1 Календарь