понедельник, 2 июня 2014 г.

Kivy App Contest 2014

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

Совершенно случайно наткнулся в марте-апреле на анонс конкурса по разработке приложений (помнится, гуглил тогда что-то конкретное по связке Python + GUI).

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

О конкурсе


  • собственно, страничка соревнования;
  • обязательным условием являлось написание приложения на фреймворке Kivy для Python'а (поддержкой этого фреймворка и занимаются организаторы). Фреймворке, насколько я понял, не пользующемся большой популярностью. Причём, наверное, не пользующемся ей от недостаточной раскрученности. А конкурс - отличный повод расширить круг тех, кто знает, что такое Kivy, и им пользуется, а заодно увеличить количество публично доступных и способных завлечь новых разработчиков приложений;  
  • конкурс проводился во второй раз. Первый имел место в 2012. Я тогда знать не знал обо всём об этом (да и на Python'е написал к тому моменту лишь несколько олимпиадных задач суммарно строчек на 50). И не один я не знал: всего 11 человек поучаствовало в тот раз. Это при не менее способствующей творчеству теме "Игры". Планшет за третье место при таком числе участников смотрелся многообещающе. А при ближайшем рассмотрении достаточно слабенького на мой вкус проекта-победителя - так и вообще...
  • на разработку отводился месяц (начиная с середины апреля). Тема конкурса (Education) была анонсирована с началом этого периода;
  • участвовать можно было как в одиночку, так и командами;

О фреймворке

  • Kivy App устроено так: программе на Python'е сопутствует файл *.kv, позволяющий средствами очень удобного языка (kvlang'а) описать GUI и графические примитивы. Вынесение графической части за пределы кода, отвечающего за основной цикл работы программы, и описание её на другом, лучше соответствующем цели языке, чем-то напомнило html / каскадные таблицы стилей, живущие независимо от JavaScript'а, хоть и тоже на стороне клиента.
  • Эти "каскадные таблицы стилей" (возможно, это только моя ассоциация, а вам kvlang их и не напомнит), как и Python, "вынуждают" программиста оформлять код легкочитаемым и унифицированным образом: отступы играют здесь ту же роль, что и в Питоне;
  • В описании графики (аналогия с Java Script Canvas, но в данном случае можно обойтись и без Python'а, воспользовавшись только разметкой на kvlang'е) замечены вкрапления элементов, знакомых мне, в первую очередь, по OpenGL: translate/rotate/scale/что-то вроде стека модельно-видовых матриц, и тому подобное.
  • Он просто шикарно документирован! Вы это слышите из уст человека, который ещё осенью поносил документации на MSDN (нравящиеся, во всяком случае по моему впечатлению, среднестатистическому программисту) на чём свет стоит! Документация Kivy представлена в двух вариантах: как в превосходно собранной 1000-страничной pdf-ке, которую было очень удобно читать с планшета в транспорте, так и на сайте. Плюсы (обоих вариантов): 
    • "связность" по ссылкам внутри документации зашкаливающая, так что информацию о любой упоминающейся детали можно быстренько уточнить; 
    • документация богато снабжена скриншотами, примерами работоспособного исходного кода;
    • оформление (цветовыделение, курсив, и тому подобное) позволяет быстро выхватывать из контекста то, что действительно важно.
  • Кросс-платформенный. Один и тот же код, обещают нам, можно будет собрать в работоспособное приложение и под Android, и под iOS, и под MacOS, и под Windows. Одна неожиданность: чтобы собрать приложение под Android, нужно воспользоваться Linux'ом, а вот под, собственно, Linux приложение не собрать.
  • Больше ничего писать не буду, посмотрите и попробуйте сами: мне кажется, фреймворк того стоит!

О моём проекте

Вначале предлагаю посмотреть, что у меня получилось:


