Русский
Русский
English
Статистика
Реклама

Сбор данных

Что может пойти не так с Data Science? Сбор данных

17.07.2020 14:11:33 | Автор: admin

Сегодня существует 100500 курсов по Data Science и давно известно, что больше всего денег в Data Science можно заработать именно курсами по Data Science (зачем копать, когда можно продавать лопаты?). Основной минус этих курсов в том, что они не имеют ничего общего с реальной работой: никто не даст вам чистые, обработанные данные в нужном формате. И когда вы выходите с курсов и начинаете решать настоящую задачу всплывает много нюансов.

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

И первое обо что спотыкаются люди, начав работать с реальными данными это собственно сбор этих самых релевантных нам данных. Ключевой посыл этой статьи:

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

А главное, обсудим, что делать, чтобы этого не допустить.

По разным оценкам, очистка, трансформация, data processing, feature engineering и тд занимают 80-90% времени, а анализ 10-20%, в то время как практически весь учебный материал фокусируется исключительно на анализе.

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

И для примера опять же, мы рассмотрим подобные вариации задачи сбора данных и сравнения сообществ для:

  1. Двух сабреддитов Reddit
  2. Двух разделов Хабра
  3. Двух групп Одноклассников

Условный подход в теории


Открыть сайт и почитать примеры, если понятно, заложить несколько часов на чтение, несколько часов на код по примерам и отладку. Добавить несколько часов на сбор. Накинуть несколько часов про запас (умножить на два и прибавить N часов).

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

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

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

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

И сейчас мы продемонстрируем конкретные примеры, где такие параметры и будут меняться.

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

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

Сравнение сообществ Reddit


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

  • Имеется аккуратный, понятный и документированный API.
  • Крайне просто и главное автоматически получается токен.
  • Есть python wrapper с кучей примеров.
  • Сообщество которое занимается анализом и сбором данных на реддите (вплоть до youtube роликов объясняющих, как использовать python wrapper) вот например.
  • Нужные нам методы скорее всего существуют в API. Более того, код выглядит компактно и чисто, ниже пример функции собирающей комментарии к посту.

def get_comments(submission_id):    reddit = Reddit(check_for_updates=False, user_agent=AGENT)    submission = reddit.submission(id=submission_id)    more_comments = submission.comments.replace_more()    if more_comments:        skipped_comments = sum(x.count for x in more_comments)        logger.debug('Skipped %d MoreComments (%d comments)',                     len(more_comments), skipped_comments)    return submission.comments.list()
Взято из этой подборки удобных утилит для обертки.

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

  • Лимиты API мы вынуждены брать данные батчами (спать между запросами и тд).
  • Время сбора для полного анализа и сравнения придется заложить существенное время просто для паука пройтись по сабреддиту.
  • Бот должен крутиться на сервере вы не можете просто запустить его на ноуте, сложить в рюкзак и поехать по делам. Поэтому я запустил все на VPS. По промокоду habrahabr10 можно сэкономить еще 10% стоимости.
  • Физическая недоступность некоторых данных (они видны админам или слишком сложно собираются) это надо учесть, не все данные в принципе можно собрать за адекватное время.
  • Ошибки работы сети: работа с сетью это боль.
  • Это живые настоящие данные они чистыми не бывают.

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

Сравнение разделов Хабра


Переходим к более интересному и нетривиальному случаю сравнению потоков и/или разделов Хабра.

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

  • Сначала вы думаете, что есть API, но его нет. Да-да, у Хабра есть API, но только он недоступен для пользователей (а может и совсем не работает).
  • Потом просто начинаете парсить html import requests, что может пойти не так?
  • А как вообще парсить? Самый простой и часто используемый подход итерировать по ID, отметим, что не самый эффективный и придется обрабатывать разные случаи вот для примера плотность реальных ID среди всех существующих.


    Взято из этой статьи.
  • Сырые данные, завернутые в HTML поверх сети это боль. Например, вы хотите собрать и сохранить рейтинг статьи: выдрали score из html и решили сохранить его как число для дальнейшей обработки:

    1) int(score) кидает ошибку: так как на Хабре минус, как, например в строке "5" это короткое тире, а не знак минуса (неожиданно, да?), поэтому в какой-то момент пришлось поднимать парсер к жизни вот с таким ужасным фиксом.

    try:      score_txt = post.find(class_="score").text.replace(u"","-").replace(u"+","+")      score = int(score_txt)      if check_date(date):        post_score += score
    

    Даты, плюсов и минусов может вообще не быть (как мы видим выше по функции check_date и такое было).

    2) Неэкранированные спецсимволы они придут, нужно быть готовым.

    3) Структура меняется в зависимости от типа поста.

    4) Старые посты могут иметь **странную структуру**.
  • По сути обработку ошибок и что может или не может произойти придется обрабатывать и нельзя предугадать наверняка, что пойдет не так и как еще может быть структура и что где отвалится придется просто пробовать и учитывать ошибки, которые бросает парсер.
  • Потом вы понимаете, что нужно парсить в несколько потоков иначе парс в один потом займет 30+ часов (это чисто время выполнения уже рабочего однопоточного парсера, который спит и не попадает ни под какие баны). В этой статье, это привело в какой-то момент к подобной схеме:



Итого чеклист по сложности:

  • Работа с сетью и парсом html с итерацией и перебором по ID.
  • Документы неоднородной структуры.
  • Много мест, где код может легко упасть.
  • Необходимо писать || код.
  • Отсутствует нужная документация, примеры кода и/или сообщество.

Условная оценка времени для данной задачи будет в 3-5 раз выше, чем для сбора данных с Реддита.

Сравнение групп Одноклассников


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

Начнет с нашего чеклиста сложности и отметим, что многие из них окажутся куда сложнее, чем выглядят вначале:

  • API есть, но в нем почти полностью отсутствуют нужные функции.
  • К определенным функциям нужно просить доступ по почте, то есть выдача доступа не мгновенная.
  • Он ужасно документирован (начнем с того, что всюду мешаются русские и английские термины, причем абсолютно непоследовательно иногда вам нужно просто угадать, что от вас где-то хотят) и, более того, не подходит по дизайну для получения данных, например, нужной нам функции.
  • Требует сессии в документации, а на деле ее не использует и нет никакого способа разобраться во всех тонкостях режимов API, кроме как тыкаться и надеяться, что что-то будет работать.
  • Отсутствуют примеры и сообщество, единственная точка опоры в сборе информации небольшой wrapper на питоне (без большого количества примеров использования).
  • Наиболее рабочим вариантов выглядит Selenium, так как многие нужные данные под замком.
    1) То есть идет авторизация через фиктивного пользователя (и регистрация ручками).

    2) Однако c Selenium никаких гарантий по корректной и повторяемой работе (по крайней в случае с ok.ru точно).

    3) Сайт Ок.ру содержит ошибки JavaScript и иногда странно и непоследовательно себя ведет.

    4) Нужно заниматься пагинацией, подгрузкой элементов и тд

    5) Ошибки API, которые отдает wrapper придется костыльно обрабатывать, например, вот так (кусочек экспериментального кода):

    def get_comments(args, context, discussions):    pause = 1    if args.extract_comments:        all_comments = set()#makes sense to keep track of already processed discussions        for discussion in tqdm(discussions):             try:                comments = get_comments_from_discussion_via_api(context, discussion)            except odnoklassniki.api.OdnoklassnikiError as e:                if "NOT_FOUND" in str(e):                    comments = set()                else:                    print(e)                    bp()                    pass            all_comments |= comments            time.sleep(pause)        return all_comments
    

    Моя любимая ошибка была:

    OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: ))

    6) В конечном итоге вариант Selenium + API выглядит наиболее рациональным вариантом.
  • Необходимо сохранение состояния и рестарта системы, обработка множества ошибок, в том числе непоследовательного поведения сайта причем эти ошибки, которые довольно сложно себе представить (если вы не профессионально пишите парсеры, разумеется).

Условная оценка времени для данной задачи будет в 3-5 раз выше, чем для сбора данных с Хабра. Несмотря на то что в случае с Хабром мы используем лобовой подход с парсом HTML, а в случае с ОК мы можем в критичных местах работать с API.

Выводы


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

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

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

Если пробежаться краем глаза по характеристикам задачи без дополнительных экспериментов, то Reddit и ОК выглядят похоже: есть API, python wrapper, но по сути, разница огромна. Если судить по этим параметрам, то парс Хабра выглядит сложнее, чем ОК а на практике это совсем наоборот и именно это можно выяснить, проведя простые эксперименты по анализу параметров задачи.

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

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

Подробнее..

Заметки Дата Саентиста как измерить время забега марафона лежа на диване

06.08.2020 12:10:31 | Автор: admin


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

Например, помимо Data Science, я давно увлекаюсь атлетикой и одной из целей в беге для меня, конечно, является марафон. А где марафон там и вопрос за сколько же бежать? Часто ответ на этот вопрос дается на глаз ну в среднем бегут или вот Х хорошее время!

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

А что нам говорят данные о московском марафоне?

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

TL;DR: Я собрал данные по забегам московского марафона за 2018/2019, проанализиворовал время и показатели участников, а код и данные выложил в открытый доступ.

Сбор данных


Путем шустрого гугления мы обнаружили результаты прошлых пары лет, 2019 и 2018 годов.



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

Осталось понять как достать все данные оттуда.



И это, оказывается, несложно, ибо тут есть прямая пагинация и собственно мы итерируем по всему отрезку чисел. Бинго, выкладываю собранные данные за 2019 и 2018 год здесь, если кому-то интересно для последующего анализа, то сами данные можно скачать здесь: здесь и здесь.

С чем тут пришлось повозиться


  • Страница не отдает ошибок если что-то идет не так, никто не посигналит, сайт просто отдает какие-то данные (например, повторяет прошлую страницу с результатами).
  • В какой-то момент сервер решает, что он устал и перестает отдавать данные и виснет проблема решается с помощью поспать и продолжить сбор с прошлой точки.
  • Url-магия сайт что-то мудрит со ссылками, и нельзя просто поменять год в url и получить результаты другой гонки приходится ручками через поиск искать и перепроверять, что мы действительно получаем свежие данные иначе отгружает молча данные последнего года.
  • В какой момент я собирал данные и параметризовал скрипт сбора данных годом запустил и стал собирать через час другой у меня было четыре датасета за 2016, 2017 и оказалось, что страница молча отдавала данные за 2019 год потому что в том месте год вообще игнорировался, что было совершенно неожиданно вывод стоит всегда проверять такие вещами руками, а не только постфактум хотя и постфактум, конечно, надо проверять данные.
  • Здесь есть несколько типов NA: DNF, DQ, "-" придется проводить анализ и перепроверять, и чистить данные, иначе на выходе мусор.
  • Типы данных: время здесь это timedelta, но из-за перезапусков и невалидных значений приходится поработать с фильтрами и очисткой временных значений, чтобы мы оперировали над чистыми временными результатами для подсчета средних значений все результаты здесь это усреднение по тем, кто финишировал и у кого зафиксировано валидное время.

А вот и код спойлера, если кто-то решит продолжить собирать интересные беговые данные.

Код парсера
from bs4 import BeautifulSoupimport requestsfrom tqdm import tqdmdef main():    for year in [2018]:        print(f"processing year: {year}")        crawl_year(year)def crawl_year(year):    outfilename = f"results_{year}.txt"    with open(outfilename, "a") as fout:        print("name,result,place,country,category", file=fout)    # parametorize year    for i in tqdm(range(1, 1100)):        url = f"https://results.runc.run/event/absolute_moscow_marathon_2018/finishers/distance/1/page/{i}/"        html = requests.get(url)        soup = BeautifulSoup(html.text)        names = list(            map(                lambda x: x.text.strip(),                soup.find_all("div", {"class": "results-table__values-item-name"}),            )        )        results = list(            map(                lambda x: x.text.strip(),                soup.find_all("div", {"class": "results-table__col-result"}),            )        )[1:]        categories = list(            map(                lambda x: x.text.strip().replace(" ",""),                soup.find_all("div", {"class": "results-table__values-item-country"}),            )        )        places = list(            map(                lambda x: x.text.strip(),                soup.find_all("div", {"class": "results-table__col-place"}),            )        )[1:]        for name, result, place, category in zip(names, results, places, categories):            with open(outfilename, "a") as fout:                print(name, result, place, category, sep=",", file=fout)if __name__ == "__main__":    main()```

Анализ времени и результатов


Перейдем к анализу данных и собственно результатов забега.
Использовались pandas, numpy, matplotlib и seaborn все по классике.

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

  • Мужчины так как я вхожу в эту группу мне интересны именно эти результаты.
  • Женщины для симметрии.
  • Мужчины до 35 это условно одна из самых соревновательных групп и понятно, что сравнивать мне стоит именно с ними так как я в этой группе.
  • Отдельно посмотрим на 2018 и 2019 годы а вдруг что поменялось?.

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





Как мы видим средние показатели за 2018 и 2019 практически не изменились примерно 1.5 минуты стали быстрее бегуны в 2019 году. Разница между интересующими меня группами незначительна.

Перейдем к распределениям целиком. И сначала к общему времени забега.


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

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



Как мы видим фактически вообще ничего не поменялось распределения выглядят фактически идентичными.

Далее рассмотрим распределения по полу:





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

Отдельно перейдем к самой интересной для меня группе:



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

Изучаем улучшения участников 2018 2019


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

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

  • 14 человек участвовали оба года и ни разу не финишировали
  • 89 человека добежали в 18 м, но не смогли в 19
  • 124 наоборот
  • Те, кто смогли добежать оба раза в среднем улучшили на 4 минуты свой результат

Но тут оказалось довольно интересно все:



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

Выводы


Я сделал для себя следующие выводы из проанализированных данных

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

Подробнее..

Перевод Как я воровал данные с пользовательских аккаунтов в Google

29.01.2021 12:17:38 | Автор: admin
Вы со мной не знакомы, но существует известная вероятность, что я знаком с вами. Причина в том, что у меня есть полный, неограниченный доступ к приватной информации миллионов людей, размещённой на аккаунтах Google. Отправленные по почте выписки по банковским счетам, медицинские документы, хранящиеся на Google Drive, сохранённые и пересланные чаты из Facebook, голосовые сообщения на Google Voice, личные фотографии на Google Photos. Список можно продолжать. Никто из них не знает об этом сейчас и никогда не узнает в будущем. Возможно, в их число входите и вы.

И как же я такое провернул? Всё началось с разработанного мной приложения. По очевидным причинам, обнародовать название я не стану. Приложение довольно нехитрое, оно рассчитано на людей, увлекающихся фитнесом, и предлагает возможности типа внесения данных о скорости во время пробежки или готовых комплексов силовых упражнений. Как и многие другие продукты, оно требует, чтобы пользователь первым делом создал аккаунт. По данным аналитики, примерно 60% людей вместо того, чтобы полностью проходить процедуру регистрации, соблазняются заманчивой кнопкой Войти с Google.



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



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



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

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

