Хакатон DevDays’19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократия

Недавно мы рассказывали о корпоративной магистерской программе JetBrains и Университета ИТМО «Разработка программного обеспечения / Software Engineering». Приглашаем всех интересующихся на день открытых дверей в понедельник 29 апреля. Мы расскажем о преимуществах нашей магистратуры, о том, какие бонусы предлагаем студентам и что требуем взамен. Кроме того, мы обязательно ответим на вопросы наших гостей.

Хакатон DevDays'19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократияДень открытых дверей пройдет в офисе JetBrains в БЦ «Таймс», где учатся студенты нашей магистратуры. Начало в 17:00. Узнать все подробности и зарегистрироваться на мероприятие можно на сайте mse.itmo.ru. Приходите и не пожалеете!

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

В этом посте мы хотим подробнее рассказать о хакатонах DevDays, которые проходят раз в полгода. Правила простые: собираются команды по 3-4 человека и в течение трех дней студенты воплощают собственные идеи в жизнь. Что из этого может получиться? Читайте первую часть рассказов о проектах хакатона этого семестра от самих студентов 🙂

Дневник с рекомендациями фильмов

Хакатон DevDays'19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократия

Автор идеи
Иван Ильчук
Состав команды
Иван Ильчук – парсинг сюжетов фильмов, сервер
Владислав Кораблинов – разработка моделей для сравнения близости записи дневника и сюжета фильма
Дмитрий Вальчук – UI
Никита Винокуров – UI, дизайн

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

Такая идея пришла мне в голову, когда я ехал в универ и думал о своих проблемах. «С какой бы проблемой ни столкнулся человек, какой-нибудь классик об этом уже писал,— подумал я. — А раз кто-то писал, значит, кто-то уже и экранизировал»”. Так что желание посмотреть фильм о человеке с теми же душевными терзаниями появилось само собой.

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

Хакатон DevDays'19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократияКак мы это реализовали? При нажатии волшебной кнопки дневник отправляет запись на сервер, где фильм подбирается на основании описания, взятого с Википедии. Фронтенд у нас был сделан на Electron (мы используем его, а не сайт, т.к. изначально решили хранить данные пользователя не на сервере, а локально на компьютере), а сервер и сама рекомендательная система — на Python: по описаниям были получены TF-IDF векторы, которые сравнивались на близость с вектором дневниковой записи.

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

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

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

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

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

Route generator

Хакатон DevDays'19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократияАвтор идеи
Артемьева Ирина
Состав команды
Артемьева Ирина – тимлид, main loop
Гордеева Людмила – музыка
Платонов Владислав – маршруты

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

Среди существующих приложений подобных решений найти не удалось. Ближайшие аналоги — любые планировщики маршрутов: Google Maps, 2GIS и т.д.

Такое приложение удобнее всего иметь на телефоне, поэтому хорошим вариантом стало использование Telegram. Он позволяет отображать карты и воспроизводить музыку, а управлять всем этим можно, написав бота. Основная работа с картами производилась при помощи Google Map API. Легко подружить обе технологии позволяет Python.

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

Хакатон DevDays'19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократияНикто из нас никогда не работал с Google Map API и не писал Telegram-ботов, поэтому основной проблемой стало количество времени, отведенное на реализацию проекта: разобраться в чем-то всегда занимает больше времени, чем сделать то, что хорошо знаешь. Также было сложно выбрать API Telegram-бота: из-за блокировки работают не все и пришлось помучиться, чтобы все настроить.

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

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

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

Основная проблема работы с музыкой была в незнании, откуда можно брать mp3-файлы так, чтобы не требовать от пользователя наличия аккаунта на каком-либо сервисе. Было решено запрашивать музыку у пользователя (режим UserMusic). Это порождает новую проблему: не у всех есть возможность загружать треки. Одно из решений — создание хранилища с музыкой от пользователей (режим BotMusic) — из него можно генерировать музыку независимо от сервисов.

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

Liquid Democracy

Хакатон DevDays'19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократия

Автор идеи
Станислав Сычев
Состав команды
Станислав Сычев – тимлид, база данных
Николай Изюмов – интерфейс бота
Антон Рябушев – бекэнд

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

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

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

Хакатон DevDays'19 (часть 1): дневник с рекомендациями, генератор маршрутов для прогулок и жидкая демократияДля создания этого бота мы использовали API от Telegram. Для хранения истории голосований и делегирований выбрали базу данных PostgreSQL. Для общения бота с базой данных был поднят Flask-сервер. Мы выбрали эти технологии, т.к. у нас уже был опыт взаимодействия с ними во время учебы в магистратуре. Работа над тремя составными частями проекта — базой данных, сервером и ботом — удачно распределилась между участниками команды.

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

Видео с примером работы.

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

PS. Набор в магистратуру на будущий учебный год уже открыт. Присоединяйтесь!

Источник: habr.com

Добавить комментарий