Когда у нас надёжно заработала непрерывная интеграция на Jenkins и устоялись процессы выпуска релизов продукта, возникла мысль: а почему бы не перенять передовой опыт и не поставить в офисе свой электронный излучатель информации (information radiator): большой красивый экран, на котором автоматически отображаются происходящие с проектом процессы?



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

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


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

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

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

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

Ну и не в последнюю очередь — это круто выглядит!

Software-часть


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

Архитектурно идея очень проста: формируется «живая», автоматически обновляемая Web-страница, на мониторе открывается веб-браузер во весь экран — и готово. У Dashing оказались следующие достоинства:

  1. готовый пример с раскладкой, оптимизированной для телевизора 1080p,
  2. возможность при помощи мыши расположить виджеты (aka информеры aka плитки с информацией) по экрану,
  3. много стандартных виджетов,
  4. ещё больше дополнительных виджетов,
  5. лёгкость, с которой можно разрабатывать свои собственные виджеты.


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

До этого момента я никогда не работал с Ruby. Однако разобраться в том, как всё установить и сконфигурировать оказалось нетрудно. Немного лишних телодвижений нужно, чтобы установить всё на Windows (с Linux, насколько я понимаю, всё элементарно),
вот какой перечень действий сработал у меня:
  1. Установить node.js.
  2. Установить Ruby с rubyinstaller.org.
  3. Установить оттуда же RubyDevKit.
  4. ruby dk.rb init
    ruby dk.rb review 
    ruby dk.rb install
    

  5. gem update system ::если не сделать этого, могут возникнуть проблемы с установкой других пакетов
    gem install htmlentities
    gem install bundle
    gem install nokogiri
    gem install dashing
    




Разместить на виджетах я решил следующую информацию:

  1. информеры о статусах сборок Jenkins,
  2. заголовки свежих сообщений в группу рассылки Google,
  3. комментарии к свежим коммитам в репозитории SVN с исходными кодами,
  4. информацию об изменении статусов тикетов в Trac.




За основу виджета для Jenkins я взял один из готовых в богатой библиотеке виджетов к Dashing. Т. к. мне хотелось, чтобы отображаемое на мониторе максимально походило на то, что человек видит на странице Jenkins, я усовершенствовал виджет, добавив к нему иконки с «погодными условиями» проекта, используемые в самом Jenkins. При этом фоновый цвет «плитки» соответствует статусу последней сборки: зелёный — последняя сборка успешна, серый — сборка в процессе, красный — сборка неуспешна. Дорабатывать виджеты под Dashing оказалось довольно легко и приятно, и я решил пойти дальше.

Для отображения информации о том, что присходит в системе Trac и в группе рассылки, понадобился виджет, отображающий RSS-ленту. Его пришлось клонировать и отдельно доработать для Trac и для Google-группы в силу местных особенностей RSS-формата. «Украсить» ленту Trac-событий удалось при помощи Trac-овских иконок открытого и закрытого тикета.

Более всего повозиться пришлось с лентой комментариев к коммитам из SVN. У сервера Subversion нет встроенного RSS-сервиса, каких-то готовых решений в библитеке виджетов Dashing также не было. Поизучав вопрос, я понял, что единственным подходящим методом является запуск команды svn log и анализ выводимых ею данных при помощи регулярных выражений. К этому моменту я уже достаточно разобрался и в Ruby, и в создании виджетов, чтобы сделать скрипт, объединяющий в один список комментарии к разным репозитариям и затем сортирующий их в хронологическом порядке.

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

Информационное наполнение было готово, и настала пора приобретать и устанавливать большой экран.

Hardware-часть


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

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

Исходя из размеров нашего помещения и места установки, я решил, что подходящей является диагональ 46''. Мой выбор первоначально пал на бренд Samsung, но в означенный час поставщик сообщил мне, что заказанной и предоплаченной по безналу модели Samsung у них больше нет и они могут предложить похожую, и даже более «продвинутую» модель LG. Так у нас в офисе оказался огромный плоский телевизор LG.

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

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

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

К сожалению, радовался я слишком рано. Ровно через 10 минут картинка погасла и телевизор начал показывать «скринсейвер», исчезавший, только если нажать на пульте любую клавишу. «Не проблема,» — решил я и стал искать в меню опции отключения скринсейвера. Опция не находилась. Я обратился к Google и вместо готового рецепта набрёл на страницу на официальных форумах компании LG, где несколько таких же, как я, бедолаг рассказывали о том, что купили их великолепный большой телевизор для постоянной трансляции на его экране веб-страницы, и сетовали на невозможность отключить скринсейвер. LG на своём официальном форуме не отвечал. Видимо, недаром: что-то такое знает LG про матрицы своих телевизоров, если на них часами показывать статическое изображение, и не желает тратиться на их гарантийную замену.

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