В моём случае, по клику на кнопку приложение при помощи WebView открывает диалоговое окно и задаёт веб-адрес: accounts.google.com/EmbeddedSetup. Он действительно соответствует странице входа в аккаунт Google, только особой, рассчитанной на новые устройства Android. Это обстоятельство сыграет свою роль позже, когда нам любезно предоставят всю необходимую информацию в виде cookie.

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



Обратите внимание на странную синюю полоску, слова Learn more и примерно всё на правой картинке

И вот теперь-то начинается веселье. Я использую стандартные API, встроенные как в iOS, так и в Android, чтобы внедрить тщательно прописанный фрагмент кода на Javascript, который произведёт необходимые модификации, чтобы страница не отличалась от стандартной ни своим видом, ни поведением.

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

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

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

POST /auth HTTP/1.1Content-Type: application/x-www-form-urlencodedContent-Length: 349Host: android.clients.google.comConnection: Keep-AliveUser-Agent: GoogleLoginService/1.3 (a10 JZO54K);gzipapp: com.google.android.gmsapp=com.google.android.gms&client_sig=38918a453d07199354f8b19af05ec6562ced5788&callerPkg=com.google.android.gms&callerSig=38918a453d07199354f8b19af05ec6562ced5788&service=ac2dm&Token=oauth2_4%2F4AY0e-l5vPImYAf8XsnlrdshQQeNir3rSBx5uJ2oO9Tfl17LpsaBpGf1E2euc18UyOc8MnM&ACCESS_TOKEN=1&add_account=1&get_accountid=1&google_play_services_version=204713000


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

После этого вышеупомянутый endpoint отсылает тот самый мастер-токен. Но как бы мне получить к нему доступ без подозрительных сетевых запросов? Очень просто: через лог в Google Firebase.

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

И главное: он открывает мне путь ко всем без исключения сервисам, которые когда-либо были доступны с мобильного устройства, от лица владельца соответствующего аккаунта. Достаточно одного запроса POST, чтобы я мог прикинуться официальным аккаунтом Google и обзавестись OAuth-токеном для доступа к чему угодно, включая частные (и, скорее всего, нигде не опубликованные) API. Я могу читать письма, бродить по Google Drive, просматривать бэкапы с телефона и фотографии на Google Photos, а заодно ознакомиться с веб-историей пользователя и поболтать с его друзьями по Google Messenger. Я даже создал модифицированную версию microG, с которой могу управлять всеми этими пользовательскими аккаунтами непосредственно из обычных приложений Google.

И напоминаю, весь процесс выглядит вот так. Предлагаю всем задаться вопросом: а вы бы попались?

Разоблачение


Как многие из вас уже догадались, не всё в этой статье правда. Я не публиковал никаких фитнес-приложений на Play Store и не собирал миллионы мастер-токенов. Спасибо этому материалу за вдохновение. Но сам метод работает. Я, да и любой другой разработчик, определённо мог бы сделать приложение с таким сюрпризом (возможно, кто-то уже и сделал).

FAQ


Но ведь страница отличается от нормального входа в аккаунт. Я бы заметил!

Отличия не так уже бросаются в глаза, так что, скорее всего, не заметили бы. Страница входа в аккаунт Google на Android, как правило, имеет интерфейс типа выберите аккаунт, но бывают и исключения например, многие веб-приложения, вроде тех, которые делают на Ionic и Cordova. Большинство iOS-приложений тоже часто отдают предпочтение веб-версии, очень напоминающей приведённый вариант. Кроме того, даже если вам кажется, что отсутствие экрана с такое-то приложение просит доступ, вас точно насторожит, то его вполне можно внедрить ценой нескольких лишних часов работы.

Это и на iOS работает?

Я не пробовал, но нет оснований считать, что не сработает.

И что с этим делать?

Вообще, вопрос сложный. Ни одно из моих действий, строго говоря, не подпадает под определение эксплойта, но результат, тем не менее, несёт большую опасность. Для начала Google неплохо бы разобраться со своими уведомлениями насчёт входа с нового устройства, чтобы они нормально работали. Лично я их получаю, когда пытаюсь зайти в аккаунт с компьютера, но, пока тестировал это приложение, система не сработала ни разу. Другая хорошая идея обновить гайдлайны, в том, что касается кнопок Войти с Google; сейчас там вообще ничего не говорится о требованиях к реализации. Возможно, им стоило бы углубиться в дебри безопасности через неясность этот принцип, несмотря на все свои недостатки, пока что отлично служит Apple для обеспечения безопасности в iMessage.

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

Эта проблема актуальна для всех систем авторизации в сторонних приложениях?

Вполне вероятно. Я не разбирался досконально, в каких случаях рассылаются оповещения, а в каких нет, но даже когда оповещения приходят, из них не всегда понятно, что происходит. Функция Войти с Apple, как бы там ни было, снабжена очень жёстким гайдлайном, причём администрация App Store (где функция, полагаю, в основном и используется) строго отслеживает выполнение требований. С другой стороны, у них свои проблемы с авторизацией, на фоне которых эта меркнет.

Реальная история


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

Реальная история моего прозрения началась с того, что я разработал приложение-проигрыватель Carbon Player; сейчас оно уже кануло в лету, так и не получив широкого распространения. Приложение замышлялось как замена Google Play Music (помните времена, когда такое существовало?), только с дизайном в разы круче. Чтобы получить доступ к пользовательской папке с музыкой, я перевёл gmusicapi Саймона Вебера на Java, но, переписывая код, поначалу особо не вникал, как там устроен процесс авторизации. Понял только, что нужны логин и пароль пользователя, которые я запрашивал через незамысловатое диалоговое окошко, а потом идут какие-то запросы и вываливаются какие-то токены, которые мне подходят для извлечения музыки.



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

В общем, приложение за всё время своего существования собрало от силы двадцать пять скачиваний, и я быстро махнул на него рукой, чтобы не отвлекаться от учёбы. Но перед этим успел выпустить пару обновлений, в одном из которых появился редизайн новой отпадной (ну, по тем временам) домашней страницы Google Play Music одного из немногих элементов исходного продукта, которые неплохо смотрелись.



Процесс оказался намного заморочнее, чем я думал, и пришлось неожиданно много заниматься обратной разработкой Protocol Buffers. Что важнее, по какой-то причине теперь там требовался совершенно иной токен, который в gmusicapi реализован уже не был. В итоге, чтобы его внедрить, я на несколько часов зарылся в систему авторизации, пытаясь разобраться, как она устроена. Это привело к ужасному моменту прозрения, когда я осознал, что логировал самую секретную информацию, какую только можно. Скажу одно: логирование прекратилось. Двадцать пять человек, которые скачали приложение, простите меня, пожалуйста (ваши токены я с Firebase удалил!).

Был ещё один, не связанный с первым случай, когда я работал в стартапе, создававшем менеджер паролей. Одним из ключевых преимуществ приложения было то, что оно хранило пароли строго на телефоне, но при этом позволяло авторизоваться с компьютера благодаря букмарклету на JavaScript, который соединял девайсы через QR-код. Чтобы всё проходило гладко, когда пользователь открывал сайт на компьютере, приложение обращалось к тому же сайту с телефона и внедряло тщательно прописанный фрагмент кода на JavaScript, который фиксировал логины, пароли и всё прочее. Знакомо звучит?

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

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

Парсинг сайта Умного Голосования и новый API на сайте ЦИК

20.09.2020 20:22:28 | Автор: admin
image

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

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

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

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

В итоге получилась вот такая сводная таблица. В данной статье я расскажу, как был получен приведённый набор данных, как собиралась информация с сайтов Умного Голосования и нового веб-сервиса ЦИК.

image


Сайт Умного Голосования



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

image


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

image


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

image


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

Заглянем в код страницы и обнаружим, что все описанные данные, собраны в удобном JSON-формате. В элементе с id="__NEXT_DATA__", который используется для отрисовки страницы, есть информация об избирательном участке, о соответствующих выборных кампаниях и кандидатах:

Содержимое __NEXT_DATA__ элемента
{   "props":{      "pageProps":{         "id":"440384",         "settings":{            "id":1,            "share_photo":"/ganimed-media/share_photo/smartvote_sharepic_1200x628.jpg",            "video_on_main_page":"https://youtu.be/w8gapDGwWMY",            "fake_mode":false,            "title_share":"Объединяемся, чтобы победить Единую Россию",            "text_share":"Мы разные, но у нас одна политика  мы против монополии Единой России. Всё остальное  математика.",            "telegram_bot_link":"https://tlinks.run/smartvotebot",            "viber_bot_link":"viber://public?id=smartvote",            "facebook_bot_link":"https://facebook.com/umnoegolosovanie/",            "alice_link":null,            "vk_bot_link":null         },         "serverData":{            "commission":{               "id":440384,               "number":"4317",               "address":"354340, Краснодарский край, город Сочи, Адлерский район, улица Богдана Хмельницкого, 24",               "descr":"здание средней школы  49 им. Н.И. Кондратенко",               "lat":"43.425923",               "lon":"39.920152",               "region_id":26,               "region_intid":"135637827259064320000372513"            },            "campaigns":[               {                  "id":26,                  "code":"krasnodar-gub-2020",                  "title":"Выборы губернатора Краснодарского края",                  "is_regional":true,                  "ready_date":null,                  "district":{                     "id":458,                     "code":"oik-0",                     "name":"0",                     "leaflet":""                  },                  "candidates":[                     {                        "id":998,                        "name":"Кондратьева Вениамина Ивановича",                        "share_image":"/elections-api-media/share/26/998.png",                        "anticandidate":true,                        "self_nominated":false,                        "has_won":false,                        "has_second_round":false,                        "party":{                           "title":"Единая Россия",                           "antiparty":true                        }                     }                  ]               },               {                  "id":28,                  "code":"krasnodar-sochi-gorduma-2020",                  "title":"Выборы в городское собрание Сочи",                  "is_regional":false,                  "ready_date":null,                  "district":{                     "id":526,                     "code":"oik-2",                     "name":"2",                     "leaflet":"/elections-api-media/28/526-1334-1335-5385.pdf"                  },                  "candidates":[                     {                        "id":1334,                        "name":"Киров Сабир Рафаилович",                        "share_image":"/elections-api-media/share/28/1334.png",                        "anticandidate":false,                        "self_nominated":true,                        "has_won":false,                        "has_second_round":false,                        "party":null                     },                     {                        "id":1335,                        "name":"Мукаелян Марине Айковна",                        "share_image":"/elections-api-media/share/28/1335.png",                        "anticandidate":false,                        "self_nominated":true,                        "has_won":false,                        "has_second_round":false,                        "party":null                     },                     {                        "id":5385,                        "name":"Рябцев Виктор Александрович",                        "share_image":"/elections-api-media/share/28/5385.png",                        "anticandidate":false,                        "self_nominated":false,                        "has_won":false,                        "has_second_round":false,                        "party":{                           "title":"КПРФ",                           "antiparty":false                        }                     }                  ]               }            ]         },         "error":null,         "currentUrl":"https://votesmart.appspot.com/candidates/440384"      }   },   "page":"/candidates/[id]",   "query":{      "id":"440384"   },   "buildId":"U8hjaoxZw8TINu-DU_Ixw",   "runtimeConfig":{      "HOST":"https://votesmart.appspot.com"   },   "isFallback":false,   "customServer":true,   "gip":true}



Для избирательного участка указан номер (number) соответствующей УИК и её идентификатор в базе данных сайта УмГ. Id = 440834 соответствует номеру, который содержится в URL-адресе страницы (/candidates/440834).

Можем ли мы, зная номер УИК и регион, вычислить идентификатор комиссии на сайте УмГ? Я не смог найти очевидную зависимость, так как идентификаторы распределены достаточно хаотично:
Сочи, УИК 4512 -> id = 440834
Сочи, УИК 4513 -> id = 441403
Сочи, УИК 4514 -> id = 1781216

Каким образом собрать список отражений номеров УИК в id страниц? Перебирать и проверять всевозможные идентификаторы от 1 до 2000000 звучит крайне неэффективно, большинство из этих идентификаторов нерабочие.

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

Поиск участка по адресу
https://votesmart.appspot.com/api/v1/cik/addresses?query=ADDRESS

  • ADDRESS адрес, желательно в формате Субъект, город, улица, дом. Также желательно без сокращений ул., д., так как парсер на сервере плохо с ними справляется

Пример запроса:
https://votesmart.appspot.com/api/v1/cik/addresses?query=Смоленск ленина

Результат запроса
{   "suggestions":[      {         "value":"Смоленская область, город Смоленск, Промышленный район, Ленина улица",         "data":{            "fullname":"Смоленская область, город Смоленск, Промышленный район, Ленина улица",            "level":"7",            "region_id":69,            "commission_id":null,            "intid":"138474570115456000000347353",            "path":"135637827259064320000359815,135637827259064320000359819,135637827259064320000359820,138474570115456000000347353",            "snippet":"Смоленская область, город <em>Смоленск</em>, Промышленный район, <em>Ленина</em> улица",            "score":118.84238         }      },      {         "value":"Смоленская область, город Смоленск, Ленинский район, Ленина улица, 12А",         "data":{            "fullname":"Смоленская область, город Смоленск, Ленинский район, Ленина улица, 12А",            "level":"8",            "region_id":69,            "commission_id":1124357,            "intid":"135659820348349440000359937",            "path":"135637827259064320000359815,135637827259064320000359819,135637827259064320000359822,135659820348349440000359708,135659820348349440000359937",            "snippet":"Смоленская область, город <em>Смоленск</em>, Ленинский район, <em>Ленина</em> улица, 12А",            "score":115.14931         }      },...   ]}



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

На каждый избирательный округ приходится в среднем от 2 до 8 участков. Даже не смотря на то, что адрес избирательного участка, в редких случаях, может не соответствовать округу к которому он принадлежит, я выдвинул следующую гипотезу: перебрав адреса УИК на сайте УмГ, можно собрать информацию о каждом округе.

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

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

Новый веб-сервиса ЦИК. Методы API


ГАС Выборы автоматизированная система, разработанная в 1995 году, предназначенная для подготовки и проведения выборов и референдумов в РФ.

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

image

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

image


Как вы сами можете визуально оценить, капча конечно очень простая, и наверняка кто-то уже нашел способы её обходить. Я же, вместо того чтобы заняться машинным обучением, обратился к новому разделу на сайте ЦИК, о котором пока мало кто знает: Цифровые сервисы

image

Данный раздел появился как раз во время Голосования по поправкам и содержит в себе несколько веб-сервисов, которые через POST-запросы общаются с внутренним API для получения данных из системы ГАС Выборы. Пользователь Хабра уже обратил внимание на данный функционал. Рассмотрим же его подробнее.

Далее приведено описание основных запросов нового API, которые использовались в данном проекте:

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


