{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блог Дмитрия Серженко: заметки с тегом инфопанель",
    "_rss_description": "Всю сознательную жизнь работаю в образовании.\r\n\r\nВ настоящее время — открываю Лицей информационных технологий Приморского района Санкт-Петербурга.\r\nРанее (в т.ч. по совместительству): зам. директора и  руководитель центра цифрового образования «ИнфинITи» школы № 509, сотрудник СПбЦОКОиИТ и Инспекции Комитета по образованию Санкт-Петербурга, заведующий ЦИО ИМЦ Петродворцового района, сотрудник поддержки ВКонтакте, инженер ЦИО ИМЦ Красносельского района, педагог дополнительного образования УМЦ «ИНФОБ» и лицея № 395, переводчик, индивидуальный предприниматель и проч., проч., проч.…\r\n\r\nDisclaimer. Вся информация, опубликованная в этом блоге, отражает персональное мнение частного лица, даже если затрагивает рабочие темы, и не представляет официальную позицию какой-либо организации или органа власти (хотя и может с таковой позицией совпадать… или не совпадать).",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/serzhenko.ru\/tags\/infopanel\/",
    "feed_url": "https:\/\/serzhenko.ru\/tags\/infopanel\/json\/",
    "icon": "https:\/\/serzhenko.ru\/pictures\/userpic\/userpic@2x.jpg?1762279385",
    "authors": [
        {
            "name": "Дмитрий Серженко",
            "url": "https:\/\/serzhenko.ru\/",
            "avatar": "https:\/\/serzhenko.ru\/pictures\/userpic\/userpic@2x.jpg?1762279385"
        }
    ],
    "items": [
        {
            "id": "8",
            "url": "https:\/\/serzhenko.ru\/all\/i-love-reading\/",
            "title": "Акция «Читайте с любовью»",
            "content_html": "<p>14 февраля 2017 в школе № 509 впервые прошла <a href=\"https:\/\/vk.com\/wall-128649079_416\">акция «Читайте с любовью»<\/a>, приуроченная ко Дню книгодарения и Дню всех влюблённых.<\/p>\n<p>В рамках этой акции в холле третьего этажа у библиотеки было организовано пространство для буккроссинга: каждый желающий ученик или сотрудник мог принести книгу и оставить её в дар кому-то конкретному, оставить на библиотечной тележке, чтобы кто-то впоследствии выбрал для себя... или вообще подарить школе, библиотеке.<\/p>\n<p>Участники акции получали на память сувенир — значок с символикой акции.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/serzhenko.ru\/pictures\/5NR0Si7EdEk.jpg\" width=\"1312\" height=\"984\" alt=\"\" \/>\n<\/div>\n<p>Для большей интерактивности и для увлечения «мимо проходящих» мы задействовали инфопанель, располагающуюся в этом же холле. На панели в течение всего дня отображался счётчик подаренных книг.<\/p>\n<h2>Как это работает?<\/h2>\n<p>Инфопанель в этом холле представляет собой SmartTV, напрямую (без ПК) подключённый к школьной локальной сети по Ethernet. Обычно изображение для трансляции (видео, фото, объявления) телевизор берёт со школьного медиасервера. Самый оптимальный вариант для трансляции динамического контента — использование встроенного в ПО телевизора веб-браузера.<\/p>\n<p>Была свёрстана веб-страница, на которой отображается счётчик подаренных книг. Раз в 5 секунд страница отправляет AJAX-запрос на сервер и запрашивает значение счётчика. Если в ответ приходит значение, отличное от текущего, счётчик обновляется с анимацией.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/serzhenko.ru\/pictures\/--_lg_55lw5600_side.png\" width=\"2500\" height=\"2500\" alt=\"\" \/>\n<\/div>\n<p>Как же обновляется значение на сервере? Был свёрстан второй интерфейс — для управления счётчиком. Он адаптирован для мобильных устройств. Управляющий интерфейс содержит две кнопки: «&minus;» и «&plus;» — а также текущее значение счётчика. Нажатие каждой из кнопок вызывает AJAX-запрос на сервер, содержащий один параметр — запрошенное действие. Соответственно, происходит либо декремент, либо инкремент счётчика.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/serzhenko.ru\/pictures\/--2017-04-09--18.11.40_iphone5s_gold_portrait.png\" width=\"2000\" height=\"2000\" alt=\"\" \/>\n<\/div>\n<p>Специально обученный волонтёр, принимая книжку, выдаёт значок и нажимает кнопку в своём мобильном интерфейсе. На сервер уходит запрос, обновляется значение, примерно в течение 5 секунд счётчик обновляется на экране — как раз за это время волонтёр успевает помочь прикрепить значок :) Участник акции счастлив — видит свой вклад визуализированно: «вот я принёс книжку и меня посчитали!»<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/serzhenko.ru\/pictures\/iluvreading.gif\" width=\"480\" height=\"270\" alt=\"\" \/>\n<\/div>\n<p>Что интересно — в ходе подобной акции ссылка на страницу со счётчиком в принципе без опаски может быть размещена в публичном пространстве (в соцсетях и\/или на сайте школы). Тогда следить за прогрессом акции смогут не только ученики внутри школы, но и, например, их родители. Но мы в этот раз не размещали. :)<\/p>\n<p>Одноразовая ли это история? Думаю, что нет. Очень легко адаптировать этот счётчик к любым другим акциям — считать количество отжиманий в ходе спортивных праздников, количество сданных использованных батареек (спасённых ёжиков) в рамках экологических акций и т. п. :)<\/p>\n<h2>Чуть-чуть сугубо технических деталей<\/h2>\n<p><i>Использованные технологии, библиотеки, фреймворки:<\/i><\/p>\n<ul>\n<li>PHP<\/li>\n<li>jQuery<\/li>\n<li>CSS-фреймворк <a href=\"http:\/\/getbootstrap.com\/\">Bootstrap 3<\/a> для ускорения и упрощения вёрстки<\/li>\n<li>key-value хранилище <a href=\"http:\/\/redis.io\">Redis<\/a> и php-библиотека <a href=\"https:\/\/github.com\/nrk\/predis\">Predis<\/a> для работы с ним<\/li>\n<li>JS-библиотека <a href=\"http:\/\/flipclockjs.com\/\">FlipClock<\/a> для создания анимированного счётчика в виде «циферблата»<\/li>\n<\/ul>\n<p>Значение на сервере хранится в key-value хранилище Redis в виде одного целого числа. На уровне хранилища поддерживаются атомарные операции инкремента\/декремента.<\/p>\n<p>Почему делается pull-запрос с клиентской стороны раз в 5 секунд, а не push с сервера или long-polling? Потому что браузер телевизора иногда ведёт себя странно при, казалось бы, самых банальных операциях. Например, вылетает при просмотре YouTube-роликов (через браузер, а не спец. приложение). Поэтому принято решение, во избежание лишних крэшей, максимально упростить клиентский код.<\/p>\n",
            "date_published": "2017-04-09T18:37:57+03:00",
            "date_modified": "2017-05-10T22:58:50+03:00",
            "tags": [
                "внутренние сервисы",
                "инфопанель",
                "школа № 509"
            ],
            "image": "https:\/\/serzhenko.ru\/pictures\/E15LrXm9xpE.jpg",
            "_date_published_rfc2822": "Sun, 09 Apr 2017 18:37:57 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "8",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/serzhenko.ru\/pictures\/E15LrXm9xpE.jpg",
                    "https:\/\/serzhenko.ru\/pictures\/5NR0Si7EdEk.jpg",
                    "https:\/\/serzhenko.ru\/pictures\/--_lg_55lw5600_side.png",
                    "https:\/\/serzhenko.ru\/pictures\/--2017-04-09--18.11.40_iphone5s_gold_portrait.png",
                    "https:\/\/serzhenko.ru\/pictures\/iluvreading.gif"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}