Замечания насчёт видео:

  • FPS в реальности не настолько плохой: в движении рывками виноват Screencast-O-Matic, при помощи которого я делал это видео. Там подходящих настроек не обнаружилось; тратить время на поиски другой программы не хотел, раз одна уже была когда-то установлена. Кстати, посоветуйте что-нибудь удобное и качественное для создания скринкастов;
  • но, когда "на сцене" появляется много колбочек, FPS всё же резко падает. Ниже о том, почему;
  • вы видели обучающий уровень 0 и начало уровня 1. В текущей версии есть ещё уровни 2 и 3, а также простая и задокументированная возможность добавлять какое угодно количество пользовательских уровней. Все они устроены одинаково:
    • на конвейере могут появляться только вещества из специального списка 1 (для каждого уровня список свой);
    • цель - получить в ходе реакций любые X различных веществ из Y, представленных в отдельном списке 2 (для каждого уровня список свой);
    • можно пополнять базу веществ (и в частности, задавать им цвет) и реакций (таким же простым, понятным рядовому пользователю, догадавшемуся открыть readme.txt, способом. К слову, после прохождения третьего уровня приложение само посоветует пользователю сделать это). Допустимо сколько угодно конечных продуктов реакции.

Несколько слов о процессе разработки:

  • Вначале, когда я только-только узнал о том, что вскоре начнётся конкурс, и принял решение поучаствовать, я думал, что он вновь будет посвящён разработке игр. Первая мысль: нужен художник-дизайнер! К сожалению, на мой призыв один хороший знакомый, подходивший под описанное в предыдущем предложении желание, ответил, что время выделить не может... А тут подоспел и анонс темы конкурса, после которого я решил, что самостоятельно постараюсь справиться: Education App вам не игры. Но, конечно, с художником было бы лучше. Например, был бы какой-нибудь фон на околохимическую тему на дальнем плане. А ещё мне бы колбочки нарисовали по-человечески. А так, колбы, которые вы видите, представляют собой по 4 кривые Безье с подогнанными мной параметрами, ну и ещё пару линий.
  • Занятный момент: вы видели, что в каждой колбочке находится "жидкость". Так вот, чтобы она удачно заняла пространство, хотелось запихнуть внутрь колбы прямоугольник со скруглёнными углами. И вот незадача: примитив "многоугольник со скруглёнными углами" добавлен в версии 1.8.1 фреймворка Kivy, а последняя поддерживаемая Windows версия, - 1.8.0... В результате подгонял самостоятельно из обычных эллипсов ;) 
  • Торможение, по всей видимости, вызвано использованием большого количества NumericProperties. Каждая колбочка - это виджет, описанный в *.kv-файле. Чтобы задавать положение колбы python'ом, нужно сделать его [положение] этим самым NumericProperty. Чтобы задавать надпись на колбе, StringProperty. Чем больше properties в программе, тем медленнее работа, - говорят лучше знакомые с фреймворком люди. Наверное, этот недочёт должен обходиться более адекватным способом, нежели отказом от большого числа виджетов, но я слишком поздно понял, что все силы стоит бросить именно на то, чтобы понять, как его обойти.
  • Раз сказал про надписи, упомяну как нельзя лучше подошедшую мне особенность фреймворка: внутри label'ов поддерживается упрощённый html, благодаря чему отображение индексов в формулах, разноцветных надписей, выделение главного полужирным/курсивом не создаёт никаких проблем. Помню, почти 7 лет назад, когда я делал свои самые первые шаги в программировании, мне аналогичных возможностей очень не хватало в Borland Delphi 7.
  • Занимался проектом примерно две недели. Иногда тратил на него буквально по часу, а иногда и весь день. Спектр возможностей фреймворка изучал, читая документацию в метро и одновременно обдумывая, как (и можно ли? стоит ли?) интегрировать каждую новую возможность, о которой только что узнал, в свой проект.
  • Закончил, как обычно, в последние минуты... :) Не получается пока по-другому ни с чем!.. Последний коммит - за 19 минут до дедлайна, описание и скриншоты - в оставшиеся 19 минут (а за окном в тот момент - 3 часа ночи...).
  • Да, у вас есть возможность посмотреть код, но не делайте этого, пожалуйста! Я знаю, что текущая версия лечится только двумя способами:
    • рефакторингом,
    • а то и вообще переписыванием проекта с нуля. Благо < 1200 строк суммарно на Python и kvlang это не так уж и много для слова "переписать".
Я также знаю, что "плохо" - слишком мягкое слово для двух файлов с кодом на весь проект... Подождите, я ещё не сказал, что работа от начала до конца велась в Far Manager'е?) 
В общем, привычки олимпиадника давали о себе знать, но в июне-июле непременно этот проект поправлю и больше так не буду: мне самому не понравилось каждые 5 минут в последние часы перед дедлайном искать среди 900+ строк main.py ту, которая нужна мне в настоящий момент.
  • Основная причина плохой структуры кода - то, что он разросся раза в два за последние три дня написания. И было в те часы уже не до того. Равно как и перебраться из Far'а в какую-нибудь IDE, а также разнести код по разных файлам - хорошие начинания, требовавшие вложений времени, которые рисковали не успеть себя оправдать. В общем, начинать надо было, не отталкиваясь от Far'а и одного файла, тогда бы и в конце проблем было бы на порядок меньше.
