<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Блог Дмитрия Серженко: заметки с тегом инфопанель</title>
<link>https://serzhenko.ru/tags/infopanel/</link>
<description>Всю сознательную жизнь работаю в образовании.

В настоящее время — открываю Лицей информационных технологий Приморского района Санкт-Петербурга.
Ранее (в т.ч. по совместительству): зам. директора и  руководитель центра цифрового образования «ИнфинITи» школы № 509, сотрудник СПбЦОКОиИТ и Инспекции Комитета по образованию Санкт-Петербурга, заведующий ЦИО ИМЦ Петродворцового района, сотрудник поддержки ВКонтакте, инженер ЦИО ИМЦ Красносельского района, педагог дополнительного образования УМЦ «ИНФОБ» и лицея № 395, переводчик, индивидуальный предприниматель и проч., проч., проч.…

Disclaimer. Вся информация, опубликованная в этом блоге, отражает персональное мнение частного лица, даже если затрагивает рабочие темы, и не представляет официальную позицию какой-либо организации или органа власти (хотя и может с таковой позицией совпадать… или не совпадать).</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.3 (v4134)</generator>

<itunes:subtitle>Всю сознательную жизнь работаю в образовании.

В настоящее время — открываю Лицей информационных технологий Приморского района Санкт-Петербурга.
Ранее (в т.ч. по совместительству): зам. директора и  руководитель центра цифрового образования «ИнфинITи» школы № 509, сотрудник СПбЦОКОиИТ и Инспекции Комитета по образованию Санкт-Петербурга, заведующий ЦИО ИМЦ Петродворцового района, сотрудник поддержки ВКонтакте, инженер ЦИО ИМЦ Красносельского района, педагог дополнительного образования УМЦ «ИНФОБ» и лицея № 395, переводчик, индивидуальный предприниматель и проч., проч., проч.…

Disclaimer. Вся информация, опубликованная в этом блоге, отражает персональное мнение частного лица, даже если затрагивает рабочие темы, и не представляет официальную позицию какой-либо организации или органа власти (хотя и может с таковой позицией совпадать… или не совпадать).</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Акция «Читайте с любовью»</title>
<guid isPermaLink="false">8</guid>
<link>https://serzhenko.ru/all/i-love-reading/</link>
<pubDate>Sun, 09 Apr 2017 18:37:57 +0300</pubDate>
<author></author>
<comments>https://serzhenko.ru/all/i-love-reading/</comments>
<description>
&lt;p&gt;14 февраля 2017 в школе № 509 впервые прошла &lt;a href="https://vk.com/wall-128649079_416"&gt;акция «Читайте с любовью»&lt;/a&gt;, приуроченная ко Дню книгодарения и Дню всех влюблённых.&lt;/p&gt;
&lt;p&gt;В рамках этой акции в холле третьего этажа у библиотеки было организовано пространство для буккроссинга: каждый желающий ученик или сотрудник мог принести книгу и оставить её в дар кому-то конкретному, оставить на библиотечной тележке, чтобы кто-то впоследствии выбрал для себя... или вообще подарить школе, библиотеке.&lt;/p&gt;
&lt;p&gt;Участники акции получали на память сувенир — значок с символикой акции.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://serzhenko.ru/pictures/5NR0Si7EdEk.jpg" width="1312" height="984" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Для большей интерактивности и для увлечения «мимо проходящих» мы задействовали инфопанель, располагающуюся в этом же холле. На панели в течение всего дня отображался счётчик подаренных книг.&lt;/p&gt;
&lt;h2&gt;Как это работает?&lt;/h2&gt;
&lt;p&gt;Инфопанель в этом холле представляет собой SmartTV, напрямую (без ПК) подключённый к школьной локальной сети по Ethernet. Обычно изображение для трансляции (видео, фото, объявления) телевизор берёт со школьного медиасервера. Самый оптимальный вариант для трансляции динамического контента — использование встроенного в ПО телевизора веб-браузера.&lt;/p&gt;
&lt;p&gt;Была свёрстана веб-страница, на которой отображается счётчик подаренных книг. Раз в 5 секунд страница отправляет AJAX-запрос на сервер и запрашивает значение счётчика. Если в ответ приходит значение, отличное от текущего, счётчик обновляется с анимацией.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://serzhenko.ru/pictures/--_lg_55lw5600_side.png" width="2500" height="2500" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Как же обновляется значение на сервере? Был свёрстан второй интерфейс — для управления счётчиком. Он адаптирован для мобильных устройств. Управляющий интерфейс содержит две кнопки: «&amp;minus;» и «&amp;plus;» — а также текущее значение счётчика. Нажатие каждой из кнопок вызывает AJAX-запрос на сервер, содержащий один параметр — запрошенное действие. Соответственно, происходит либо декремент, либо инкремент счётчика.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://serzhenko.ru/pictures/--2017-04-09--18.11.40_iphone5s_gold_portrait.png" width="2000" height="2000" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Специально обученный волонтёр, принимая книжку, выдаёт значок и нажимает кнопку в своём мобильном интерфейсе. На сервер уходит запрос, обновляется значение, примерно в течение 5 секунд счётчик обновляется на экране — как раз за это время волонтёр успевает помочь прикрепить значок :) Участник акции счастлив — видит свой вклад визуализированно: «вот я принёс книжку и меня посчитали!»&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://serzhenko.ru/pictures/iluvreading.gif" width="480" height="270" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Что интересно — в ходе подобной акции ссылка на страницу со счётчиком в принципе без опаски может быть размещена в публичном пространстве (в соцсетях и/или на сайте школы). Тогда следить за прогрессом акции смогут не только ученики внутри школы, но и, например, их родители. Но мы в этот раз не размещали. :)&lt;/p&gt;
&lt;p&gt;Одноразовая ли это история? Думаю, что нет. Очень легко адаптировать этот счётчик к любым другим акциям — считать количество отжиманий в ходе спортивных праздников, количество сданных использованных батареек (спасённых ёжиков) в рамках экологических акций и т. п. :)&lt;/p&gt;
&lt;h2&gt;Чуть-чуть сугубо технических деталей&lt;/h2&gt;
&lt;p&gt;&lt;i&gt;Использованные технологии, библиотеки, фреймворки:&lt;/i&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;jQuery&lt;/li&gt;
&lt;li&gt;CSS-фреймворк &lt;a href="http://getbootstrap.com/"&gt;Bootstrap 3&lt;/a&gt; для ускорения и упрощения вёрстки&lt;/li&gt;
&lt;li&gt;key-value хранилище &lt;a href="http://redis.io"&gt;Redis&lt;/a&gt; и php-библиотека &lt;a href="https://github.com/nrk/predis"&gt;Predis&lt;/a&gt; для работы с ним&lt;/li&gt;
&lt;li&gt;JS-библиотека &lt;a href="http://flipclockjs.com/"&gt;FlipClock&lt;/a&gt; для создания анимированного счётчика в виде «циферблата»&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Значение на сервере хранится в key-value хранилище Redis в виде одного целого числа. На уровне хранилища поддерживаются атомарные операции инкремента/декремента.&lt;/p&gt;
&lt;p&gt;Почему делается pull-запрос с клиентской стороны раз в 5 секунд, а не push с сервера или long-polling? Потому что браузер телевизора иногда ведёт себя странно при, казалось бы, самых банальных операциях. Например, вылетает при просмотре YouTube-роликов (через браузер, а не спец. приложение). Поэтому принято решение, во избежание лишних крэшей, максимально упростить клиентский код.&lt;/p&gt;
</description>
</item>


</channel>
</rss>