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

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

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

 

 -Постоянные читатели

 -Статистика

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

Habrahabr








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

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

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

ИТ против ИИ: отберут ли машины работу у своих создателей?

Четверг, 21 Сентября 2017 г. 15:18 + в цитатник
Разговоры о том, что системы искусственного интеллекта рано или поздно вытеснят людей из ряда профессий, ведутся уже не первый десяток лет. Роботы проникают в медицину, тяжелую промышленность, решают сложные аналитические и творческие задачи. А издание The Guardian не так давно сообщило, что одна из японский страховых компаний сократила часть сотрудников, заменив их системой Watson Explorer от IBM, которая, по предположениям менеджмента, должна оказаться на 30% продуктивнее людей.

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

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

В этом материале:

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

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

https://habrahabr.ru/post/338410/


Метки:  

ИТ против ИИ: отберут ли машины работу у своих создателей?

Четверг, 21 Сентября 2017 г. 15:18 + в цитатник
Разговоры о том, что системы искусственного интеллекта рано или поздно вытеснят людей из ряда профессий, ведутся уже не первый десяток лет. Роботы проникают в медицину, тяжелую промышленность, решают сложные аналитические и творческие задачи. А издание The Guardian не так давно сообщило, что одна из японский страховых компаний сократила часть сотрудников, заменив их системой Watson Explorer от IBM, которая, по предположениям менеджмента, должна оказаться на 30% продуктивнее людей.

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

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

В этом материале:

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

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

https://habrahabr.ru/post/338410/


Метки:  

ИТ против ИИ: отберут ли машины работу у своих создателей?

Четверг, 21 Сентября 2017 г. 15:18 + в цитатник
Разговоры о том, что системы искусственного интеллекта рано или поздно вытеснят людей из ряда профессий, ведутся уже не первый десяток лет. Роботы проникают в медицину, тяжелую промышленность, решают сложные аналитические и творческие задачи. А издание The Guardian не так давно сообщило, что одна из японский страховых компаний сократила часть сотрудников, заменив их системой Watson Explorer от IBM, которая, по предположениям менеджмента, должна оказаться на 30% продуктивнее людей.

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

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

В этом материале:

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

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

https://habrahabr.ru/post/338410/


Метки:  

ИТ против ИИ: отберут ли машины работу у своих создателей?

Четверг, 21 Сентября 2017 г. 15:18 + в цитатник
Разговоры о том, что системы искусственного интеллекта рано или поздно вытеснят людей из ряда профессий, ведутся уже не первый десяток лет. Роботы проникают в медицину, тяжелую промышленность, решают сложные аналитические и творческие задачи. А издание The Guardian не так давно сообщило, что одна из японский страховых компаний сократила часть сотрудников, заменив их системой Watson Explorer от IBM, которая, по предположениям менеджмента, должна оказаться на 30% продуктивнее людей.

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

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

В этом материале:

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

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

https://habrahabr.ru/post/338410/


Метки:  

Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

