Cерия публикаций про сбор подписей

1. Введение, сайт «Навальный 20!8», подготовка к сбору
2. Железо и сети, видеонаблюдение
3. Жнец-2018: система для сбора подписей
4. Управление проектом

Это третья часть материала про IT-инфраструктуру штабов Навального. В предыдущих главах было рассказано про разработку сайта «Навальный 20!8», организацию сети в штабах и производство сканеров документов.

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



Листы, QR-коды и способы работы с ними


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

При сборе подписей в Новосибирске мы каждый лист помещали в мультифору (прозрачный «файл»), на которой маркером записывались ID листа и все служебные пометки. Это подошло для четырех тысяч листов, но не сработает для сотен тысяч. В этот раз мы посчитали использование мультифор ненадежным и неудобным решением.



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

Код листа состоит из 6 символов. Можно использовать цифры и буквы латиницы, имеющие графические аналоги в кириллице (в формах можно писать в любой раскладке). Для удобства добавили разделители: 91?X7?BA.

Этот же идентификатор печатается в виде QR-кода для автоматического распознавания на различных этапах работы. QR-коды победили по надежности и скорости распознавания все другие виды штрихкодов.



Жизнь штабов полна трудностей, поэтому QR-коды тщательно тестировали в различных стрессовых для листов ситуациях…



… и решили, что трех кодов будет достаточно, чтобы обработать любой живой лист.



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

Каждый лист (точнее, идентификатор листа) создается в базе, после чего его можно распечатать на бумаге формата A4. Но нельзя просто взять и напечатать лист на ближайшем принтере. По закону изготовление подписных листов должно быть оплачено с избирательного счета кандидата. Обычно их изготавливает внешний подрядчик. Поэтому мы сделали техническую сторону максимально дружественной и гибкой. Листы или печатаются прямо из браузера, или предварительно сохраняются в многостраничный PDF-файл, который можно передать подрядчику любым удобным способом.


Сыч: подготовка к сбору подписей


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

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

Состав Сыча


Бэкенд с RESTful API: Python 3.6, aiohttp, aiohttp_admin, SQLAlchemy.
Базы данных: PostgreSQL, Redis.
Демон уведомлений.
Демон распознавания номеров паспорта.
Демон для сборки аналитики.
Сервис проверки паспорта по его номеру.
Коробочная версия Кладр-API для работы с адресами (PHP 5.6 + MongoDB).

Мы решили сделать для Сыча отдельный бэкенд с RESTful API, потому что планировалось интегрировать его с несколькими сервисами, включая сайт «Навальный 20!8». В качестве хранилища использовали отдельную базу PostgreSQL и Redis — для кэширования. Для управления пользователями подошла библиотека aiohttp_admin, которую мы модифицировали под свои нужды.

Внутренний интерфейс оператора — это пошаговая форма сканирования паспорта и заполнения персональных данных. Из-за большого количества возможных состояний эту форму написали на React.

Взаимодействие с сайтом «Навальный 20!8» велось через API, который защищен токеном и доступен только по локальной сети между виртуальными машинами.


Запись на верификацию


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



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



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


Уведомления


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



SMS-уведомления отправлялись для напоминания о записи за три часа и для информирования о том, что штаб отменил запись. Очередь уведомлений была сделана по тому же принципу, что и на сайте «Навальный 20!8»: таблицы в БД с сообщениями, которые отправлялись группами через почтовые и SMS-шлюзы.


Распознавание паспортных данных


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


Аналитика Сыча


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

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

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



Регионального менеджера мы избавили от лишних подробностей, и на первом экране он видел только самые важные вещи по своей группе штабов: ключевые показатели, рейтинги и проблемные штабы (обозначены тревожным красным). К «проблемным» мы относили штабы с показателями на N% ниже среднего значения, хронически недогруженные (им требовалось дополнительное оповещение) и перегруженные по количеству записей (это означало, что не все люди могут записаться и нужно увеличить количество операторов).


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

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



Всего в аналитике выводилось более 50 показателей. Гибкости SQLAlchemy хватило, чтобы ни разу не перейти на чистый SQL и чтобы код оставался читабельным. Для наиболее трудозатратных показателей сначала сделали кэширование в Redis, но оказалось проще периодически обсчитывать их в бэкграунде и при запросах брать из файла.


Жнец-2018: система для сбора подписей


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

Со стороны бэкенда Жнец-2018 — наследник старого Жнеца, но интерфейс оператора он получил от системы верификации. Некоторые экраны были доработаны после анализа отзывов о работе Сыча. Кроме того, были добавлены интерфейсы для нескольких уровней проверки данных и для управления движением листов.


Интерфейс оператора


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

1. На момент выборов он должен быть старше 18 лет.
2. Если избирателю 20 или 45 лет, у него должен быть новый паспорт.
3. Паспорт не должен числиться в списке недействительных.

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