Информация об УИК
http://cikrf.ru/iservices/voter-services/committee/subjcode/SUBJECT_CODE/num/COMMITTEE_NUM


Пример запроса:
http://cikrf.ru/iservices/voter-services/committee/subjcode/01/num/2

Результат запроса
{   "vrn":"4014001117979",   "name":"Участковая избирательная комиссия 2",   "subjCode":"01",   "numKsa":"01T001",   "vid":"5",   "address":{      "address":"385200, Республика Адыгея, городской округ Адыгейск, город Адыгейск, проспект имени В.И.Ленина, 16",      "descr":"здание МБОУ СОШ1",      "phone":"8-87772-9-23-72",      "lat":"44.882893",      "lon":"39.187187"   },   "votingAddress":{      "address":"385200, Республика Адыгея, городской округ Адыгейск, город Адыгейск, проспект имени В.И.Ленина, 16",      "descr":"здание МБОУ СОШ1",      "phone":"8-87772-9-23-72",      "lat":"44.882893",      "lon":"39.187187"   }}




Информация о выборных кампаниях на участке
http://cikrf.ru/iservices/voter-services/vibory/committee/COMMITTEE_VRN

  • COMMITTEE_VRN идентификатор УИК

Пример запроса:
http://cikrf.ru/iservices/voter-services/vibory/committee/4544028162533

Результат запроса
[   {      "vrn":"100100163596966",      "date":"2020-07-01",      "name":"Общероссийское голосование по вопросу одобрения изменений в Конституцию Российской Федерации",      "subjCode":"0",      "pronetvd":null,      "vidvibref":"0"   },   {      "vrn":"25420001876696",      "date":"2020-09-13",      "name":"Выборы депутатов Законодательного Собрания Новосибирской области седьмого созыва",      "subjCode":"54",      "pronetvd":"0",      "vidvibref":"2"   },   {      "vrn":"4544220183446",      "date":"2020-09-13",      "name":"Выборы депутатов Совета депутатов города Новосибирска седьмого созыва ",      "subjCode":"54",      "pronetvd":null,      "vidvibref":"2"   }]




Перечень округов выборной кампании
http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/tvd

  • CAMPAIGN_VRN идентификатор выборной кампании

Пример запроса:
http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/tvd

Результат запроса
{   "_embedded":{      "tvdDtoList":[         {            "vrn":457422069601,            "namtvd":"Муниципальная избирательная комиссия города Орла",            "namik":"Муниципальная избирательная комиссия города Орла",            "numtvd":"0",            "vidtvd":"ROOT",            "_links":{               "results":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069601/proportion"               }            }         },         {            "vrn":457422069602,            "namik":"Окружная избирательная комиссия  1",            "numtvd":"1",            "vidtvd":"OIK",            "_links":{               "results":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069602/major"               }            }         },         ...      ]   },   "_links":{      "self":{         "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/tvd"      }   }}


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

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



Список кандидатов, участвующих в выборной кампании
http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/candidates/?page=PAGE_NUM&numokr=NUMTVD

  • CAMPAIGN_VRN идентификатор выборной кампании
  • PAGE_NUM номер страницы списка
  • NUMTVD номер округа (необязательный параметр)

Пример запроса:
http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/?page=1&numokr=11

