Программирование Викиданных/artolela
Artolela – это обучающая игра, целью которой является совершенствование навыков владения иностранными языками с помощью известных картин. Artolela не только помогает пользователям в изучении языков, но и позволяет расширить кругозор, так как во время игры пользователь знакомится с шедеврами живописи. Статья описывает механику игры, а также технические детали её реализации, начиная от поиска картин и заканчивая разработкой Android-приложения. Также в статье описаны пути дальнейшего развития приложения.
О приложении
правитьArtolela(полное название "Art of learning language") – это мобильное приложение, разработанное под операционную систему Android.
Язык разработки: Java.
Платформа: Android.
Платформа разработки: Android Studio 2.3.3.
Язык интерфейса: русский и английский.
Совместимость: Android 4.0+.
Описание приложения
правитьПриложение предназначено для совершенствования навыков иностранных языков в игровой форме.
Суть игры:
- В начале игры пользователь выбирает два языка.
- Затем пользователю показывается картина, её название на первом языке и четыре варианта названия этой картины на втором языке.
- Пользователю необходимо выбрать верный вариант названия картины на втором языке.
Сценарий игры:
- Пользователь запускает приложение.
- Пользователь выбирает два языка: для подписей к картинам и для вариантов ответа.
- Пользователь выбирает количество уровней (количество картин, названия которых ему нужно отгадать).
- Пользователь нажимает кнопку «Начать».
- Пользователю показывается картина, её название и четыре варианта ответа.
- Пользователь выбирает один из предложенных вариантов ответов.
- Пользователь нажимает кнопку «Далее».
- После того как пользователь прошёл заданное количество уровней, он видит на экране свою оценку в виде отношения количества правильно отвеченных вопросов к общему количеству вопросов.
- Если пользователь нажимает кнопку «Сыграть снова», то пункты 2-9 повторяются. Также пользователь может закрыть приложение, то есть выйти из программы.
Примечание 1: На 2017 год приложение поддерживает три языка (русский, английский, итальянский). Количество картин-объектов на сайте Викиданных, имеющих label (описание) одновременно на русском, английском и итальянском языках, – 757.
Примечание 2: По нажатию на картину во время игры, пользователь увидит её увеличенную версию.
Архитектура приложения
правитьПриложение состоит из трех активностей[1] и базы данных, включающей две таблицы.
База данных
правитьБаза данных содержит две таблицы. Таблица Pictures включает пять атрибутов: идентификатор картины (auto incremantal ID), названия картины на трёх языках и полную ссылку на картину на Викискладе. Первичным ключом таблицы Pictures является атрибут Pictures.ID. Таблица Images состоит из трёх атрибутов: идентификатор ссылки на картину, ссылку на картину на Викискладе и название файла с картиной. Первичным ключом таблицы Images является атрибут Images.ID. Внешним ключом таблицы Images является атрибут url, который ссылается на атрибут image_link таблицы Pictures. Таблица Pictures заполняется из JSON-файла (содержит результат SPARQL-запроса), таблица Images заполняется из XML-файла (содержит результат работы программы Download Master).
Пример таблицы Pictures для картины "Триумф смерти":
_id | 27 |
label_ru | Триумф смерти |
label_en | The Triumph of Death |
label_it | Trionfo della Morte |
image_link | http://commons.wikimedia.org/wiki/Special:FilePath/Thetriumphofdeath.jpg |
Пример таблицы Images для картины "Триумф смерти":
_id | 27 |
url | http://commons.wikimedia.org/wiki/Special:FilePath/Thetriumphofdeath.jpg |
filename | Thetriumphofdeath.jpg |
Android (Activity)
правитьПриложение состоит из следующих активностей:
- Начальный экран приложения. На главном экране устанавливаются настройки приложения (языки и количество уровней). Элементы экрана: два элемента Spinner[2] для выбора языков (каждый Spinner состоит из элементов ImageView[3] и TextView[4] для отображения флага страны и названия языка соответственно), один элемент SeekBar[5] для выбора количества уровней, одна кнопка.
- Примечание 1: При выборе языков нужно проверять, что пользователь выбрал разные языки в качестве родного языка и изучаемого языка. Если пользователь выбрал одинаковые языки, то игра не начнётся, а пользователь увидит соответствующее всплывающее сообщение (Toast[6]).
- Примечание 2: Пользователь может выбрать от 5 до 50 уровней. Шаг шкалы составляет 5 картин. Если пользователь выбирает значение 0, то игра не начнётся, а пользователь увидит соответствующее всплывающее сообщение (Toast).
- Примечание 3: Картины, отображающиеся в процессе игры, хранятся на удаленном сервере. Перед каждым уровнем с сервера загружается одна картина. Поэтому, во избежание ошибок, перед каждым уровнем необходимо проверять доступ к сети Интернет. По нажатию на кнопку «Начать» проверяется доступ к сети Интернет. Если доступ есть, то игра начинается. Если доступа нет, то пользователь увидит соответствующее сообщение с возможностью перехода к настройкам сети Интернет.
- Игровой экран приложения. На этом экране происходит сам процесс игры. Элементы экрана: один элемент ImageView для отображения картины, один элемент TextView для отображения названия картины на языке пользователя, четыре элемента RadioButton[7], объединенные в RadioGroup[8], для отображения вариантов ответов, одна кнопка для перехода к следующей картине.
- Примечание 1: Необходимо проверять, что пользователь не забыл выбрать вариант ответа. Если вариант ответа не выбран, то при нажатии на кнопку «Далее» новый уровень не начнётся, а пользователь увидит соответствующее всплывающее сообщение (Toast).
- Примечание 2: При переходе к каждому уровню также проверяется доступ к сети Интернет.
- Примечание 3: Если изображение не удаётся загрузить с сервера, то, чтобы ImageView не оставался пустым, на его месте отобразится placeholder[9] (изображение-заглушка, используемое вместо изображения картины, если файл с картиной недоступен (например, файл не загрузился с сервера или отсутствует в приложение)).
- Финишный экран приложения. Экран для отображения результатов игры. Элементы экрана: один элемент TextView для отображения отношения успешно пройденных уровней к общему количеству уровней, одна кнопка для перехода на начальный экран.
Случайный выбор (random)
правитьДля выбора картины и вариантов ответа использовался конструктор Random() класса java.utils.Random [10]. У этого класса есть несколько методов для генерации псевдослучайных чисел. Для получения данных о картине и об ответах необходимо было сгенерировать соответствующие идентификаторы. Для этих целей был выбран метод nextInt(int bound), который возвращает псевдослучайное число в диапазоне от 0 до bound-1. Параметром bound было количество записей в соответствующей таблице. Так как в таблицах нумерация кортежей начинается с единицы и заканчивается количеством записей в таблице n, а метод nextInt(n) вернёт число в диапазоне от 0 до n-1, то для операций с базой данных необходимо возвращаемому значению этого метода прибавлять единицу, чтобы псевдослучайное число было в диапазоне от 1 до n.
Подготовка изображений
правитьSPARQL
правитьКартины, используемые в приложении, получены из Викиданных. Картину имеет смысл добавлять в приложение только при условии наличия у неё заполненного поля label на трёх языках и при наличии ссылки на картину на Викискладе (image (P18)). Для получения всех картин, удовлетворяющих этим условиям, использовался SPARQL-скрипт, по которому были получены 757 записей.
#List of pictures in Russian, English and Italian having property "image"
SELECT ?picture ?label_ru ?label_en ?label_it ?image
WHERE
{
#Not using in application
?picture wdt:P31 wd:Q3305213.
#Pictures with label in Russian
?picture rdfs:label ?label_ru filter (lang(?label_ru) = "ru").
#Pictures with label in English
?picture rdfs:label ?label_en filter (lang(?label_en) = "en").
#Pictures with label in Italian
?picture rdfs:label ?label_it filter (lang(?label_it) = "it").
#Pictures with link to Wikimedia
?picture wdt:P18 ?image.
}
Получение ссылок
правитьПосле того как получен список картин, нужно получить ссылки на файлы с изображениями этих картин. Для этого выдача SPARQL-скрипта была экспортирована в JSON-файл с помощью стандартных средств сервиса запросов SPARQL.
Загрузка изображений
правитьДля загрузки большого количества файлов использовалась программа Download Master. Была выбрана эта программа, поскольку у неё есть функция загрузки файлов по импортируемому списку URL-адресов. Ещё одним преимуществом программы Download Master является возможность экспортировать список загрузок, содержащий ссылки на изображения, хранящиеся на Викискладе, и названия загруженных файлов, в XML-файл.
Примечание 1: C помощью программы Download Master получилось извлечь ссылки на картины из JSON-файла без его предварительной обработки.
Примечание 2: На загрузку 757 изображений потребовался 1 час 10 минут (при подключении к сети Интернет на скорости 20 Мбит/с).
Сжатие изображений
правитьПосле загрузки изображений, суммарный размер файлов составил 8,45 Гб (максимальный размер одной картины – 493 Мб). Картины такого большого объёма могут медленно загружаться из интернета, из-за чего у пользователя может возникнуть ощущение, что приложение «зависает». Поэтому было принято решение сжать картины до приемлемого размера. Для сжатия изображений использовалась программа FILEminimizer Suite[11], так как она позволяет сжимать изображения в пакетном режиме и обеспечивает хороший процент сжатия[12] (средний процент сжатия - более 90%).
Примечание 1: После сжатия суммарный размер картин составил 84,5 Мб (максимальный размер одной картины – 684 Кб).
Примечание 2: На сжатие 757 изображений потребовалось 3 часа 30 минут (характеристики компьютера, на котором производилось сжатие: процессор Intel Core i5, 8 Гб ОЗУ, HDD накопитель).
Размещение на сервере
правитьПосле сжатия изображения были загружены на удалённый сервер.
Результат
правитьФинальная версия приложения доступна для скачивания в PlayMarket под именем Artolela.
Исходный код приложения размещен на GitHub в репозитории Artolela.
Идеи развития
правитьПриложение готово к работе, но его можно развивать дальше. Вот некоторые возможные варианты:
- Добавить в приложение большее количество языков.
- Добавить режим игры «аудирование». В данном режиме пользователь видит картины и её название на родном языке. Отличие от оригинальной версии заключается в том, что вместо четырех названий, написанных на изучаемом языке, пользователю доступны четыре кнопки, по нажатию на которые озвучиваются варианты названия картины на изучаемом языке. Таким образом, пользователь не только изучает новый язык, но и учится воспринимать иностранные слова на слух.
- Добавить режим игры «текстовый режим». Суть: нужно найти или разработать нейронную сеть, которая генерирует текстовое описание изображения (что изображено на картине). На вход нейронной сети подаются картины. Текст, сгенерированный нейронной сетью, показывается пользователю. Пользователь должен отгадать название картины из предложенных вариантов по её словесному описанию.
- Добавить режим игры «продвинутое аудирование». Суть: пользователь отгадывает названия картин по их озвученному описанию на изучаемом языке.
- Использовать приложение для обучения нейронной сети. Нейронная сеть генерирует описание картины, а пользователь указывает является ли описание верным.
- Разработать аналогичное приложение, где пользователь отгадывает музыкальное произведение (например, классическую музыку) по его отрывку.
- Разработать аналогичное приложение, где пользователь отгадывает фильм или книгу по главным героям произведения.
См. также
правитьПримечания
правитьЛитература
правитьExtremum Обзор инструментов для сжатия изображений (Русский). — Хабрахабр, 2013.