Сейчас в базе более 110 миллионов записей (серии и номера паспортов). Для быстрого поиска при небольшом объеме базы и индексов была придумана такая схема: в PostgreSQL создается таблица с миллионом записей, первичным ключом в которой является номер паспорта (от 0 до 999999), а во втором поле записаны все серии недействительных паспортов для этого номера. Для уменьшения объема серии переведены в бинарный формат (по два байта) и сжаты с использованием zlib (просто захотелось). Исходно база занимает около 1 Гб без учета индексов. После обработки получается 260 Мб вместе с индексом. Одна запись проверяется в среднем за 15 мс.

0,6% паспортов людей, проходивших верификацию, нашлись в базе недействительных паспортов. Это значит, что без такой проверки мы бы потратили 12% от лимита недействительных подписей только на данный вид ошибок.

0,88% паспортов нам не подошли, поскольку гражданину исполнилось 20 или 45 лет, но он еще не заменил паспорт. И это еще 18% от лимита недействительных подписей.

В подписном листе 4 колонки, заполняемые оператором: ФИО, год рождения, номер паспорта и адрес постоянной регистрации. Все эти данные проходили через Жнеца для проверки и коррекции возможных ошибок. Например, в полях для имени и отчества работает поиск опечаток:



Для подсказок по именам в API есть метод, который сравнивает значение с большим списком и возвращает три варианта ответа:

— все OK, есть такое имя;
— есть похожее имя (такое-то);
— неизвестное имя (редкое имя или серьезные ошибки в написании).

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

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


Сканирование документов


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


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

Изображение получается на клиентской стороне из HTML 5 Canvas API и отправляется на сервер в виде строки base64, в которой лежит JPEG. С точки зрения фронтенда сканеры могут работать в двух режимах: USB web-камера и стриминг видеопотока с компьютера в локальной подсети. Сыч работает только с USB-камерами, а Жнец-2018 позволяет переключаться между режимами. Оператор сам выбирает, какой сканер использовать.

С выбором видеопотока соседних компьютеров возникла небольшая проблема: столы и сканеры можно двигать, а операторы могут пересаживаться. Мы не знаем, какой сканер окажется рядом с оператором в следующий раз. Пришлось перебирать штабную подсеть и дать оператору возможность выбрать любой из живых сканеров. Но оказалось, что сервер видеотрансляции сканера, хоть и ставят корректные CORS-заголовки (Access-Control-Allow-Origin: *), не отвечают на OPTIONS-запросы. Браузер запрещал ajax-запросы на соседние хосты, из-за чего для поиска не получалось использовать обычный jQuery.ajax(). JSONP-запросы тоже не помогли, поскольку их не получалось отменить программно, а несколько десятков ожидающих запросов полностью блокировали страницу. Решить проблему помогли картинки. Мы добавляли в DOM теги и прописывали им src видеопотока. Если картинка меняла размеры в соответствии с размерами потока, то поток считался живым и показывался оператору.

Отображение видеопотока в браузере заметно нагружает скромные процессоры Raspberry Pi, поэтому нам пришлось сделать «скринсейвер»: после 5 минут бездействия браузер ставит трансляцию на паузу.

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



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


Обработка адресов


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

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

— это должен быть адрес по базе ФИАС (федеральная информационная адресная система);
— для переименованных улиц нужно указывать новые названия, даже если в паспорте было старое;
— законом устанавливается определенный формат иерархии адресных объектов, которые нужно записать (например, нельзя указывать городской район).

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

На сборе подписей в Новосибирске из-за претензий к полю «адрес» были признаны недействительными около 3,5% подписей. И это 70% от лимита, который установлен для подписей за выдвижение кандидата в президенты.

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

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

В базе ФИАС пока еще нет достаточно качественных и полных сведений о домах и квартирах, поэтому мы остановились на уровне улиц. В таком виде база со всеми дополнительными построениями весит около 2 ГБ и вполне комфортно живет в виде PostgreSQL. Для импорта использовались модифицированные скрипты из репозитория fias2pgsql.

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

После серии экспериментов мы остановились на форме из трех полей:

— субъект РФ — он есть всегда, это самое понятное поле;
— адрес по ФИАС — поле с автодополнением по адресам данного региона внутри ФИАС;
— дом/корпус/квартира — строка, куда данные переписываются точно в соответствии со штампом о постоянной регистрации.



Юристы составили таблицу преобразований адресов, при помощи которой мы приводили адреса ФИАС в формат, соответствующий законодательству о выборах. Чаще всего нужно было исключить один из элементов адреса. Какие-то адреса исключали целиком (гаражные кооперативы, дворовые территории и другие подобные объекты). IT-отдел получал таблицу с правилами, а юридический отдел в ответ получал по 10 примеров на каждый из 44 типов адресов.



После нескольких таких итераций база была готова к работе.

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

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


Решение получилось удобным и быстрым. Один запрос к suggest API выполняется за 15–20 мс, бэкенд спокойно обрабатывает 300 одновременных соединений на не самой мощной виртуалке.