На тему того, почему выше вы видели видеоролик, а не ссылку на работоспособное приложение:
  • В 20-х числах мая я пытался собрать приложение под Android, вчера попытался сделать это же под Windows. На данный момент оба начинания не увенчались успехом: что *.apk, что *.exe у меня есть (только *.apk пока не умею скидывать кому-нибудь, не подключив его устройство к своему ноутбуку с Ubuntu), но оба они вылетают с ошибкой при запуске. Пока что разбираюсь, что не так. Как будет, чем поделиться, непременно поделюсь. 
  • А чтобы запустить проект из исходников, требуется предварительно слишком много всего установить, чтобы я предлагал этим кому-нибудь заниматься :)
На тему того, почему конкурс начался в середине апреля, закончился в середине мая, а пишу я о нём только в начале июня:
  • Анонс результатов должен был появиться 20-го мая (по GMT, то есть не позже 3 ночи 21-го мая в нашем часовом поясе). Я с нетерпением ждал этого момента. 
  • Тем не менее, вечером 20-го мая на сайте появилась следующая запись (обратите внимание на орфографию в двух последних предложениях: кажется, писавшие это долго не спали, пытаясь успеть к ими же поставленному сроку :)
  • Потом орфографию всё же поправили) 
  • И наконец, 1-го июня результаты были опубликованы.

Мои ожидания


  • В середине апреля я поставил себе цель (одну из тех самых X целей на год) - взять один из 8 ценных призов (одно из трёх первых мест либо победа в одной из пяти специальных номинаций: см. сайт). Информация сейчас куда-то пропала, но призы были солидные: так, за одно из трёх первых мест участник получал смартфон/планшет (не на выбор ;), а в зависимости от места) из линейки Google Nexus, бесплатный онлайн-курс английского/французского с инструктором (а вот тут на выбор ;), и мой был бы очевиден, достигни я результата-мечты), привилегии на год на GitHub'е и что-то ещё. 
  • Ставя эту цель, я ориентировался на прошлый конкурс с 11 участниками, когда, ко всему прочему, даже проект-победитель отнюдь не впечатлял. 
  • За сутки до крайнего срока внесения изменений в проект я, в числе 177 участников (да, электронные адреса в массовых рассылках в наши дни скрывать становится всё менее и менее модно...), получил deadline reminder. "177 участников" - ключевое словосочетание в предыдущем предложении :) Ожидания сразу приуменьшились, хотя я ещё грезил номинацией Best App Idea: расширяемость под нужды конкретного пользователя, имеющего своей целью запомнить конкретные хим.реакции, должна была быть высоко оценена.
  • Приза мой проект удостоен не был, то есть цель, формально говоря, не выполнена, но я всё равно доволен! Доволен невероятно 
    • тем, что поучаствовал (как писал выше, впервые участвовал в чём-то подобном), 
    • тем, что на сей раз я сам ставил себе задачу, а не выполнял кем-то навязанное задание. Границ для творчества практически не было, и это прекраснее всего!
    • тем, как шёл процесс разработки,
    • тем, чему научился за это время, 
    • тем, что в результате многое, пусть далеко не всё, что задумывалось, получилось. 
    • И ощущаю себя причастным к конкурсу, объединившему участников from over 56 different countries, как гласит страничка соревнования.
  • Да и не совсем с пустыми руками останусь: любимый приз программиста-олимпиадника - футболка - не обошла меня и в данном случае: моё приложение среди 53 valid entries that could be scored and used for the contest. 53 человека пополнят свой гардероб новой вещью. Будет забавно, если на ней будет изображён этот логотип: с ним есть риск привлекать слишком много внимания ;)

А закончу пост в обычном стиле: делитесь идеями, соображениями, знакомыми художниками и опытом участия в подобных мероприятиях: не один же я в них участвую!

P.S. Традиционный хронометраж: на написание (вы не подумайте: не приложения, а лишь этого поста) затрачено ~ 3h30, разбитые на вчера и сегодня.


Комментариев нет:

Отправить комментарий