20 Января

Часовщик XXI века

Расскажу, как обстоят дела с моим циферблатом для Pebble, которому я посвятил немало времени в последние три недели. Итак, с момента релиза (22 дня назад) он был скачан более 600 раз, сам циферблат я обновлял дважды и дважды страницу настроек. Кроме того, по итогам разработки я написал статью на Хабр, где в комментариях получил пару дельных советов.

Теперь подробнее и с деталями. Первый же отзыв, полученный через пару часов после релиза сообщал мне, что... я перепутал AM и PM в 12-часовой версии. Я быстренько пофиксил это дело, выпустив версию 1.01. Потом было много разных экспериментов (например, использование графики с прозрачным фоном). Кроме того, мне порекомендовали статью по оптимизации из которой я использовал пару примеров. Как ни странно, код стал компактнее, но вот количество потребляемой памяти возросло, а не наоборот.

Версия 1.02 была выпущена вчера. В ней полностью переработан механизм отключения standby-экрана. Собственно, в примере с которого я брал код на C, такой опции не было, там была возможность отключения автоматического возврата к standby-экрану. У себя же я изменил её описание на странице настроек, но не изменил суть. Вчера эта недоработка была исправлена.

Теперь о странице настроек. С ней всё проще, так как я могу обновлять её в любой момент, независимо от циферблата. На момент релиза для корректного отображения погоды пользователю надо было где-то найти ID своего города openweathermap.org и ввести его в настройках. Мне самому эта система не нравилась, вдобавок пару раз пользователи меня спрашивали где им взять этот ID. Однозначно это надо было менять. Оптимальным вариантом мне показалось поле ввода, предлагающее варианты в зависимости от вводимого текста (как в поисковике Джуджла). Я попробовал несколько скриптов для этого и остановился на jQuery-Autocomplete. Понравилось, что он не тащит с собой ничего лишнего (как, например, популярный Select2). Также я поместил весь список городов в базу данных. Тут выяснилось два интересных момента: 1) в разных странах существовали города с одинаковыми названиями и 2) у некоторых городов (по всей видимости достаточно крупных) было по несколько ID, привязанных к разным координатам. Для решения первой проблемы надо было добавить обозначение страны. Максимально компактным и наглядным решением мне показались флаги перед названием города. Чтобы свести к минимуму количество запросов к серверу (количество которых и так возросло из-за динамического списка), я целенаправленно искал флаги-спрайты и нашёл отличный вариант. Единственное, что я изменил - это сжал изображение флагов через TinyPNG. Что из этого получилось, можно посмотреть здесь.

Со второй проблемой было сложнее. Не хотелось отпугивать пользователей какими-то лишними опциями или координатами. В итоге я просто "отсёк" все лишние варианты через GROUP BY в SQL-запросе. Да, решение компромиссное и имеет свои минусы. Например, если в одной стране есть два города с одинаковым названием, то будет показан только один из них. Тем не менее, ничего лучше я пока не придумал.

Планы на будущее? Ну с нынешним циферблатом уже мало чего можно сделать. Единственное, что ещё хочется реализовать - определение местоположения по GPS и поиск города исходя из этого. А ещё есть идея другого циферблата, гораздо более простого.

15 Января

Пытался найти в архивах этого сайта пост,.. а его нет. Нет, он не исчез, просто я его не написал. Вот так и живу: в голове планов громадьё, а до реализации доживает далеко не всё. Вернёмся к несуществующему посту. В ноябре уже прошлого года мы с Дмитрием и Инной неплохо прогулялись по вечернему Cтарому городу и, между делом, я пофоткал на телефон. Результаты просматривал на следующий день, на трезвую голову и был ими (результатами) приятно удивлён. Оказалось, что камера на Nexus 5 действительно хорошо снимает, причём даже в темноте.

Вчера я вновь испытал удивление, обнаружив отличный фото-редактор для телефона. Ранее подобные программы я считал ненужным баловством, а ещё мне почему-то казалось, что они жутко неудобные. Прочитал вчера про Snapseed, попробовал и был в восторге. Приложение, к слову сказать, бесплатное и существует как для ондроида, так и для яблокофонов. Если пользоваться им умеренно (пока не мой случай), снимки можно сделать гораздо привлекательнее. Ниже пара моих примеров: в первом случае оригинал снят на посредственную камерку телефона LG Optimus L9, во втором - на зеркальный Canon.

29 Декабря

С почином, уважаемый!

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

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

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