Заполнение подписного листа


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

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

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

Мы разработали такие сценарии работы оператора, которые уменьшают вероятность возникновения типичных ошибок. Заверительные надписи листов «домашнего» региона (около 80% подписей будут из региона, в котором находится штаб) заполняются сборщиком заранее, в спокойной обстановке. Для всех блоков листа Жнец показывает, как именно они должны быть заполнены.


Интерфейс заполнения имитирует реальный подписной лист, который в данный момент лежит на столе перед оператором. Показаны занятые строки, колонки для заполнения, номер листа, крупно — данные для внесения.

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

После заполнения всего листа на нем проставляется дата и подпись сборщика. Лист передается на проверку.


Проверка подписей, работа с листами в штабе


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

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

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


Все имена и другие данные на изображении являются выдуманными

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


Смайлики и нейрофизиология счастья


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


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

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


Отправка листов


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



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

После сканирования листы упаковывают и отправляют в Москву.


Детали форм


Все паспортные данные вводятся и отображаются моноширинным шрифтом Source Code Pro Regular. В нем ноль легко отличить от буквы «О», а символы достаточно похожи на те, что обычно используются в современных паспортах.

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



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


Логистика и физическое хранение листов


Перекладывание бумажек — один из видов деятельности, в котором человечество достигло невероятных успехов. Казалось бы, можно пойти в магазин канцтоваров, купить набор для сбора подписей «Федеральный» и не думать о подробностях. Но есть проблема: все офисные решения стоят слишком дорого. Мы не можем поставить в каждый штаб сканеры документов за несколько десятков тысяч рублей и шкафы с подвесными папками за сто тысяч, поэтому на каждом этапе приходилось что-то изобретать и создавать из подручных материалов.


Немного фактов о физике процесса


Нам нужно сдать 315 тысяч подписей. Для этого, с учетом региональных квот и запаса на различные ошибки, нужно собрать и обработать около 1 миллиона подписей. На каждом листе может быть максимум пять подписей, но в реальности будет где-то 3-4. Это дает нам, грубо говоря, 300 тысяч листов.

Лист бумаги формата А4 имеет площадь 1/16 м?.
Плотность обычной офисной бумаги — 80 г/м?, каждый лист весит 5 г.
Высота пачки из 500 листов — 4,5 см для чистых листов, более 6 см для заполненных.

Получается, все собранные листы будут весить 1,5 тонны, а сложенные в одну пачку они будут около 36 метров в высоту.


Как все это хранить?


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

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

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

Для быстрого доступа была придумана система индексации физической базы листов. Индекс состоит из нескольких уровней: штаб (ящик), коробка, папка. Адрес папки в архиве выглядит так: 77?1?15. Внутри каждой папки лежит 25 листов (в произвольном порядке).


На левой верхней картинке — коробка на 500 подписных листов в бумажных папках.
На правой картинке — ящик на 2000 листов в подвесных папках.



Получение и сортировка листов


Все листы, приезжающие из регионов, сканируются автоматическим двухсторонним сканером (он уже был в офисе, поэтому не пришлось собирать его самим из LEGO и Arduino). Этот аппарат умеет заливать результат на сервер по SFTP. Там сканы прогоняются через python-скрипт, который ищет QR-коды в стандартных местах, распознает их и привязывает сканы к общей базе данных. Скрипт надежно обрабатывает даже мятые листы.



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



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


Бэкенд


Жнец-2018 сделан на Django со стандартным шаблонизатором и ORM. В качестве базы данных используется PostgreSQL. Служебные части системы — ФИАС, проверка паспортов, работа с данными предварительной регистрации — вынесены в отдельные модули (django app) со своими базами данных.

Физический мир подписей представлен в виде нескольких классов объектов: подписной лист, строка в листе, подпись. У объектов этих классов есть атрибуты, отражающие состояние объекта в реальном мире. Для управления состояниями использован шаблон «конечный автомат» (машина состояний, finite state machine) и библиотека django-fsm. Все переходы между состояниями прописаны в виде FSM-транзакций, внутри которых проводятся необходимые проверки и дополнительные действия с объектом.

Схема состояний выглядит примерно так:



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


Тестирование


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

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

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

Нагрузочное тестирование проводилось при помощи Locust. Это простой инструмент, доступный через PyPI. Сценарии описываются в виде кода на питоне, примерно как юнит-тесты в Django:



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



Развертывание проекта организовано так же, как для сайта «Навальный 20!8».
Доступ к веб-приложениям Жнеца возможен только через штабную VPN-сеть.


Мониторинг


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

Zabbix отслеживает состояние всех виртуальных машин проекта.

Elasticsearch собирает логи nginx со всех виртуалок, Kibana показывает это в виде графиков.



В Sentry валятся все ошибки из приложений и с фронтендов. Фронтенды вынесены в отдельную «организацию», чтобы не портили статистику по ошибкам бэкенда. Удобная штука, но заставить Sentry работать при нашей нагрузке было довольно сложно.