Результат запроса
{   "_embedded":{      "candidateDtoList":[         ...         {            "index":50,            "vrn":4674020270868,            "fio":"Трофименко Владимир Карпович",            "datroj":"23.04.1964 00:00:00",            "vidvig":"выдвинут",            "registr":"зарегистрирован",            "vrnio":4674220132098,            "namio":"Региональное отделение Политической партии \"Российская партия пенсионеров за социальную справедливость\" в Смоленской области",            "numokr":11,            "tekstat2":"1",            "_links":{               "self":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020270868"               }            }         },         {            "index":56,            "vrn":4674020269642,            "fio":"Божедомов Евгений Эдуардович",            "datroj":"15.02.1986 00:00:00",            "vidvig":"выдвинут",            "registr":"отказ в регистрации",            "namio":"Самовыдвижение",            "numokr":11,            "tekstat2":"1",            "_links":{               "self":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020269642"               }            }         },         {            "index":105,            "vrn":4674020271181,            "fio":"Трифоненко Владислав Андреевич",            "datroj":"15.07.1994 00:00:00",            "vidvig":"выдвинут",            "registr":"зарегистрирован",            "vrnio":4674220134054,            "namio":"Смоленское городское отделение политической партии \"КОММУНИСТИЧЕСКАЯ ПАРТИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\"",            "numokr":11,            "tekstat2":"1",            "_links":{               "self":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020271181"               }            }         },         ...               ]   },   "_links":{      "self":{         "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates?page=1&numokr=11"      }   },   "page":{      "size":20,      "totalElements":9,      "totalPages":1,      "number":1   }}


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



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

Выгрузка данных с сайта ЦИК


Прежде чем приступить к скачиванию нужных данных, нужно было составить список выборных кампаний, которые мы задействуем в проекте. Дело в том, что Умное Голосование проходило не везде, а именно на выборах:
в законодательные собрания регионов,
в городские советы региональных центров,
в городские советы крупных городов (с населением больше 200 тысяч человек)
(А также довыборы в Госдуму по 4 округам).
// Леонид Волков

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

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

vybory.izbirkom.ru/region/izbirkom?action=show&vrn=21120001136916&
region=11&prver=1&pronetvd=1


В итоге, список состоял из 43 выборных кампаний. Всего в Единый день голосования прошло более 9000 отдельных выборных кампаний в органы разного уровня.

Теперь, имея на руках список выборов и перечисленные ранее методы API, скачать данные не составило никакого труда. Написав скрипт на python, делая обычные запросы про помощи requests модуля, я сохранил данные о кандидатах и избирательных участках в исходном JSON-формате.

Главное, что стоит учесть при скачивании информации об избирательных участках: недостаточно перебирать всевозможные номера начиная с 1, до тех пор пока сервер не вернет пустое значение. Дело в том, что нумерация УИК в регионе может прерываться, и идти, например, в таком виде:
...1001 1016, 1101 1136, 1138 ...
либо:
0 700, 900 1002, 1004...
Чтобы определить максимальный номер УИК в регионе и не делать лишние запросы, я собирал данные следующим образом: пробовал выгрузить данные по первым 1000 номерам, а затем проверял если i+1,i+5,i+100,i+500,i+1000 номера соответствуют какому-либо УИКу (в случае чего продолжал скачивание).

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

К примеру, в Удмуртии в названии УИК была следующая нумерация: 1/01, 1/02, 1/03, в Липецкой области: 01-01, 01-02, 01-03. В Оренбургской области я столкнулся с настоящей экзотикой: это был единственный регион, где ряд избирательных комиссий были названы в честь кого-то. Например Участковая избирательная комиссия 1696 имени Братьев Пустовитовых

Выгрузка данных с сайта Умного Голосования


Теперь, по каждому собранному адресу УИК мы собираемся скачать данные о голосовании с сайта УмГ. Перед этим стоит учесть несколько особенностей (о которых я узнал уже в процессе):

Во первых, надо учесть что адреса в базе данных ЦИК имеют различный формат, порой даже в отдельных областях регионов. Мне пришлось убирать сокращения д., г. и ул., так как сайт Умного Голосования совсем не справлялся с поиском адресов по таким запросам. Ещё рекомендую убирать почтовый индекс из адреса, а также, встречающийся иногда префикс Российская Федерация.

Во вторых, сайт УмГ имеет жёсткую защиту от DDoS атак, и даже если вы сделаете сотню запросов с интервалом в 0.3 секунды ваш IP получит бан. Можно было бы использовать набор из платных прокси, но лично я просто воспользовался бесплатными прокси и чередовал запросы со своего и стороннего IP. Чтоб уж точно не получить бан, между запросами был интервал примерно в 0.7 секунд. В итоге, скачивание всех данных заняло примерно сутки.

С использованием запросов из первой главы, алгоритм получился следующим:
  1. Форматируем адрес УИК
  2. Делаем запрос на список подходящих адресов
  3. Получаем список, содержащий идентификаторы страниц сайта
  4. Проверяем если уже скачали данные об участке по данному идентификатору
  5. Загружаем HTML-страницу сайта по данному идентификатором
  6. Извлекаем элемент __NEXT_DATA__ и сохраняем данные в JSON-формате


Парсинг страницы происходил при помощи библиотеки beautifulsoup4.

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

Это не беда, ведь для каждого округа, нам достаточно найти хоть одну соответствующую страницу на сайте.

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

Объединение данных с сайтов УмГ и ЦИК


На данном этапе, мы собираем удобную структуру данных, с информацией о каждом кандидате по округам: идентификатор кандидата, ФИО, партия, метка с информацией о том, подержан ли он УмГ.

Пример собранного набора данных о кандидатах
{    "33": [        {            "name": "Бекенева Любовь Александровна",            "vrn": 4444032121758,            "birthdate": "05.05.1958 00:00:00",            "party": "ЕР",            "smart_vote": 0        },        {            "name": "Крохичев Павел Александрович",            "vrn": 4444032122449,            "birthdate": "16.11.1977 00:00:00",            "party": "КПРФ",            "smart_vote": 0        },        {            "name": "Ростовцев Михаил Павлович",            "vrn": 4444032122782,            "birthdate": "27.02.1996 00:00:00",            "party": "ЛДПР",            "smart_vote": 0        },        {            "name": "Морозов Максим Сергеевич",            "vrn": 4444032123815,            "birthdate": "20.11.1991 00:00:00",            "party": "Яблоко",            "smart_vote": 1        },        {            "name": "Захарова Алина Сергеевна",            "vrn": 4444032124060,            "birthdate": "21.07.1996 00:00:00",            "party": "КПКР",            "smart_vote": 0        },        {            "name": "Афанасов Александр Николаевич",            "vrn": 4444032123597,            "birthdate": "21.05.1974 00:00:00",            "party": "СР",            "smart_vote": 0        }    ],    ...}



Алгоритм достаточно прямолинейный:
  1. По массиву данных с сайта УмГ создаем список поддержанных кандидатов для каждого округа
  2. По массиву данных с сайта ЦИК создаем отфильтрованный список допущенных кандидатов для каждого округа
  3. В каждом округе по ФИО вычисляем соответствие Кандидат-УмГКандидат-ЦИК

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

Во первых, есть шанс что в одном округе будут кандидаты с полностью совпадающими ФИО. Благо, среди 5000 кандидатов, такая ситуация была лишь в одном случае, причём ни один из кандидатов не был поддержан УмГ.

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

В третьих, надо учитывать актуальность данных. Данные на сайте ЦИКа и УмГ изменялись и обновлялись вплоть до субботы: каких-то кандидатов снимали/восстанавливали, в каких-то округах менялась поддержка УмГ.
Для валидации списков УмГ был написан простой скрипт, который делает по одному запросу на округ (ведь собранный нами набор данных теперь позволяет однозначно определить страницу, посвященную каждому округу) и проверяет соответствуют ли имена тем, что мы получали ранее.

Интересной задачей была идентификация партий по названию их отделений. Данный пункт можно было бы пропустить, но я решил заняться этим для унификации информации. Проблема заключается в том, что у кандидатов от одной партии может различаться её название в базе ЦИК. Например, в случае КПРФ встречалось более 40 вариантов:

Ивановское городское (местное) отделение Политической партии "Коммунистическая партия Российской Федерации"
Ямало-Ненецкое ОО ПП "КПРФ"
ЧОО ПП КПРФ
КАЛУЖСКОЕ РЕГИОНАЛЬНОЕ ОТДЕЛЕНИЕ политической партии "КОММУНИСТИЧЕСКАЯ ПАРТИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ"
...


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

Выгрузка результатов выборов с сайта ЦИК


Собранного набора данных хватило для достижения первоначальной цели проекта мы составили списки кандидатов УМГ-2020 для каждого избирательного округа. Но если есть техническая возможность получить результаты выборов, почему бы не воспользоваться ею?


Результаты выборов в округе
http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/results/DISTRICT_VRN/major

  • CAMPAIGN_VRN идентификатор выборной кампании
  • DISTRICT_VRN идентификатор округа

Пример запроса:
http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069602/major

Результат запроса
{   "report":{      "tvd":"",      "date_sign":"none",      "vrnvibref":"457422069597",      "line":[         {            "txt":"число избирателей на момент окончания голосования",            "kolza":"8488",            "index":"1"         },         {            "txt":"число бюллетеней, полученных участковой комиссией",            "kolza":"6700",            "index":"2"         },         ...         {            "txt":"число недействительных бюллетеней",            "kolza":"65",            "index":"9"         },         {            "txt":"число действительных бюллетеней",            "kolza":"1948",            "index":"10"         },         ...         {            "delimetr":"1"         },         {            "txt":"Авдеев Максим Юрьевич",            "numsved":"1",            "kolza":"112",            "index":"11",            "namio":"ПАРТИЯ ПЕНСИОНЕРОВ в Орловской области",            "perza":"5.56",            "numsvreestr":"4574030258379"         },         {            "txt":"Жуков Александр Александрович",            "numsved":"2",            "kolza":"186",            "index":"12",            "namio":"Орловское региональное отделение Партии СПРАВЕДЛИВАЯ РОССИЯ",            "perza":"9.24",            "numsvreestr":"4574030258723"         },         {            "txt":"Жуков Родион Вячеславович",            "numsved":"3",            "kolza":"54",            "index":"13",            "namio":"Самовыдвижение",            "perza":"2.68",            "numsvreestr":"4574030258555"         },         ...      ],      "data_gol":"13.09.2020 00:00:00",      "is_uik":"0",      "type":"423",      "version":"0",      "sgo_version":"5.6.0",      "isplann":"0",      "podpisano":"1",      "versions":{         "ver":{            "current":"true",            "content":"0"         }      },      "vibory":"Выборы депутатов Орловского городского Совета народных депутатов шестого созыва",      "repforms":"1",      "generation_time":"14.09.2020 07:59:21",      "nazv":"Результаты выборов по одномандатному (многомандатному) округу",      "datepodp":"14.09.2020 05:44:00"   }}


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



Когда в ГАС Выборы начали публиковать предварительные результаты, я столкнулся с небольшим разочарованием. Оказалось, что через API можно получить данные только по тем результатам, которые официально утвердили. С предварительными результатами всё ещё можно ознакомиться на старом сайте избиркома, но нельзя через новые веб-сервисы.

Спустя сутки были известны результаты по 50%, а к концу недели были подведены итоги почти всех выборов, некоторые регионы всё ещё отказывались утверждать результаты. На момент написания статьи, прошло уже 7 дней, а результаты выборов в Тамбове всё ещё не утверждены. К тому же, в некоторых округах происходит пересчёт голосов, из-за чего эти результаты также недоступны через API.

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

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

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

Пример результатов голосования в округе
{..."33": {        "candidate_total": {            "4444032121758": 880,            "4444032122449": 236,            "4444032122782": 143,            "4444032123597": 152,            "4444032123815": 149,            "4444032124060": 72        },        "is_final": 1,        "non_valid_votes": 132,        "registered_voters": 6928,        "valid_votes": 1632    },...}



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

Публикация итогов УмГ-2020


Во первых, собранные данные в JSON-формате я опубликовал на GitHub. Данные будут обновляться, пока результаты не утвердят во всех округах.

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

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

image

В итоге получилась такая таблица, в которой собраны:



Послесловие


Идея данного мини-проекта возникла за 3 дня до дня голосования и лично я доволен тем, как успел изучить и реализовать всё в кратчайшие сроки (хотя код получился ужасным).

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

Подробнее..

Перевод Детектор плагиата на базе ИИ в патенте Spotify на самом деле метод сбора данных?

15.12.2020 14:09:01 | Автор: admin

Как Uber хочет сделать беспилотные автомобили, так и Spotify хочет создавать музыку с помощью компьютера.

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

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

Плагиат серьезная проблема в музыкальной отрасли. Достаточно вспомнить судебную тяжбу в отношении композиции Blurred Lines, по итогу которой суд постановил, что Робин Тик и Фаррелл Уильямс скопировали один из хитов Марвина Гэя, и поэтому должны выплатить семье автора более 5миллионов долларов. С помощью описанной в патенте системы проблему с плагиатом мелодии можно было бы своевременно устранить даже виртуальные чернила не успели бы высохнуть.

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

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

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

Джордж Ховард (George Howard), профессор теории музыкального бизнеса в колледже Беркли, настроен в этом отношении скептически. Ховард бывший президент музыкального лейбла Rykodisc, владелец одноименной консалтинговой фирмы и сооснователь компании Music Audience Exchange, которая помогает авторам лицензировать музыку для брендов. Также он стоял у истоков сервиса TuneCore, посредством которого исполнители продают музыку на крупных стриминговых платформах (например, Spotify).

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

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

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

Как Uber хочет сделать беспилотные автомобили, так и Spotify хочет создавать музыку с помощью компьютера, говорит Ховард.

Предположение о потенциале Spotify по созданию музыки с использованием ИИ высказываются и другими особенно в свете того, что в качестве главы исследовательской лаборатории Spotify Creator Technology Research Lab фирма наняла Франсуа Паше. При этом компания уклоняется от ответа на вопрос, является ли создание музыки одной из конечных целей.

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

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

Самый известный проект Паше Flow Machines в создании музыки в значительной степени полагался на нотные тетради и привлек внимание прессы после того, как в его рамках искусственным интеллектом впервые была создания поп-песня. Перед этим Паше с командой пять лет (с 2012 по 2017г.) собирали базу данных, в которой в итоге оказалось более 12000машиночитаемых нотных тетрадей, использованных для обучения алгоритмов.

В 2016г. Паше стал соавтором статьи, описывающей алгоритм, генерирующий новую музыку в стиле Баха о чем я уже писал. Несколько месяцев спустя, в начале 2017г., Паше стал одним из авторов исследования о вариантах выборки нотных тетрадей Sampling Variations of Lead Sheets, в котором группа исследователей вышла за рамки репертуара Баха. Например, алгоритм сгенерировал список потенциальных нотных тетрадей для версии In A Sentimental Mood Дюка Эллингтона и Джона Колтрейна в стиле The Beatles.

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

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


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее..

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

24.09.2020 12:15:14 | Автор: admin
Привет, Хабровчане! Мы Владимир Мясников и Владислав Егоров представители команды интеграционного тестирования Mir Plat.Form (АО НСПК). Сегодня мы расскажем про разработанный и развиваемый нами инструмент автоматизации, позволивший сократить рутину во внутренних процессах команды.

Предисловие


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



На данный момент команда работает с 13 системами уровня mission и business critical. Mission critical системы обеспечивают выполнение Mir Plat.Form своих основных функций, обеспечивающих стабильность и непрерывность функционирования банковской карточной системы РФ. Системы уровня business critical отвечают за поддержку предоставляемых клиентам Mir Plat.form дополнительных сервисов, от которых зависит непосредственная операционная деятельность компании. Частота выкатывания релизов в ПРОД варьируется от раза в неделю до раза в квартал, всё зависит от системы и готовности участников к частоте обновлений. В общей сложности мы насчитали около 200 релизов, прошедших через нашу команду в прошлом году.

Простая математика гласит следующее: количество проверяемых цепочек это N-систем * M-интеграций между ними * K-релизов. Даже на примере 13 систем * 11 интеграций * 27 версий релизов получается примерно 3 861 возможных вариантов совместимости систем. Кажется, ответ очевиден автотесты? Но проблема чуть серьезнее, только автотесты не спасут. Учитывая растущее количество систем и их интеграций, а также различную частотность релизов, всегда имеется риск протестировать неправильную цепочку версий систем. Следовательно, имеется риск пропустить дефект в межсистемном взаимодействии, например, влияющий на корректность работы платежной системы (ПС) Мир.

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

Ввели единую базу выпуска релизов. Для этой задачи вполне хватило календаря релизов в Confluence с указанием версий систем, установленных в ПРОД;

Отслеживаем интеграционные цепочки в соответствие с релизными датами. Здесь мы тоже не стали изобретать велосипед, он нам потребуется дальше. Для решение данной задачи использовали Epic структуры в JIRA для интеграционного тестирования релизов. Пример структуры для релиза 1.111.0 системы System3:



С одной стороны, все эти действия позволили улучшить понимание команды о тестируемых интеграциях, версиях систем и последовательности их выхода в ПРОД. С другой все равно осталась вероятность некорректного тестирования вследствие человеческого фактора:
  1. В случае, если дату релиза какой-нибудь системы подвинули, то члену команды необходимо вручную поправить календарь и всю структуру в JIRA, в том числе сроки выполнения задач и, возможно, версии тестируемых систем;
  2. Перед тестированием интеграции необходимо убедиться, что окружение для тестирования состоит из нужных версий систем. Для этого необходимо вручную пробежаться по тестовым стендам и выполнить пару консольных команд.

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

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

Какие опции хотелось реализовать в разрабатываемой системе?
1. Наглядный календарь релизов с возможностью вывода версий всех систем на конкретную дату;
2. Мониторинг окружений для интеграционного тестирования:
список окружений;
наглядное отображение тестовых стендов и систем, входящих в состав отдельного окружения;
контроль версий систем, развернутых на тестовых стендах.
3. Автоматизированную работу с задачами в Jira:
создание Epic структуры релиза;
управление жизненным циклом задач на тестирование;
актуализация задач в случае сдвига даты релиза;
подкладывание allure-отчетов в задачи на тестирование.
4. Автоматизированную работу с ветками в Bitbucket, а именно создание релизных веток в проектах:
интеграционных автотестов;
автодеплоя интеграционного окружения.
5. Интуитивно понятный UI для запуска автотестов и обновления версий систем.

Что есть СМИТ


Так как система несложная, мы не стали особо мудрить с технологиями. Бэкенд написали на Java с использованием Spring Boot. Фронтенд на React. К базе данных особенных требований не было, поэтому мы выбрали MySql. Поскольку у нас принято работать с контейнерами, то все вышеперечисленные составляющие завернули в Docker, собирая при помощи Docker Compose. Работает СМИТ быстро и так же надежно, как остальные системы Mir Plat.Form.



Интеграции


Atlassian Jira. В джире создаются, открываются, принимаются в работу и закрываются задачи на тестирование каждой конкретной интеграции, если все тесты прошли успешно прикладывается ссылка на allure отчет в комментарии.
Atlassian BitBucket. В битбакете лежит код проекта автотестов, где инженеры по автоматизации ведут список окружений, настраивают его и добавляют/убирают системы в определенные окружения. Также там создаются релизные ветки под каждую новую версию системы, где будут вестись работы по актуализации кода и бизнес логики тестовых сценариев.
Jenkins. Все тесты из проекта автотестирования можно запускать через Jenkins, для каждого набора тегов у нас предусмотрена своя джоба. Отдельные джобы нужны для того, чтобы не грузить все шаги каждый раз, а загружать только нужные с помощью указания glue для Cucumber.
Системы. У СМИТа есть необходимость взаимодействовать с самими системами. Так СМИТ узнает актуальные версии систем путем выполнения определенных команд по ssh.

Ведение списков систем


Перед тем как в СМИТе вести календарь и мониторить состояние окружений, необходимо завести список тестируемых систем и взаимосвязи между ними. Все настройки можно произвести через веб-интерфейс:



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


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

Календарь релизов


После того, как владельцы систем или тим лиды команд разработки продуктов сообщают нам дату установки нового релиза в ПРОД, мы регистрируем этот релиз в календаре. Получается вот такая вот картина:



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

Также на странице с календарем имеется функция вывода версий всех систем на конкретную дату:



Стоит отметить, что при регистрации нового релиза в календаре СМИТ автоматически создает Epic структуру в Jira и релизные ветки в проектах в Bitbucket.

Состояние окружений


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



Как видно на скриншоте, СМИТ обнаружил на хосте host-4.nspk.ru неактуальную версию System 4 и предлагает обновить её. Если нажать красную кнопку с белой стрелкой, то СМИТ вызовет Jenkins джоб на деплой актуальной версии системы в текущем окружении. Также есть возможность обновить все системы после нажатия соответствующей кнопки.

Окружения для интеграционного тестирования


Стоит немного рассказать про то, как мы задаем тестовые окружения. Одно окружение представляет собой некий набор стендов с развернутыми системами Mir Plat.form и настроенной интеграцией (на одном стенде одна система). В общей сложности у нас 70 стендов, разбитых на 12 окружений.

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

{     "properties":{        "comment":"Общие system property для всех Environment. Могут быть переопределены персональными property, а также всем, что при запуске тестов в System.getProperties()",      "common.property":"some global property"   },   "environments":[        {           "comment":"Если отсутствует name, то Environment получит имя common + порядковый номер. Например common1",         "name":"env_1",         "properties":{              "comment":"Персональные system property данного Environment. Могут переопределять общие property. Могут быть переопределены всем, что при запуске тестов в System.getProperties()",            "env1.property":"some personal property"         },         "DB":{              "comment":"Пример TestResource'а DbTestResource. Если не указано поле id, то оно автоматически будет взято из ключа",            "url":"jdbc:mysql://11.111.111.111:3306/erouter?useUnicode=yes&characterEncoding=UTF-8&useSSL=false",            "driver":"com.mysql.jdbc.Driver",            "user":"fo",            "password":"somepass"         },         "SYS_CMD":{              "comment":"Пример TestResource'а на основе RemoteExecCmd. Должен иметь параметр type = remote",            "type":"remote",            "host":"10.111.111.111",            "username":"user",            "password":"somepass"         }      }   ]}


Помимо того, что данный файл необходим для работы проекта интеграционных автотестов, он также является дополнительным конфигурационным файлом для СМИТа. При запросе обновлении информации об окружениях в СМИТе отправляется HTTP запрос в API нашего bitbucket, где мы храним проект с интеграционными автотестами. Таким путем СМИТ получает актуальное содержимое файла конфигураций из master ветки.

Запуск тестов


Одной из целей создания СМИТа было максимальное упрощение процедуры запуска интеграционных автотестов. Рассмотрим, что же у нас получилось в итоге на примере:



На странице тестирования системы (в данном примере System 3) можно выбрать перечень систем, с которыми нужно проверить интеграцию. После выбора нужных интеграций и нажатия на кнопку Запустить тестирование, СМИТ:
1. Сформирует очередь и последовательно запустит соответствующие Jenkins джобы;
2. мониторит выполнение джоб;
3. меняет статус у соответствующих задач в Jira:
Если джоба отработала успешно задача в Jira будет автоматически закрыта, к ней будет приложена ссылка на allure-отчет и комментарий о том, что дефектов в данной интеграции не обнаружено.
Если джоба зафейлена задача в Jira останется открытой и будет ожидать решения от ответственного за интеграцию сотрудника, который сможет определить причину падения тестов. Ответственного за интеграцию можно подсмотреть в карточке интеграции.

Вывод


СМИТ был создан для минимизации рисков интеграционного тестирования, но нам как команде хотелось бОльшего! В частности, одним из желаний было, чтобы по одному нажатию кнопки автотесты запускались с правильным тестовым окружением, проверялось все в нужных интеграционных соответствиях, задачи в Jira сами открывались и закрывались вместе с отчетами. Такая утопия автотестеров: скажи системе, что проверить, и иди пить кофе :)

Подведем итог, что у нас получилось реализовать:
1. Наглядный календарь релизов с возможностью вывода версий всех систем на конкретную дату;
2. UI для отслеживания состояния наших окружений, позволяющий посмотреть перечень и версии систем, установленных на конкретном окружении;
3. Оповещение пользователей о неактуальных версиях систем с возможностью обновления до актуальной;
4. UI с интуитивно понятным запуском интеграционных автотестов для всей системы или для отдельных интеграций на определенном окружении;
5. Автоматическое создание и закрытие Epic и Task в Jira, прикладывание Allure отчетов к ним;
6. Автоматическое создание релизных веток в Bitbucket.

О планах на будущее


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

Как настроить сбор данных с датчиков IoT и SCADA для Data Governance

09.11.2020 16:20:11 | Автор: admin
В этом году на форуме по управлению данными INFADAY 2020 было много интересных технических кейсов. Один из них настройка сбора потоковых данных с датчиков IoT и систем SCADA таким образом, чтобы эти данные сразу можно было включить в процессы стратегического управления данными в организации Data Governance.

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

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

Ниже я расскажу, как можно настроить сбор данных с датчиков с учётом Data Governance на примере Tibbo Aggregate Network Manager и платформы Informatica. Если хотите посмотреть видеозапись демонстрации на форуме INFADAY 2020, это можно сделать на сайте мероприятия.


Собираем данные с датчиков в хранилище и Kafka

Давайте для примера соберём данные с коммутатора Ubiquity, обработаем их и передадим в хранилище данных и в Kafka.
Первичный сбор будем проводить с помощью решения AggreGate Network Manager (NM) компании Tibbo, которое прекрасно работает с разными типами датчиков и данных, которые с них собираются. Ниже вы можете видеть папку в разделе Devices Ubiquity Switch. Здесь теперь хранятся наши данные с коммутатора.



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



AggreGate NM стыкуется с Informatica через промежуточный MQTT-брокер. Network Manager отправляет данные IoT-протокола MQTT (Message Queuing Telemetry Transport), упакованные в формат JSON.
Заходим в раздел Модели, выбираем заранее созданный объект Informatica_MQTT_Sender и в закладке конструктора правил находим задание: упаковать таблицу интерфейсов ifXtable в формат JSON и послать на сервер брокера MQTT.



Открываем Data Engineering Streaming, в нём мы настраиваем два простых маппинга по захвату данных из брокера MQTT и перемещению в Kafka и в хранилище Hadoop.
В интерфейсе платформы Informatica маппинг по перемещению в хранилище будет выглядеть так.



Трансформация (string) нужна для разделения потока данных на отдельные строки с помощью символов #CRLF (Carriage Return, Line Feed).



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



А это уже интерфейс брокера Kafka с загруженными данными.



Если маршрутизация MQTT-трафика не создаёт существенной нагрузки, то тогда можно установить брокер на сервере Informatica. Это уберёт лишнее из вычислительной цепи и сократит задержки обработки данных.
Обратите внимание, консоль управления Kafka доступна на сборке кластере ArenaData, в сборке Hortonworks веб-интерфейс Kafka-брокеров отсутствует.

Не забываем включать данные с датчиков в процессы Data Governance

Если вы работали с платформой Informatica, знаете, что она умеет не только интегрировать данные и оптимально перемещать их между ИТ-системами, но и обеспечивает комплексные процессы Data Governance. В частности, перед отправкой данных из Data Engineering Streaming в корпоративное хранилище, вы могли бы проверить их качество внутри платформы Informatica c помощью Informatica Data Quality.
Подробнее..

Подводя итоги 2020 года

04.01.2021 18:18:07 | Автор: admin

Привет, Хабр! Я люблю считать и собирать данные. 2020 год состоял из 8784 часов, 4874 из которых я смог учесть в собранной мною статистике. Я знаю как потратил 55% всего прошлого года! В этой статье я постараюсь доказать, что учиться в университете совсем не сложно, а также расскажу о своем методе учета времени, и заодно проанализирую собранные за год данные о временных затратах почти на все, чем я занимаюсь. С самого начала учебы в университете на старте каждого семестра я наблюдал вздыхающих студентов: "Ой ряды начались! А теперь страшный теорвер! Диффуры душат. Как же сложно закрыть ТАУ или случайные процессы". И каждый раз мы сдавали экзамены, и каждый раз выдыхали с облегчением, ведь столько времени потратили, такую сложную задачу решили А насколько сложную? А сколько времени? Чем дальше, тем чаще я задавался этими вопросами, ведь субъективные мнения такие субъективные. Мы ведь в техническом вузе учимся, где циферы? С тех пор как я стал хорошо учиться, меня все больше озадачивали суждения других студентов обо мне, мол просто с мозгами повезло. Причем на мой вопрос, сколько времени они ботали на этой неделе я часто слышал: "Ну не знаю, примерно часа два". Недавно я смог совершенно четко самому себе отвечать на этот вопрос, и собрал доказательства в пользу очевидного тезиса: в вопросах учебы дело вовсе не в везении с объемом серого вещества в голове, а в количество потраченного времени.

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

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

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

Предобработка датасета

Посмотрим на датасет

Код/Результат
import mathimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inlineimport matplotlib.dates as datesimport matplotlib.dates as mdates                file_name = "CLK 31 12 20.xlsx"sheet =  "Sheet 1"df = pd.read_excel(io=file_name, sheet_name=sheet)print(df)print(df.info())
[2823 rows x 4 columns]<class 'pandas.core.frame.DataFrame'>RangeIndex: 2823 entries, 0 to 2822Data columns (total 4 columns): #   Column              Non-Null Count  Dtype         ---  ------              --------------  -----          0   Project             2823 non-null   object         1   Description         2823 non-null   object         2   Start Date          2823 non-null   datetime64[ns] 3   Duration (decimal)  2823 non-null   float64       dtypes: datetime64[ns](1), float64(1), object(2)

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

Код/Результат
projects = df.Project.unique()descriptions = df.Description.unique()for project in projects:    print("\n Проект: ", project, "\n Задачи:")    for description in df[df.Project == project].Description.unique():        print("       ", description)
Задача:  Rest  Подзадачи:        Games        Watching anime        Watching films        Kara no Shjo        Doki-Doki! Задача:  Life  Подзадачи:        Sleep        Walks Задача:  Study at home  Подзадачи:        m_3_Other        m_3_ILNT        m_3_C-A DaP S        m_3_Research work        m_3_ET_in_SR        m_3_Course_work        m_3_IPT_in_IMR        m_2_Practice        m_2_English_courses        m_2_AIS_MR        m_2_HaSCS_IMR        m_2_S-LaF_in_CS_IMR        m_2_K_Practice        m_2_Research work        m_2_Course_work        Other        m_2_Other        m_1_GT_MIMR        m_1_OMaT        m_1_Practice        m_1_AB_ACS        Schedule        m_1_SDoAS        m_1_English        m_1_IS_MaR        Master's dissertation        b_8_Math for master's        b_8_DepLoME        b_8_GOSI        b_8_AI        b_8_Research work        b_7_Prak 7        b_8_Basics of designing        b_8_VM        b_8_Electronics Задача:  Development  Подзадачи:        Data Science        Drawing        Guitar        Reading books        SQL for DS        Japanese        Writing        Sport        English        Python        Machine Learning        Handmade        Python finance        Reading articles        Programming Задача:  Studying at the University  Подзадачи:        m_3_ET_in_SR        m_3_English_courses        m_3_IMR_CS_TA        m_3_IPT_in_IMR        m_3_C-A_DaP_S        m_3_ILNT        m_2_English_courses        m_2_S-LaF_in_CS_IMR        m_2_HaSCS_IMR        m_2_K_Practice        m_2_Practice        m_1_AB_ACS        m_1_GT_MIMR        m_1_SDoAS        m_1_English        m_1_IS_MaR        B&R Practice        m_1_OMaT

b - значит бакалавриат, а m - магистратура. Циферки - это номер семестра. Остальное - название предметов или задач. Нижний предел в форме уникальности названий соблюден, а верхний у меня улетает в +бесконечность вместе с бритвой Оккама. нужно большей ассоциаций и зачеркнутого текста. Извиняюсь. Дальше удаляем из датафрейма ряды с данным по хендмейду, писательству и гитаре, потому что я тратил на это слишком уж мало времени. Хнык. Ну да ладно, когда-нибудь я отращу золотые руки, стану вообще писец и на гитаре игрец. Когда-нибудь потом А сейчас подумаем, что мы хотим получить на выходе? Пожалуй, хотелось бы пронаблюдать динамику интеллектуальных похождений объекта исследования, так что будем строить графики зависимости времени работы над задачей от даты. Но, во-первых, записи в один день могут дублироваться, а во-вторых, в них есть куча пропусков, ведь не каждый день я занимаюсь сразу всеми делами. Дубликаты удаляем, пропуски заполняем Nan'ами, поскольку по жанру я должен посчитать всякие средние и отклонения.

Обработка дубликатов

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

def remove_duplicates(df):    date = df["Start Date"].to_numpy()    time = df["Duration (decimal)"].to_numpy()        length = len(date)    remove_list = []    for i in range(length - 1):        for j in range(i + 1, length):            if date[i] == date[j]:                time[i] += time[j]                if not j  in remove_list:                    remove_list.append(j)        df = df.drop(df.index[remove_list])    date = np.delete(date, remove_list)    time = np.delete(time, remove_list)    return df

Теперь просто пройдемся по всем подзадачам в датафрейме. Удалено около 800 дубликатов.

data = pd.DataFrame()for project in projects:    descriptions = df[df.Project == project].Description.unique()    for description in descriptions:        df_temp = df[df.Project == project]        df_temp = df_temp[df_temp.Description == description]        new = remove_duplicates(df_temp)        data = data.append(new, ignore_index=True)            print(data.info())df = data
<class 'pandas.core.frame.DataFrame'>RangeIndex: 2095 entries, 0 to 2094Data columns (total 4 columns): #   Column              Non-Null Count  Dtype         ---  ------              --------------  -----          0   Project             2095 non-null   object         1   Description         2095 non-null   object         2   Start Date          2095 non-null   datetime64[ns] 3   Duration (decimal)  2095 non-null   float64       dtypes: datetime64[ns](1), float64(1), object(2)

На данный момент мы можем обратиться к ячейкам со временем только по названию задачи, названию подзадачи и дате, но этого маловато. Хотелось бы провести некоторые обобщения, например, разбить данные по семестрам, свести вместе все данные по занятиям data science и тд. Для этого создается еще одна колонка, которая заполняется метками для обобщения данных: b7, b8, m1, m2, m3, games, DS и english.

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

Коды методов
def reindex(data_frame, name='data', start_date='1-1-2019', end_date='12-31-20'):    idx = pd.date_range(start_date, end_date)    dates = pd.Index(pd.to_datetime(data_frame['Start Date'].tolist(), format="%Y%m%d"))        column = data_frame['Duration (decimal)'].tolist()    column = [float(i) for i in column]    series = pd.Series(column, dates)    series.index = pd.DatetimeIndex(series.index)    series = series.reindex(idx, fill_value=0)        data = series.to_frame(name=name)    return data  def plot_kde(data_frame, col_name):    fig = plt.figure(figsize=(14, 7))    ax = fig.add_subplot(111)    sns.distplot(data_frame[col_name], hist=True, ax=ax, bins=20)    fig.savefig('kde.png', dpi=300)# Помимо баров также прорисую линию среднего значения и среднее отклонение.   def plot_bar(data_frame, img_name):    fig = plt.figure(figsize=(20, 10))    ax = fig.add_subplot(111)    data_frame.plot.bar(ax=ax, legend=False)        ax.xaxis.set_major_locator(dates.MonthLocator())    ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n\n%b\n'))    plt.tight_layout()    ax.tick_params(labelsize=20)    ax.set_xlabel("Месяц 2020", fontsize=25)    ax.set_ylabel("Время", fontsize=25)            plt.axhline(y=data_frame.data.mean(), color='r', linestyle='-')    x = list(range(0, data_frame.data.shape[0]))    mean = data_frame.data.mean()    std = data_frame.data.std()    ax.fill_between(x,                    (mean - std) if (mean - std) > 0 else 0,                    mean + std,                    color='silver')    plt.tight_layout()    fig.savefig(img_name, dpi=500)    return ax# Да, я хотел написать это своими руками :)    def stat(data_frame, col_name):    print("Sum: ".ljust(10), "%0.2f" % data_frame[col_name].sum())    print("Mean: ".ljust(10), "%0.2f" % data_frame[col_name].mean())    print("Std: ".ljust(10), "%0.2f" % data_frame[col_name].std())    print("Min: ".ljust(10), data_frame[col_name].min())    print("Max: ".ljust(10), data_frame[col_name].max())    print("Zero: ".ljust(10), (data_frame[col_name] == 0).astype(int).sum())    print("Not zero: ".ljust(10), (data_frame[col_name] != 0).astype(int).sum())

Анализ временных затрат на полезности и бесполезность

Пришло время смотреть на палочки заняться разведочным анализом! Начнем со сна. В этом случае пропуски в данных нужно заполнить не Nan-ами, а средним значением. Причем в некоторых случаях объект исследования действительно не спал сутки, а в некоторых просто забил на сохранение данных. Будем считать, что если встречается один пропуск посреди данных, то сутки были бессонными, а если пропусков сразу несколько, то поля нужно заполнить средним значением.

Код
start_date = '1-1-2020'end_date = '12-31-2020'sleep_data = df.loc[df['Description'].isin(['Sleep'])]sleep_data = reindex(sleep_data,                     start_date=start_date,                     end_date=end_date)sleep_data['data'] = sleep_data['data'].replace({0:np.nan})sleep_arr = sleep_data['data'].to_numpy()for i in range(1, len(sleep_arr - 1)):    if math.isnan(sleep_arr[i]) and not math.isnan(sleep_arr[i - 1]) and not math.isnan(sleep_arr[i + 1]):        sleep_arr[i] = 0        sleep_arr[np.isnan(sleep_arr)] = np.nanmean(sleep_arr)sleep_data['data'] = sleep_arrstat(sleep_data, 'data')plot_bar(sleep_data, 'sleep.png')plot_kde(sleep_data, 'data')

В итоге, за год я проспал 3224 часа. Для полноты картины стоит заметить, что в этом году всего было 8784 часа. Со средним ладно, а вот отклонение слишком большое. Ну и минимум с максимумом в виде 0 и 20 часов выглядят не очень. На добивании 16 суток без сна. Хорошо еще, что на графике не видно, как часто мой режим переворачивается вверх тормашками. Определенно, нужно что-то менять

Можно было бы перевести во временной формат, но и без этого все понятно.Sum:       3224.42Mean:      8.81Std:       3.28Min:       0.0Max:       20.0Zero:      16Not zero:  350

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

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

Чтение книг

Итого 152 часа за год. На самом деле я читал книги 216 часов, но недостающая часть времени записана в DS, потому что читал я Рашку, Николенко и прочих. В целом, в этом году я читал мало, и объясняется это очень просто. Много читать, а точнее слушать книги, я стал в тот момент, когда вдруг заметил, что в универ мне ехать полтора часа в одну сторону, а кубик Рубика уже реально надоел, да и люди косятся. И не потому, что я гениально выучил целых восемь комбинаций, а из-за шума. Так вот в этом году я в университете почти не появлялся (из-за пандемии и уменьшения количества пар), отсюда и низкие показатели. Странно осознавать, как сильно внешние условия могут влиять на жизнь. А еще страннее объяснять знакомым, почему мне выгодно ехать в универ даже на одну пару.

Sum:       152.50Mean:      0.42Std:       0.89Min:       0.0Max:       7.73Zero:      267Not zero:  99
Рисование

Искусство и страх (годна книга, кстати). Ну тут все плохо. Получше, чем за все пять прошлых лет, но недостаточно. Однако, все собранные мною данные можно легко использовать как почву для поиска мотивации. За это время я перешел в digital и освоил несколько интересных инструментов и техник, так что почувствовал неплохой прирост качества, причем стоило этого всего 47 часов. Уф, а если за год я порисую часов эдак 100, или 160. Уф, это ведь всего пол часа в день Но все равно заставить меня взять в руки планшет не для игры в osu, а для рисования очень и очень сложно.

Sum:       46.60Mean:      0.13Std:       0.58Min:       0.0Max:       5.8Zero:      339Not zero:  27
Английский язык

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

Sum:       90.69Mean:      0.25Std:       0.58Min:       0.0Max:       3.13Zero:      282Not zero:  84
Японский язык

Оо, нихонго. Решил я в третий раз штурмовать учебник Струговой и в этот раз бросил его не на пятнадцатой и даже не на пятидесятой страницей, а аж на сто восьмидесятой! Когда садился ботать, задача казалась нереально сложной. Некоторые иероглифы имеют до пяти чтений, да еще и запоминаются ну реально тяжело. А когда вся дневная норма в пять страниц выпадала на грамматику, я вообще хотел заняться вообще чем угодно, только не этим (хоть за курсачи сесть). Но если взглянуть на данные, то потратил-то я всего 50 часов, а проработал много материала и сильно продвинулся. Ватащи ва нихонго во декимасу сукощи декимасу тотему сукощи декимасу Ну ладно, декимасен не умею я, но прирост знаний меня впечатлил. На графике видны два пика мотивации и плато безнадежности. Выводы таковы. Большой ошибкой было выставлять чрезмерные нормы, и попытка жестко придерживаться расписания. Сначала я проходил пять страниц в день без выходных, потом добавил выходные, потом снизил объем до трех страниц, а потом забил, выгорел. Впрочем, ничего нового.

Sum:       52.42Mean:      0.14Std:       0.45Min:       0.0Max:       3.18Zero:      320Not zero:  46
Игры

Да всего-то пара пабов в день, аим потренить.

Впереди большая статья расходов. Но куда деваться. Над этими данными реально стоит подумать, ведь целых 344 часа своей жизни я потратил черт пойми что. Круто конечно бахать в оsu на шестизвездочных картах, но Кстати, взрыв в октябре связан с простой вещью - покупкой нового мощного компа. Сначала я написал здесь, что в общем-то можно и поиграть немного, расслабиться и отдохнуть, но себе-то зачем врать? Больше всего меня успокаивает рисование, а на втором месте крафт бумажных цветов. Игры же меня наоборот выводят из равновесия, так что никакой пользы тут быть не может.. Вот в новеллы поиграть можно, ведь изучать чужое творчество всегда интересно и даже полезно (кстати, пик в апреле это как раз новеллы, ибо сидеть на изоляции без интернетов тяжко). Вообще, над этим графиком можно думать очень долго. Говорить можно что угодно, но реальные данные лучше всего говорят о моих приоритетах. И картина получается невеселая, однако на нее нужно смотреть, потому что иначе можно утонуть в субъективизме.

Sum:       344.03Mean:      0.94Std:       1.62Min:       0.0Max:       12.0Zero:      165Not zero:  201
Data science

А теперь data science. Воспользуюсь размытостью данного понятия и засчитаю сюда вообще все, что связано с работой с данными. Конкретно этим направлением я стал интересоваться примерно в марте, а до этого просто кодил что-то для себя. 208 часов выглядят весьма неплохо, и тут есть над чем подумать. С одной стороны, я до сих пор не чувствую, что реально что-то знаю в этой области, но за это время я изучил немало новых методов, и лучше понял старые. А после курса от Anrew Ng я наконец-то приобрел общее понимание проблемы машинного обучения. Но больше всего меня радует то, что никто меня не заставляет этим заниматься, а я ботаю, потому что мне это реально нравится, и нравится все больше и больше.

Основными чекпоинтами можно выделить Python и машинное обучение в апреле (18 часов), курс Andrew Ng в октябре (32 часа), Глубокое обучение Николенко в ноябре (19 часов).

Sum:       208.30Mean:      0.57Std:       1.04Min:       0.0Max:       6.0Zero:      254Not zero:  112
Просмотр фильмов\сериалов\аниме

Ну сериальчики под чайок это наше все. Можно даже пледик достать на +10 к ламповости. В целом, тут меня ничего не напрягает, и ограничивать себя в просмотре годного кино я не собираюсь. Однако, более полезные занятия точно нужно дотянуть до этих показателей. В апреле опять же самоизоляция и Breaking Bad. А выброс в ноябре связан с пиццей и ночным марафоном по просмотру аниме. И да, по идее, если присмотреться, то ближе к концу года можно найти периодичность, ведь основное время просмотра я стал переносить на выходные.

Sum:       271.24Mean:      0.74Std:       1.25Min:       0.0Max:       9.5Zero:      220Not zero:  146
Прогулки

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

Sum:       192.04Mean:      0.52Std:       0.41Min:       0.0Max:       1.0Zero:      128Not zero:  238

Интересно, смогу ли я продать эти данные маркетологам?

Анализ временных затрат на учебу

Перейдем к главному - данным по учебе. Начну с последнего семестра бакалавриата. Сначала нужно слегка переписать методы вывода. Что значат названия предметов не имеет значения.

Код
def plot_bot(data_frame, start_date, end_date, year, img_name):    descriptions = data_frame.Description.unique()    df = pd.DataFrame(reindex(remove_duplicates(data_frame[data_frame.Description == descriptions[0]]),                              name=descriptions[0],                              start_date=start_date,                              end_date=end_date))    for description in descriptions[1:]:        new = reindex(remove_duplicates(data_frame[data_frame['Description'] == description]),                      name=description,                      start_date=start_date,                       end_date=end_date)        df[description] = new[description].to_numpy()    fig = plt.figure(figsize=(20, 10))    ax = fig.add_subplot(111)    df[descriptions].plot(kind='bar', stacked=True, figsize=(30, 15), ax=ax)        ax.xaxis.set_major_locator(dates.MonthLocator())    ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n\n%b\n'))    ax.tick_params(labelsize=20)    ax.set_xlabel("Месяц " + str(year), fontsize=25)    ax.set_ylabel("Время", fontsize=25)    ax.legend(fontsize=30)    ax.grid(axis='y')        df['Sum'] = df[list(df.columns)].sum(axis=1)    #ax.set_xlim(243, 395) #m1    #ax.set_xlim(45, 181) #m2    #ax.set_xlim(245, 366) #m3    plt.tight_layout()    fig.savefig(img_name, dpi=300)    return ax, df

Картина матплотибом: последний семестр учебы, прокрастинация душит. Вообще, в начале семестра я не так плохо работал, но это потому, что сессия намечалась на апрель. А когда я с ней покончил и остался один на один с дипломом, почему-то решил почти месяц ничего не делать. Как обычно. Причем чем больше задача, тем ближе к дедлайну я буду подбираться в безделии. Когда до сдачи диплома осталось около месяца, я таки взялся за работу, и поработал очень даже неплохо. 212 часов = 116 страниц, или одна страница каждые 1,8 часа. Ладно, по словам и строкам кода считать уже не буду. Ну а вообще, это было очень круто. Почти каждый день я полностью отдавался делу, видел результаты и решал интересную задачу. Правда через пару часов после успешной сдачи я стоял на автобусной остановке и думал над одним вопросом. "И чо?" Помню, с соседом по общаге мы собирались купить пару сигар и с пафосом раскурить их по поводу успешной защиты. Но сигары мы так и не купили, а в тот вечер стояли на балконе и давились дешевым табаком, при этом думая: "И ЧО???" Я долго думал, что дальше, и ничего лучше магистратуры не придумал. Сосед к концу года перебрался в другую страну на хорошую работу, а я остался, и видимо, останусь снова.

Ну а дальше была подготовка к поступлению в магистратуру. 66 часов матана и "Вы зачислены на бла бла бла". Снова посчитаем. Если покрутить формулировки, то получается, что за два года я приобретаю ресурсы, которые стоят 400 тысяч рублей, ведь год обучения стоит 200 тысяч. Переворачиваем схему деньги=ресурсы в ресурсы=деньги и "Маааам, так я работаю, целых 400 000 / 24 = 16 666 рублей в месяц зарабатываю!!!" А ведь еще можно посчитать стипендию! За первые шесть месяцев учебы это 13700. Делим на 66 часов подготовки к поступлению и получаем 208 рублей в час. Очень даже неплохо, ведь на прошлой работе я получал около 236 рублей в час, а долгосрочной пользы от этой работы было чуть меньше чем никакой.

Sum:       390.97Mean:      1.07Std:       2.10Min:       0.0Max:       10.0Zero:      252Not zero:  113DepLoME_sum:  212Math_for_masters:  66b_8_Math_for_masters:     66b_8_DepLoME:              212b_8_GOSI:                 15b_8_AI:                   28b_8_Research work:        25b_8_Basics of designing:  16b_8_VM:                   12b_8_Electronics:          13

Дальше первый семестр магистратуры. Ситуация выглядит получше, ведь работал я стабильнее, хотя ближе к сессии все же есть слабый перегиб. В итоге получается, что чтобы закрыть этот семестр на отлично мне потребовалось 234 часа (практика по B&R не считается). Если пересчитать стипендию, то выходит 96 рублей в час. Негусто, но лишним не будет. Кстати, когда я впервые пересчитывал эти часы, было удивительно, что в итоге нужно было тратить всего 1 час 20 минут в день, чтобы без проблем все сдать. С этого момента я перестал даже думать о нытье по поводу учебы, и совершенно перестал понимать других студентов в этом вопросе.

Sum:       234.95Mean:      0.59Std:       1.40Min:       0.0Max:       12.64Zero:      296Not zero:  99Average per day:  1.22Studying at the university:  62Study at home:  172m_1_GT_MIMR:              34m_1_OMaT:                 13m_1_Practice:             56m_1_AB_ACS:               52m_1_SDoAS:                18m_1_English:              15m_1_IS_MaR:               28

Второй семестр маги. Прокрастинатор возвращается. Идея так распределить время работы явно была плохой, но я справился. А вот нервные клетки все равно не вернуть. Всего на второй семестр ушло 165 часов. Неплохо. Ну и по стипендии. Выходит 152 рубля в час. Сойдет. Кстати забавно, что в университете я провел всего 12 часов. Пандемия, что еще сказать.

Sum:       165.84Mean:      0.45Std:       1.21Min:       0.0Max:       7.97Zero:      301Not zero:  65Average per day:  0.92Studying at the university:  12Study at home:  153m_2_Practice:             29m_2_AIS_MR:               7m_2_HaSCS_IMR:            48m_2_S-LaF_in_CS_IMR:      12m_2_K_Practice:           18m_2_Research work:        40m_2_Course_work:          8

Ну и третий семестр маги. Было потрачено всего 58 часов, а нужно еще часов эдак 120. В общем, январь у меня будет веселым. Люблю наступать на грабли, что поделать.

Sum:       58.60Mean:      0.16Std:       0.58Min:       0.0Max:       4.5Zero:      327Not zero:  39Studying at the university:  15Study at home:  43m_3_Other:                1m_3_ILNT:                 6m_3_C-A DaP S:            0m_3_Research work:        5m_3_ET_in_SR:             24m_3_Course_work:          4

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

Study:        787Development:  492Rest:         650

И еще раз сведу все вместе для 2020 года.

                Time, h  Time, %  Time per dayNan                3910     44.5          10.7Sleep              3224     36.7           8.8Games               344      3.9           0.9Study               295      3.4           0.8Watching films      271      3.1           0.7DS                  208      2.4           0.6Walks               192      2.2           0.5Reading books       152      1.7           0.4English              90      1.0           0.2Japanese             52      0.6           0.1Drawing              46      0.5           0.1

Заключение

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

Вторым открытие для меня стало количество времени, которое я потратил на учебу. В первом семестре мне потребовалось 235 часов, чтобы закрыться на отлично и получать в среднем 96 рублей за потраченный на учебу час. Ребят, мне платили за мое же образование! В течение шести месяцев это 1 час 13 минут в день без выходных, или 2 часа в день с выходными. Что в этом сложного? И больше всего этот вопрос я задавал самому себе. Сложного ничего нет, просто мозг по-другому видит ситуацию. А точнее не видит, попробуй ему объясни, зачем тратить энергию на что-то далекое и не обязательно светлое. На второй семестр потребовалось вообще 165 часов с оплатой в 152 рубля за час. Это 55 минут в день без выходных, или 1 час 22 минуты в день с выходными. Опять же ничего сложного в этом нет.

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

P.S.

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

1) Сколько времени уходит на сбор такой статистики? - Не больше пяти минут в день. Согласитесь, это время можно было потратить намного бесполезнее.

2) Зачем я это делаю и что дальше? - А это хороший вопрос. На самом деле все эти графики появились не из-за того, что год назад я начал интересоваться Data Science. Наоборот, в каком-то смысле я стал интересоваться темой данных еще восемь лет назад, когда открыл блокнот и записал: "Кажется, я чувствую необходимость вести дневник". С тех пор я собрал кучу разных записей, заметок, статистики по временным и денежным затратам и так далее. Например, сейчас у меня имеется 1089 страниц дневниковых записей, которые хотелось бы прогнать через несколько слоев LSTM. Тут должно быть интересно, ведь на 400 тысячах слов уже можно что-то научить. Ну и все остальное можно проанализировать хотя бы ради интереса. Например, в 2020-том я потратил на обновление железа больше половины всех денег, что потратил за год. Может я в итоге покопаюсь во всем этом, а может быть и нет. А вдруг, вдруг эти данные пригодятся для воссоздания моей личности в будущем?! По крайней мере, эти привычки сохранительства приучают меня замечать детали, обдумывать, соотносить и т.п. Хотя, это лишь мое субъективное мнение.

Кстати, кроме удовлетворения собственного интереса такой подход может принести пользу другим людям. Меня всегда очень обнадеживают численные представления объема работы, лучше всего во времени. Хорошим примером может быть чтение книг. Одно дело взять в руки Python и машинное обучение на 420 страниц, а другое дело знать, что у какого-то робототехника на ее изучение ушло 18 часов. Это совсем немного, дерзайте. Аналогичную статистику можно собрать по поводу чего угодно, и кому-то она возможно принесет пользу. Но это потом, всё потом)