Львиную долю времени у меня заняло рисование графики. Первыми я, конечно же, нарисовал сами часы. Оформление календаря тоже родилось достаточно быстро. По мере отрисовки графики, я сразу же добавлял её в проект и располагал где надо. Достаточно неожиданно для меня, циферблат приобрёл лёгкий налёт стимпанковости. Индикаторы батареи и соединения Bluetooth я уже намеренно делал в этом стиле. Только оформление блока погоды мне никак не давалось. На какое-то время я оставил его и отвлёкся на веб-интерфейс для настройки циферблата. По сути, это обычная веб-страница, адрес которой прописан в настройках циферблата и которая принимает и отдаёт назад в циферблат какие-то переменные. Страничка не отняла много времени, так как никакой адаптивности и мультибраузерности тут не требовалось. В целях оптимизации я минифицировал весь CSS и JS и включил их в код страницы. Таким образом, единственный подключаемый файл на этой странице - это jQuery.

Fight for the bytes!

Закончив с этим, я вернулся к блоку погоды. Дизайн для него вроде как сложился, я дорисовал графику, добавил в проект и... случилось непредвиденное: я превысил лимит памяти на часах. Циферблат без ошибок компилировался и загружался в часы, где мгновенно "падал". Надо было урезать графику. Начал я с "экономии на спичках" и срезал "резьбу" у индикатора батареи. Сейчас вместо этой "резьбы" показан индикатор Bluetooth, у которого буква B вылезла за экран. Визуально разницы с предыдущим вариантом вообще нет. Дальше было самое трудоёмкое - центральный блок с датой и секундами. Я убрал фоновую картинку с кругом и нарисовал его программно. Тут выяснился один нюанс: для рисовки круга задаются координаты центра и радиус, таким образом, его размер в пикселях всегда будет нечётным и расположить его строго по центру невозможно. Пришлось немного попередвигать всё остальное, так как старый круг имел чётный размер. По той же причине индикатор секунд уже не вписывался в круг и его тоже надо было перерисовывать. А это 60 спрайтов, если что... Впрочем, если уж перерисовывать, то нужно выжать из этого по максимуму. В итоге, всё, что реально не меняется в индикаторе секунд я перенёс на фоновую картинку, что позволило заметно уменьшить разрешение спрайта. Умножаем на 60 и получается существенная экономия, которая, в конечном итоге, и позволила мне вписаться в байтовый бюджет.

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

Короче, циферблат готов и опубликован:

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

Также у меня есть некоторые планы на будущее. Например, сейчас не очень удобно реализована настройка погоды: надо в интернете посмотреть ID своего города openweathermap.org и ввести его в поле в настройках. Не очень удобно. Есть официальный список, но там 74 тысячи городов. Засовывать их все в выпадающее меню - не вариант. Короче, надо думать... Ещё хотелось бы сделать возможность отображения календаря вместо погоды. Словом - громадьё моё.

19 Декабря

Сами сосите!

Леденцы вредны для зубов ,так же, как и шоколад. Но для себя я всё же сделал выбор в пользу последнего и три дня тому как, перепрошил свой Nexus 5 Андроидом версии 4.4.4. На самом деле, приятный ранее во всех отношениях телефон, обновившись до Android Lollipop начал меня выбешивать. В попу ваши Лоллипопы! Google долго думал, как омрачить мою радость и в итоге вчера появилась новость о том, что в новой версии ОС таки появится беззвучный режим. Чтож, вы выпускайте, а мы поглядим и основательно подумаем...

26 Ноября

Лучше отличная реализация и средняя идея, чем средняя реализация и отличная идея.

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

Вторая проблема для меня куда существенней: в Android Lollipop больше нет режима "без звука". Я уже писал, что в рабочее время по расписанию я специальной программой отключал все звуки и вибрацию на телефоне чтобы не нервировать коллег, а все уведомления я и так получаю на часы. Сейчас есть три режима: "Все" (обычный, со всеми звуками), "Важные" (звонки только от выбранных контактов, уведомления только от выбранных приложений) и "Не беспокоить" (никаких уведомлений). Херня в том, что при активизации последнего профиля даже будильник не работает. Напомню, что испокон веков будильник - одна из самых приоритетных вещей в телефоне и даже выключенный телефон автоматически включается ради него. Короче, проблема с профилями пока не решена, так как старая программа не работает, а ничего нового я пока не нашёл.

Цитировать
в комментарии