Гусь


Это функциональный мониторинг, чем-то похожий на uptime.com, только самодельный. Бэкенд построен на django, очереди сделаны на celery с бэкендом в redis.

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

Если что-то пошло не так, Гусь умеет отправлять письма и SMS или звонить среди ночи и человеческим голосом объяснять ситуацию (для звонков и синтеза речи используется сервис Twillio).

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



Еще в Гусе есть распределенный мониторинг через «ботнет» из мобильных приложений. Приложения получают список адресов для мониторинга, проверяют их (статус ответа и наличие указанного контента) и отправляют результат на сервер. Таким мониторингом удобно отслеживать блокировки Роскомнадзора и состояние сервера под атакой.





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

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


  1. anprs
    24.01.2018 17:50
    +1

    Невидимые комментарии. imageКакой-то баг?


    1. Boomburum
      24.01.2018 17:57
      +1

      Иногда НЛО удаляет откровенную политоту, а счётчик комментариев не сразу обновляется.


      1. neomedved
        24.01.2018 18:03
        +1

        А почему нет надписи «НЛО прилетело и опубликовало эту надпись здесь»?


        1. Boomburum
          24.01.2018 18:19

          Она появляется при деактивации пользователя (эта довольно редкая санкция).


  1. SuhoffGV
    24.01.2018 17:53

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


  1. pavelpromin
    24.01.2018 18:19
    +3

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


    1. Igor_Shumilov
      24.01.2018 18:38

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


      1. pavelpromin
        24.01.2018 19:09

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


  1. vagonovozhaty
    24.01.2018 18:34

    Надеюсь, он победит.


    1. kosmos89
      24.01.2018 18:53

      Как этот комментарий соотносится с тематикой ресурса?


  1. Igor_Shumilov
    24.01.2018 18:41

    А сколько времени заняла разработка такой системы? Работа сделана очень скрупулёзно, и весьма масштабно.


    1. StopDesign Автор
      24.01.2018 18:53

      Сложно сказать. Над всем, что описано в трех постах, работали примерно полтора года. Но еще столько же работы, сделанной в этот период, осталось за рамками рассказа. Свой интернет-магазин, например. Сайт и системы для сбора подписей делались параллельно, но примерно одной и той же командой. Жнец-2018 был сделан за два месяца (а если только программирование считать, то за полтора месяца от первого коммита до последнего).


      1. vaslobas
        25.01.2018 03:35

        Сколько в команде человек?


        1. StopDesign Автор
          25.01.2018 04:15

          В разное время количество участников команды варьировалось от 5 до 15. Это только со стороны IT-отдела. В последней главе будет рассказано про команду.


      1. AndreyUA
        26.01.2018 10:40
        +1

        А если Навальному не понадобится, то в опенсорс выложите? Я так понимаю, что все равно народ оплатил?


  1. homeles
    24.01.2018 19:19
    +1

    Ребята, прочитал все три части — было интересно и про технологии и про процесс. НО — нигде (может слепой) не увидел у вас в текстах слов про защиту Персональных Данных… Являетесь ли вы оператором ПДн? Как организовано, защищено хранение и передача ПДн? У вас только микротик на каналах связи :) Боюсь что ФСТЭК, ФСБ это не очень понравится ?! (для примера скажу — нам даже «темное»(почитайте что это такое) волокно между ЦОД и резервной площадкой заставили закрывать криптой. Хотя по этому волокну гонялись только бэкапы, причем зашифрованные).


    1. StopDesign Автор
      24.01.2018 20:38

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


      1. elobachev
        25.01.2018 17:56

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

        Материал у вас получился конечно очень интересный, жду четвертой части.


  1. yannmar
    24.01.2018 20:51
    -5

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

    // чувырло кликнуло на кнопке, запускаем вокера

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

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


    1. StopDesign Автор
      24.01.2018 21:12

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

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


      1. yannmar
        24.01.2018 21:27
        -2

        Неумно. Но дело, конечно, ваше, чуваки.


    1. tzlom
      24.01.2018 21:29

      Вы перегибаете, знаете сколько ругательств содержится в ядре линукса?


      1. yannmar
        24.01.2018 21:35
        -2

        А неуважительных эпитетов в адрес пользователей?


        1. tetramino
          25.01.2018 16:08

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


          1. yannmar
            25.01.2018 23:26

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

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

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

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


            1. VolCh
              26.01.2018 09:23

              В некоторых кругах слово "чувак" не несёт негативных коннотаций, а то и несёт положительные, а-ля "свой парень".


              1. StopDesign Автор
                26.01.2018 18:56
                +1

                Именно. Нас значительно больше раздражало формальное «подписант».


  1. ru_vlad
    24.01.2018 23:21

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


    1. tibik
      25.01.2018 00:13

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


    1. StopDesign Автор
      25.01.2018 04:24
      +1

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


      1. gamlerBY
        25.01.2018 17:54

        Выдуманная фотография?


        1. StopDesign Автор
          25.01.2018 17:55

          Да. Искаженный фоторобот.


  1. bipiem
    24.01.2018 23:37

    Вопросы:
    1 Система поддерживает (потенциально) много-кандидатность? Т.е. кроме одного кандидата можно в одном штабе в одной системе вести аналогичный процесс по другому кандидату? Может с небольшой доработкой, Например, в базу добавить поле «ID кандидата» и др.?
    Было бы неплохо иметь единый мощный инструмент и даже одну инфраструктуру (с разделением \ разграничением админских прав) в интересах нескольких (всех) кандидатов от оппозиции (хотя бы на будущее).

    2 Понял бизнес-процесс так: Сбор подписей в поддержку выдвижения кандидатом в президенты России:
    0) Фаза «Подготовка»: заготовка подписных листов.
    А) Фаза «удаленка» — предварительная регистрация, не обязательная. Избиратель удаленно заполняет анкету и подтверждает емайл и номер телефона.
    Плюс запись на верификацию.
    Б0) Верификация (фактически тестирование) + Аналитика Сыча.

    Б) Фаза «Фронт». Сбор подписи (6 минут на человека). Жнец-2018. Интерфейс оператора.
    Избиратель приходит в штаб и предъявляет паспорт.
    Сборщик (оператор):
    — проверяет возраст (фото не сверяет?);
    — данные вбивает в компьютер, заполняемые оператором: ФИО, год рождения, номер паспорта и адрес постоянной регистрации;
    — система проверяет данные на опечатки и паспорт по базе (заблаговременно скачанной и сжатой до 260 Мб);
    — подпись сборщика.
    Сборщик собственноручно вписывает данные в Подписной лист (анкету табличной формы), а избиратель проверяет и расписывается в поле «подпись»?

    При этом сборщик списывает данные с экрана, а не с паспорта?
    Делается скан паспорта (согласие на ПД, если нужно). Скан передается в Хранилище.

    В1) Фаза «Бэк» в штабе (В конце каждого рабочего дня).
    Сканируется Подписной лист и скан отправляется в Хранилище?
    Проверяющий (он же — доверенное лицо кандидата) проверяет и подписывает лист.
    Юрист проверяет – листы с отметкой «показать юристу».
    Нет проверок: графолога и проверка по базе паспортов (была на фронте).
    Учет отправляемых листов — через мобильное приложение. Сортировка. Передача листов на отправку в центральный штаб. Бумага (физические подписные листы) отправляется «в центр» (центральный штаб).

    В2) Фаза «Бэк» — уже в центральном штабе.
    Получение и сортировка листов. Организация системы хранения.
    Видимо уже в Центре: Бумажные Подписные листы сшиваются и отправляются в ЦИК.
    Какие – то еще проверки делаются?

    Другое:
    Г) Сервисы аналитики
    Д) Видеонаблюдение
    Е) Система управления ИТ-системой (включая мониторинг)
    Ё) дополнительные сервисы, косвенно связанные с заполнением Подписного листа, например, рассылка новостей (Отправка почты или SMS).
    Ж) система координации \ управления процессом в целом (про нее не нашел описания).

    3) Схемы
    Схема верхнеуровневых процессов есть? Вообще, хотелось бы более последовательное описание самого бизнес-процесса, и лишь при его детализации – переход к реализации (техническим деталям). За указанными «техническими» деревьями не особо виден «лес целевого процесса».

    Схема, где показан «запуск программы по верификации» — на чем составлена?
    Почему бы не выложить полный комплект схем? Технические подробности – хорошо, но хотелось бы и описание логики в виде последовательного графического алгоритма.
    А там – гляди и до описания «Enterprise Architecture» останется пара шагов.


    1. VolCh
      25.01.2018 08:44

      Добавлю 1.1:


      1. VolCh
        25.01.2018 08:45

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


        1. ShNURoK42
          26.01.2018 12:28

          Ох, прошу вас, аккуратнее с вопросами :)


        1. StopDesign Автор
          26.01.2018 18:57

          Допилить её можно для разных задач, но референдум инициировать невозможно.


  1. suntexnik
    25.01.2018 07:28
    -1

    Такую бы «энергию» и способности да в полезное дело…
    А то фигнёй какой-то страдают.


    1. VolCh
      25.01.2018 08:43

      Спасибо Путину за это. Его подпись стоит под 19-ФЗ и 67-ФЗ, требующих такой волокиты.


      1. erwins22
        25.01.2018 16:43

        Предложите вариант, что бы кандидатов будет не менее 3 и не более 50.
        Если список будет большой, то выбирать из него будет сложно, кроме того усложняется сама процедура выборов.
        Значит вводим ограничения. Они могут быть или подписи в поддержку или деньги или какой нить еще критерий.
        Предположим, что мы вводим ограничение на число проверенных подписей в 300т, но не на общее число подписей. Я беру и через генератор бреда формирую листы, например 100 млн из которых 1т настоящих. Уголовной ответственности нет за некорректную подпись. Сколько времени уйдет на ручную проверку такого числа подписей (полгода? год?)? Только я один срываю выборы.
        Значит вводим ограничение на общее число подписей. Вероятно 5% родилось из ошибок пенсионного фонда при внесении сведений. Там была цифра вроде такой.
        Вариант 2 разрешаем каждому сделать сайт и поставить там накрутчики. Думаю получиться тоже самое.

        Деньги. Какую сумму вы считаете нормальной для внесения залога? 1млрд? 100 млрд? 1 млн? С учетом инфляции придется переписывать этот закон каждый год или например сделать в МРОТ?


        1. MikailBag
          25.01.2018 16:45

          Если проблема лишь в проверке подписей, можно устроить так:
          Платить a * N рублей для проверки 315000 + N подписей, где a настроить по вкусу.
          Т.е. те, кто и сейчас набирают все необходимые подписи, платить не будут.


        1. jex
          25.01.2018 17:03

          Подписи — нормальный механизм. Просто сверху ограничения должны быть намного лояльнее. Раньше же ЦИК проверял каким-то образом 2млн. подписей, значит можно спокойно сделать верхнюю границу как минимум в 600к., нижнюю оставить 300к. Также нужно больше времени для сбора подписей, месяца 3 хотя бы.
          В целом, никто не спорит с механизмом сбора подписей для выдвижения, просто сейчас условия очень жесткие.


          1. StopDesign Автор
            25.01.2018 17:47

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


        1. VolCh
          25.01.2018 17:30

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


          1. erwins22
            25.01.2018 17:44

            Тогда, что мешает просто распечатать выборочно базу МВД?
            Предложите механизм защиты. По месту регистрации можно выборочно послать например участкового с вопросом был ли факт подписи. Кстати по СССР так и поступали, вероятно данный механизм перекочевал с тех пор.
            Как я понял в данном случае можно перегененировать подписи используя шаблон подписи взятый с скана паспорта. (даже не предположение, а возможность)
            Ваш механизм не предусматривает никакой процедуры верификации.

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


            1. neomedved
              25.01.2018 17:59

              А сейчас-то что мешает распечатать базу МВД? Ну кроме того факта, что её нет в открытом доступе. Зачем рассуждать о том, что можно послать по адресу участкового, если такой процедуры нет?


            1. VolCh
              25.01.2018 18:48
              +1

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


          1. StopDesign Автор
            25.01.2018 17:52

            Есть ГосУслуги. Можно разрешить собирать подписи через них, например. И никакого брака, никакого «рисования»…

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


    1. Igor_Shumilov
      25.01.2018 09:39
      +1

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


  1. erwins22
    25.01.2018 10:30

    Размещать первую страницу паспорта на иностранных серверах? Это нарушение закона о ПД.
    Я понимаю Навальному пофиг, но админ будет сидеть долго.

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


    1. alan008
      25.01.2018 11:31
      +1

      Статью не читай, картинки смотри.


      1. erwins22
        25.01.2018 11:37
        +1

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

        Вероятно я что то понял не так или ошибся в своем рассмотрении вопроса. Прошу разъяснить.


        1. justserega
          25.01.2018 11:56

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


          1. erwins22
            25.01.2018 12:13

            5) обработка персональных данных членов (участников) общественного объединения или религиозной организации осуществляется соответствующими общественным объединением или религиозной организацией, действующими в соответствии с законодательством Российской Федерации, для достижения законных целей, предусмотренных их учредительными документами, при условии, что персональные данные не будут распространяться без согласия в письменной форме субъектов персональных данных;

            В письменной форме вы получили разрешение передавать данные за пределы Российской Федерации?

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

            4. Трансграничная передача персональных данных на территории иностранных государств, не обеспечивающих адекватной защиты прав субъектов персональных данных, может осуществляться в случаях:
            1) наличия согласия в письменной форме субъекта персональных данных на трансграничную передачу его персональных данных;
            2) предусмотренных международными договорами Российской Федерации;
            3) предусмотренных федеральными законами, если это необходимо в целях защиты основ конституционного строя Российской Федерации, обеспечения обороны страны и безопасности государства, а также обеспечения безопасности устойчивого и безопасного функционирования транспортного комплекса, защиты интересов личности, общества и государства в сфере транспортного комплекса от актов незаконного вмешательства;
            4) исполнения договора, стороной которого является субъект персональных данных;
            5) защиты жизни, здоровья, иных жизненно важных интересов субъекта персональных данных или других лиц при невозможности получения согласия в письменной форме субъекта персональных данных.

            Виновному грозит денежное взыскание до 200 тыс. руб., тюремное заключение до 2 лет — Читайте подробнее на FB.ru: fb.ru/article/272751/otvetstvennost-za-razglashenie-personalnyih-dannyih-administrativnaya-i-ugolovnaya-federalnyiy-zakon-rf-ot-iyulya-goda--fz-o-personalnyih-dannyih


            1. VolCh
              25.01.2018 12:25

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


              1. erwins22
                25.01.2018 12:30

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


            1. justserega
              25.01.2018 12:27

              Я имел ввиду по сути — в чем смысл закона?


              1. erwins22
                25.01.2018 12:35

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

                И ответственность наступит вне зависимости от отношения к закону.


                1. justserega
                  25.01.2018 12:38

                  Смысл закона в наступлении ответственности? То есть никакой другой смысловой нагрузки в нем нет? Он ни от чего нас не защищает, не приносит никакой пользы?


                  1. erwins22
                    25.01.2018 12:44

                    Аналогичный закон есть и в ЕС и в США.

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

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


                    1. VolCh
                      25.01.2018 12:47
                      +1

                      Смысл любого закона в регламентации защиты чьих-то прав и интересов, а ответственность (если она есть — бывает, что и нет) — это способ заставить "несознательных лиц" этот закон исполнять.


                      1. erwins22
                        25.01.2018 13:49

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

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


                        1. tetramino
                          25.01.2018 17:32

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


                        1. VolCh
                          25.01.2018 17:36

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


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


                          1. tetramino
                            25.01.2018 18:09

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


                  1. VolCh
                    25.01.2018 12:44

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


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


    1. neomedved
      25.01.2018 14:29

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


    1. ToshiruWang
      25.01.2018 17:54

      Разрешение какого именно человека? Вы бы посмотрели на серию паспорта (вторая часть — сразу всё понятно), на МЧЗ (в которой вообще не пойми что), да и первая часть не уверен что совпадает с регионом выдачи (65 это, вроде, Свердловская). Технический же ресурс.
      PS. Автору — а в МЧЗ, похоже, оригинальный номер бланка засветился, но покорёжено там знатно.


  1. AndreyMtv
    25.01.2018 11:34
    -2

    Молодцы. С поставленной задачей справились на 100%.
    Навальный больше не кандидат в президенты.


    1. VolCh
      25.01.2018 12:22
      +1

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


      Да и вообще, ваше второе утверждение ложно: Навального не зарегистрировали в качестве кандидата в Президенты России, а не исключили его из списка кандидатов. Он не стал кандидатом из-за "лёгких" разногласий между ст. 32 п. 3, ст. 81. п.2 Конституции России и ст. 5-6 Закона о выборах Президента Российской Федерации и трактовкой этих разногласий в пользу закона, а не Конституции, вопреки ст. 15 п. 1 Конституции. Конституция устанавливает только три основания не быть Президентом: недееспособность, отбывание наказания в местах лишения свободы, больше двух сроков подряд, а Закон их значительно расширяет, не смотря на то, что Конституция имеет высшую юридическую силу и прямое действие.


      Это так, небольшой ликбез о состоянии избирательного права в России и практики его применения.


      1. AndreyMtv
        25.01.2018 12:56

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


        1. Loki3000
          25.01.2018 13:23
          +1

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


          1. tetramino
            25.01.2018 17:35
            -1

            Во всяком случае так оно должно работать.

            Почему? Потому, что вам это кажется логичным? Это не аргумент, как вы понимаете.


            1. Loki3000
              25.01.2018 17:44

              По определению слова «конституция».


              1. tetramino
                25.01.2018 17:52

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


                1. Loki3000
                  25.01.2018 18:05

                  Конституция Рoссийской Фeдерации, Раздел 1, Статья 15

                  1. Конституция Российской Федерации имеет высшую юридическую силу, прямое действие и применяется на всей территории Российской Федерации. Законы и иные правовые акты, принимаемые в Российской Федерации, не должны противоречить Конституции Российской Федерации.


                  1. tetramino
                    25.01.2018 18:13

                    Я не против сузить обсуждение конституций сейчас до сугубо Конституции РФ, но по-прежнему не вижу, какой именно участок приведенной вами выдержки из текста Конституции запрещает ограничивать её действие.

                    Зато я могу привести участок, который это разрешает. Конституция РФ, статья 55 пункт 3: «Права и свободы человека и гражданина могут быть ограничены федеральным законом только в той мере, в какой это необходимо в целях защиты основ конституционного строя, нравственности, здоровья, прав и законных интересов других лиц, обеспечения обороны страны и безопасности государства.»


                    1. VolCh
                      25.01.2018 18:55

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


                      Ст. 55 п. 2 не даёт принимать законы, ограничивающие конституционные права больше чем указано в самой Конституции. А ст. 56 п. 3 прямо перечисляет права и свободы которые не могут быть ограничены ни в коем случае.


                      1. tetramino
                        25.01.2018 20:28

                        Ст. 55 п. 2 не даёт принимать законы, ограничивающие конституционные права больше чем указано в самой Конституции.

                        Нет, там написано иное.

                        А ст. 56 п. 3 прямо перечисляет права и свободы которые не могут быть ограничены ни в коем случае.

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


                      1. StjarnornasFred
                        26.01.2018 18:53

                        Дело в том, что Конституция не содержит описания запретов для человека, который хочет выдвинуться в президенты. Упомянутые 3 ограничения (псих, зэк, уже был) — означают лишь, что при их наличии человека не будут рассматривать по закону, а сразу завернут. В Конституции нет указания, что "… недопустимы иные критерии для выдвижения". Что не запрещено, то разрешено — и иные критерии тоже разрешены. Главное — они не должны смягчать 3 основных. Иными словами, никакой закон не может позволит выдвигаться недееспособным, заключённым и на третий срок.


        1. jex
          25.01.2018 13:26

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

          Это разве хорошо? Так террористы и появляются, их ведь выводят из легального поля, нарушая конституцию.


          1. AndreyMtv
            25.01.2018 13:37

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


            1. neomedved
              25.01.2018 13:39

              И негров линчуют!


            1. jex
              25.01.2018 16:30

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


              1. tetramino
                25.01.2018 17:38

                А зачем конституция в целом, кстати? Нужна ли она?


                1. jex
                  25.01.2018 19:11

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


                  1. tetramino
                    25.01.2018 20:39

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


        1. VolCh
          25.01.2018 17:17

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


          1. tetramino
            25.01.2018 17:37

            Звучит как предложение вернуться от сложной сетевой структуры к древовидной. Она, конечно, обывателю понятнее, но отнюдь не единственная и не самая эффективная.


            1. VolCh
              25.01.2018 17:40

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


              1. tetramino
                25.01.2018 17:43

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


                1. VolCh
                  25.01.2018 18:56

                  Я там же ответил.


      1. tetramino
        25.01.2018 17:34

        Конституция имеет высшую юридическую силу

        Сама же конституция статьёй 55 нам утверждает, что это не так: «Права и свободы человека и гражданина могут быть ограничены федеральным законом...»


  1. CryptoPirate
    25.01.2018 12:31
    +1

    Масштаб проделанной работы впечатляет!

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


    1. VolCh
      25.01.2018 12:40

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


  1. pavelpromin
    25.01.2018 13:17
    +1

    Будет ли когда нибудь опубликован исходный код продуктов?!
    Я понимаю, что некоторые части кода ИТ-инфроструктуры не могут быть опубликованы в связи с возможностью атаки на них действующим правительством. Но все таки!
    В связи с идеологией открытости/прозрачности перед своими избирателями/сторонниками/спонсорами по раскрытию информации — это реально ?!


    1. StopDesign Автор
      25.01.2018 17:36

      А есть ли смысл? Код — это 5% проекта. Выложить его просто чтобы показать, какие мы открытые и прозрачные?

      Код РосВыборов открыт, но где практическая польза от этого?

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

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

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


  1. BiosUefi
    25.01.2018 15:07
    -1

    Я устал и, отдыхая,
    В балаган вас приглашаю,
    Где куклы так похожи на людей.

    Арлекины и пираты,
    Циркачи и акробаты,
    И злодей, чей вид внушает страх,
    Волк и заяц, тигры в клетке — Все они марионетки
    В ловких и натруженных руках


    1. fpir
      25.01.2018 15:56
      -1

      Вот он, настоящий хозяин судеб своей страны! Обратите внимание, даже «не одобряемого» поэта цитирует!


  1. amarao
    25.01.2018 16:05

    Выглядит круто. Вы планируете сырцы и чертежи выкладывать?


  1. gotch
    25.01.2018 16:57
    +1

    Подскажите пожалуйста, а в чем нарисован это изящный workflow?
    image


    1. StopDesign Автор
      25.01.2018 17:38
      +1

      draw.io. Там не всё хорошо, но среди бесплатных инструментов это один из лучших.


  1. arkharis
    25.01.2018 17:06

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


  1. eduard93
    25.01.2018 22:00

    А в чём вы бизнес-процессы/диаграммы рисуете? Хорошо выглядит.


    1. StopDesign Автор
      26.01.2018 03:15

      draw.io


  1. Wan-Derer
    25.01.2018 22:11

    Интересно. И интересно насколько продвинуты остальные штабы.


    1. MikeKosulin
      26.01.2018 03:25
      +1

      У некоторых выгрузка напрямую из баз ФМС, наверное.


      1. imm
        26.01.2018 15:13

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


        1. StopDesign Автор
          26.01.2018 18:59

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


  1. temsan89
    26.01.2018 11:49

    Подскажите, пожалуйста, на чем сделаны таблицы? Все jquery data-tables? Если да — сталкивались ли вы с необходимостью редактировать таблицы? (в беспл. версии функционал редактирования запрещен) Спасибо.


    1. StopDesign Автор
      26.01.2018 19:05

      Да, DataTables. Редактировать не приходилось, тут таблицы для отображения статистики.