Как завсегдатаи Хабра наверное знают, я интересуюсь книгами о политике. А еще я интересуюсь программированием, особенно на тех платформах, на которых раньше не программировал – почти как про горы у Высоцкого. Так совпало, что на тот момент, когда я начал изучать Android, оказалось что на носу — выборы в Госдуму – тот самый государственный орган который принимает те замечательные законы, о которых все мы читали и слышали. Чтобы совместить приятное с полезным, я решил написать под Android простую программу, строящую на основе статистики голосования партийных фракция их рейтинг, с учетом мнения пользователя: если пользователь закон не одобряет, а почти вся партийная фракция голосовала за этот закон, то такая партия пользователю не подходит, и выбирать ее в следующий созыв Госдумы не стоит. Вначале это были лишь вялотекущие идеи, но потом мне попалась статья, и я окончательно уверился в том, что такая программа будет полезна не только для моего самообразования.
Для начала я посмотрел, есть ли подобные приложения в более развитых с политической точки зрения странах. Нашлось таких очень немного, буквально единицы, например. Все они больше были похожи на аггрегаторы околополитических новостей. Остальное, найденное на Google Play по слову politics было, либо играми типа симулятора политика, либо электронными книгами, имеющими это слово в названии. Таким образом, учиться было не у кого.
Далее я занялся получением данные о голосовании. Как ни странно, оказалось, что их надо искать на сайте Госдумы. Формат данных на странице с результатами оказался довольно простым, только голосование «За» почему-то обозначалось константой «-1» — что наводит на размышления, по поводу того, что в самой Госдуме думают о своих «За».
На скорую руку, был написан site scraper – программа, автоматически считывающая данные с сайта, ходя по нему как обычный пользователь, и вечером того же дня запустил ее. Данные скачивались всю ночь, уж не знаю, что подумали администраторы сервера Госдумы. После этого получилось несколько .csv-файлов, самый объемный из которых занимал на диске 89Мб – содержал в себе голоса депутатов, по всем голосованиям, проходившем в Госдуме этого созыва, их было – несколько десятков тысяч.
Надо было их проредить – выбрать только самые существенные голосования и законы. Пришлось заняться этим вручную, тут автоматизация не поможет. В итоге я выбрал 19 самых резонансных из принятых Госдумой законопроектов, и итоги голосований того чтения законопроекта, где он был окончательно принят. Все это было сложено в таблицы БД Sqlite. Только после этого я узнал, что у Госдумы есть свой API, которым я мог бы воспользоваться, не скачивая данные таким велосипедно-варварским образом, но было уже поздно.
После этого создав в Android Studio заготовку проекта Tabbed-интерфейса, я начал писать само приложение. Опущу подробности перипетий с Android, Java, жутко тормозными Gradle и Android Studio, с кодировкой в SQLite, и с ListFragment, который упорно прятал последнюю строку прокручиваемого списка под navigation bar, хотя я ему поставил признак appbar_scrolling_view_behavior. Главное – это то, что через 5 дней приложение было готово. Вот пара скриншотов его экранов (всего их там 3):
Теперь приложение надо было куда-то выложить. Известный всем Google Play за регистрации аккаунта разработчика просит 15$. Тратить эту сумму не очень хотелось, и я решил выложить приложение в Amazon App Store – он размещает Android-приложения бесплатно, хотя, чтобы там выложить приложение, придется изрядно попотеть над формами ввода, которые все надо заполнить, и в которых почему-то нет русского языка в списке выбора локализаций.
В итоге получилось маленькое, может быть несколько скучное, но все равно симпатичное приложение «Робоизбиратель-2016», которое, я надеюсь, в ближайшее время появится в Amazon App Store, когда пройдет модерацию. Для самых нетерпеливых — я выложил .apk вот здесь.
А в качестве послесловия к статье, процитирую часть текста из окна «О программе»: «Автор программы не вкладывал в нее никакого пристрастия ни к одной из партий, и поставил своей целью не агитацию, а привлечение внимания ИТ-сообщества и всех остальных российских граждан к предстоящим выборам в Госдуму».
» Репозиторий приложения тут
» Cкачанные данные голосования выложены тут
И, да, если у кого-то есть возможность выложить приложение в Google Play — я не против.
Комментарии (41)
ivan386
03.09.2016 11:23+1Кстати скачанная база всех голосов уже есть:
Скачал результату по всем голосованиям и выложил в гитхаб здесь: https://github.com/data-dumaGovRu/vote
Общий размер получился 1438Мб в форматированном JSON.Но копия будет не лишней. Чем больше копий тем меньше возможности менять голоса.
Интересно кстати как вы выбирали резонансные законы и ставили соответствие названия в СМИ и конкретным номером законопректа?
xystarcha
05.09.2016 14:42Согласен, выбор законов и их наименование скорее всего противоречит
Автор программы не вкладывал в нее никакого пристрастия ни к одной из партий, и поставил своей целью не агитацию
Хотя, я не против агитации.
Snooper
03.09.2016 11:40Согласен по поводу веб-сервиса. И почему амазон, а не f-droid? Repository of Free and Open Source (FOSS) software on the Android platform.
Slavenin999
03.09.2016 11:49Каким образом суммируются голоса пользователей за закон? Где-то есть бэкэнд?
devpony
03.09.2016 21:14+1Насколько я понял из статьи, ичего нигде не суммируется. Приложение лично тебе подбирает партию, которая имеет наиболее близкое мнение о законах.
Sadler
03.09.2016 13:43А можно как-то посмотреть результаты без скачивания и запуска с левых сайтов разных исполняемых файлов и без парсинга csv-шек? Первое небезопасно, второе просто лениво.
ivan386
03.09.2016 15:06Если вы хотите узнать как голосовали депутаты за законопрокты то это изначально доступно на сайте vote.duma.gov.ru.
igor_suhorukov
03.09.2016 17:27Веб скрайперы это конечно хорошо. Была же вроде инициатива про открытые данные государства…
rrrav
03.09.2016 21:52строящую на основе статистики голосования партийных фракция их рейтинг
— как понять эту фразу?ivan386
03.09.2016 22:08В моём варианте если голос пользователя за закон совпадал с голосом депутата то ему добавляется очко рейтинга. Если не совпадает вычитается. Таким образом формируется рейтинг депутатов. Правда есть проблема в том что вместо того чтобы голосовать против депутаты просто "отсутствуют" на заседани и тем самым получают -1 при любом выборе пользователя.
MaxF
06.09.2016 16:30Я подправил вам немного внешний вид, немного почистил от лишнего.
В том числе устранил проблемку с прокруткой.
Посмотрите пуллреквест и, если понравится, смержите.
Londoner
03.09.2016 22:05+1Что-то мне подсказывает, что те, кто про такой апп узнает и установит, и так самостоятельно способны понять, за какую партию проголосовать. Думаю, таких максимум 5% населения. Надо думать как достучаться до оставшизся 95%, до дяди Васи, ничего кроме первого канала не видящего.
ivan386
03.09.2016 22:13Зря вы так думаете. Не одна из нынешних партий не вызывает моего доверия. И благодаря своему скрипту я хоть примерно понял кто наиболее близок к моему выбору.
evgeniykozin
03.09.2016 22:56Хорошая вещь!
Готов её выложить на Google Play. И готов рекламировать у нас на сайте, так как, на мой взгляд, подавляющее число граждан, воспользовавшись Вашим сервисом получат в ответ партию, в которой я состою.
startsevdenis
04.09.2016 00:38+2Я просто оставлю это здесь http://api.duma.gov.ru/
sashabe
04.09.2016 00:57Хмм, знакомый логотип… Я знаю, что Эпплу хватит денег, чтобы купить Газпром, но что Дропбокс уже купил всю Госдуму со всеми депутатами — это что-то новое…
Regis
04.09.2016 01:38Что-то вдруг подумалось: а почему бы Apple не купить себе маленькую страну, чтобы там им нужные законы принимали…
Roman513
05.09.2016 14:40Успехов Вам в Ваших изысканиях и изучении нового! Надеюсь, Вам будет полезна информация об ошибках, а опытные разработчики Хабра помогут их исправить.
ОшибкиОшибки возникли на разрешении 1280x720, Android 5.1.1
Изначально при открытии приложения нельзя проскроллить до последнего пункта:
Если попробовать выбрать вариант какого-нибудь нижнего пункта, такая возможность появляется, зато появляются проблемы в верхней части окна.
И если попробовать выбрать вариант для, например, "Закона Яровой", то происходит автоскролл вверх, выбор при этом не сохраняется
Также после случайного нажатия кнопки "Вперёд" (к результату) о потом "назад" увидел, что результаты не сохранились
kabakov_as
05.09.2016 14:40Приложение хорошее и нужное. В отличии от web-версии его можно использовать и непосредственно на избирательном участке, например.
Но по поводу текущего deployment'а очень большие вопросы.
Линк на yandex диск — не работает.
С Amazon App Store не устанавливается «due to country restrictions»
sunman сделай что бы был способ установить
Если пофантазировать, то можно и по имени депутата, показывать кто он есть.
Пришёл избератель на участок — сфоткал билютень и видит сразу кто есть кто.
В этом году агитации нет, по крайней мере я не встречал так где живу. Реально о кандидатах узнаю только на участке за 5ть минут до голосования
ak47cccp
05.09.2016 14:41У меня, по-моему, не все законопроекты влезли. Последний — это «о запрете Google». Всего штук 18. Вижу, что что-то там дальше еще есть, но ниже уже не прокручивается.
Телефон Xiaomi Redmi 3 pro.
aslepov78
05.09.2016 14:41Информатизация политики — вещь нужная. Автор молодец. Пора выводить на чистую воду все что там твориться. Прозрачность везде и во всем — вот что надо РФ.
LevOrdabesov
06.09.2016 07:27Сергей, отличное дело вы сделали!
К сожалению, у меня тоже не все законы влезают в экран, и не скроллится, но это мелочи.
MaxF
06.09.2016 16:36Я поправил вам немного xml: убрал лишнее, устранил проблемку с прокруткой, улучшил читабельность (на свой вкус).
Посмотрите пулреквест и, если понравится, смержите.
Если что форк тут https://bitbucket.org/FilenkovMaxim/votershelper
lopatoid
Мне кажется, такая штука должна быть веб-сервисом, а не мобильным приложением.
ivan386
Тогда вам сюда: Персональный рейтинг депутатов каждому при помощи JavaScript и браузера Chrome
igor_suhorukov
Где-то в англоязычной информации попадался проект баг трекера для политиков. Аналог Jira/Redmine только для политики.