Четверг, 21 Сентября 2017 г. 15:09 + в цитатник
AndreyIvanoff сегодня в 15:09 Маркетинг

Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

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

    image

    Реализация мультиформатного баннера, шаблон Leaderboard 1.

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

    Тот, кто хоть раз имел дело с запуском медийных рекламных кампаний по технологии RTB (англ. Real Time Bidding), сталкивался с проблемой: клиент предоставил для размещения баннер формата 240x400 и на этом всё. Однако стандарты IAB предусматривают как минимум 15 разных форматов: Leaderboard (728x90), Inline rectangle (300x250), Mobile leaderboard (320x50), Half-page (300x600), Banner, Large rectangle и другие.

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

    Сколько форматов баннеров в RTB-трафике


    Их очень много: по данным рекламной платформы DataMind, на конец 2016 года — около 1700 форматов, количество потенциальных показов по которым превышает 100 тысяч в месяц.

    Ниже представлена диаграмма распределения трафика между размерами рекламных блоков. Чем больше точка, тем больше трафика на нее приходится. В топ выходят всем известные форматы: 320x50, 240x400, 728x90, 300x250. Но для проведения масштабной рекламной кампании этих форматов оказывается недостаточно.

    image

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

    Если рекламная кампания запускается только с одним баннером формата 240x400, рекламодатель охватывает только 17,22% от всего доступного трафика. А если подготовить рекламные материалы для всех IAB-форматов, охват увеличится до 77,2%.


    Распределение рекламного трафика по форматам баннеров. 22,8% рекламных показов возможны для форматов, которые не включены в стандарт IAB

    Но что делать, если хочется получить все 100% и еще сэкономить? Не каждый рекламодатель будет делать баннер формата, например, 800x90, поэтому и аукцион для этого формата будет менее «горячим» по сравнению с аукционом для формата 240x400.

    Универсальная классификация рекламных форматов баннеров


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


    Точечная диаграмма для форматов баннеров с потенциальными показами свыше 100 тысяч в месяц в RTB-трафике для территории России. Классифицированы форматы Towers, Squares, Leaderboards

    Здесь вся плоскость разбита на три больших области:

    • баннеры-башни (Towers);
    • баннеры-квадраты (Squares);
    • баннеры-перетяжки (Leaderboards).

    Обратите внимание как ведут себя точки диаграммы: они выстраиваются вдоль четырех линий с коэффициентами наклона:

    $k_{-2}=\frac{height}{width}=1.78, k_{-1}=\frac{height}{width}=1.33, k_0=\frac{height}{width}= 1,\\ k_{1}=\frac{height}{width}=0.75, k_{2}=\frac{height}{width}=0.56.$

    Нажмите, если формула не отображается.
    image

    Можно обнаружить интересную степенную зависимость, которая, кажется, как-то связана с историческим развитием форматов экранов (См. Соотношение сторон экрана):

    $$display$$\begin{equation} k_{i}=\left(\frac{3}{4}\right)^{i}, i=-2,-1,0,1,2. \end{equation}$$display$$

    Нажмите, если формула не отображается
    image

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

    Классификация форматов баннеров на Towers, Squares, Leaderboars интуитивно понятна. Кажется, что достаточно сверстать три HTML-шаблона для каждого формата, и мы сможем отобразить рекламные материалы в рекламном блоке любого размера. Отчасти это так.

    Как устроены адаптивные баннеры AdWords


    Разрабатывая собственную технологию мультиформатных баннеров, мы в Tinkoff.ru решили исследовать технологию, которую использует Google. Оказалось, что она не применяет резиновую верстку в комбинации с media-запросами. Для каждого рекламного блока удаленный и очень хитрый сервис отдает позицию каждого элемента HTML-баннера, по которой элемент жестко фиксируется в рекламном блоке. Нам стало интересно, какой алгоритм используется для адаптации рекламных материалов к рекламному блоку заданного размера.

    Для исследования был «пойман» реальный рекламный мультиформатный баннер с рекламой одного из продуктов Tinkoff.ru. Он был принудительно отображен в блоках разного размера, при этом ширина блока изменялась от 216 до 1 200 px, а высота — от 36 до 1 200 px с шагом в 1 пиксель. Мы провели около 1,145 миллиона наблюдений за поведением верстки мультиформатного баннера при разных значениях ширины и высоты рекламного места. И выявили девять типичных HTML-шаблонов, которые использует Google при отображении баннера. Мы разбили их на три класса и дали им названия:

    • для класса Tower: Tower 1 и Tower 2 (визуально различаются только используемыми шрифтами, поэтому далее не будем выделять Tower 2 отдельно);
    • для класса Square: Square 1, Square 2, Square 3, Square 4;
    • для класса Leaderboard: Leaderboard 1 (пример — на первом рисунке в статье), Leaderboard 2, Leaderboard 3.

    Области использования каждого HTML-шаблона изображены на рисунке ниже. Мы обнаружили существенно нелинейную область, граница которой описывается гиперболой (для форматов Leaderboard 3 и др.).


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

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

    Обработка результатов наблюдений


    Алгоритм выбора шаблона в зависимости от размера рекламного блока устанавливается просто, если использовать деревья решений. Мы использовали Recursive Partitioning and Regression Trees из R-пакета rpart со следующим набором фич:

    • Площадь рекламного блока $S = width \cdot height$;
    • Угол наклона $k = \frac{height}{width}$;
    • Ширина $width$;
    • Высота $height$.

    Нажмите, если формулы не отображаются
    image

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

    на JavaScript
    template_names = ['leaderboard1', 'leaderboard2', 'leaderboard3', 'square1', 'square2', 'square3', 'square4', 'tower1'];
    function getTemplate(w, h) {
      var wdh = w/h,
        wh = w*h;
      if (wdh >= 0.7000456) {
        if (wdh >= 2.499373) {
          if (wh >= 32399) {
            if (wdh >= 4.501131) {
              return template_names[0]; //leaderboard1 - bannerA
            } else {
              return template_names[1]; //leaderboard2 - bannerB
            }
          };
          return template_names[2]; //leaderboard3 - smallBanner
        } else {
          if (wdh < 1.200121) {
            if (wdh >= 0.8999545) {
              if (w < 781.5) {
                if (wh < 32399.5) {
                  return template_names[5];// "square3"; //smallSquare
                } else {
                  return template_names[6];//"square4"; //square191
                }
              } else {
                if (wdh >= 0.9995005) {
                  return template_names[5];//"square3"; //smallSquare
                } else {
                  return template_names[7];//"tower1"; //towerB
                }
              }
            } else {
              if (wh < 32399) {
                  return template_names[5]; //"square3"; //smallSquare
              } else {
                  return template_names[4]; //"square2"; //squareC
              }
            }
          } else {
            if (h< 174.5) {
              if (wdh >= 2.002874 && wh >= 32392.5) {
                return template_names[1];//"leaderboard2"; //bannerB
              }
              return template_names[5];//"square3"; //smallSquare
            } else {
              if (w < 601.5 && wdh < 1.531339) {
                  return template_names[3];//"square1"; //squareA
              }
              return template_names[4];//"square2"; //squareC
            }
          }
        }
      } else {
          return template_names[7];//"tower1"; //towerA + towerB
      }
    }

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

    Схематичное представление шаблонов


    Как же выглядят эти шаблоны для отображения рекламных материалов? Мы представили их в виде схем-таблиц.

    image

    Схематичное представление девяти HTML-шаблонов, используемых в AdWords

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

    image

    Частота присутствия рассмотренных девяти шаблонов в RTB-трафике

    Шаблоны из класса Leaderboard


    Leaderboard 1 — один из самых простых шаблонов. Ассеты — главная картинка, логотип, заголовок, описание, кнопка — располагаются последовательно. Leaderboard 2 — более сложный шаблон, который отображает дополнительную информацию о компании — дополнительный ассет Short Name в схеме-таблице выше. Шаблон Leaderboard 3 часто используется в рекламных блоках на мобильных устройствах. Из-за ограниченного места он анимирует смену заголовка и описания. Сравните реализацию этих шаблонов:
    image
    Leaderboard 1 для рекламного блока 480x70
    image
    Leaderboard 2 для рекламного блока 400x125
    image
    Leaderboard 3 для рекламного блока 400x100. Показан второй кадр с описанием

    Шаблоны из класса Square


    Квадратные шаблоны востребованы меньше всего, но они занимают свою большую долю в 20,35%. Различия между шаблонами Square 1 и Square 4 визуально практически отсутствуют, однако согласно полученному классификатору, на шаблон Square 1 приходится около 0,66% трафика. Почему так происходит, остается загадкой. Возможно, гипербола, которую мы наблюдали выше, — результат работы какого-то адаптивного алгоритма, специфичного для нашего экспериментального баннера.
    image
    image
    image
    image
    Square 1 для рекламного блока 300x300
    Square 2 для рекламного блока 150x215
    Square 3 для рекламного блока 215x250
    Square 4 для рекламного блока 250x250

    Шаблоны из класса Tower


    Мы не нашли существенных различий между шаблонами Tower 1 и Tower 2, поэтому реализовали только первый из них.
    image
    image
    image
    Реализации шаблона Tower

    Использование мультиформатного баннера в RTB


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

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

    Заключение


    Что дает технология мультиформатных баннеров? В первую очередь она позволяет проводить масштабные A/B-тестирования рекламных слоганов и других ассетов на 100% рекламных блоков разного размера без привлечения дизайнеров. Разнообразную механику многоруких бандитов можно применить для тестирования конкретных вариаций ассетов и самих шаблонов баннеров.

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

    https://habrahabr.ru/post/335952/


    Метки:  

    Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

    Четверг, 21 Сентября 2017 г. 15:09 + в цитатник
    AndreyIvanoff сегодня в 15:09 Маркетинг

    Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

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

      image

      Реализация мультиформатного баннера, шаблон Leaderboard 1.

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

      Тот, кто хоть раз имел дело с запуском медийных рекламных кампаний по технологии RTB (англ. Real Time Bidding), сталкивался с проблемой: клиент предоставил для размещения баннер формата 240x400 и на этом всё. Однако стандарты IAB предусматривают как минимум 15 разных форматов: Leaderboard (728x90), Inline rectangle (300x250), Mobile leaderboard (320x50), Half-page (300x600), Banner, Large rectangle и другие.

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

      Сколько форматов баннеров в RTB-трафике


      Их очень много: по данным рекламной платформы DataMind, на конец 2016 года — около 1700 форматов, количество потенциальных показов по которым превышает 100 тысяч в месяц.

      Ниже представлена диаграмма распределения трафика между размерами рекламных блоков. Чем больше точка, тем больше трафика на нее приходится. В топ выходят всем известные форматы: 320x50, 240x400, 728x90, 300x250. Но для проведения масштабной рекламной кампании этих форматов оказывается недостаточно.

      image

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

      Если рекламная кампания запускается только с одним баннером формата 240x400, рекламодатель охватывает только 17,22% от всего доступного трафика. А если подготовить рекламные материалы для всех IAB-форматов, охват увеличится до 77,2%.


      Распределение рекламного трафика по форматам баннеров. 22,8% рекламных показов возможны для форматов, которые не включены в стандарт IAB

      Но что делать, если хочется получить все 100% и еще сэкономить? Не каждый рекламодатель будет делать баннер формата, например, 800x90, поэтому и аукцион для этого формата будет менее «горячим» по сравнению с аукционом для формата 240x400.

      Универсальная классификация рекламных форматов баннеров


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


      Точечная диаграмма для форматов баннеров с потенциальными показами свыше 100 тысяч в месяц в RTB-трафике для территории России. Классифицированы форматы Towers, Squares, Leaderboards

      Здесь вся плоскость разбита на три больших области:

      • баннеры-башни (Towers);
      • баннеры-квадраты (Squares);
      • баннеры-перетяжки (Leaderboards).

      Обратите внимание как ведут себя точки диаграммы: они выстраиваются вдоль четырех линий с коэффициентами наклона:

      $k_{-2}=\frac{height}{width}=1.78, k_{-1}=\frac{height}{width}=1.33, k_0=\frac{height}{width}= 1,\\ k_{1}=\frac{height}{width}=0.75, k_{2}=\frac{height}{width}=0.56.$

      Нажмите, если формула не отображается.
      image

      Можно обнаружить интересную степенную зависимость, которая, кажется, как-то связана с историческим развитием форматов экранов (См. Соотношение сторон экрана):

      $$display$$\begin{equation} k_{i}=\left(\frac{3}{4}\right)^{i}, i=-2,-1,0,1,2. \end{equation}$$display$$

      Нажмите, если формула не отображается
      image

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

      Классификация форматов баннеров на Towers, Squares, Leaderboars интуитивно понятна. Кажется, что достаточно сверстать три HTML-шаблона для каждого формата, и мы сможем отобразить рекламные материалы в рекламном блоке любого размера. Отчасти это так.

      Как устроены адаптивные баннеры AdWords


      Разрабатывая собственную технологию мультиформатных баннеров, мы в Tinkoff.ru решили исследовать технологию, которую использует Google. Оказалось, что она не применяет резиновую верстку в комбинации с media-запросами. Для каждого рекламного блока удаленный и очень хитрый сервис отдает позицию каждого элемента HTML-баннера, по которой элемент жестко фиксируется в рекламном блоке. Нам стало интересно, какой алгоритм используется для адаптации рекламных материалов к рекламному блоку заданного размера.

      Для исследования был «пойман» реальный рекламный мультиформатный баннер с рекламой одного из продуктов Tinkoff.ru. Он был принудительно отображен в блоках разного размера, при этом ширина блока изменялась от 216 до 1 200 px, а высота — от 36 до 1 200 px с шагом в 1 пиксель. Мы провели около 1,145 миллиона наблюдений за поведением верстки мультиформатного баннера при разных значениях ширины и высоты рекламного места. И выявили девять типичных HTML-шаблонов, которые использует Google при отображении баннера. Мы разбили их на три класса и дали им названия:

      • для класса Tower: Tower 1 и Tower 2 (визуально различаются только используемыми шрифтами, поэтому далее не будем выделять Tower 2 отдельно);
      • для класса Square: Square 1, Square 2, Square 3, Square 4;
      • для класса Leaderboard: Leaderboard 1 (пример — на первом рисунке в статье), Leaderboard 2, Leaderboard 3.

      Области использования каждого HTML-шаблона изображены на рисунке ниже. Мы обнаружили существенно нелинейную область, граница которой описывается гиперболой (для форматов Leaderboard 3 и др.).


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

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

      Обработка результатов наблюдений


      Алгоритм выбора шаблона в зависимости от размера рекламного блока устанавливается просто, если использовать деревья решений. Мы использовали Recursive Partitioning and Regression Trees из R-пакета rpart со следующим набором фич:

      • Площадь рекламного блока $S = width \cdot height$;
      • Угол наклона $k = \frac{height}{width}$;
      • Ширина $width$;
      • Высота $height$.

      Нажмите, если формулы не отображаются
      image

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

      на JavaScript
      template_names = ['leaderboard1', 'leaderboard2', 'leaderboard3', 'square1', 'square2', 'square3', 'square4', 'tower1'];
      function getTemplate(w, h) {
        var wdh = w/h,
          wh = w*h;
        if (wdh >= 0.7000456) {
          if (wdh >= 2.499373) {
            if (wh >= 32399) {
              if (wdh >= 4.501131) {
                return template_names[0]; //leaderboard1 - bannerA
              } else {
                return template_names[1]; //leaderboard2 - bannerB
              }
            };
            return template_names[2]; //leaderboard3 - smallBanner
          } else {
            if (wdh < 1.200121) {
              if (wdh >= 0.8999545) {
                if (w < 781.5) {
                  if (wh < 32399.5) {
                    return template_names[5];// "square3"; //smallSquare
                  } else {
                    return template_names[6];//"square4"; //square191
                  }
                } else {
                  if (wdh >= 0.9995005) {
                    return template_names[5];//"square3"; //smallSquare
                  } else {
                    return template_names[7];//"tower1"; //towerB
                  }
                }
              } else {
                if (wh < 32399) {
                    return template_names[5]; //"square3"; //smallSquare
                } else {
                    return template_names[4]; //"square2"; //squareC
                }
              }
            } else {
              if (h< 174.5) {
                if (wdh >= 2.002874 && wh >= 32392.5) {
                  return template_names[1];//"leaderboard2"; //bannerB
                }
                return template_names[5];//"square3"; //smallSquare
              } else {
                if (w < 601.5 && wdh < 1.531339) {
                    return template_names[3];//"square1"; //squareA
                }
                return template_names[4];//"square2"; //squareC
              }
            }
          }
        } else {
            return template_names[7];//"tower1"; //towerA + towerB
        }
      }

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

      Схематичное представление шаблонов


      Как же выглядят эти шаблоны для отображения рекламных материалов? Мы представили их в виде схем-таблиц.

      image

      Схематичное представление девяти HTML-шаблонов, используемых в AdWords

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

      image

      Частота присутствия рассмотренных девяти шаблонов в RTB-трафике

      Шаблоны из класса Leaderboard


      Leaderboard 1 — один из самых простых шаблонов. Ассеты — главная картинка, логотип, заголовок, описание, кнопка — располагаются последовательно. Leaderboard 2 — более сложный шаблон, который отображает дополнительную информацию о компании — дополнительный ассет Short Name в схеме-таблице выше. Шаблон Leaderboard 3 часто используется в рекламных блоках на мобильных устройствах. Из-за ограниченного места он анимирует смену заголовка и описания. Сравните реализацию этих шаблонов:
      image
      Leaderboard 1 для рекламного блока 480x70
      image
      Leaderboard 2 для рекламного блока 400x125
      image
      Leaderboard 3 для рекламного блока 400x100. Показан второй кадр с описанием

      Шаблоны из класса Square


      Квадратные шаблоны востребованы меньше всего, но они занимают свою большую долю в 20,35%. Различия между шаблонами Square 1 и Square 4 визуально практически отсутствуют, однако согласно полученному классификатору, на шаблон Square 1 приходится около 0,66% трафика. Почему так происходит, остается загадкой. Возможно, гипербола, которую мы наблюдали выше, — результат работы какого-то адаптивного алгоритма, специфичного для нашего экспериментального баннера.
      image
      image
      image
      image
      Square 1 для рекламного блока 300x300
      Square 2 для рекламного блока 150x215
      Square 3 для рекламного блока 215x250
      Square 4 для рекламного блока 250x250

      Шаблоны из класса Tower


      Мы не нашли существенных различий между шаблонами Tower 1 и Tower 2, поэтому реализовали только первый из них.
      image
      image
      image
      Реализации шаблона Tower

      Использование мультиформатного баннера в RTB


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

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

      Заключение


      Что дает технология мультиформатных баннеров? В первую очередь она позволяет проводить масштабные A/B-тестирования рекламных слоганов и других ассетов на 100% рекламных блоков разного размера без привлечения дизайнеров. Разнообразную механику многоруких бандитов можно применить для тестирования конкретных вариаций ассетов и самих шаблонов баннеров.

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

      https://habrahabr.ru/post/335952/


      Метки:  

      Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

      Четверг, 21 Сентября 2017 г. 15:09 + в цитатник
      AndreyIvanoff сегодня в 15:09 Маркетинг

      Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

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

        image

        Реализация мультиформатного баннера, шаблон Leaderboard 1.

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

        Тот, кто хоть раз имел дело с запуском медийных рекламных кампаний по технологии RTB (англ. Real Time Bidding), сталкивался с проблемой: клиент предоставил для размещения баннер формата 240x400 и на этом всё. Однако стандарты IAB предусматривают как минимум 15 разных форматов: Leaderboard (728x90), Inline rectangle (300x250), Mobile leaderboard (320x50), Half-page (300x600), Banner, Large rectangle и другие.

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

        Сколько форматов баннеров в RTB-трафике


        Их очень много: по данным рекламной платформы DataMind, на конец 2016 года — около 1700 форматов, количество потенциальных показов по которым превышает 100 тысяч в месяц.

        Ниже представлена диаграмма распределения трафика между размерами рекламных блоков. Чем больше точка, тем больше трафика на нее приходится. В топ выходят всем известные форматы: 320x50, 240x400, 728x90, 300x250. Но для проведения масштабной рекламной кампании этих форматов оказывается недостаточно.

        image

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

        Если рекламная кампания запускается только с одним баннером формата 240x400, рекламодатель охватывает только 17,22% от всего доступного трафика. А если подготовить рекламные материалы для всех IAB-форматов, охват увеличится до 77,2%.


        Распределение рекламного трафика по форматам баннеров. 22,8% рекламных показов возможны для форматов, которые не включены в стандарт IAB

        Но что делать, если хочется получить все 100% и еще сэкономить? Не каждый рекламодатель будет делать баннер формата, например, 800x90, поэтому и аукцион для этого формата будет менее «горячим» по сравнению с аукционом для формата 240x400.

        Универсальная классификация рекламных форматов баннеров


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


        Точечная диаграмма для форматов баннеров с потенциальными показами свыше 100 тысяч в месяц в RTB-трафике для территории России. Классифицированы форматы Towers, Squares, Leaderboards

        Здесь вся плоскость разбита на три больших области:

        • баннеры-башни (Towers);
        • баннеры-квадраты (Squares);
        • баннеры-перетяжки (Leaderboards).

        Обратите внимание как ведут себя точки диаграммы: они выстраиваются вдоль четырех линий с коэффициентами наклона:

        $k_{-2}=\frac{height}{width}=1.78, k_{-1}=\frac{height}{width}=1.33, k_0=\frac{height}{width}= 1,\\ k_{1}=\frac{height}{width}=0.75, k_{2}=\frac{height}{width}=0.56.$

        Нажмите, если формула не отображается.
        image

        Можно обнаружить интересную степенную зависимость, которая, кажется, как-то связана с историческим развитием форматов экранов (См. Соотношение сторон экрана):

        $$display$$\begin{equation} k_{i}=\left(\frac{3}{4}\right)^{i}, i=-2,-1,0,1,2. \end{equation}$$display$$

        Нажмите, если формула не отображается
        image

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

        Классификация форматов баннеров на Towers, Squares, Leaderboars интуитивно понятна. Кажется, что достаточно сверстать три HTML-шаблона для каждого формата, и мы сможем отобразить рекламные материалы в рекламном блоке любого размера. Отчасти это так.

        Как устроены адаптивные баннеры AdWords


        Разрабатывая собственную технологию мультиформатных баннеров, мы в Tinkoff.ru решили исследовать технологию, которую использует Google. Оказалось, что она не применяет резиновую верстку в комбинации с media-запросами. Для каждого рекламного блока удаленный и очень хитрый сервис отдает позицию каждого элемента HTML-баннера, по которой элемент жестко фиксируется в рекламном блоке. Нам стало интересно, какой алгоритм используется для адаптации рекламных материалов к рекламному блоку заданного размера.

        Для исследования был «пойман» реальный рекламный мультиформатный баннер с рекламой одного из продуктов Tinkoff.ru. Он был принудительно отображен в блоках разного размера, при этом ширина блока изменялась от 216 до 1 200 px, а высота — от 36 до 1 200 px с шагом в 1 пиксель. Мы провели около 1,145 миллиона наблюдений за поведением верстки мультиформатного баннера при разных значениях ширины и высоты рекламного места. И выявили девять типичных HTML-шаблонов, которые использует Google при отображении баннера. Мы разбили их на три класса и дали им названия:

        • для класса Tower: Tower 1 и Tower 2 (визуально различаются только используемыми шрифтами, поэтому далее не будем выделять Tower 2 отдельно);
        • для класса Square: Square 1, Square 2, Square 3, Square 4;
        • для класса Leaderboard: Leaderboard 1 (пример — на первом рисунке в статье), Leaderboard 2, Leaderboard 3.

        Области использования каждого HTML-шаблона изображены на рисунке ниже. Мы обнаружили существенно нелинейную область, граница которой описывается гиперболой (для форматов Leaderboard 3 и др.).


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

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

        Обработка результатов наблюдений


        Алгоритм выбора шаблона в зависимости от размера рекламного блока устанавливается просто, если использовать деревья решений. Мы использовали Recursive Partitioning and Regression Trees из R-пакета rpart со следующим набором фич:

        • Площадь рекламного блока $S = width \cdot height$;
        • Угол наклона $k = \frac{height}{width}$;
        • Ширина $width$;
        • Высота $height$.

        Нажмите, если формулы не отображаются
        image

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

        на JavaScript
        template_names = ['leaderboard1', 'leaderboard2', 'leaderboard3', 'square1', 'square2', 'square3', 'square4', 'tower1'];
        function getTemplate(w, h) {
          var wdh = w/h,
            wh = w*h;
          if (wdh >= 0.7000456) {
            if (wdh >= 2.499373) {
              if (wh >= 32399) {
                if (wdh >= 4.501131) {
                  return template_names[0]; //leaderboard1 - bannerA
                } else {
                  return template_names[1]; //leaderboard2 - bannerB
                }
              };
              return template_names[2]; //leaderboard3 - smallBanner
            } else {
              if (wdh < 1.200121) {
                if (wdh >= 0.8999545) {
                  if (w < 781.5) {
                    if (wh < 32399.5) {
                      return template_names[5];// "square3"; //smallSquare
                    } else {
                      return template_names[6];//"square4"; //square191
                    }
                  } else {
                    if (wdh >= 0.9995005) {
                      return template_names[5];//"square3"; //smallSquare
                    } else {
                      return template_names[7];//"tower1"; //towerB
                    }
                  }
                } else {
                  if (wh < 32399) {
                      return template_names[5]; //"square3"; //smallSquare
                  } else {
                      return template_names[4]; //"square2"; //squareC
                  }
                }
              } else {
                if (h< 174.5) {
                  if (wdh >= 2.002874 && wh >= 32392.5) {
                    return template_names[1];//"leaderboard2"; //bannerB
                  }
                  return template_names[5];//"square3"; //smallSquare
                } else {
                  if (w < 601.5 && wdh < 1.531339) {
                      return template_names[3];//"square1"; //squareA
                  }
                  return template_names[4];//"square2"; //squareC
                }
              }
            }
          } else {
              return template_names[7];//"tower1"; //towerA + towerB
          }
        }

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

        Схематичное представление шаблонов


        Как же выглядят эти шаблоны для отображения рекламных материалов? Мы представили их в виде схем-таблиц.

        image

        Схематичное представление девяти HTML-шаблонов, используемых в AdWords

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

        image

        Частота присутствия рассмотренных девяти шаблонов в RTB-трафике

        Шаблоны из класса Leaderboard


        Leaderboard 1 — один из самых простых шаблонов. Ассеты — главная картинка, логотип, заголовок, описание, кнопка — располагаются последовательно. Leaderboard 2 — более сложный шаблон, который отображает дополнительную информацию о компании — дополнительный ассет Short Name в схеме-таблице выше. Шаблон Leaderboard 3 часто используется в рекламных блоках на мобильных устройствах. Из-за ограниченного места он анимирует смену заголовка и описания. Сравните реализацию этих шаблонов:
        image
        Leaderboard 1 для рекламного блока 480x70
        image
        Leaderboard 2 для рекламного блока 400x125
        image
        Leaderboard 3 для рекламного блока 400x100. Показан второй кадр с описанием

        Шаблоны из класса Square


        Квадратные шаблоны востребованы меньше всего, но они занимают свою большую долю в 20,35%. Различия между шаблонами Square 1 и Square 4 визуально практически отсутствуют, однако согласно полученному классификатору, на шаблон Square 1 приходится около 0,66% трафика. Почему так происходит, остается загадкой. Возможно, гипербола, которую мы наблюдали выше, — результат работы какого-то адаптивного алгоритма, специфичного для нашего экспериментального баннера.
        image
        image
        image
        image
        Square 1 для рекламного блока 300x300
        Square 2 для рекламного блока 150x215
        Square 3 для рекламного блока 215x250
        Square 4 для рекламного блока 250x250

        Шаблоны из класса Tower


        Мы не нашли существенных различий между шаблонами Tower 1 и Tower 2, поэтому реализовали только первый из них.
        image
        image
        image
        Реализации шаблона Tower

        Использование мультиформатного баннера в RTB


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

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

        Заключение


        Что дает технология мультиформатных баннеров? В первую очередь она позволяет проводить масштабные A/B-тестирования рекламных слоганов и других ассетов на 100% рекламных блоков разного размера без привлечения дизайнеров. Разнообразную механику многоруких бандитов можно применить для тестирования конкретных вариаций ассетов и самих шаблонов баннеров.

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

        https://habrahabr.ru/post/335952/


        Метки:  

        Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

        Четверг, 21 Сентября 2017 г. 15:09 + в цитатник
        AndreyIvanoff сегодня в 15:09 Маркетинг

        Мультиформатные баннеры в Tinkoff.ru и подход к верстке адаптивных баннеров в Google AdWords

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

          image

          Реализация мультиформатного баннера, шаблон Leaderboard 1.

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

          Тот, кто хоть раз имел дело с запуском медийных рекламных кампаний по технологии RTB (англ. Real Time Bidding), сталкивался с проблемой: клиент предоставил для размещения баннер формата 240x400 и на этом всё. Однако стандарты IAB предусматривают как минимум 15 разных форматов: Leaderboard (728x90), Inline rectangle (300x250), Mobile leaderboard (320x50), Half-page (300x600), Banner, Large rectangle и другие.

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

          Сколько форматов баннеров в RTB-трафике


          Их очень много: по данным рекламной платформы DataMind, на конец 2016 года — около 1700 форматов, количество потенциальных показов по которым превышает 100 тысяч в месяц.

          Ниже представлена диаграмма распределения трафика между размерами рекламных блоков. Чем больше точка, тем больше трафика на нее приходится. В топ выходят всем известные форматы: 320x50, 240x400, 728x90, 300x250. Но для проведения масштабной рекламной кампании этих форматов оказывается недостаточно.

          image

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

          Если рекламная кампания запускается только с одним баннером формата 240x400, рекламодатель охватывает только 17,22% от всего доступного трафика. А если подготовить рекламные материалы для всех IAB-форматов, охват увеличится до 77,2%.


          Распределение рекламного трафика по форматам баннеров. 22,8% рекламных показов возможны для форматов, которые не включены в стандарт IAB

          Но что делать, если хочется получить все 100% и еще сэкономить? Не каждый рекламодатель будет делать баннер формата, например, 800x90, поэтому и аукцион для этого формата будет менее «горячим» по сравнению с аукционом для формата 240x400.

          Универсальная классификация рекламных форматов баннеров


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


          Точечная диаграмма для форматов баннеров с потенциальными показами свыше 100 тысяч в месяц в RTB-трафике для территории России. Классифицированы форматы Towers, Squares, Leaderboards

          Здесь вся плоскость разбита на три больших области:

          • баннеры-башни (Towers);
          • баннеры-квадраты (Squares);
          • баннеры-перетяжки (Leaderboards).

          Обратите внимание как ведут себя точки диаграммы: они выстраиваются вдоль четырех линий с коэффициентами наклона:

          $k_{-2}=\frac{height}{width}=1.78, k_{-1}=\frac{height}{width}=1.33, k_0=\frac{height}{width}= 1,\\ k_{1}=\frac{height}{width}=0.75, k_{2}=\frac{height}{width}=0.56.$

          Нажмите, если формула не отображается.
          image

          Можно обнаружить интересную степенную зависимость, которая, кажется, как-то связана с историческим развитием форматов экранов (См. Соотношение сторон экрана):

          $$display$$\begin{equation} k_{i}=\left(\frac{3}{4}\right)^{i}, i=-2,-1,0,1,2. \end{equation}$$display$$

          Нажмите, если формула не отображается
          image

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

          Классификация форматов баннеров на Towers, Squares, Leaderboars интуитивно понятна. Кажется, что достаточно сверстать три HTML-шаблона для каждого формата, и мы сможем отобразить рекламные материалы в рекламном блоке любого размера. Отчасти это так.

          Как устроены адаптивные баннеры AdWords


          Разрабатывая собственную технологию мультиформатных баннеров, мы в Tinkoff.ru решили исследовать технологию, которую использует Google. Оказалось, что она не применяет резиновую верстку в комбинации с media-запросами. Для каждого рекламного блока удаленный и очень хитрый сервис отдает позицию каждого элемента HTML-баннера, по которой элемент жестко фиксируется в рекламном блоке. Нам стало интересно, какой алгоритм используется для адаптации рекламных материалов к рекламному блоку заданного размера.

          Для исследования был «пойман» реальный рекламный мультиформатный баннер с рекламой одного из продуктов Tinkoff.ru. Он был принудительно отображен в блоках разного размера, при этом ширина блока изменялась от 216 до 1 200 px, а высота — от 36 до 1 200 px с шагом в 1 пиксель. Мы провели около 1,145 миллиона наблюдений за поведением верстки мультиформатного баннера при разных значениях ширины и высоты рекламного места. И выявили девять типичных HTML-шаблонов, которые использует Google при отображении баннера. Мы разбили их на три класса и дали им названия:

          • для класса Tower: Tower 1 и Tower 2 (визуально различаются только используемыми шрифтами, поэтому далее не будем выделять Tower 2 отдельно);
          • для класса Square: Square 1, Square 2, Square 3, Square 4;
          • для класса Leaderboard: Leaderboard 1 (пример — на первом рисунке в статье), Leaderboard 2, Leaderboard 3.

          Области использования каждого HTML-шаблона изображены на рисунке ниже. Мы обнаружили существенно нелинейную область, граница которой описывается гиперболой (для форматов Leaderboard 3 и др.).


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

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

          Обработка результатов наблюдений


          Алгоритм выбора шаблона в зависимости от размера рекламного блока устанавливается просто, если использовать деревья решений. Мы использовали Recursive Partitioning and Regression Trees из R-пакета rpart со следующим набором фич:

          • Площадь рекламного блока $S = width \cdot height$;
          • Угол наклона $k = \frac{height}{width}$;
          • Ширина $width$;
          • Высота $height$.

          Нажмите, если формулы не отображаются
          image

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

          на JavaScript
          template_names = ['leaderboard1', 'leaderboard2', 'leaderboard3', 'square1', 'square2', 'square3', 'square4', 'tower1'];
          function getTemplate(w, h) {
            var wdh = w/h,
              wh = w*h;
            if (wdh >= 0.7000456) {
              if (wdh >= 2.499373) {
                if (wh >= 32399) {
                  if (wdh >= 4.501131) {
                    return template_names[0]; //leaderboard1 - bannerA
                  } else {
                    return template_names[1]; //leaderboard2 - bannerB
                  }
                };
                return template_names[2]; //leaderboard3 - smallBanner
              } else {
                if (wdh < 1.200121) {
                  if (wdh >= 0.8999545) {
                    if (w < 781.5) {
                      if (wh < 32399.5) {
                        return template_names[5];// "square3"; //smallSquare
                      } else {
                        return template_names[6];//"square4"; //square191
                      }
                    } else {
                      if (wdh >= 0.9995005) {
                        return template_names[5];//"square3"; //smallSquare
                      } else {
                        return template_names[7];//"tower1"; //towerB
                      }
                    }
                  } else {
                    if (wh < 32399) {
                        return template_names[5]; //"square3"; //smallSquare
                    } else {
                        return template_names[4]; //"square2"; //squareC
                    }
                  }
                } else {
                  if (h< 174.5) {
                    if (wdh >= 2.002874 && wh >= 32392.5) {
                      return template_names[1];//"leaderboard2"; //bannerB
                    }
                    return template_names[5];//"square3"; //smallSquare
                  } else {
                    if (w < 601.5 && wdh < 1.531339) {
                        return template_names[3];//"square1"; //squareA
                    }
                    return template_names[4];//"square2"; //squareC
                  }
                }
              }
            } else {
                return template_names[7];//"tower1"; //towerA + towerB
            }
          }

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

          Схематичное представление шаблонов


          Как же выглядят эти шаблоны для отображения рекламных материалов? Мы представили их в виде схем-таблиц.

          image

          Схематичное представление девяти HTML-шаблонов, используемых в AdWords

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

          image

          Частота присутствия рассмотренных девяти шаблонов в RTB-трафике

          Шаблоны из класса Leaderboard


          Leaderboard 1 — один из самых простых шаблонов. Ассеты — главная картинка, логотип, заголовок, описание, кнопка — располагаются последовательно. Leaderboard 2 — более сложный шаблон, который отображает дополнительную информацию о компании — дополнительный ассет Short Name в схеме-таблице выше. Шаблон Leaderboard 3 часто используется в рекламных блоках на мобильных устройствах. Из-за ограниченного места он анимирует смену заголовка и описания. Сравните реализацию этих шаблонов:
          image
          Leaderboard 1 для рекламного блока 480x70
          image
          Leaderboard 2 для рекламного блока 400x125
          image
          Leaderboard 3 для рекламного блока 400x100. Показан второй кадр с описанием

          Шаблоны из класса Square


          Квадратные шаблоны востребованы меньше всего, но они занимают свою большую долю в 20,35%. Различия между шаблонами Square 1 и Square 4 визуально практически отсутствуют, однако согласно полученному классификатору, на шаблон Square 1 приходится около 0,66% трафика. Почему так происходит, остается загадкой. Возможно, гипербола, которую мы наблюдали выше, — результат работы какого-то адаптивного алгоритма, специфичного для нашего экспериментального баннера.
          image
          image
          image
          image
          Square 1 для рекламного блока 300x300
          Square 2 для рекламного блока 150x215
          Square 3 для рекламного блока 215x250
          Square 4 для рекламного блока 250x250

          Шаблоны из класса Tower


          Мы не нашли существенных различий между шаблонами Tower 1 и Tower 2, поэтому реализовали только первый из них.
          image
          image
          image
          Реализации шаблона Tower

          Использование мультиформатного баннера в RTB


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

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

          Заключение


          Что дает технология мультиформатных баннеров? В первую очередь она позволяет проводить масштабные A/B-тестирования рекламных слоганов и других ассетов на 100% рекламных блоков разного размера без привлечения дизайнеров. Разнообразную механику многоруких бандитов можно применить для тестирования конкретных вариаций ассетов и самих шаблонов баннеров.

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

          https://habrahabr.ru/post/335952/


          Метки:  

          [Из песочницы] Продажа электронных подписей и сопутствующих услуг

          Четверг, 21 Сентября 2017 г. 14:38 + в цитатник
          ninadinastiia сегодня в 14:38 Управление

          Продажа электронных подписей и сопутствующих услуг

          Всем доброго времени суток! Открытие нового направления в бизнесе — это всегда интересно, но нельзя забывать о законе. Юристу необходимо быть предельно внимательным, а предпринимателю скорее всего не обойтись без юриста.

          Введение


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

          Расширение бизнеса


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

          1. Документация для регистрации в налоговой;
          2. Документация для открытия расчетного счета (обязательно, если это ООО);
          3. Круглая печать;
          4. Электронная подпись для сдачи отчетности;

          Это самый минимальный список, для нормальной работы нужно гораздо больше. Конечно можно сдавать отчеты почтой (только не НДС), некоторым ИП можно работать без печати, даже счета не открывая, но мы все же о бизнесе, а не о выживании).
          Три первые пункта мы предоставляем клиентам, осталось как то организовать работу с ЭП.

          «Начать может и один человек, без лицензии»


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

          1. Покупка межсетевого экрана и его настройка;
          2. Покупка антивируса;
          3. Покупка охранного оборудования;
          4. Ежемесячные затраты на охрану;

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

          Из обзора судебной практики стало понятно, что никакого единого мнения нет. От штрафа в 2 000.00 рублей до тюремного заключения. Предусмотрена как административная, так и гражданская с уголовной ответственность.

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

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

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

          Мы будем просто передавать документы


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

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

          Постановление Правительства РФ от 16.04.2012 N 313 (ред. от 18.05.2017)

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

          22. Передача защищенных с использованием шифровальных (криптографических) средств информационных систем.

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

          24. Передача средств изготовления ключевых документов.

          С Вами говорит ФСБ


          Звонок в Федеральную службу безопасности снял все сомнения и расставил все на свои места. В отделе лицензирования трубку взяла доброжелательная женщина, ответившая на мои вопросы:

          1. Да, лицензия нужна;
          2. Для ее получения нам необходимо обучить всего одного человека;
          3. Необходимые виды деятельности для работы с УЦ "*******" в качестве партнера — 21, 22, 23, 24;

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

          Предпринимателям


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

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

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

          https://habrahabr.ru/post/338408/


          Метки:  

          RAIF-Challenge 2017: онлайн-чемпионат по искусственному интеллекту. Применяем ML/AI на практике

          Четверг, 21 Сентября 2017 г. 14:04 + в цитатник
          В то время как с помощью искусственного интеллекта IBM Watson лучше докторов диагностирует рак, MasterCard и PayPal — отсекают мошеннические операции, а беспилотная техника начала летать наравне с «пилотной», российский бизнес отказывается верить в «великую силу» ИИ. Внедрения успешны — но единичны. Чтобы исправить ситуацию и на практике показать компаниям все возможности подобных технологий, «Инфосистемы Джет» при поддержке «М.Видео», «Альфастрахования» и банка «УРАЛСИБ» с 20 сентября по 25 октября проводят онлайн-чемпионат по AI и машинному обучению «RAIF-Challenge 2017» в рамках форума RAIF (Russian Artificial Intelligence Forum). читать далее

          https://habrahabr.ru/post/338296/


          RAIF-Challenge 2017: онлайн-чемпионат по искусственному интеллекту. Применяем ML/AI на практике

          Четверг, 21 Сентября 2017 г. 14:04 + в цитатник
          В то время как с помощью искусственного интеллекта IBM Watson лучше докторов диагностирует рак, MasterCard и PayPal — отсекают мошеннические операции, а беспилотная техника начала летать наравне с «пилотной», российский бизнес отказывается верить в «великую силу» ИИ. Внедрения успешны — но единичны. Чтобы исправить ситуацию и на практике показать компаниям все возможности подобных технологий, «Инфосистемы Джет» при поддержке «М.Видео», «Альфастрахования» и банка «УРАЛСИБ» с 20 сентября по 25 октября проводят онлайн-чемпионат по AI и машинному обучению «RAIF-Challenge 2017» в рамках форума RAIF (Russian Artificial Intelligence Forum). читать далее

          https://habrahabr.ru/post/338296/


          RAIF-Challenge 2017: онлайн-чемпионат по искусственному интеллекту. Применяем ML/AI на практике

          Четверг, 21 Сентября 2017 г. 14:04 + в цитатник
          В то время как с помощью искусственного интеллекта IBM Watson лучше докторов диагностирует рак, MasterCard и PayPal — отсекают мошеннические операции, а беспилотная техника начала летать наравне с «пилотной», российский бизнес отказывается верить в «великую силу» ИИ. Внедрения успешны — но единичны. Чтобы исправить ситуацию и на практике показать компаниям все возможности подобных технологий, «Инфосистемы Джет» при поддержке «М.Видео», «Альфастрахования» и банка «УРАЛСИБ» с 20 сентября по 25 октября проводят онлайн-чемпионат по AI и машинному обучению «RAIF-Challenge 2017» в рамках форума RAIF (Russian Artificial Intelligence Forum). читать далее

          https://habrahabr.ru/post/338296/


          RAIF-Challenge 2017: онлайн-чемпионат по искусственному интеллекту. Применяем ML/AI на практике

          Четверг, 21 Сентября 2017 г. 14:04 + в цитатник
          В то время как с помощью искусственного интеллекта IBM Watson лучше докторов диагностирует рак, MasterCard и PayPal — отсекают мошеннические операции, а беспилотная техника начала летать наравне с «пилотной», российский бизнес отказывается верить в «великую силу» ИИ. Внедрения успешны — но единичны. Чтобы исправить ситуацию и на практике показать компаниям все возможности подобных технологий, «Инфосистемы Джет» при поддержке «М.Видео», «Альфастрахования» и банка «УРАЛСИБ» с 20 сентября по 25 октября проводят онлайн-чемпионат по AI и машинному обучению «RAIF-Challenge 2017» в рамках форума RAIF (Russian Artificial Intelligence Forum). читать далее

          https://habrahabr.ru/post/338296/


          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          Четверг, 21 Сентября 2017 г. 13:37 + в цитатник
          wabbit сегодня в 13:37 Администрирование

          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          • Tutorial

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

          • сбор всех данных за раз, полученных в JSON от консольной утилиты счетчика электроэнергии Меркурий 236
          • сбор показателей S.M.A.R.T. жестких дисков и SSD, полученных в табличном виде от smartmontools.



          А в чем была собственно проблема?


          Собирать данные через консольные утилиты или вызовы API данные можно было и ранее, но существовали сложности:

          • медленные запуски утилит каждый раз, на каждый нужный элемент данных
          • обращение к ресурсу (диск, порт, счетчик, API приложения) на каждый элемент данных
          • парсинг результата нужно было делать внешними скриптами/утилитами
          • а если потом нужно было поправить парсинг – приходилось опять обновлять UserParameters или скрипты
          • кроме всего прочего, одновременные запросы от нескольких Zabbix pollers приводили к ошибке при обращении, например, к последовательному порту.

          В общем, дело было так:


          А с появлением зависимых элементов данных, стало возможно так:


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

          • В Zabbix 3.4 источником данных может выступать другой элемент данных, который называется родительским или мастер-элементом. Такой элемент может, например, содержать массив данных в формате JSON, XML или фривольном текстовом формате.
          • В момент поступления новых данных в родительский элемент, остальные элементы данных, которые называются зависимыми, обращаются к родительскому элементу и при помощи таких функций препроцессинга как JSON path, XPath или Regex выделяют из текста нужную метрику.


          Кстати, препроцессинг – тоже нововведение 3.4, он реализован добавлением новых процессов preprocessing_manager и preprocessing_worker на Zabbix-сервере. Поэтому, если вы обновляетесь с 3.2 – не забудьте обновить шаблон для сервера, чтобы мониторить их работу.

          Переходим к примерам.


          Меркурий 236



          Представим, что на нашем проекте, кроме контейнеров, виртуальных машин, приложений, сетевых устройств, баз данных, бизнес показателей и всего прочего требующего контроля, присутствует необходимость мониторить показатели электросети и другой «инженерки», как, например, климатическое оборудование. Используются стандартные для нашей средней полосы устройства: трехфазный счетчик электроэнергии Меркурий 236 АRT-01 PQRS с интерфейсом RS-485, поверх которого общение происходит через проприетарный протокол производителя.
          Задача ответственная – сразу собирать показатели напряжения, мощности, тока, потребления, частоты. Подключить такой прибор к серверу с Zabbix агентом – задача посильная – достаточно будет серийного порта с RS-485, например, в форме USB адаптера. Но как прочитать данные? Если бы не github и добрые люди, поделившиеся своим решением для умного дома, писать бы нам модуль к Zabbix, который бы мы учили разговаривать на протоколе счетчика и опрашивать показатели.
          Утилита простая и удобная (за что автору большое человеческое спасибо) подключается к счетчику на указанный порт, считывает данные и отдает нам в виде текста, CSV или JSON.

          Давайте попробуем установить и запустить:

          git clone https://github.com/Shden/mercury236.git
          cd mercury236
          make
          ./mercury236 /dev/ttyS0 --help
          Usage: mercury236 RS485 [OPTIONS] ...
          RS485 address of RS485 dongle (e.g. /dev/ttyUSB0), required
          --debug to print extra debug info
          --testRun dry run to see output sample, no hardware required
          Output formatting:
          ....
          --help prints this screen


          Запускается! Отлично, подключаем счетчик, опрашиваем, получаем JSON:

          ./mercury236 /dev/ttyS0 --json
          {
                          "U": {
                                         "p1": 0.35,
                                         "p2": 0.35,
                                         "p3": 226.86
                          },
                          "I": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.39
                          },
                          "CosF": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.60,
                                         "sum": 0.60
                          },
                          "F": 50.00,
                          "A": {
                                         "p1": 41943.03,
                                         "p2": 41943.03,
                                         "p3": 41943.03
                          },
                          "P": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 53.45,
                                         "sum": 53.45
                          },
                          "S": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 89.83,
                                         "sum": 89.83
                          },
                          "PR": {
                                         "ap": 120.51
                          },
                          "PR-day": {
                                         "ap": 86.00
                          },
                          "PR-night": {
                                         "ap": 34.51
                          },
                          "PY": {
                                         "ap": 0.00
                          },
                          "PT": {
                                         "ap": 0.04
                          }
          }


          В итоге утилита уже сделала всю сложную работу за нас, реализовав протокол общения с счетчиком, вытащив данные, да еще и предложила нам это в виде удобного JSON объекта. Вот только раньше просто так мы ей не смогли бы воспользоваться — пришлось бы писать обвязку в виде скриптов, а самое главное – реализовывать механизм контроля доступа к среде последовательного порта. Ведь если два поллера Zabbix одновременно обратятся к нему – один за током третьей фазы 3, а другой — за током фазы 2, у нас не вернулось бы ничего.
          В 3.4 все становится гораздо проще, и мы теперь быстро и легко можем передавать данные сторонних консольных утилит в Zabbix, не прибегая к оберточным скриптам, и не запуская по 10 раз одно и тоже на каждый элемент данных отдельно. Итак,


          Настроим запуск утилиты mercury236 из Zabbix


          sudo cp mercury236 /etc/zabbix/scripts
          cd /etc/zabbix/scripts
          chmod +x mercury236
          sudo usermod -G dialout zabbix

          Для запуска скрипта, создадим в конфиге Zabbix-агента новый UserParameter:
          UserParameter=mercury236[],/etc/zabbix/scripts/mercury236 $1 $2

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


          Как видите, в родительском элементе данных нет ничего особенного – просто проверка через UserParameter Zabbix-агента. А это значит, что и нет никаких ограничений на то, какой тип проверки может выступать в роли родительского элемента – здесь могут быть и данные полученные через Zabbix trapper или через Внешние проверки. Единственное, мы выбрали Тип информации – Text и срок хранения истории в 1 день – хранить дольше мы собираемся метрики отдельно в зависимых элементах (можно не хранить данные вообще в родительском элементе, выставив срок хранения 0). Обратите внимание, что препроцессинг в этом элементе данных мы не трогаем.


          Настроим получение наших метрик счетчика


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


          Создадим элемент данных для напряжения первой фазы, выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get




          Затем во вкладке «Предобработка» добавим наше выражение JSON Path:
          Путь JSON: $.U.p1


          Кстати, маленький совет. Чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять JSON Path можно быстро проверить правильность выражения онлайн, например здесь: jsonpath.com, скопировав туда JSON, полученный от утилиты.
          Аналогичным образом создаем другие интересующие нас метрики. В том числе — для накопленной энергии по дневному тарифу.

          Для этого создадим новый элемент данных и выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get

          А вот во вкладке «Предобработка» обратите внимания на два нюанса:

          • будем использовать нотацию с квадратными скобками, так как в пути JSON есть дефис
          • препроцессинг может быть многошаговым, например здесь результата первого шага умножим на 1000, чтобы получить Вт*ч из кВт*ч




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



          Доведем наш шаблон до ума


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



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


          Шаблон готов, данные побежали, посмотрим, что у нас получилось:

          Все последние данные, собранные за одно обращение:


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

          • переиспользовали хорошую программку и не тратили время на написание своей реализации сбора данных по протоколу Меркурий
          • UserParameter остался, но схлопнулся до простого вызова. По сути можно даже system.run[] использовать
          • cкрипты-обертки тоже не писали. Всё распарсили через JSON path в шаблоне
          • cчетчик не мучали сильно, один запрос – все нужные нам данные разом.



          Smartctl и smartmontools



          Давно мы уже писали на хабре, как можно контролировать S.M.A.R.T. жестких дисков, чтобы успеть их вовремя поменять, через использование UserParameters. Такой подход работает, но он не был лишен недостатков:

          • избыточные запуски утилиты smartctl, а она в свою очередь каждый раз обращалась к контроллеру жесткого диска
          • пришлось делать отдельный парсинг для Linux и Windows. Особенно больно с этим сейчас работать в Win: (for /F… так… экранируем двойные кавычки еще кавычками…. Аааа!!!!)

          Постараемся в 3.4 от всего этого избавится.

          Случай с smartmontools имеет два отличия от примера со счетчиком выше:

          • smartctl нам JSON не возвращает
          • дисков в сервере может быть различное количество, поэтому нам нужно использовать низкоуровневое обнаружение(LLD).

          Но ничего страшного! Во-первых, зависимые элементы данных работают и для LLD, а во-вторых у нас среди preprocessing-фильтров есть и PCRE regex. Воспользуемся им, чтобы вытащить нужные показатели из не супер сильно структурированного ответа утилиты. Примерно такого:

          Приступим.


          Упрощаем UserParameters


          Было:
          UserParameter=uHDD[], sudo smartctl -A $1| grep -i "$2"| tail -1| cut -c 88-|cut -f1 -d' '
          UserParameter=uHDD.model.[],sudo smartctl -i $1 |grep -i "Device Model"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.sn.[],sudo smartctl -i $1 |grep -i "Serial Number"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.health.[],sudo smartctl -H $1 |grep -i "test"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.errorlog.[],sudo smartctl -l error $1 |grep -i "ATA Error Count"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Стало:
          UserParameter=uHDD.A[],sudo smartctl -A $1
          UserParameter=uHDD.i[],sudo smartctl -i $1
          UserParameter=uHDD.health[],sudo smartctl -H $1
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Аналогично делаем и для Windows, попутно избавляясь от CMD магии с использование for /F и find. Посмотреть можно тут.

          Создаем новые родительские элементы данных


          Для сбора всех атрибутов S.M.A.R.T. создадим прототип мастер-элемента данных:


          Как и в предыдущем примере, ничего особенного настраивать не надо. Только Тип информации – Text, а Период хранения — 1 день.
          Для сбора результатов тестов и инвентарных данных нам потребуется запускать smartctl с другими ключами. Поэтому аналогично создадим еще два элемента данных:

          • uHDD.i["{#DISKNAME}"]
          • uHDD.health["{#DISKNAME}"]



          Настроим получение наших атрибутов S.M.A.R.T. диска


          Создадим зависимый элемент данных для атрибута 5, Reallocated:


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


          И так же как и с JSON Path, чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять regex, удобно быстро проверить правильность выражения онлайн, например здесь: regex101.com скопировав туда наш вывод smartctl.
          В итоге получим такой вот список прототипов:



          Тестируем, смотрим что получилось


          Для двух HDD:


          Для SSD под Windows:


          Подведем итоги примера с smartmontools:
          • мы убрали весь парсинг из UserParameters
          • нет внешних скриптов (кроме LLD), нет внешних зависимостей, весь парсинг происходит на Zabbix-сервере, там его легко посмотреть и подправить, если нужно
          • когда утилита или API не возвращает XML/JSON – не беда, всегда можно попробовать использовать регулярные выражения
          • жесткие диски больше не мучаем – сначала достаем весь список параметров S.M.A.R.T., а затем уже на Zabbix-сервере раскладываем его по метрикам.

          Обновленный шаблон (заодно обновили триггеры, добавили элементы данных для SSD) доступен на репозитории решений на share.zabbix.com здесь.


          В завершении


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

          https://habrahabr.ru/post/337856/


          Метки:  

          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          Четверг, 21 Сентября 2017 г. 13:37 + в цитатник
          wabbit сегодня в 13:37 Администрирование

          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          • Tutorial

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

          • сбор всех данных за раз, полученных в JSON от консольной утилиты счетчика электроэнергии Меркурий 236
          • сбор показателей S.M.A.R.T. жестких дисков и SSD, полученных в табличном виде от smartmontools.



          А в чем была собственно проблема?


          Собирать данные через консольные утилиты или вызовы API данные можно было и ранее, но существовали сложности:

          • медленные запуски утилит каждый раз, на каждый нужный элемент данных
          • обращение к ресурсу (диск, порт, счетчик, API приложения) на каждый элемент данных
          • парсинг результата нужно было делать внешними скриптами/утилитами
          • а если потом нужно было поправить парсинг – приходилось опять обновлять UserParameters или скрипты
          • кроме всего прочего, одновременные запросы от нескольких Zabbix pollers приводили к ошибке при обращении, например, к последовательному порту.

          В общем, дело было так:


          А с появлением зависимых элементов данных, стало возможно так:


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

          • В Zabbix 3.4 источником данных может выступать другой элемент данных, который называется родительским или мастер-элементом. Такой элемент может, например, содержать массив данных в формате JSON, XML или фривольном текстовом формате.
          • В момент поступления новых данных в родительский элемент, остальные элементы данных, которые называются зависимыми, обращаются к родительскому элементу и при помощи таких функций препроцессинга как JSON path, XPath или Regex выделяют из текста нужную метрику.


          Кстати, препроцессинг – тоже нововведение 3.4, он реализован добавлением новых процессов preprocessing_manager и preprocessing_worker на Zabbix-сервере. Поэтому, если вы обновляетесь с 3.2 – не забудьте обновить шаблон для сервера, чтобы мониторить их работу.

          Переходим к примерам.


          Меркурий 236



          Представим, что на нашем проекте, кроме контейнеров, виртуальных машин, приложений, сетевых устройств, баз данных, бизнес показателей и всего прочего требующего контроля, присутствует необходимость мониторить показатели электросети и другой «инженерки», как, например, климатическое оборудование. Используются стандартные для нашей средней полосы устройства: трехфазный счетчик электроэнергии Меркурий 236 АRT-01 PQRS с интерфейсом RS-485, поверх которого общение происходит через проприетарный протокол производителя.
          Задача ответственная – сразу собирать показатели напряжения, мощности, тока, потребления, частоты. Подключить такой прибор к серверу с Zabbix агентом – задача посильная – достаточно будет серийного порта с RS-485, например, в форме USB адаптера. Но как прочитать данные? Если бы не github и добрые люди, поделившиеся своим решением для умного дома, писать бы нам модуль к Zabbix, который бы мы учили разговаривать на протоколе счетчика и опрашивать показатели.
          Утилита простая и удобная (за что автору большое человеческое спасибо) подключается к счетчику на указанный порт, считывает данные и отдает нам в виде текста, CSV или JSON.

          Давайте попробуем установить и запустить:

          git clone https://github.com/Shden/mercury236.git
          cd mercury236
          make
          ./mercury236 /dev/ttyS0 --help
          Usage: mercury236 RS485 [OPTIONS] ...
          RS485 address of RS485 dongle (e.g. /dev/ttyUSB0), required
          --debug to print extra debug info
          --testRun dry run to see output sample, no hardware required
          Output formatting:
          ....
          --help prints this screen


          Запускается! Отлично, подключаем счетчик, опрашиваем, получаем JSON:

          ./mercury236 /dev/ttyS0 --json
          {
                          "U": {
                                         "p1": 0.35,
                                         "p2": 0.35,
                                         "p3": 226.86
                          },
                          "I": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.39
                          },
                          "CosF": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.60,
                                         "sum": 0.60
                          },
                          "F": 50.00,
                          "A": {
                                         "p1": 41943.03,
                                         "p2": 41943.03,
                                         "p3": 41943.03
                          },
                          "P": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 53.45,
                                         "sum": 53.45
                          },
                          "S": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 89.83,
                                         "sum": 89.83
                          },
                          "PR": {
                                         "ap": 120.51
                          },
                          "PR-day": {
                                         "ap": 86.00
                          },
                          "PR-night": {
                                         "ap": 34.51
                          },
                          "PY": {
                                         "ap": 0.00
                          },
                          "PT": {
                                         "ap": 0.04
                          }
          }


          В итоге утилита уже сделала всю сложную работу за нас, реализовав протокол общения с счетчиком, вытащив данные, да еще и предложила нам это в виде удобного JSON объекта. Вот только раньше просто так мы ей не смогли бы воспользоваться — пришлось бы писать обвязку в виде скриптов, а самое главное – реализовывать механизм контроля доступа к среде последовательного порта. Ведь если два поллера Zabbix одновременно обратятся к нему – один за током третьей фазы 3, а другой — за током фазы 2, у нас не вернулось бы ничего.
          В 3.4 все становится гораздо проще, и мы теперь быстро и легко можем передавать данные сторонних консольных утилит в Zabbix, не прибегая к оберточным скриптам, и не запуская по 10 раз одно и тоже на каждый элемент данных отдельно. Итак,


          Настроим запуск утилиты mercury236 из Zabbix


          sudo cp mercury236 /etc/zabbix/scripts
          cd /etc/zabbix/scripts
          chmod +x mercury236
          sudo usermod -G dialout zabbix

          Для запуска скрипта, создадим в конфиге Zabbix-агента новый UserParameter:
          UserParameter=mercury236[],/etc/zabbix/scripts/mercury236 $1 $2

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


          Как видите, в родительском элементе данных нет ничего особенного – просто проверка через UserParameter Zabbix-агента. А это значит, что и нет никаких ограничений на то, какой тип проверки может выступать в роли родительского элемента – здесь могут быть и данные полученные через Zabbix trapper или через Внешние проверки. Единственное, мы выбрали Тип информации – Text и срок хранения истории в 1 день – хранить дольше мы собираемся метрики отдельно в зависимых элементах (можно не хранить данные вообще в родительском элементе, выставив срок хранения 0). Обратите внимание, что препроцессинг в этом элементе данных мы не трогаем.


          Настроим получение наших метрик счетчика


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


          Создадим элемент данных для напряжения первой фазы, выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get




          Затем во вкладке «Предобработка» добавим наше выражение JSON Path:
          Путь JSON: $.U.p1


          Кстати, маленький совет. Чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять JSON Path можно быстро проверить правильность выражения онлайн, например здесь: jsonpath.com, скопировав туда JSON, полученный от утилиты.
          Аналогичным образом создаем другие интересующие нас метрики. В том числе — для накопленной энергии по дневному тарифу.

          Для этого создадим новый элемент данных и выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get

          А вот во вкладке «Предобработка» обратите внимания на два нюанса:

          • будем использовать нотацию с квадратными скобками, так как в пути JSON есть дефис
          • препроцессинг может быть многошаговым, например здесь результата первого шага умножим на 1000, чтобы получить Вт*ч из кВт*ч




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



          Доведем наш шаблон до ума


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



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


          Шаблон готов, данные побежали, посмотрим, что у нас получилось:

          Все последние данные, собранные за одно обращение:


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

          • переиспользовали хорошую программку и не тратили время на написание своей реализации сбора данных по протоколу Меркурий
          • UserParameter остался, но схлопнулся до простого вызова. По сути можно даже system.run[] использовать
          • cкрипты-обертки тоже не писали. Всё распарсили через JSON path в шаблоне
          • cчетчик не мучали сильно, один запрос – все нужные нам данные разом.



          Smartctl и smartmontools



          Давно мы уже писали на хабре, как можно контролировать S.M.A.R.T. жестких дисков, чтобы успеть их вовремя поменять, через использование UserParameters. Такой подход работает, но он не был лишен недостатков:

          • избыточные запуски утилиты smartctl, а она в свою очередь каждый раз обращалась к контроллеру жесткого диска
          • пришлось делать отдельный парсинг для Linux и Windows. Особенно больно с этим сейчас работать в Win: (for /F… так… экранируем двойные кавычки еще кавычками…. Аааа!!!!)

          Постараемся в 3.4 от всего этого избавится.

          Случай с smartmontools имеет два отличия от примера со счетчиком выше:

          • smartctl нам JSON не возвращает
          • дисков в сервере может быть различное количество, поэтому нам нужно использовать низкоуровневое обнаружение(LLD).

          Но ничего страшного! Во-первых, зависимые элементы данных работают и для LLD, а во-вторых у нас среди preprocessing-фильтров есть и PCRE regex. Воспользуемся им, чтобы вытащить нужные показатели из не супер сильно структурированного ответа утилиты. Примерно такого:

          Приступим.


          Упрощаем UserParameters


          Было:
          UserParameter=uHDD[], sudo smartctl -A $1| grep -i "$2"| tail -1| cut -c 88-|cut -f1 -d' '
          UserParameter=uHDD.model.[],sudo smartctl -i $1 |grep -i "Device Model"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.sn.[],sudo smartctl -i $1 |grep -i "Serial Number"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.health.[],sudo smartctl -H $1 |grep -i "test"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.errorlog.[],sudo smartctl -l error $1 |grep -i "ATA Error Count"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Стало:
          UserParameter=uHDD.A[],sudo smartctl -A $1
          UserParameter=uHDD.i[],sudo smartctl -i $1
          UserParameter=uHDD.health[],sudo smartctl -H $1
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Аналогично делаем и для Windows, попутно избавляясь от CMD магии с использование for /F и find. Посмотреть можно тут.

          Создаем новые родительские элементы данных


          Для сбора всех атрибутов S.M.A.R.T. создадим прототип мастер-элемента данных:


          Как и в предыдущем примере, ничего особенного настраивать не надо. Только Тип информации – Text, а Период хранения — 1 день.
          Для сбора результатов тестов и инвентарных данных нам потребуется запускать smartctl с другими ключами. Поэтому аналогично создадим еще два элемента данных:

          • uHDD.i["{#DISKNAME}"]
          • uHDD.health["{#DISKNAME}"]



          Настроим получение наших атрибутов S.M.A.R.T. диска


          Создадим зависимый элемент данных для атрибута 5, Reallocated:


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


          И так же как и с JSON Path, чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять regex, удобно быстро проверить правильность выражения онлайн, например здесь: regex101.com скопировав туда наш вывод smartctl.
          В итоге получим такой вот список прототипов:



          Тестируем, смотрим что получилось


          Для двух HDD:


          Для SSD под Windows:


          Подведем итоги примера с smartmontools:
          • мы убрали весь парсинг из UserParameters
          • нет внешних скриптов (кроме LLD), нет внешних зависимостей, весь парсинг происходит на Zabbix-сервере, там его легко посмотреть и подправить, если нужно
          • когда утилита или API не возвращает XML/JSON – не беда, всегда можно попробовать использовать регулярные выражения
          • жесткие диски больше не мучаем – сначала достаем весь список параметров S.M.A.R.T., а затем уже на Zabbix-сервере раскладываем его по метрикам.

          Обновленный шаблон (заодно обновили триггеры, добавили элементы данных для SSD) доступен на репозитории решений на share.zabbix.com здесь.


          В завершении


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

          https://habrahabr.ru/post/337856/


          Метки:  

          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          Четверг, 21 Сентября 2017 г. 13:37 + в цитатник
          wabbit сегодня в 13:37 Администрирование

          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          • Tutorial

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

          • сбор всех данных за раз, полученных в JSON от консольной утилиты счетчика электроэнергии Меркурий 236
          • сбор показателей S.M.A.R.T. жестких дисков и SSD, полученных в табличном виде от smartmontools.



          А в чем была собственно проблема?


          Собирать данные через консольные утилиты или вызовы API данные можно было и ранее, но существовали сложности:

          • медленные запуски утилит каждый раз, на каждый нужный элемент данных
          • обращение к ресурсу (диск, порт, счетчик, API приложения) на каждый элемент данных
          • парсинг результата нужно было делать внешними скриптами/утилитами
          • а если потом нужно было поправить парсинг – приходилось опять обновлять UserParameters или скрипты
          • кроме всего прочего, одновременные запросы от нескольких Zabbix pollers приводили к ошибке при обращении, например, к последовательному порту.

          В общем, дело было так:


          А с появлением зависимых элементов данных, стало возможно так:


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

          • В Zabbix 3.4 источником данных может выступать другой элемент данных, который называется родительским или мастер-элементом. Такой элемент может, например, содержать массив данных в формате JSON, XML или фривольном текстовом формате.
          • В момент поступления новых данных в родительский элемент, остальные элементы данных, которые называются зависимыми, обращаются к родительскому элементу и при помощи таких функций препроцессинга как JSON path, XPath или Regex выделяют из текста нужную метрику.


          Кстати, препроцессинг – тоже нововведение 3.4, он реализован добавлением новых процессов preprocessing_manager и preprocessing_worker на Zabbix-сервере. Поэтому, если вы обновляетесь с 3.2 – не забудьте обновить шаблон для сервера, чтобы мониторить их работу.

          Переходим к примерам.


          Меркурий 236



          Представим, что на нашем проекте, кроме контейнеров, виртуальных машин, приложений, сетевых устройств, баз данных, бизнес показателей и всего прочего требующего контроля, присутствует необходимость мониторить показатели электросети и другой «инженерки», как, например, климатическое оборудование. Используются стандартные для нашей средней полосы устройства: трехфазный счетчик электроэнергии Меркурий 236 АRT-01 PQRS с интерфейсом RS-485, поверх которого общение происходит через проприетарный протокол производителя.
          Задача ответственная – сразу собирать показатели напряжения, мощности, тока, потребления, частоты. Подключить такой прибор к серверу с Zabbix агентом – задача посильная – достаточно будет серийного порта с RS-485, например, в форме USB адаптера. Но как прочитать данные? Если бы не github и добрые люди, поделившиеся своим решением для умного дома, писать бы нам модуль к Zabbix, который бы мы учили разговаривать на протоколе счетчика и опрашивать показатели.
          Утилита простая и удобная (за что автору большое человеческое спасибо) подключается к счетчику на указанный порт, считывает данные и отдает нам в виде текста, CSV или JSON.

          Давайте попробуем установить и запустить:

          git clone https://github.com/Shden/mercury236.git
          cd mercury236
          make
          ./mercury236 /dev/ttyS0 --help
          Usage: mercury236 RS485 [OPTIONS] ...
          RS485 address of RS485 dongle (e.g. /dev/ttyUSB0), required
          --debug to print extra debug info
          --testRun dry run to see output sample, no hardware required
          Output formatting:
          ....
          --help prints this screen


          Запускается! Отлично, подключаем счетчик, опрашиваем, получаем JSON:

          ./mercury236 /dev/ttyS0 --json
          {
                          "U": {
                                         "p1": 0.35,
                                         "p2": 0.35,
                                         "p3": 226.86
                          },
                          "I": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.39
                          },
                          "CosF": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.60,
                                         "sum": 0.60
                          },
                          "F": 50.00,
                          "A": {
                                         "p1": 41943.03,
                                         "p2": 41943.03,
                                         "p3": 41943.03
                          },
                          "P": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 53.45,
                                         "sum": 53.45
                          },
                          "S": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 89.83,
                                         "sum": 89.83
                          },
                          "PR": {
                                         "ap": 120.51
                          },
                          "PR-day": {
                                         "ap": 86.00
                          },
                          "PR-night": {
                                         "ap": 34.51
                          },
                          "PY": {
                                         "ap": 0.00
                          },
                          "PT": {
                                         "ap": 0.04
                          }
          }


          В итоге утилита уже сделала всю сложную работу за нас, реализовав протокол общения с счетчиком, вытащив данные, да еще и предложила нам это в виде удобного JSON объекта. Вот только раньше просто так мы ей не смогли бы воспользоваться — пришлось бы писать обвязку в виде скриптов, а самое главное – реализовывать механизм контроля доступа к среде последовательного порта. Ведь если два поллера Zabbix одновременно обратятся к нему – один за током третьей фазы 3, а другой — за током фазы 2, у нас не вернулось бы ничего.
          В 3.4 все становится гораздо проще, и мы теперь быстро и легко можем передавать данные сторонних консольных утилит в Zabbix, не прибегая к оберточным скриптам, и не запуская по 10 раз одно и тоже на каждый элемент данных отдельно. Итак,


          Настроим запуск утилиты mercury236 из Zabbix


          sudo cp mercury236 /etc/zabbix/scripts
          cd /etc/zabbix/scripts
          chmod +x mercury236
          sudo usermod -G dialout zabbix

          Для запуска скрипта, создадим в конфиге Zabbix-агента новый UserParameter:
          UserParameter=mercury236[],/etc/zabbix/scripts/mercury236 $1 $2

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


          Как видите, в родительском элементе данных нет ничего особенного – просто проверка через UserParameter Zabbix-агента. А это значит, что и нет никаких ограничений на то, какой тип проверки может выступать в роли родительского элемента – здесь могут быть и данные полученные через Zabbix trapper или через Внешние проверки. Единственное, мы выбрали Тип информации – Text и срок хранения истории в 1 день – хранить дольше мы собираемся метрики отдельно в зависимых элементах (можно не хранить данные вообще в родительском элементе, выставив срок хранения 0). Обратите внимание, что препроцессинг в этом элементе данных мы не трогаем.


          Настроим получение наших метрик счетчика


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


          Создадим элемент данных для напряжения первой фазы, выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get




          Затем во вкладке «Предобработка» добавим наше выражение JSON Path:
          Путь JSON: $.U.p1


          Кстати, маленький совет. Чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять JSON Path можно быстро проверить правильность выражения онлайн, например здесь: jsonpath.com, скопировав туда JSON, полученный от утилиты.
          Аналогичным образом создаем другие интересующие нас метрики. В том числе — для накопленной энергии по дневному тарифу.

          Для этого создадим новый элемент данных и выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get

          А вот во вкладке «Предобработка» обратите внимания на два нюанса:

          • будем использовать нотацию с квадратными скобками, так как в пути JSON есть дефис
          • препроцессинг может быть многошаговым, например здесь результата первого шага умножим на 1000, чтобы получить Вт*ч из кВт*ч




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



          Доведем наш шаблон до ума


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



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


          Шаблон готов, данные побежали, посмотрим, что у нас получилось:

          Все последние данные, собранные за одно обращение:


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

          • переиспользовали хорошую программку и не тратили время на написание своей реализации сбора данных по протоколу Меркурий
          • UserParameter остался, но схлопнулся до простого вызова. По сути можно даже system.run[] использовать
          • cкрипты-обертки тоже не писали. Всё распарсили через JSON path в шаблоне
          • cчетчик не мучали сильно, один запрос – все нужные нам данные разом.



          Smartctl и smartmontools



          Давно мы уже писали на хабре, как можно контролировать S.M.A.R.T. жестких дисков, чтобы успеть их вовремя поменять, через использование UserParameters. Такой подход работает, но он не был лишен недостатков:

          • избыточные запуски утилиты smartctl, а она в свою очередь каждый раз обращалась к контроллеру жесткого диска
          • пришлось делать отдельный парсинг для Linux и Windows. Особенно больно с этим сейчас работать в Win: (for /F… так… экранируем двойные кавычки еще кавычками…. Аааа!!!!)

          Постараемся в 3.4 от всего этого избавится.

          Случай с smartmontools имеет два отличия от примера со счетчиком выше:

          • smartctl нам JSON не возвращает
          • дисков в сервере может быть различное количество, поэтому нам нужно использовать низкоуровневое обнаружение(LLD).

          Но ничего страшного! Во-первых, зависимые элементы данных работают и для LLD, а во-вторых у нас среди preprocessing-фильтров есть и PCRE regex. Воспользуемся им, чтобы вытащить нужные показатели из не супер сильно структурированного ответа утилиты. Примерно такого:

          Приступим.


          Упрощаем UserParameters


          Было:
          UserParameter=uHDD[], sudo smartctl -A $1| grep -i "$2"| tail -1| cut -c 88-|cut -f1 -d' '
          UserParameter=uHDD.model.[],sudo smartctl -i $1 |grep -i "Device Model"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.sn.[],sudo smartctl -i $1 |grep -i "Serial Number"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.health.[],sudo smartctl -H $1 |grep -i "test"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.errorlog.[],sudo smartctl -l error $1 |grep -i "ATA Error Count"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Стало:
          UserParameter=uHDD.A[],sudo smartctl -A $1
          UserParameter=uHDD.i[],sudo smartctl -i $1
          UserParameter=uHDD.health[],sudo smartctl -H $1
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Аналогично делаем и для Windows, попутно избавляясь от CMD магии с использование for /F и find. Посмотреть можно тут.

          Создаем новые родительские элементы данных


          Для сбора всех атрибутов S.M.A.R.T. создадим прототип мастер-элемента данных:


          Как и в предыдущем примере, ничего особенного настраивать не надо. Только Тип информации – Text, а Период хранения — 1 день.
          Для сбора результатов тестов и инвентарных данных нам потребуется запускать smartctl с другими ключами. Поэтому аналогично создадим еще два элемента данных:

          • uHDD.i["{#DISKNAME}"]
          • uHDD.health["{#DISKNAME}"]



          Настроим получение наших атрибутов S.M.A.R.T. диска


          Создадим зависимый элемент данных для атрибута 5, Reallocated:


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


          И так же как и с JSON Path, чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять regex, удобно быстро проверить правильность выражения онлайн, например здесь: regex101.com скопировав туда наш вывод smartctl.
          В итоге получим такой вот список прототипов:



          Тестируем, смотрим что получилось


          Для двух HDD:


          Для SSD под Windows:


          Подведем итоги примера с smartmontools:
          • мы убрали весь парсинг из UserParameters
          • нет внешних скриптов (кроме LLD), нет внешних зависимостей, весь парсинг происходит на Zabbix-сервере, там его легко посмотреть и подправить, если нужно
          • когда утилита или API не возвращает XML/JSON – не беда, всегда можно попробовать использовать регулярные выражения
          • жесткие диски больше не мучаем – сначала достаем весь список параметров S.M.A.R.T., а затем уже на Zabbix-сервере раскладываем его по метрикам.

          Обновленный шаблон (заодно обновили триггеры, добавили элементы данных для SSD) доступен на репозитории решений на share.zabbix.com здесь.


          В завершении


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

          https://habrahabr.ru/post/337856/


          Метки:  

          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          Четверг, 21 Сентября 2017 г. 13:37 + в цитатник
          wabbit сегодня в 13:37 Администрирование

          Zabbix 3.4: Массовый сбор данных на примерах счетчика Меркурий и smartmontools

          • Tutorial

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

          • сбор всех данных за раз, полученных в JSON от консольной утилиты счетчика электроэнергии Меркурий 236
          • сбор показателей S.M.A.R.T. жестких дисков и SSD, полученных в табличном виде от smartmontools.



          А в чем была собственно проблема?


          Собирать данные через консольные утилиты или вызовы API данные можно было и ранее, но существовали сложности:

          • медленные запуски утилит каждый раз, на каждый нужный элемент данных
          • обращение к ресурсу (диск, порт, счетчик, API приложения) на каждый элемент данных
          • парсинг результата нужно было делать внешними скриптами/утилитами
          • а если потом нужно было поправить парсинг – приходилось опять обновлять UserParameters или скрипты
          • кроме всего прочего, одновременные запросы от нескольких Zabbix pollers приводили к ошибке при обращении, например, к последовательному порту.

          В общем, дело было так:


          А с появлением зависимых элементов данных, стало возможно так:


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

          • В Zabbix 3.4 источником данных может выступать другой элемент данных, который называется родительским или мастер-элементом. Такой элемент может, например, содержать массив данных в формате JSON, XML или фривольном текстовом формате.
          • В момент поступления новых данных в родительский элемент, остальные элементы данных, которые называются зависимыми, обращаются к родительскому элементу и при помощи таких функций препроцессинга как JSON path, XPath или Regex выделяют из текста нужную метрику.


          Кстати, препроцессинг – тоже нововведение 3.4, он реализован добавлением новых процессов preprocessing_manager и preprocessing_worker на Zabbix-сервере. Поэтому, если вы обновляетесь с 3.2 – не забудьте обновить шаблон для сервера, чтобы мониторить их работу.

          Переходим к примерам.


          Меркурий 236



          Представим, что на нашем проекте, кроме контейнеров, виртуальных машин, приложений, сетевых устройств, баз данных, бизнес показателей и всего прочего требующего контроля, присутствует необходимость мониторить показатели электросети и другой «инженерки», как, например, климатическое оборудование. Используются стандартные для нашей средней полосы устройства: трехфазный счетчик электроэнергии Меркурий 236 АRT-01 PQRS с интерфейсом RS-485, поверх которого общение происходит через проприетарный протокол производителя.
          Задача ответственная – сразу собирать показатели напряжения, мощности, тока, потребления, частоты. Подключить такой прибор к серверу с Zabbix агентом – задача посильная – достаточно будет серийного порта с RS-485, например, в форме USB адаптера. Но как прочитать данные? Если бы не github и добрые люди, поделившиеся своим решением для умного дома, писать бы нам модуль к Zabbix, который бы мы учили разговаривать на протоколе счетчика и опрашивать показатели.
          Утилита простая и удобная (за что автору большое человеческое спасибо) подключается к счетчику на указанный порт, считывает данные и отдает нам в виде текста, CSV или JSON.

          Давайте попробуем установить и запустить:

          git clone https://github.com/Shden/mercury236.git
          cd mercury236
          make
          ./mercury236 /dev/ttyS0 --help
          Usage: mercury236 RS485 [OPTIONS] ...
          RS485 address of RS485 dongle (e.g. /dev/ttyUSB0), required
          --debug to print extra debug info
          --testRun dry run to see output sample, no hardware required
          Output formatting:
          ....
          --help prints this screen


          Запускается! Отлично, подключаем счетчик, опрашиваем, получаем JSON:

          ./mercury236 /dev/ttyS0 --json
          {
                          "U": {
                                         "p1": 0.35,
                                         "p2": 0.35,
                                         "p3": 226.86
                          },
                          "I": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.39
                          },
                          "CosF": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 0.60,
                                         "sum": 0.60
                          },
                          "F": 50.00,
                          "A": {
                                         "p1": 41943.03,
                                         "p2": 41943.03,
                                         "p3": 41943.03
                          },
                          "P": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 53.45,
                                         "sum": 53.45
                          },
                          "S": {
                                         "p1": 0.00,
                                         "p2": 0.00,
                                         "p3": 89.83,
                                         "sum": 89.83
                          },
                          "PR": {
                                         "ap": 120.51
                          },
                          "PR-day": {
                                         "ap": 86.00
                          },
                          "PR-night": {
                                         "ap": 34.51
                          },
                          "PY": {
                                         "ap": 0.00
                          },
                          "PT": {
                                         "ap": 0.04
                          }
          }


          В итоге утилита уже сделала всю сложную работу за нас, реализовав протокол общения с счетчиком, вытащив данные, да еще и предложила нам это в виде удобного JSON объекта. Вот только раньше просто так мы ей не смогли бы воспользоваться — пришлось бы писать обвязку в виде скриптов, а самое главное – реализовывать механизм контроля доступа к среде последовательного порта. Ведь если два поллера Zabbix одновременно обратятся к нему – один за током третьей фазы 3, а другой — за током фазы 2, у нас не вернулось бы ничего.
          В 3.4 все становится гораздо проще, и мы теперь быстро и легко можем передавать данные сторонних консольных утилит в Zabbix, не прибегая к оберточным скриптам, и не запуская по 10 раз одно и тоже на каждый элемент данных отдельно. Итак,


          Настроим запуск утилиты mercury236 из Zabbix


          sudo cp mercury236 /etc/zabbix/scripts
          cd /etc/zabbix/scripts
          chmod +x mercury236
          sudo usermod -G dialout zabbix

          Для запуска скрипта, создадим в конфиге Zabbix-агента новый UserParameter:
          UserParameter=mercury236[],/etc/zabbix/scripts/mercury236 $1 $2

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


          Как видите, в родительском элементе данных нет ничего особенного – просто проверка через UserParameter Zabbix-агента. А это значит, что и нет никаких ограничений на то, какой тип проверки может выступать в роли родительского элемента – здесь могут быть и данные полученные через Zabbix trapper или через Внешние проверки. Единственное, мы выбрали Тип информации – Text и срок хранения истории в 1 день – хранить дольше мы собираемся метрики отдельно в зависимых элементах (можно не хранить данные вообще в родительском элементе, выставив срок хранения 0). Обратите внимание, что препроцессинг в этом элементе данных мы не трогаем.


          Настроим получение наших метрик счетчика


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


          Создадим элемент данных для напряжения первой фазы, выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get




          Затем во вкладке «Предобработка» добавим наше выражение JSON Path:
          Путь JSON: $.U.p1


          Кстати, маленький совет. Чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять JSON Path можно быстро проверить правильность выражения онлайн, например здесь: jsonpath.com, скопировав туда JSON, полученный от утилиты.
          Аналогичным образом создаем другие интересующие нас метрики. В том числе — для накопленной энергии по дневному тарифу.

          Для этого создадим новый элемент данных и выберем:

          • Тип: Зависимый элемент данных
          • Основной элемент данных: mercury-get

          А вот во вкладке «Предобработка» обратите внимания на два нюанса:

          • будем использовать нотацию с квадратными скобками, так как в пути JSON есть дефис
          • препроцессинг может быть многошаговым, например здесь результата первого шага умножим на 1000, чтобы получить Вт*ч из кВт*ч




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



          Доведем наш шаблон до ума


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



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


          Шаблон готов, данные побежали, посмотрим, что у нас получилось:

          Все последние данные, собранные за одно обращение:


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

          • переиспользовали хорошую программку и не тратили время на написание своей реализации сбора данных по протоколу Меркурий
          • UserParameter остался, но схлопнулся до простого вызова. По сути можно даже system.run[] использовать
          • cкрипты-обертки тоже не писали. Всё распарсили через JSON path в шаблоне
          • cчетчик не мучали сильно, один запрос – все нужные нам данные разом.



          Smartctl и smartmontools



          Давно мы уже писали на хабре, как можно контролировать S.M.A.R.T. жестких дисков, чтобы успеть их вовремя поменять, через использование UserParameters. Такой подход работает, но он не был лишен недостатков:

          • избыточные запуски утилиты smartctl, а она в свою очередь каждый раз обращалась к контроллеру жесткого диска
          • пришлось делать отдельный парсинг для Linux и Windows. Особенно больно с этим сейчас работать в Win: (for /F… так… экранируем двойные кавычки еще кавычками…. Аааа!!!!)

          Постараемся в 3.4 от всего этого избавится.

          Случай с smartmontools имеет два отличия от примера со счетчиком выше:

          • smartctl нам JSON не возвращает
          • дисков в сервере может быть различное количество, поэтому нам нужно использовать низкоуровневое обнаружение(LLD).

          Но ничего страшного! Во-первых, зависимые элементы данных работают и для LLD, а во-вторых у нас среди preprocessing-фильтров есть и PCRE regex. Воспользуемся им, чтобы вытащить нужные показатели из не супер сильно структурированного ответа утилиты. Примерно такого:

          Приступим.


          Упрощаем UserParameters


          Было:
          UserParameter=uHDD[], sudo smartctl -A $1| grep -i "$2"| tail -1| cut -c 88-|cut -f1 -d' '
          UserParameter=uHDD.model.[],sudo smartctl -i $1 |grep -i "Device Model"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.sn.[],sudo smartctl -i $1 |grep -i "Serial Number"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.health.[],sudo smartctl -H $1 |grep -i "test"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.errorlog.[],sudo smartctl -l error $1 |grep -i "ATA Error Count"| cut -f2 -d: |tr -d " "
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Стало:
          UserParameter=uHDD.A[],sudo smartctl -A $1
          UserParameter=uHDD.i[],sudo smartctl -i $1
          UserParameter=uHDD.health[],sudo smartctl -H $1
          UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl
          

          Аналогично делаем и для Windows, попутно избавляясь от CMD магии с использование for /F и find. Посмотреть можно тут.

          Создаем новые родительские элементы данных


          Для сбора всех атрибутов S.M.A.R.T. создадим прототип мастер-элемента данных:


          Как и в предыдущем примере, ничего особенного настраивать не надо. Только Тип информации – Text, а Период хранения — 1 день.
          Для сбора результатов тестов и инвентарных данных нам потребуется запускать smartctl с другими ключами. Поэтому аналогично создадим еще два элемента данных:

          • uHDD.i["{#DISKNAME}"]
          • uHDD.health["{#DISKNAME}"]



          Настроим получение наших атрибутов S.M.A.R.T. диска


          Создадим зависимый элемент данных для атрибута 5, Reallocated:


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


          И так же как и с JSON Path, чтобы не тратить много времени на отладку и ловлю ошибок, перед тем как заполнять regex, удобно быстро проверить правильность выражения онлайн, например здесь: regex101.com скопировав туда наш вывод smartctl.
          В итоге получим такой вот список прототипов:



          Тестируем, смотрим что получилось


          Для двух HDD:


          Для SSD под Windows:


          Подведем итоги примера с smartmontools:
          • мы убрали весь парсинг из UserParameters
          • нет внешних скриптов (кроме LLD), нет внешних зависимостей, весь парсинг происходит на Zabbix-сервере, там его легко посмотреть и подправить, если нужно
          • когда утилита или API не возвращает XML/JSON – не беда, всегда можно попробовать использовать регулярные выражения
          • жесткие диски больше не мучаем – сначала достаем весь список параметров S.M.A.R.T., а затем уже на Zabbix-сервере раскладываем его по метрикам.

          Обновленный шаблон (заодно обновили триггеры, добавили элементы данных для SSD) доступен на репозитории решений на share.zabbix.com здесь.


          В завершении


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

          https://habrahabr.ru/post/337856/


          Метки:  

          LibGDX. Практические вопросы и ответы

          Четверг, 21 Сентября 2017 г. 13:28 + в цитатник
          mr-cpp сегодня в 13:28 Разработка

          LibGDX. Практические вопросы и ответы

          • Tutorial
          imageПривет хабр!
          Закончился конкурс от ВКонтакте vk.com/wall-104669514_37 и мой 2-х недельный марафон в интернете по поиску нужной информации
          Хочу поделится небольшим опытом работы с графическим движком LibGDX. В интернете полно примеров, но большинство далеки от практики (нарисованный спрайт это далеко еще не игра) или уже устарели.


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

          Вопросы, которые мне приходилось решать:

          Вариант использования встроенного логгера
          Я часто использую Timber из-за удобства. В core модуле он недоступен, потому написал простой вспомогательный класс с использованием имеющегося в LibGDX логгера, с которым приложение в релиз версии перестает писать логи
          import com.badlogic.gdx.Gdx;
          
          public class GdxLog {
          
           public static boolean DEBUG;
          
           @SuppressWarnings("all")
           public static void print(String tag, String message) {
            if (DEBUG) {
             Gdx.app.log(tag, message);
            }
           }
          
           @SuppressWarnings("all")
           public static void d(String tag, String message, Integer...values) {
            if (DEBUG) {
             Gdx.app.log(tag, String.format(message, values));
            }
           }
          
           @SuppressWarnings("all")
           public static void f(String tag, String message, Float...values) {
            if (DEBUG) {
             Gdx.app.log(tag, String.format(message.replaceAll("%f", "%.0f"), values));
            }
           }
          }
          
          //... вызов
          GdxLog.d(TAG, "worldWidth: %d", worldWidth);
          

          Плюс для удобства различные float значения 1.23456789 округляются

          E/libEGL: call to OpenGL ES API with no current context (logged once per thread)
          Поначалу сильно огорчала такая ошибка, ничего не мог понять. Она происходит, потому что графика GLSurfaceView отрисовывается в своем отдельном потоке, когда проиcходит попытка извне вмешаться в этот процесс. Как исправить:
          Gdx.app.postRunnable(new Runnable() {
             @Override
             public void run() {
                 // Здесь выполняется в самом потоке
             }
          });
          

          Впринципе аналогично, как и в случае, view.postInvalidate()
          Я не любитель анонимных классов, поэтому написал такой простой метод для сокращения кода (иначе он просто становился не читаемым). Хотя с java 8 это уже не такая проблема, но из дополнительных плюсов то, что обрабатываются InvocationTargetException, когда, например, файл не найден, приложение уже не упадет по такой незначительной ошибке.
          // null may be only String params
          public void postRunnable(final String name, final Object...params) {
           Gdx.app.postRunnable(new Runnable() {
            @Override
            public void run() {
             Method method = null;
             Class[] classes = new Class[params.length];
             for (int i = 0; i < params.length; i++) {
              classes[i] = params[i] == null ? String.class : params[i].getClass();
             }
             try {
              method = World.class.getMethod(name, classes);
             } catch (SecurityException e) {
              GdxLog.print(TAG, e.toString());
             } catch (NoSuchMethodException e) {
              GdxLog.print(TAG, e.toString());
             }
             if (method == null) {
              return;
             }
             try {
              method.invoke(WorldAdapter.this, params);
             } catch (IllegalArgumentException e) {
              GdxLog.print(TAG, e.toString());
             } catch (IllegalAccessException e) {
              GdxLog.print(TAG, e.toString());
             } catch (InvocationTargetException e) {
              GdxLog.print(TAG, e.toString());
             }
            }
           });
          }
          

          Важно, чтобы параметры не были примитивами, а наследовали Object. И плюс здесь упрощение с null параметром (только от класса String)

          Как использовать LibGDX с другими виджетами
          Через фрагмент. Больше информации в wiki
          Пример:
          public class ActivityMain extends AppCompatActivity
              implements AndroidFragmentApplication.Callbacks {
          
          protected FragmentWorld fragmentWorld;
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           // ...
           getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.world, fragmentWorld, FragmentWorld.class.getSimpleName())
            .commitAllowingStateLoss();
          }
          
          @Override
          public void exit() {}
          

          И сам фрагмент:
          public class FragmentWorld extends AndroidFragmentApplication {
          
           public World world;
          
           @Override
           public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            int worldWidth = getResources().getDimensionPixelSize(R.dimen.world_width);
            int worldHeight = getResources().getDimensionPixelSize(R.dimen.world_height);
            world = new World(BuildConfig.DEBUG, worldWidth, worldHeight);
            return initializeForView(world);
           }
          }
          


          Как вытащить рендер мира или Pixmap в Bitmap
          Я не хотел сохранять pixmap в файл и потом средствами Android вытаскивать Bitmap
          Поэтому придумал такой лайфхак с OutputStream классом. Работает прекрасно и не требует медленных r/w операций
          final Pixmap pixmap = getScreenshot();
          Observable.fromCallable(new Callable  () {
           @Override
           public Boolean call() throws Exception {
            PixmapIO.PNG writer = new PixmapIO.PNG((int)(pixmap.getWidth() * pixmap.getHeight() * 1.5 f));
            writer.setFlipY(false);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            try {
             writer.write(output, pixmap);
            } finally {
             StreamUtils.closeQuietly(output);
             writer.dispose();
             pixmap.dispose();
            }
            byte[] bytes = output.toByteArray();
            Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            return true;
           }
          }).subscribeOn(Schedulers.io()).subscribe();
          


          Как работать с colors совместно с Android
          На самом деле можно int, наверное, (Color класс в LibGDX довольно специфичен как и вся графика, по-моему мнению, т.е. нужно разбираться на уровне битов) но для простоты я предпочел hex хранить и передавать в String
          Соотвественно понадобился парсер:
          protected Color parseColor(String hex) {
           String s1 = hex.substring(0, 2);
           int v1 = Integer.parseInt(s1, 16);
           float f1 = 1 f * v1 / 255 f;
           String s2 = hex.substring(2, 4);
           int v2 = Integer.parseInt(s2, 16);
           float f2 = 1 f * v2 / 255 f;
           String s3 = hex.substring(4, 6);
           int v3 = Integer.parseInt(s3, 16);
           float f3 = 1 f * v3 / 255 f;
           return new Color(f1, f2, f3, 1 f);
          }
          

          Пример параметра «ffffff»

          Как определить нажатие на actor
          sticker.addListener() Все проще. Есть метод hit у сцены
          Sticker sticker = (Sticker) stickersStage.hit(coordinates.x, coordinates.y, false);
          


          Математика scale и rotation на событие pinch (два пальца)
          Возможно это не лучшее решение, но работает хорошо. Поворот без резких скачков, плавный зум
          @Override
          public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1,
           Vector2 pointer2) {
           // initialPointer doesn't change
           // all vectors contains device coordinates
           Sticker sticker = getCurrentSticker();
           if (sticker == null) {
            return false;
           }
          
           Vector2 startVector = new Vector2(initialPointer1).sub(initialPointer2);
           Vector2 currentVector = new Vector2(pointer1).sub(pointer2);
           sticker.setScale(sticker.startScale * currentVector.len() / startVector.len());
          
           float startAngle = (float) Math.toDegrees(Math.atan2(startVector.x, startVector.y));
           float endAngle = (float) Math.toDegrees(Math.atan2(currentVector.x, currentVector.y));
           sticker.setRotation(sticker.startRotation + endAngle - startAngle);
           return false;
          }
          

          Единственно необходимо перед этим событием запоминать текущий зум и поворот
          @Override
          public boolean touchDown(float x, float y, int pointer, int button) {
           if (pointer == FIRST_FINGER) {
            Vector2 coordinates = stickersStage.screenToStageCoordinates(new Vector2(x, y));
            Sticker sticker = (Sticker) stickersStage.hit(coordinates.x, coordinates.y, false);
            if (sticker != null) {
             // здесь
             sticker.setPinchStarts();
             currentSticker = sticker.index;
            }
           }
           return false;
          }
          
          @Override
          public void pinchStop() {
           Sticker sticker = getCurrentSticker();
           if (sticker != null) {
            // здесь
            sticker.setPinchStarts();
           }
          }
          

          И на время события pinch актер неподвижен в этом случае

          Почему не происходит анимация, но action к актеру добавлен
          Ключевой метод act у сцены. Боль, когда этого не знаешь)
          spriteBatch.begin();
          stickersStage.act();
          stickersStage.getRoot().draw(spriteBatch, 1);
          spriteBatch.end();
          


          Градиент в LibGDX
          Насколько я понял, можно задать только левый верхний и нижний правый цвета. При этом есть не задавать остальные (transparent), то между ними будет пробел. Т.е. остальные определяются как сумма этих двух цветов на данном расстоянии, если речь идет о линейном градиенте. Сказать, что своеобразно, ничего не сказать
          gradientTopLeftColor = parseColor(topLeftColor);
          gradientBottomRightColor = parseColor(bottomRightColor);
          gradientBlendedColor = new Color(gradientTopLeftColor).add(gradientBottomRightColor);
          


          Хитрости обработки движения актера (событие pan)
          Вот этот обработчик
          @Override
          public boolean pan(float x, float y, float deltaX, float deltaY) {
           if (currentSticker != Sticker.INDEX_NONE) {
            Sticker sticker = getCurrentSticker();
            if (sticker != null) {
             sticker.moveBy(deltaX * worldDensity, -deltaY * worldDensity);
            }
           }
           return false;
          }
          

          worldDensity это разница между перемещением пальца в экранных координатах и актера в игровых. Без этого параметра актер будет отрываться от пальца
          @Override
          public void resize(int width, int height) {
           if (height > width) {
            worldDensity = 1f * worldWidth / width;
           } else {
            worldDensity = 1f * worldHeight / height;
           }
           viewport.update(width, height, true);
          }
          

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

          Как лучше работать с анимациями актеров (Action)
          Использовать Pool класс. В моем проекте есть пример более детально реализации дополнительной
          public void onAppear() {
           ScaleToAction scaleToAction = scaleToPool.obtain();
           scaleToAction.setPool(scaleToPool);
           scaleToAction.setScale(startScale);
           scaleToAction.setDuration(ANIMATION_TIME_APPEAR);
           addAction(scaleToAction);
          }
          


          Наверное все, что из интересного. Сам не нашел решение проблемы увеличения viewport. Камера zoom помогает только с приближением сцены, и получается, что сцена сокращается больше чем надо (область видимости неизменная).
          Другой вопрос это сохранение рендера мира. На выходе он соотвествует размеру экрана, но мне нужен определенный размер. Пробовал с framebuffer, но не получилось вытащить с него pixmap (присутствуют какие-то баги с инициализацией класса Texture)

          Еще недостаток в движке, что не позволяет, например, полностью отключить ввод с клавиатуры. Получалось так, что он перехватывал фокус с другого виджета (но он на это и не рассчитан собственно, хотя было бы неплохо. Go pull request, одним словом)

          Но в целом, все очень даже хорошо. Развивайся дальше LibGDX)

          Ссылка на проект: github.com/androidovshchik/VKAdvancedPosting
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338398/


          Метки:  

          LibGDX. Практические вопросы и ответы

          Четверг, 21 Сентября 2017 г. 13:28 + в цитатник
          mr-cpp сегодня в 13:28 Разработка

          LibGDX. Практические вопросы и ответы

          • Tutorial
          imageПривет хабр!
          Закончился конкурс от ВКонтакте vk.com/wall-104669514_37 и мой 2-х недельный марафон в интернете по поиску нужной информации
          Хочу поделится небольшим опытом работы с графическим движком LibGDX. В интернете полно примеров, но большинство далеки от практики (нарисованный спрайт это далеко еще не игра) или уже устарели.


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

          Вопросы, которые мне приходилось решать:

          Вариант использования встроенного логгера
          Я часто использую Timber из-за удобства. В core модуле он недоступен, потому написал простой вспомогательный класс с использованием имеющегося в LibGDX логгера, с которым приложение в релиз версии перестает писать логи
          import com.badlogic.gdx.Gdx;
          
          public class GdxLog {
          
           public static boolean DEBUG;
          
           @SuppressWarnings("all")
           public static void print(String tag, String message) {
            if (DEBUG) {
             Gdx.app.log(tag, message);
            }
           }
          
           @SuppressWarnings("all")
           public static void d(String tag, String message, Integer...values) {
            if (DEBUG) {
             Gdx.app.log(tag, String.format(message, values));
            }
           }
          
           @SuppressWarnings("all")
           public static void f(String tag, String message, Float...values) {
            if (DEBUG) {
             Gdx.app.log(tag, String.format(message.replaceAll("%f", "%.0f"), values));
            }
           }
          }
          
          //... вызов
          GdxLog.d(TAG, "worldWidth: %d", worldWidth);
          

          Плюс для удобства различные float значения 1.23456789 округляются

          E/libEGL: call to OpenGL ES API with no current context (logged once per thread)
          Поначалу сильно огорчала такая ошибка, ничего не мог понять. Она происходит, потому что графика GLSurfaceView отрисовывается в своем отдельном потоке, когда проиcходит попытка извне вмешаться в этот процесс. Как исправить:
          Gdx.app.postRunnable(new Runnable() {
             @Override
             public void run() {
                 // Здесь выполняется в самом потоке
             }
          });
          

          Впринципе аналогично, как и в случае, view.postInvalidate()
          Я не любитель анонимных классов, поэтому написал такой простой метод для сокращения кода (иначе он просто становился не читаемым). Хотя с java 8 это уже не такая проблема, но из дополнительных плюсов то, что обрабатываются InvocationTargetException, когда, например, файл не найден, приложение уже не упадет по такой незначительной ошибке.
          // null may be only String params
          public void postRunnable(final String name, final Object...params) {
           Gdx.app.postRunnable(new Runnable() {
            @Override
            public void run() {
             Method method = null;
             Class[] classes = new Class[params.length];
             for (int i = 0; i < params.length; i++) {
              classes[i] = params[i] == null ? String.class : params[i].getClass();
             }
             try {
              method = World.class.getMethod(name, classes);
             } catch (SecurityException e) {
              GdxLog.print(TAG, e.toString());
             } catch (NoSuchMethodException e) {
              GdxLog.print(TAG, e.toString());
             }
             if (method == null) {
              return;
             }
             try {
              method.invoke(WorldAdapter.this, params);
             } catch (IllegalArgumentException e) {
              GdxLog.print(TAG, e.toString());
             } catch (IllegalAccessException e) {
              GdxLog.print(TAG, e.toString());
             } catch (InvocationTargetException e) {
              GdxLog.print(TAG, e.toString());
             }
            }
           });
          }
          

          Важно, чтобы параметры не были примитивами, а наследовали Object. И плюс здесь упрощение с null параметром (только от класса String)

          Как использовать LibGDX с другими виджетами
          Через фрагмент. Больше информации в wiki
          Пример:
          public class ActivityMain extends AppCompatActivity
              implements AndroidFragmentApplication.Callbacks {
          
          protected FragmentWorld fragmentWorld;
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           // ...
           getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.world, fragmentWorld, FragmentWorld.class.getSimpleName())
            .commitAllowingStateLoss();
          }
          
          @Override
          public void exit() {}
          

          И сам фрагмент:
          public class FragmentWorld extends AndroidFragmentApplication {
          
           public World world;
          
           @Override
           public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            int worldWidth = getResources().getDimensionPixelSize(R.dimen.world_width);
            int worldHeight = getResources().getDimensionPixelSize(R.dimen.world_height);
            world = new World(BuildConfig.DEBUG, worldWidth, worldHeight);
            return initializeForView(world);
           }
          }
          


          Как вытащить рендер мира или Pixmap в Bitmap
          Я не хотел сохранять pixmap в файл и потом средствами Android вытаскивать Bitmap
          Поэтому придумал такой лайфхак с OutputStream классом. Работает прекрасно и не требует медленных r/w операций
          final Pixmap pixmap = getScreenshot();
          Observable.fromCallable(new Callable  () {
           @Override
           public Boolean call() throws Exception {
            PixmapIO.PNG writer = new PixmapIO.PNG((int)(pixmap.getWidth() * pixmap.getHeight() * 1.5 f));
            writer.setFlipY(false);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            try {
             writer.write(output, pixmap);
            } finally {
             StreamUtils.closeQuietly(output);
             writer.dispose();
             pixmap.dispose();
            }
            byte[] bytes = output.toByteArray();
            Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            return true;
           }
          }).subscribeOn(Schedulers.io()).subscribe();
          


          Как работать с colors совместно с Android
          На самом деле можно int, наверное, (Color класс в LibGDX довольно специфичен как и вся графика, по-моему мнению, т.е. нужно разбираться на уровне битов) но для простоты я предпочел hex хранить и передавать в String
          Соотвественно понадобился парсер:
          protected Color parseColor(String hex) {
           String s1 = hex.substring(0, 2);
           int v1 = Integer.parseInt(s1, 16);
           float f1 = 1 f * v1 / 255 f;
           String s2 = hex.substring(2, 4);
           int v2 = Integer.parseInt(s2, 16);
           float f2 = 1 f * v2 / 255 f;
           String s3 = hex.substring(4, 6);
           int v3 = Integer.parseInt(s3, 16);
           float f3 = 1 f * v3 / 255 f;
           return new Color(f1, f2, f3, 1 f);
          }
          

          Пример параметра «ffffff»

          Как определить нажатие на actor
          sticker.addListener() Все проще. Есть метод hit у сцены
          Sticker sticker = (Sticker) stickersStage.hit(coordinates.x, coordinates.y, false);
          


          Математика scale и rotation на событие pinch (два пальца)
          Возможно это не лучшее решение, но работает хорошо. Поворот без резких скачков, плавный зум
          @Override
          public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1,
           Vector2 pointer2) {
           // initialPointer doesn't change
           // all vectors contains device coordinates
           Sticker sticker = getCurrentSticker();
           if (sticker == null) {
            return false;
           }
          
           Vector2 startVector = new Vector2(initialPointer1).sub(initialPointer2);
           Vector2 currentVector = new Vector2(pointer1).sub(pointer2);
           sticker.setScale(sticker.startScale * currentVector.len() / startVector.len());
          
           float startAngle = (float) Math.toDegrees(Math.atan2(startVector.x, startVector.y));
           float endAngle = (float) Math.toDegrees(Math.atan2(currentVector.x, currentVector.y));
           sticker.setRotation(sticker.startRotation + endAngle - startAngle);
           return false;
          }
          

          Единственно необходимо перед этим событием запоминать текущий зум и поворот
          @Override
          public boolean touchDown(float x, float y, int pointer, int button) {
           if (pointer == FIRST_FINGER) {
            Vector2 coordinates = stickersStage.screenToStageCoordinates(new Vector2(x, y));
            Sticker sticker = (Sticker) stickersStage.hit(coordinates.x, coordinates.y, false);
            if (sticker != null) {
             // здесь
             sticker.setPinchStarts();
             currentSticker = sticker.index;
            }
           }
           return false;
          }
          
          @Override
          public void pinchStop() {
           Sticker sticker = getCurrentSticker();
           if (sticker != null) {
            // здесь
            sticker.setPinchStarts();
           }
          }
          

          И на время события pinch актер неподвижен в этом случае

          Почему не происходит анимация, но action к актеру добавлен
          Ключевой метод act у сцены. Боль, когда этого не знаешь)
          spriteBatch.begin();
          stickersStage.act();
          stickersStage.getRoot().draw(spriteBatch, 1);
          spriteBatch.end();
          


          Градиент в LibGDX
          Насколько я понял, можно задать только левый верхний и нижний правый цвета. При этом есть не задавать остальные (transparent), то между ними будет пробел. Т.е. остальные определяются как сумма этих двух цветов на данном расстоянии, если речь идет о линейном градиенте. Сказать, что своеобразно, ничего не сказать
          gradientTopLeftColor = parseColor(topLeftColor);
          gradientBottomRightColor = parseColor(bottomRightColor);
          gradientBlendedColor = new Color(gradientTopLeftColor).add(gradientBottomRightColor);
          


          Хитрости обработки движения актера (событие pan)
          Вот этот обработчик
          @Override
          public boolean pan(float x, float y, float deltaX, float deltaY) {
           if (currentSticker != Sticker.INDEX_NONE) {
            Sticker sticker = getCurrentSticker();
            if (sticker != null) {
             sticker.moveBy(deltaX * worldDensity, -deltaY * worldDensity);
            }
           }
           return false;
          }
          

          worldDensity это разница между перемещением пальца в экранных координатах и актера в игровых. Без этого параметра актер будет отрываться от пальца
          @Override
          public void resize(int width, int height) {
           if (height > width) {
            worldDensity = 1f * worldWidth / width;
           } else {
            worldDensity = 1f * worldHeight / height;
           }
           viewport.update(width, height, true);
          }
          

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

          Как лучше работать с анимациями актеров (Action)
          Использовать Pool класс. В моем проекте есть пример более детально реализации дополнительной
          public void onAppear() {
           ScaleToAction scaleToAction = scaleToPool.obtain();
           scaleToAction.setPool(scaleToPool);
           scaleToAction.setScale(startScale);
           scaleToAction.setDuration(ANIMATION_TIME_APPEAR);
           addAction(scaleToAction);
          }
          


          Наверное все, что из интересного. Сам не нашел решение проблемы увеличения viewport. Камера zoom помогает только с приближением сцены, и получается, что сцена сокращается больше чем надо (область видимости неизменная).
          Другой вопрос это сохранение рендера мира. На выходе он соотвествует размеру экрана, но мне нужен определенный размер. Пробовал с framebuffer, но не получилось вытащить с него pixmap (присутствуют какие-то баги с инициализацией класса Texture)

          Еще недостаток в движке, что не позволяет, например, полностью отключить ввод с клавиатуры. Получалось так, что он перехватывал фокус с другого виджета (но он на это и не рассчитан собственно, хотя было бы неплохо. Go pull request, одним словом)

          Но в целом, все очень даже хорошо. Развивайся дальше LibGDX)

          Ссылка на проект: github.com/androidovshchik/VKAdvancedPosting
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338398/


          Метки:  

          Обзор GUI-интерфейсов для управления Docker-контейнерами

          Четверг, 21 Сентября 2017 г. 12:32 + в цитатник
          shurup сегодня в 12:32 Администрирование

          Обзор GUI-интерфейсов для управления Docker-контейнерами



            Работа с Docker в консоли — привычная для многих рутина. Тем не менее, бывают случаи, когда GUI-/веб-интерфейс может оказаться полезным даже для них. В статье представлен обзор наиболее заметных на сегодняшний день решений, авторы которых попытались предложить более удобные (или подходящие для каких-то случаев) интерфейсы для знакомства с Docker или даже обслуживания больших его инсталляций. Некоторые из проектов совсем молоды, а иные — наоборот, уже отмирают…

            Portainer


            • Сайт; GitHub; Gitter.
            • Лицензия: Open Source (zlib License и другие).
            • ОС: Linux, Mac OS X, Windows.
            • Языки/платформа: Go, JavaScript (Angular).
            • Демо-версия (admin / tryportainer).



            Portainer (ранее известен как UI for Docker) — самый популярный веб-интерфейс для работы с Docker-хостами и кластерами Docker Swarm. Запускается очень просто — развёртыванием Docker-образа, которому в качестве параметра передаётся адрес/сокет Docker-хоста. Позволяет управлять контейнерами, образами (умеет забирать их из Docker Hub), сетями, томами, секретами. Поддерживает Docker 1.10+ (и Docker Swarm 1.2.3+). При просмотре контейнеров для каждого из них доступна базовая статистика (использование ресурсов, процессы), логи, подключение к консоли (веб-терминал xterm.js). Имеются свои списки доступов, позволяющие ограничивать пользователям Portainer права на различные операции в интерфейсе.

            Kitematic (Docker Toolbox)





            Стандартный GUI для пользователей Docker в Mac OS X и Windows, который вошёл в состав Docker Toolbox — инсталлятора набора утилит, включающих в себя также Docker Engine, Compose и Machine. Имеет минимальный набор функций, обеспечивающих загрузку образов из Docker Hub, управление базовыми настройками контейнеров (включая тома, сети), просмотр логов и подключение к консоли.

            Shipyard


            • Сайт; GitHub.
            • Лицензия: Open Source (Apache License 2.0).
            • ОС: Linux, Mac OS X.
            • Языки/платформа: Go, Node.js.



            Shipyard — это не просто интерфейс, а система управления ресурсами Docker, в основу которой заложено наличие своего API. API в Shipyard — RESTful на базе формата JSON, совместим на 100% с Docker Remote API, предлагает дополнительные возможности (в частности — аутентификацию и управление списками доступа, логирование всех выполняемых операций). Этот API и является той базой, вокруг которой уже построен веб-интерфейс. Для хранения служебной информации, не относящейся напрямую к контейнерам и образам, в Shipyard используется RethinkDB. Веб-интерфейс позволяет управлять контейнерами (включая просмотр статистики и логов, подключение к консоли), образами, узлами кластера Docker Swarm, приватными реестрами (Registries).

            DockStation


            • Сайт; GitHub (без исходного кода).
            • Лицензия: проприетарная.
            • ОС: Linux, Mac OS X, Windows.
            • Языки/платформа: Electron (Chromium, Node.js).



            DockStation — молодой проект, созданный белорусскими программистами (которые, кстати, ищут инвесторов для его дальнейшего развития). Две главные особенности — ориентированность на разработчиков (не на DevOps-инженеров или сисадминов) и закрытость кода (бесплатно для личного использования и стартапов, платно — для компаний). Позволяет не только управлять образами (поддерживается Docker Hub) и контейнерами (+ статистика и логи), но и заводить проекты с визуализацией связей контейнеров, задействованных в проекте. Другая особенность — наличие парсера (находится в бета-версии), позволяющего конвертировать команды docker run в формат Docker Compose. Работает с Docker 1.10.0+ (Linux) и 1.12.0 (Mac + Windows), Docker Compose 1.6.0+.

            Simple Docker UI


            • GitHub.
            • Лицензия: Open Source (MIT License).
            • ОС: Linux, Mac OS X, Windows.
            • Языки/платформа: Electron, Scala.js (+ React on Scala.js).



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

            Другие варианты


            В обзор не попали:

            • Rancher — платформа управления контейнерами, обладающая функциями оркестровки и поддержкой Kubernetes. Open Source (Apache License 2.0); работает в Linux; написана на Java. Имеет веб-интерфейс Rancher UI на Node.js.
            • Data Pulley — простая утилита, имеющая минимум функций и документации. Open Source (MIT License); работает в Linux (имеется только пакет для Ubuntu); написана на Python. Поддерживает Docker Hub для образов, просмотр логов для контейнеров.
            • Panamax — проект, задававшийся целью «сделать деплой сложных контейнеризированных приложений таким простым, как drag-n-drop». Для этого был создан свой каталог шаблонов для деплоя приложений (Panamax Public Templates), результаты из которого показываются при поиске образов/приложений наравне с данными из Docker Hub. Open Source (Apache License 2.0); работает в Linux, Mac OS X, Windows; написан на Ruby. Интегрирован с ОС CoreOS и системой для оркестровки Fleet. Судя по видимой в интернете активности, перестал поддерживаться в 2015 году.
            • Docklyконсольный графический интерфейс для управления контейнерами и образами Docker. Open Source (MIT License); написан на JavaScript/Node.js.

            Напоследок: как же выглядит GUI в Dockly? Осторожно, GIF на 3,4 Мб!


            P.S.


            Читайте также в нашем блоге:

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

            https://habrahabr.ru/post/338332/


            Метки:  

            Поиск сообщений в rss_rss_hh_full
            Страницы: 1824 ... 1541 1540 [1539] 1538 1537 ..
            .. 1 Календарь