P.P.S.

Ну вот я и написал свою первую статью на Хабр. Надеюсь, она была интересной, а может быть даже полезной. В любом случае, жду от Вас любые конструктивные отзывы и мысли. Спасибо за прочтение!

Подробнее..

Прощай Google! 15 Альтернативных поисковиков, которые не шпионят, а сажают деревья и раздают воду

21.06.2020 12:22:54 | Автор: admin
Аве Кодер!

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


CC Search


ccsearch.creativecommons.org

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

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

Работает CC Search довольно прямолинейно: он извлекает результаты с таких платформ, как Soundcloud, Wikimedia и Flickr и отображает результаты, помеченные как материал Creative Commons.

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

SwissCows


swisscows.ch

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

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

DuckDuckGo


duckduckgo.com

Поисковик УткаУткаИди не собирает и не хранит твои личные данные, по крайней мере так они говорят (кря).
Это означает, что ты можешь спокойно выполнять поиск, не беспокоясь о том, что твой личный ФСБшник узнает, что ты все еще ищешь адрес того деда мороза, которому рассказывал стишок когда тебе было 9 и почему поиск продолжает выдавать адрес мордовской колонии номер 17.

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

StartPage


www.startpage.com

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

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

SearchEncrypt


www.searchencrypt.com/home

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