Источник видеосигнала должен был быть простым, дешёвым и надёжным, при этом без особых требований к быстродействию системы. Я остановился на неттопе MSI WindBox DC-111, который подвернулся по выгодной цене. Должен сказать, что эта маленькая машина нас не подвела: работая круглые сутки, она надёжно выполняла (и продолжает выполнять) свою задачу уже почти год. А во время корпоративных вечеринок мы запускаем на ней прокрутку фотографий и видео.



Телевизор же продолжил «проявлять характер». При помощи таймеров он был настроен таким образом, чтобы автоматически включаться в 9:00 и выключаться в 19:00 по рабочим дням. Но почему-то через три часа после автоматического утреннего включения (т. е. ровно в полдень) он, если не понажимать какие угодно кнопки на пульте, гаснет. Если после этого включить его вручную, он работает уже без выключения столько, сколько надо (естественно, всё меню настроек было внимательно изучено, все «энергосберегающие» опции отключены). Так продолжается и поныне.

Заключение


Наш «излучатель» проработал уже почти год, и по результатам этой истории я могу сделать следующие выводы:

  1. Задача требует некоторой смекалки, но ничего невыполнимого для профессиональных программистов.
  2. Фреймворк Dashing смело рекомендую в качестве системы быстрой и удобной сборки информационных панелей.
  3. Идея использовать в качестве инфопанели бытовой телевизор имеет подводные камни: наш телевизор LG изо всех сил сопротивляется работе в таком режиме. Хотя за год работы с его матрицей вообще ничего не случилось.


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

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


  1. AllexIn
    29.05.2016 08:44
    +1

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


    1. IvanPonomarev
      29.05.2016 10:45
      +1

      Интересная мысль. «Повентилирую вопрос», как дойдут руки.


      1. tolstomordik
        30.05.2016 16:49
        +1

        Отключение через три часа, после включения телевизора по таймеру, это не баг, это фича бытовых телевизоров LG. Раз снаружи никого нет (пульт никто не теребит) то работать не для кого и аппарат, добросовестно отработав заданные производителем три часа отрубается.
        Столкнулся с этим при реализации задачи отображения медийного контента по расписанию (Digital Signage).
        В принципе, телевизор управляется по RS-232. На своем экземпляре проверил, работает. Простейший способ отправки из под Windows — CMD-файл.


        1. IvanPonomarev
          01.06.2016 21:13

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


          1. dkv
            01.06.2016 22:22

            USB-RS232 Converter стоит менее 200 рублей на алиэкпрессе. В оффлайне за 500 найти не проблема.


            1. IvanPonomarev
              01.06.2016 23:29

              на ТЕЛЕВИЗОРЕ нет RS232


              1. dkv
                01.06.2016 23:49

                Засада. Остаётся ИК. И тут бы Broadlink Black Bean использовать за $11, как готовое доступное решение, да вот только к нему подход ещё найти надо.


      1. dkv
        30.05.2016 22:30

        Как уже написали, есть вариант управлять по RS-232 либо ещё есть вариант HDMI-CEC, но вряд ли последнее поддерживается неттопом. А вот на малине бы работало.


  1. Akr0n
    29.05.2016 09:41
    +3

    У нас самый старый RaspberryPi справляется с выводом дашборда. Зачем был целый неттоп?


    1. IvanPonomarev
      29.05.2016 10:47

      Затем, что никто из нас с малиновыми пирогами до этого дело не имел, и цена трудозатрат на разбирательство была бы выше разницы в цене девайса (учитывая, что неттоп обошёлся в 13000 рублей).

      Но с точки зрения инженерной неттоп тут overkill, конечно.

      Что стоит на вашем RaspberryPi? Только браузер или и «мозги» тоже? Расскажите.


      1. Akr0n
        29.05.2016 15:34

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


  1. xdenser
    29.05.2016 10:04
    +3

    Скроллбары не мешают?


    1. IvanPonomarev
      29.05.2016 10:48
      +1

      :-) чё-та вылезли, не было их, в понедельник схожу поправлю


  1. woodhead
    29.05.2016 14:38

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


    1. IvanPonomarev
      29.05.2016 14:46

      Да, у меня то же самое ощущение) Недаром я заказывал Samsung… Но в моём случае, я подозреваю, такое поведение телевизора — не брак, а намеренное продвижение для «промышленных задач» своих «промышленных решений» за «промышленную цену».

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


      1. staticspb
        29.05.2016 15:23

        Может быть мне просто повезло, но уже три года минимум использую Samsung ME45 как основной монитор, который, в силу специфики и графика работы, все три года не выключался.
        Вообще эти экраны оказались достаточно хорошими, за несколько лет из почти сотни – только два ушли «по гарантии». При работе 24/7 в терминалах частной авиации. Остальные до сих пор работают.
        А вот LG… Нервов нам подпортил) опять-же, может просто не повезло))


  1. azsx
    29.05.2016 18:15
    +2

    > почему-то через три часа после автоматического утреннего включения (т. е. ровно в полдень) он, если не понажимать какие угодно кнопки на пульте, гаснет. Если после этого включить его вручную, он работает уже без выключения столько, сколько надо (естественно, всё меню настроек было внимательно изучено, все «энергосберегающие» опции отключены).
    Данная функция называется эко-таймер и смотрится в английских мануалах. Как правило штатно, даже в сервисном меню ее отключить нельзя. Делают так:
    1. Выводят черную картинку на экран, телевизор включен всегда.
    2. Обратитесь в местный сервис, возможно они уже читали мануал и умеют отключать эту опцию для вашей модели.
    3. Решайте проблему методом «научного тыка». Найдите в настройках второй таймер (эко-таймер). Попробуйте сперва поставить его на 10 минут, потом либо на 0, либо «выкл». Попробуйте поставить телевизор на профиль «энергосберегающий», затем обнулите эко-таймер, затем верните профиль «обычный» или яркость повысьте.
    4. Купите Chunghop RM-L968E, например, там макросы поставьте на таймер (на пульте) типа громкость увеличить и уменьшить раз в 3 часа. Но предлагаемый мой пульт узконаправленный (замучаетесь в реальном офисе).
    По моему мнению, я могу и ошибаться, им законодательно надо ставить не отключаемый эко-таймер, но они его ставят и предусматривают недокументированные возможности по его отключению.
    ps
    а ваще сливайте прошивку от lg, дебажьте её и ищите эко-таймер на 10800 и как его отключить. А то грустно статью читать, я повесил телик и обновляю на нем сайт. А я на мониторе 15 пингов в терминаторе запустил и при сбое повесил на них звуковой сигнал ошибки. Только это не круто :)


    1. IvanPonomarev
      29.05.2016 18:15

      вот это интересно… как только доберусь, попробую, спасибо!


  1. Paskin
    30.05.2016 08:42

    1. Не исключено что для вашего ТВ есть новая прошивка, исправляющая эти проблемы
    2. Если ваши ТВ и компьютер поддерживают CEC (передачу управляющих сигналов по HDMI) — можно найти соответствующую библиотеку и играться громкостью раз в час, например — это предотвратит выключение.
    3. Можно купить за пару долларов ИК-излучатель и эмулировать пульт
    4. Тут должна была быть реклама Распберри — CEC она умеет из коробки, а ИК колхозится за пять минут через GPIO


  1. Markuzzz
    30.05.2016 09:15

    3 года назад столкнулся с таким же поведением телевизора LG при включении по таймеру. Тоже использовали в качестве табло. При детальном осмотре задней панели ТВ был найден последовательный порт для удаленного управления, а в мануале от ТВ — список управляющих кодов. Далее ТВ был соединен с ПК нуль-модемным кабелем, и, так как ПК, который выводил картинку, работал под Windows, следующую схему включения:
    в планировщик был вставлен батник, который посылал в последовательный порт с помощью утилиты serialsend 3 байта, которые включали ТВ, а затем запускали PowerPoint Viewer с презентацией в полноэкранном режиме. Эта же задача планировщика предварительно выводила ПК из режима гибернации.
    Выключение происходило наоборот: планировщик снова запускал батник, который завершал PowerPoint, копировал из шары свежую версию презентации, отправлял в последовательный порт другие 3 байта, которые выключали ТВ, и переводил ПК в режим гибернации.
    Полагаю что под Linux'ом будет проще — можно напрямую писать в последовательный порт без костылей.


    1. roboter
      30.05.2016 10:23

      под вин тоже же есть > com1, или о каких костылях речь?


      1. Markuzzz
        30.05.2016 17:50

        Произвольный набор байт сможете отправить в com-порт через стандартное перенаправление вывода?


        1. roboter
          30.05.2016 19:14

          ммм, да, COPY произвольныйнаборбайт.HEX COM1


          1. Markuzzz
            31.05.2016 06:36

            Эта команда создаст вам в текущей директории копию файла произвольныйнаборбайт.HEX с именем COM1


            1. Paskin
              31.05.2016 07:24

              Вот так будет работать:
              copy file.bin \\.\com1 /b


    1. IvanPonomarev
      01.06.2016 21:14

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

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


  1. bigspb
    30.05.2016 16:45

    Сборки Jenkins удобно мониторить Catlight (есть такая система мониторинга для Jenkins, см. catlight.io/a/jenkins-build-status-notifications ).
    Заметно повышает производительность программистов ))