Приложение Маяки Эстонии
18 Сентября

Продолжу немного рассказывать о приложении. Меня очень выбили из колеи проблемы с предыдущим. Сделал совсем небольшое косметическое обновление версии для Android и... приложение стало вылетать при попытке открыть карту. А карту я не менял совсем. С одной стороны ситуация анекдотичная, мол "я не трогал, оно само", а с другой - первые три дня я почти не вылезал из-за компьютера, пытаясь найти проблему. Приложение и карта в нём отлично работали на эмуляторе, компилировались без ошибок, но на смартфоне карта продолжала вылетать. Я перепробовал всё, на что хватило моего ума: отключал поочерёдно функции карты в готовом приложении, делал совершенно новое приложение с картой, компилировал примеры, идущие вместе с плагином карт. После трёх десятков часов таких ковыряний уровень понимания проблемы был нулевым. Я не продвинулся ни на миллиметр. Важный нюанс: я поменял компьютер, на который заново были установлены все программы для разработки и именно после этого ошибка и появилась. В какой-то момент появилась иллюзия победы: приложение, загруженное на телефон непосредственно из Android Studio, работало без ошибок. Я сделал новый релиз, загрузил в маркет, обновил приложение у себя на телефоне и... ошибка никуда не ушла. Очень сильно ситуацию усугублял тот факт, что в Play Market'е была опубликована версия с этой ошибкой и, как я узнал, нельзя было отменить и убрать последний релиз и вернуть предыдущий неглючный. Раньше можно было, а теперь Гугл убрал эту возможность. В итоге, переработка, гонка и стресс, а на выходе ноль. Идей больше не было, тикет на GitHub и вопрос на Stackoverflow не помогли совсем. Остался последний вариант - забить. Я дал проблеме отдохнуть от себя, съездил на Рухну и спустя дней пять начал ковыряться снова и уже к обеду работающая без ошибок версия была отправлена в Play Market на код-ревью. Перебрав ранее все остальные варианты, я начал разбираться с тем, что могло измениться при переносе приложения с одного компьютера на другой, а именно настройками проекта. Ранее я знал, что Flutter - это фреймворк, который использует язык программирования Dart. Чего я не знал, так это того, что в конечном итоге приложение компилируется под другой язык. Для андроида это Kotlin или Java, причём выбрать это в Android Studio можно лишь один раз при создании нового приложения. Я не уверен на 100%, но мне кажется, что почти два года назад, когда я только начинал делать "Маяки Прибалтики", возможности такого выбора не было. Насколько я понимаю ситуацию, при переносе проекта с одного компьютера на другой, результирующий язык с Java поменялся на Kotlin и это начало вызывать ошибку. Другой вопрос, почему под Kotlin карта не работает, хотя должна. А в моём случае изменение языка на Java убрало ошибку.

Теперь немного о новом приложении. Абзацем выше я уже писал, что начинал писать "Маяки Прибалтики" почти два года назад, в ноябре 2019. Сейчас я сел за новое приложение и реально офигел, как сильно изменился Flutter за это время. Изначально я планировал брать готовые куски кода из старого приложения и с минимальными изменениями использовать в новом, но за меня решили, что так не будет. В Dart появилась такая штука как Null safety. В теории вещь прекрасная, на практике хоть и не сильная, но постоянная "попаболь". Так что приложение "Маяки России" я пишу полностью с нуля.

Ещё одним аспектом, который изменился очень сильно, стали стили и темы. Поясню: во Flutter стили элементов можно писать непосредственно в самом элементе (как inline CSS в HTML), либо объявить и описать всё заранее (как CSS "нормального человека"). Сложность в том, что первый способ значительно проще и очевиднее, но отдельное оформление для светлой и тёмной тем работает только во втором способе, который на тот момент был плохо задокументирован. Короче, в "Маяках Прибалтики" мне пришлось делать очень костыльную смесь обоих способов. Сейчас этот вопрос проработан намного лучше и написать тему намного проще и удобнее.

14 Сентября

Сегодня рассказ о том, почему же я бегал по полю и чего там искал, сверяясь с телефоном. Искал я свой Mavic 2 Pro. Если кратко, то поехали с сыном искать развалины старого маяка Рухну. Точного места не знали, но знали район. В поле я взлетел, полетел к береговой линии и планировал дальше пролететь вдоль неё, пытаясь найти развалины. Через 45 секунд полёта я получил на пульте сообщение о том, что заряд батареи 0% (при взлёте было 74%) и квадрик немедленно приземляется. Приземляется где-то в поле, в высокой траве. Если вы сталкивались с дронами DJI, то понимаете, что такое поведение очень далеко от штатного. Как и почему - чуть далее, а пока надо квадрик искать. У DJI есть крайне полезная функция Find my drone в приложении, но с неочевидным функционалом. На экране показывается последнее зафиксированное положение дрона и пилота. Также там можно включить помаргивания/попискивания и лучше сделать это сразу, потому что потом связь может пропасть. По идее, это всё что нужно, и я побежал. Надо пояснить, что я был в состоянии некоторой паники, в первую очередь, от того, что из-за незапланированных поисков можно было не успеть на паром, который ходит три раза в неделю. Короче, думал я мало, а бегал много. Добежав непосредственно до искомых развалин я на 100% уверился в том, что уже давно бегаю совсем не там, где летал. И тут подтвердилась и вторая вещь: карта на странице Find my drone показывает не текущее положение пилота, а то, что было зафиксировано на момент запуска. Это чертовски не очевидно: так как карта вращается по компасу, логично, что и положение она обновляет. Но нет. Переписал координаты в навигатор и уже без проблем нашёл квадрик. Пищание сильно помогло, так как в высокой траве можно стоять вплотную к искомому дрону и не видеть его.