Информация для реальных ценителей поисковик использует комбинацию методов шифрования, которые включают шифрование Secure Sockets Layer и шифрование AES-256.

Когда ты вводишь запрос, Search Encrypt извлекает результаты из своей сети партнеров по поиску и передает запрашиваемую информацию.

Интересная особенность Search Encrypt заключается в том, что после 30 минут бездействия, твои поисковые запросы и настройки обнуляются, поэтому никто не узнает что ты там искал, печатая одной рукой.

Search Encrypt Выбор настоящего параноика.

Gibiru


gibiru.com

Календарь Мая предсказывал столкновение Земли с планетой Нибиру, но в итоге Земля столкнулась с Gibiru.

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

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

OneSearch


www.onesearch.com

В январе 2020 года Verizon Media, так называется подразделение Verizon Communications, то есть Bell Corporation, после того, как ее раскололи и перекрасили запустила поисковую систему OneSearch, ориентированную на конфиденциальность.

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

Но есть:
Беспристрастные, нефильтрованные и зашифрованные результаты поиска.

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

Wiki.com


wiki.com

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

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

Boardreader


boardreader.com

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

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

giveWater


www.givewater.com

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

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

Ecosia


www.ecosia.org

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

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

Ekoru


www.ekoru.org

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

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

Slideshare


www.slideshare.net

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

Wayback Machine


archive.org

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

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

У Ясеня


уясеня.рф

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

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

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

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

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

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



Пиши в комментариях свои личные предпочтения или если я упустил кого-то достойного внимания. Аве!
Подробнее..

Проблемы мониторинга дата-пайплайнов и как я их решал

16.06.2021 00:20:01 | Автор: admin

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

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

Чтобы понять, как все это мониторить, давайте разберемся кто вообще работает с данными, которые мы с таким трудом намайнили:

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

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

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

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

Вот примеры:

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

  • Пайплайн стучится в источник с надеждой получить свежие данные, которые появляются в API источника с неопределенной задержкой (привет Apple), пайплан может успешно завершиться как скачав отчет, так и получив сообщение о том, что отчета еще нет. Тут, конечно, можно делать бесконечные ретраи внутри, либо просто ронять пайплайн, но тогда не особо очевидно будет, по какой причине он упал - что-то пошло не так, или данные в источнике еще не подтянулись.

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

ETL как он естьETL как он есть

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

Чего не хватает во встроенных мониторингах систем работы с данными:

  • Бизнес не может просто посмотреть в модный мониторинг типа того же Airflow или ELK и понять, можно или нельзя доверять данным, актуальность состояния данных непрозрачна.

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

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

Все это превращается в такие вот проблемы:

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

  2. Люди из бизнеса хотят более наглядного отображения состояния данных и системы, чем оно представлено в технических мониторингах.

  3. Статистика, если и собирается, то собирается по техническим проблемам и нельзя понять, насколько эти технические проблемы повлияли на бизнес.

Концепция

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

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

Почему вообще вебхуки?

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

После того, как мы начали отсылать из процессов события, нужно их проанализировать и получить ответы на всякие важные вопросы, например (все числа абстрактны):

  • запустилась ли наша задача 10 раз за последний день?

  • не превышает ли количество падений (определяем падение, если полученное значение > 0, например) 15% от всех запусков за сегодня?

  • нет ли процессов, которые длятся больше 20 минут?

  • не прошло ли больше часа с момента последнего успешного завершения?

  • стартовало ли событие по планировщику в нужное время?

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

Реализация

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

Дашборд состояния серверов Sensorpad средствами SensorpadДашборд состояния серверов Sensorpad средствами Sensorpad

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

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


Для инженера тут все понятно:

  • скрипт отрабатывает быстро (еще бы, простая крон-джоба);

  • монитор вполне живой, 25 минут назад обновился;

  • места еще с запасом (цифра 53 в левом нижнем углу - это последнее принятое значение);

Для людей из бизнеса тут тоже все просто:

  • монитор зеленый;

  • статус прописан в первой же строчке;

  • никакой лишней информации;

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

И насколько просто такое настроить?

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

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

    df -h |grep vda1 | awk  '{ print $5 }'| sed 's/.$//' | xargs -I '{}' curl -G "https://sensorpad.link/<уникальный ID>?value={}" > /dev/null 2>&1
    
  3. Присоединяем к этому вебхуку монитор, называем его: количество свободного места (но можно еще и другие, например, то, что события уходят по графику означает, что сервер не упал)

  4. Настраиваем правила, по которым монитор меняет свой статус.

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

  6. Добавляем монитор на один или несколько дашбордов.

А можно поподробнее?

Для вебхуков я пока что сделал саму простую имплементацию:

  • базовый вебхук, который будет нужен для 80% проектов;

  • cron-вебхук, который ожидает события в заданное через cron-синтаксис время;

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

главное в нашем деле - не усложнять интерфейсыглавное в нашем деле - не усложнять интерфейсы

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

Догфудинг в действииДогфудинг в действии

Дальше создаем тот самый монитор - квадратик, меняющий статус и цвет.

Можно даже иконку выбратьМожно даже иконку выбрать

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

Теперь, собственно то, из-за чего я и написал эту балалайку: правила и гибкая логика.

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

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

На скриншоте выше видно уже созданные правила, но я покажу как они создаются.

Например правило, которое можно сформулировать так: "установи статус Warning, если за последний день было больше 5 джоб, которые работали дольше 10 секунд".

А вот какие вообще можно выбирать проверки в каждом из пунктов:

И какие реальные кейсы можно покрыть этими правилами?

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

  • Cron job, Airflow DAG или любой другой процесс не запустился по расписанию;

  • 20% задач одного и того же пайплайна за день не отработали как надо;

  • связанная задача в пайплайне не запустилась через 2 минуты после окончания родительской задачи;

  • интервал между запусками двух задач меньше 1 минуты (похоже, у нас две конкурентные джобы);

  • с момента последнего успешного завершения пайплайна прошло 2 часа (а данные должны считаться каждый час);

  • время работы пайплайна уже целых 20 минут (а должен был отработать за 5, что-то подвисло).

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

А теперь - статистика!

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

Немного полезных и не очень графиковНемного полезных и не очень графиков

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

Вот такой концепт. Чего не хватает?


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

Потыкайте его вживую, заодно зацените, какой я у мамы дизайнер лендингов: https://sensorpad.io

Подробнее..

Разработка инфраструктуры вождения автомобилей высокой автономности (HAD)

12.03.2021 10:04:49 | Автор: admin

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

1. ВВЕДЕНИЕ

Помимо преимуществ у автономных автомобилей есть и немало серьезнейших проблем.

  • Водить даже обычный автомобиль бывает очень непросто, но ситуация дополнительно осложняется, если нужна автоматическая отказоустойчивая система, способная работать в любых условиях вождения с крайне низкими показателями допустимых ошибок. Автономные автомобили образуют и потребляют огромные объемы данных. При этом в новом отчете прогнозируется рост глобального рынка автомобилей с сетевыми возможностями на 270% к 2022 году. Предполагается, что к 2022 году будет продано свыше 125 миллионов пассажирских автомобилей с возможностями сетевого подключения [1].

  • Суммарные расходы на разработку автономных систем вождения могут достигать миллиардов долларов, при этом стоимость оборудования одного автомобиля всем необходимым для полностью автономного вождения также будет весьма велика и может достигать 100 тысяч долларов [2].

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

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

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

Во все времена существования автомобилей именно технологии определяли самые современные возможности безопасности. С 70-х годов автопроизводители стали выпускать подушки безопасности, что позволило избежать множества человеческих жертв. Применение антиблокировочных тормозных систем, которыми автомобили оснащаются с 90-х годов, привело к снижению столкновений без человеческих жертв на 6-8% [3]. Тем не менее почти 1,3 миллиона человек ежегодно становятся жертвами дорожно-транспортных происшествий [4].

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

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

Беспилотные автомобили будут играть важную роль в будущем умных городов и повлияют на построение и устройство городской инфраструктуры. В настоящее время только в США свыше 700 миллионов выделенных парковочных мест, занимаемая ими общая площадь сравнима с площадью всего штата Коннектикут. Автомобиль в среднем занимает парковочное место в течение всего 4% времени, тогда как при использовании беспилотных автомобилей коэффициент использования возрастает до 75% [5]. По этим причинам автономные автомобильные парки станут важным компонентом в умных городах будущего.

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

Отчет, опубликованный компанией Allied Market Research, гласит, что объем глобального рынка автономных автомобилей составил 54,23 млрд долларов в 2019 году, а к 2026 году может вырасти до 556,67 млрд долларов, при этом совокупные темпы годового роста с 2019 по 2026 год составят 39,47% [6]. Для систем вождения высокой автономности (HAD) и полуавтономных функций в расширенных системах помощи водителям (ADAS) требуется платформа, способная получать и обрабатывать данные как в ядре, так и на границе сети. Высокопроизводительные решения HPE для хранения и архивации данных повышают надежность развертывания, обеспечивают защиту данных и их готовность к анализу. Множество решений HAD могут предоставляться по модели как услуга или по другим моделям потребления с оплатой по мере использования. Именно в этой области действуют решения пакета HPE GreenLake, упрощая обслуживание ИТ-инфраструктуры и сохраняя конфиденциальность и контроль над ней.

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

1.1. Общие характеристики задачи

Составные части процесса разработки автономного автомобиляСоставные части процесса разработки автономного автомобиля
  1. Обнаружение. Решения HAD опираются на технологии автомобильных встроенных датчиков. Основные датчики: спутниковая система геопозиционирования (GPS), блок инерциальных датчиков (IMU), камеры, лидары, радары, ультразвуковые источники, а также различные датчики, установленные внутри автомобиля и в его силовом агрегате. Некоторые технологии уже широко применяются (например, GPS и камеры), тогда как другие (например, лидары) в настоящий момент достаточно дороги, однако по мере развития автономных автомобилей такие системы будут становиться дешевле и компактнее. Таким образом, на первом этапе необходимо преобразовать объем данных, поступающих от всего комплекса датчиков автомобиля, в подробное представление окружающей обстановки.

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

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

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

  5. Принятие решения. Решение это подготовка к действию. Что автомобиль должен сделать? Повернуть? Затормозить? Продолжить ехать прямо? Бортовой компьютер автомобиля принимает решения на основе данных с датчиков, обработанных в контексте окружающей обстановки. Модели обучаются с помощью алгоритмов машинного обучения и огромного объема данных, полученных с комплексов автомобильных датчиков. это позволяет создать алгоритмы, способные предсказывать потенциальные события на основе поступающей в реальном времени ситуативной информации. После этого можно применять логические схемы для определения предпочитаемой последовательности действий. Основная цель состоит в составлении стратегии вождения: уклонении от препятствий, планировании поведения, управлении на основе данных GPS, планировании маршрутов, прогнозировании явно незафиксированных событий.

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

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

Высокоуровневый вид компонентов разработки полного цикла системы HADВысокоуровневый вид компонентов разработки полного цикла системы HAD

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

  • Модель в контуре управления (MIL). Тестирование модели системы и операционной среды без проведения тестов на оборудовании HAD (часто выполняется на обычных рабочих станциях). Проверка MIL обычно проводится на ранних этапах цикла разработки.

  • Программное обеспечение в контуре управления (SIL). Испытание и проверка автоматически созданного кода, используемого в контроллере системы. Тестирование SIL часто происходит в сэмулированной среде, также без проверки на системном оборудовании HAD.

  • Оборудование в контуре управления (HIL). Тестирование и проверка системного оборудования HAD для выявления всех ошибок в архитектуре оборудования или вызванных используемым компилятором.

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

2. УРОВНИ АВТОНОМНОСТИ

В соответствии с подходом SAE (Society of Automotive Engineers), который поддерживается Национальным управлением по безопасности движения автотранспорта США (NHTSA), автономность автомобилей определяется по шестиуровневой иерархии (с Уровня 0 по Уровень 5).

  • Уровень 0. Без автоматизации. Автомобилем всегда управляет только человек. При этом автомобиль может быть оснащен определенными системами предупреждения, но задача динамического вождения полностью выполняется человеком.

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

  • Уровень 2. Частичная автоматизация. Автомобиль может совершать маневры (перестраиваться из ряда в ряд), ускоряться и замедляться. При этом человек по-прежнему постоянно контролирует движение автомобиля и выполняет все остальные аспекты задачи динамического вождения.

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

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

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