Вечером начал гуглить, отчего такие приключения бывают. Оказывается, это ошибка батареи. Если одна банка разряжается быстрее, то в какой-то момент её разряд может стать критически низким, в то время как у всех остальных банок всё в порядке. Это у меня и произошло. Дабы не гадать на обломках дро на кофейной гуще, я загрузил все логи на Airdata (крайне полезный сервис). Картина такова: в семи из десяти последних полётов была ошибка на четвёртой банке батареи. В предыдущие 25-30 полётов ошибки появлялись значительно реже - раз за 7-8 полётов. Совершенно очевидно, что эту батарею использовать больше нельзя.

Погуглил ресурс батареи. Нашёл цифру в 200 циклов зарядки. У меня их было 112, то есть почти экватор. Эксплуатировал и хранил батареи очень бережно, без перегревов и переохлаждений и никогда в "пустом" состоянии. Странно, что померла, но в любом случае я отделался лёгким испугом. Полутора часами ранее этого инцидента я летал над водой, снимая с моря порт Рингсу. Вот там такая ошибка лишила бы меня всего дрона.

13 Сентября
Сын разбудил меня, мы проспали завтрак. Быстренько собрались и побежали. Термос с кофе уже унесли, на шведском столе тоже мало чего осталось. Как назло, кофейный аппарат тоже не работал. Получается, я заплатил 8 евро только за два худеньких бутика с ветчиной и чёрным хлебом. А я люблю с булкой.
Я сижу расслабленный в портовой кафешке и пью кофе. Не могу поверить своему счастью: папка с такими важными для меня историческими документами сама пришла мне в руки! День обещал быть лёгким и приятным.
С сыном мы пробираемся через заросли колючей малины и чего-то ещё, пытаясь не потерять едва уловимую тропку в высокой траве. Паутины на кустах больше, чем во всех фильмах про Индиану Джонса, мы оба все в ней.
В полнейшей панике я бегу по прибрежному лугу, уворачиваясь от кочек и коровьих "лепёх". Периодически я сверяюсь с навигатором в телефоне, но паника от этого только растёт: только бы найти ЕГО. А в 500-700 метрах на камне стоит 8-летний мальчик в красной кофте с Супер Марио и плачет от того, что папа его бросил.
Мы стоим с сыном на верхней палубе небольшого парома-катамарана. Воздух бодряще-прохладен, качка несильная, туман - очень густой. Мы шутим, мимо нас проплывает красный моргающий буй. Секунд через 30-40 мы вспоминаем о нём и пытаемся разглядеть в тумане, но безуспешно.
Под ливнем на электросамокате мы едем к автовокзалу. Женщина в кассе говорит, что билетов нет и сегодня в Таллинн мы уже не уедем.
Голодные и чуть подмокшие мы с сыном идём по пярнускому мосту. Самокат приходится катить, так как у него села батарея.
Уставший, но расслабленный я сижу дома возле своего компьютера и, попивая пиво, вытираю паутину с фотоаппарата, её там налипло изрядно. Это был прекрасный день и как прекрасно, что он закончился.

Не думаю, что из меня вышел бы хороший режиссёр или сценарист, но выше - трейлер моего вчерашнего дня на Рухну. Хронология сохранена. Не припомню, чтобы у меня когда-либо ещё были такие насыщенные разноплановыми событиями дни. Разумеется, скоро напишу подробнее.

13 Сентября

Везёт, как утопленнику

Сегодня приехали с сыном на Рухну. Эта первая наша с ним "чисто мужская" поездка и планировал я её ещё в прошлом году. Уже был тут три года назад. Приезжал в последних числах сентября. Было тепло, но темнело рано. До сих пор хорошо помню, как паром причалил и я сошёл с него в совершенно непроглядную тьму. Сейчас всё не так. Сойдя с судна, мы с сыном успели сгонять на самокате к маяку, погулять там и ещё до заката заселиться.

Ситуация с маяком - полный провал и моё персональное проклятье этого года. До этого Суоменлинна, а сейчас этот маяк на реконструкции. Это нарушило абсолютно все планы. Вероятно, теперь буду до опупения фоткать местные церкви.

Реконструкция маяка Рухну

Как облажаться ещё больше? Я научу. Например, можно ошибиться с проживанием, как я. Бронировал через Booking домик в Bulersi talu. Очень хорошее и популярное место, что примечательно, владелец - старейшина острова и местный историк. Рассчитывал с ним пообщаться и узнать, где стоял старый маяк. Что выяснилось на месте? Что домик я заказал у соседа, в Lääne-bulersi. Тут условия не самые лучшие и не кормят. Не могу рекомендовать это место.

6 Сентября

Наснимал что бог послал #52

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