Классификация уровней автономности HAD, установленная Обществом автомобильных инженеров США (SAE) [7: https://www.sae.org/standards/content/j3016_201806/]Классификация уровней автономности HAD, установленная Обществом автомобильных инженеров США (SAE) [7: https://www.sae.org/standards/content/j3016_201806/]

Последние инвестиции и корпоративные приобретения свидетельствуют об интересе отрасли к разработке HAD и о стремлении как можно скорее добиться автономности Уровня 5. Корпорация Ford инвестировала 1 миллиард долларов в Argo AI [8]. Корпорация GM инвестировала средства в Lyft и приобрела Cruise Automation [9]. Корпорация Volvo создала совместное предприятие с Uber [10]. Корпорация Uber приобрела Otto [11]. Корпорация Intel инвестировала 15,3 миллиарда долларов для приобретения Mobileye [12]. Корпорации Hyundai и Toyota объявили о собственных инвестициях в исследования и разработку HAD. Это лишь небольшая, но достаточно репрезентативная выборка деятельности в этой весьма динамичной отрасли.

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

Инициатива достижения Уровня 5 набирает все большие обороты. Тем временем крупнейшие автопроизводители осваивают направление автономных автомобилей самостоятельно либо заключают партнерские соглашения с другими компаниями, разрабатывающими такие программы. Все производители по-разному подходят к решению проблемы. Компания Waymo (принадлежит корпорации Alphabet/Google) объявила, что интересуется только Уровнем 5. Другие компании, такие как Uber и Ford, готовятся к Уровню 4 [13]. Корпорации Daimler и Bosch объявили [14] о планах разработки автономных автомобилей Уровней 4 и 5 с возможным стартом производства к началу следующего десятилетия. Другие компании выбрали последовательное развитие: по мере совершенствования технологий HAD они проходят каждый из уровней.

3. СБОР, ПРЕОБРАЗОВАНИЕ И АНАЛИЗ ДАННХ

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

Поток данных от набора датчиков одного автомобиля составляет в среднем 33 Гбит/с, это примерно 120 ТБ данных за 8-часовую поездку. Технологии еще находятся на этапе разработки, поэтому в силу действующих правовых норм потребуется хранить весь объем данных с автономных автомобилей. Однодневный тест-драйв парка из 80 автомобилей это около 10 ПБ исходных данных. Следовательно, небольшой парк автомобилей будет генерировать от 100 до 500 ПБ данных в день.

3.1. Основные принципы

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

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

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

4. ПОИСК КОМПЛЕКСНОГО РЕШЕНИЯ HAD

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

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

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

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

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

4.1. Регистрация данных

Бортовое оборудование тестовых автомобилей собирает данные, поступающие от датчиков, и сохраняет их, при этом скорость потока данных может превышать 30 Гбит/с. Например, если эксплуатационный парк из 80 автомобилей собирает 18 ТБ данных за 8-часовую смену при скорости 5 Гбит/с в каждом автомобиле, за всю смену будет сгенерировано 1,44 ПБ сырых данных. сли же такой же автомобильный парк генерирует данные на скорости 30 Гбит/с в каждом автомобиле, за смену будет создано 8,64 ПБ данных.

Для таких высоких скоростей данных рекомендуется конвергентная система для границы сети HPE Edgeline EL8000. Это универсальная модульная конвергентная платформа, объединяющей вычислительные ресурсы и ресурсы хранения данных, и допускающая подключение датчиков. Системы HPE EL8000 могут работать в более жестких условиях окружающей среды, чем стандартное ИТ оборудование, и поддерживают удаленное управление. HPE EL8000 это идеальный регистратор данных, представляющий собой интегрированное расширение центра обработки данных.

Система HPE EL8000 может принимать десятки гигабит данных в секунду от лидаров, радаров и видеопотоков, это практичная конвергентная автомобильная вычислительная платформа для тестирования и разработки. Каналы ввода-вывода шины PCIe в системах HPE EL8000 связаны напрямую с ЦП, обеспечивается непосредственный доступ к внутренней шине ЦП. Таким образом, данные напрямую движутся в память и из памяти, а также в кэш процессора и в другие устройства PCIe.

HPE EL8000 это не просто модуль хранения данных. Эта система поддерживает 64-разрядные ЦП x86 и специализированные ускорители вычислений, в том числе видеоускорители (GPU) и П ИС. В этом отношении HPE EL8000 представляет первый шаг конвейера преобразования данных. HPE EL8000 может устранить одно из узких мест потока данных за счет автоматической разметки содержимого тегами на лету. При этом снижается объем необходимых операций предварительной обработки.

4.2. Получение данных

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

  • Замена физических носителей. Система HPE EL8000 оборудована накопителями с поддержкой горячей замены; можно вставлять накопители в автомобильную систему и извлекать их. При этом в качестве носителей данных используются твердотельные накопители, чтобы свести к минимуму риск потери данных при манипуляциях и транспортировке. Носители информации передаются в местный центр сбора информации, информация с них считывается и по высокоскоростным каналам передачи данных передается в ЦОД.

  • Выгрузка данных по высокоскоростным локальным сетям в станции сбора данных или центры обработки данных. В этом случае для выгрузки данных с автомобилей в станции сбора данных используется локальная сеть. Станции сбора данных расположены в центрах обработки данных, где автомобили подключают непосредственно к сети ЦОД. После подключения автомобили выгружают данные в указанные целевые системы по каналам с пропускной способностью 100 Гбит/с.

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

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

Различные файловые системы. Производительность и масштабируемостьРазличные файловые системы. Производительность и масштабируемость

4.3. Озеро данных

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

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

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

Некоторые клиенты пользуются другими распределенными крупномасштабными средами, включая Hadoop Distributed File System (HDFS), Ceph и даже решения, совместимые с S3. Например, HDFS работает на стандартном оборудовании и легко масштабируется. HDFS также назначить разные уровни хранения данных в зависимости от их температуры. Самые горячие данные, к которым требуется быстрый доступ, размещаются на самых быстрых накопителях, а холодные данные на менее скоростных дисках. Такой подход дает возможность создать озеро данных с невысокими затратами и оптимизировать систему с точки зрения важности данных и потребности в них.

4.4. Методики Программное обеспечение в контуре управления (SIL) и Оборудование в контуре управления (HIL)

В отчете, опубликованном в 2016 году [15], корпорация RAND подсчитала, что для снижения количества ДТП со смертельным исходом на 20 % автономные автомобили должны проехать около 11 миллиардов миль. сли использовать парк из 100 автомобилей, которые ездят круглосуточно 365 дней в году со средней скоростью 25 миль в час, для выполнения этой задачи потребуется 518 лет. Очевидно, требуется другое решение.

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

Корпорация HPE располагает опытом создания и поставки систем моделирования для автомобильных компаний во всем мире. В этих решениях HPE обычно использует шасси HPE Apollo 2000 Gen10 с серверами HPE XL170r для вычислений с использованием центрального процессора и с серверами HPE XL190r для вычислений с использованием видеокарт (GPU).

Индивидуальные рабочие процессы SIL создаются на основе системы контроля и управления (CMS). Система CMS поддерживает планирование событий по времени и обработку очередей действий, которые будут выполняться параллельно в зависимости от наличия свободных ресурсов.

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

Модель Оборудование в контуре управления (HIL) также можно интегрировать в основную сеть ЦОДа для организации высокоскоростного доступа к озеру данных. Поскольку требуется очень высокий уровень производительности, для конфигурации HAD предпочтительно использовать высокоскоростные среды передачи данных, такие как InfiniBand и Intel Omni-Path. Также стоит предусмотреть дополнительные каналы Ethernet 10 Гбит/с для реализации глобальной связности и индивидуальных проектов HIL.

4.5. Архивация и резервное копирование

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

Кроме того, в силу действующего законодательства и собственных политик, компании может также потребоваться архивация и резервное копирование данных. Для длительного хранения данных корпорация HPE предлагает решение Data Management Framework (DMF). Это иерархический диспетчер хранения данных с более чем 20-летней историей успешной эксплуатации. HPE DMF автоматически отслеживает свободное пространство в управляемой файловой системе. За счет этого гарантируется наличие необходимого свободного места, а системные администраторы избавляются от рутинной необходимости постоянно отслеживать загрузку ресурсов хранения данных и добавлять новые.

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

Ленточное решение HPE DMF построено на основе ленточной библиотеки HPE TFinity ExaScale на базе технологии Spectra. TFinity ExaScale это самая вместительная в мире отдельно стоящая система хранения данных [16]. Одна библиотека TFinity EE способна хранить до 53 450 ленточных картриджей на 44 шкафах.

При использовании технологии сжатия TS1150 емкость системы превышает 1 эксабайт. Благодаря решению Dual Robotics и 72 накопителям LTO-8 скорость записи достигает примерно 21 ГБ/с, а емкость 100,2 ПБ при использовании картриджей 8350 LTO-8 (четыре дорожки).

5. УСЛУГИ И РЕШЕНИЯ ПАРТНЕРОВ

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

5.1. Создание

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

  • исследовать цели и приоритеты сценариев использования для бизнеса, данных и участников ИТ-экосистемы;

  • определить функциональность ИИ и аналитики, необходимую для достижения поставленных целей;

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

5.2. Выполнение

Запуск в эксплуатацию налагает требования по необходимому уровню операционной поддержки для всех компонентов, чтобы обеспечить оптимальную доступность для поддержки бизнеса. Предоставляя услуги операционной поддержки HPE Pointnext Services, корпорация HPE может помочь в реализации операционных задач системы HAD.

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

5.3. Потребление

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

5.4. Партнеры

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

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

6. ЗАКЛЮЧЕНИЕ

В дорожно-транспортных происшествиях во всем мире ежегодно гибнет около 1,35 миллиона человек. Аварии на дорогах обходятся большинству стран в 3% их внутреннего валового продукта. От 20 до 50 миллионов человек получают несмертельные травмы, часто приводящие к нетрудоспособности [18].

Автомобили высокой автономности стремительно растущий рынок, цель повышение безопасности и здоровья общества. По оценкам специалистов, если распространение автономных автомобилей достигнет 10, 50 и 90%, это может привести к снижению числа человеческих жертв соответственно на 1100, 9600 и 21 700 человек в США за год [19].

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

Предложения HPE позволяют удовлетворить потребности автомобильной промышленности в современных решениях ИИ и высокопроизводительных вычислений для облачных развертываний HAD. При этом клиенты могут приобрести и эксплуатировать решения самостоятельно, а также заключить договор с HPE (используя HPE Pointnext Services, HPE GreenLake и другие предложения услуг) и поручить нашей корпорации обработку некоторых или всех вычислительных задач для HAD. Корпорация HPE предлагает полный ассортимент вычислительных систем, сетевых решений, систем хранения данных и технической поддержки и услуг по всему миру, гарантируя, что разработчики уже сегодня могут приступить к созданию оптимальных решений HAD для надежных и безопасных транспортных сетей будущего.

Подробнее..

Перевод Индексы PSI и CSI лучшие метрики для мониторинга работы модели

14.08.2020 18:11:43 | Автор: admin
Представляем вам перевод статьи, опубликованной в блоге towardsdatascience.com.
Ее автор, Juhi Ramzai, рассказала об эффективных методах проверки моделей PSI (индексе стабильности популяции) и CSI (индексе стабильности характеристик).

Изображение предоставлено автором

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

А теперь перейдем к основной теме данного поста. Мы узнаем все о PSI (индексе стабильности популяции) и CSI (индексе стабильности характеристик), которые являются одними из самых важных стратегий мониторинга, используемых во многих областях, особенно в сфере оценки кредитных рисков.

Обе эти метрики (и PSI, и CSI) сосредоточены на изменениях в РАСПРЕДЕЛЕНИИ ПОПУЛЯЦИИ.

Основная идея этих метрик заключается в том, что модель прогнозирования лучше всего работает, если данные, использованные для ее обучения, не слишком отличаются от валидационных / OOT (out of time) данных в плане экономических условий, основополагающих допущений, стиля ведения кампании, направленности и т. д.

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

Индекс стабильности популяции (PSI)


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

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

Изначально индекс стабильности популяции (PSI) был разработан для мониторинга изменений в распределении между внеплановыми выборками (ООТ) и выборками периода времени разработки при оценке кредитных рисков. В настоящее время использование индекса PSI стало более гибким по своей природе, что позволяет исследовать изменения как распределений, связанных с атрибутами модели, так и популяций в целом, включая зависимые и независимые переменные CSI. Мы рассмотрим это в следующем разделе.

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


Источник

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

  • с изменениями в экономической среде, такими как экономический кризис, COVID-19 и т. д.;
  • изменениями в источниках данных;
  • изменениями во внутренней политике, которые прямо или косвенно влияют на распределение популяции;
  • проблемами с интеграцией данных, которые могут привести к ошибкам в данных;
  • проблемами при программировании/кодировании, такими как реализация модели или пропуск некоторых важных этапов в коде оценки качества работы модели.

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

ШАГИ ДЛЯ РАСЧЕТА ИНДЕКСА PSI (Ссылка)

  1. Сортируем оцениваемую переменную по убыванию в оцениваемой выборке.
  2. Разделяем данные на 10 или 20 групп (дециль).
  3. Рассчитываем процент записей в каждой группе на основании оцениваемой выборки.
  4. Рассчитываем процент записей в каждой группе на основании выборки разработки.
  5. Рассчитываем разницу между шагами 3 и 4.
  6. Берем натуральный логарифм (Шаг 3 / Шаг 4).
  7. Умножаем шаг 5 на шаг 6.

ТАБЛИЦА EXCEL ИНДЕКСА PSI:

Изображение предоставлено автором

ПРАВИЛА ТОЛКОВАНИЯ (Ссылка)

  1. Индекс PSI < 0,1 без изменений. Вы можете продолжить использование существующей модели.
  2. Индекс PSI >= 0,1, но меньше 0,2 требуются небольшие изменения.
  3. PSI >= 0,2 требуются значительные изменения. В идеале модель больше не должна использоваться. Ее следует обучить заново / заменить другой.

Также можно использовать условный диапазон форматирования красную, желтую и зеленую зоны (Red-Amber-Green zone). Красный цвет тревожное состояние, при котором индекс PSI составляет более 20%, желтый это 1020%, при этом модель должна находиться под наблюдением, а зеленый это этап, на котором модель считается пригодной для использования, т. е. < 10%.

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

Индекс стабильности характеристик (CSI)


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

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


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

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

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

ТАБЛИЦА EXCEL ИНДЕКСА CSI


Изображение предоставлено автором

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

Ссылка на исследование
Подробнее..

Какие Антивирусы собирают ваши пользовательские данные, и как этого избежать?

31.03.2021 00:12:34 | Автор: admin
Антивирусное ПО было создано для защиты данных пользователя от любого посягательства из вне. Но в связи с большим спросом на антивирусы, некоторые производители, начали использовать информацию о клиентах в коммерческих целях. В этой статье мы разберёмся, какие программы собирают данные о клиентах и какими альтернативными вариантами их заменить.

image

Введение


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

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

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

В качестве реакции на опубликованное исследование, компания AVAST 30 января 2020 года сообщила о прекращении деятельности своей дочерней компании Jumpshot, которая продала маркетологам истории браузеров пользователей продукта компании AVAST.

AVAST собирает и продает историю просмотров



image

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

Вот как Michael Kan рассказывает об этом в издании PC Mag:

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

Несмотря на утверждение компании AVAST, что переданные третьим лицам данные анонимны, изданиям PC Mag и Motherboard удалось связать полученную информацию о пользователях с их личностями. Например, если известно, какой из пользователей магазина Amazon приобрел определенный продукт в конкретное, определенные до секунды, время и дату, то вполне можно идентифицировать анонимного пользователя и затем просмотреть его историю запросов браузера.

AVAST собирает данные с помощью антивируса, стационарно установленного на компьютерном устройстве


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

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

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

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

В открывшемся окне антивирусного решения нажмите на кнопку Меню, расположенную в правом верхнем углу панели активного рабочего окна.

image

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

image

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

image

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

Расширения браузера способствуют утечке информации


Антивирусное программное обеспечение часто объединяет расширения браузера, которые собирают подробные сведения, включая информацию о запросах пользователей в поисковой строке, для маркетинговых целей. В октябре 2019 года создатель расширения Adblock Plus Владимир Палант объединил и структурировал способ сбора и передачи несколькими расширениями браузера AVAST информации об истории посещений пользователей. Расширение браузера AVG также производило сбор и последующую передачу подобных сведений, что неудивительно, так как компания AVAST приобрела AVG несколько лет назад.

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

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

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

За использование бесплатного антивирусного программного обеспечения необходимо платить


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

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

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

Какие антивирусные программы не отслеживают пользователей?



image

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

В продолжение, ранее упомянутый создатель расширения Adblock Plus Владимир Палант, разоблачивший сбор данных в расширениях браузера AVAST и AVG, сообщил, что не обнаружил никаких признаков того, что бесплатный антивирус Kaspersky шпионит за собственной аудиторией пользователей. Однако в августе 2019 года исследователь Рональд Эйкенберг, сотрудник немецкого издания Ct Magazine, обратил внимание на особенность, которая позволяет следить за пользователем в Интернете. Антивирусы Лаборатории Касперского осуществляют инъекцию кода Java Script в браузер, чтобы проверить безопасность сайтов, при этом код присваивает устройству уникальный идентификатор, с помощью которого его можно отследить в глобальной сети. В настоящее время, использование уникальных идентификаторов прекращено и возможность случайного раскрытия личной информации пользователей в продуктах Лаборатории Касперского устранена.

Для пользователей, опасающихся утечки конфиденциальной информации, мы рекомендуем использовать программный продукт компании Microsoft Защитник Windows, который интегрирован в операционную систему Windows 10. У антивируса Microsoft нет побочных действий и все его усилия сосредоточены на защите персонального компьютера от вредоносных программ. Он не отслеживает историю просмотров веб-страниц и не вынуждает пользователей приобретать дополнительное программное обеспечение, хотя корпорация Microsoft и предлагает более продвинутый договор на программный продукт с целью обеспечения безопасности при ведении коммерческой деятельности.

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

Заключение


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

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

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

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

Категории

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

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru