Привет друзья! 👋
Все это время я не терял ни одного момента и занимался приложением.
В основном концентрировался на 2х вещах:
🟥 Карта (MapKit)
С картами всё оказалось не так уж просто🗺
Для выбора места где был приобретен товар, решил использовать PointsOfInterest (POI). Эта фича работает прекрасно, в больших городах многие места отмечены на карте, и это облегчает выбор магазинов/кафе/ресторанов.
Однако тут есть проблема, которую, похоже, можно решить только лишь используя UIKit (настало его время😄 ). Суть - при выборе POI можно использовать механизм отслеживания изменений
Но при добавлении своих аннотаций, например, уже сохраненная точка, эта функциональность ломается. POI можно выбрать, но в
Поскольку эта часть оказалась слишком сложнее ожидаемого, решил отложить данную часть на потом. Зачем застревать на одном месте, верно?🙂
Следующиее - нужно показать карту вокруг места где пользователь находится сейчас. С этим ок, работает хорошо, беру локацию и позиционирую карту на этой точке. Дополнительно сохраняю последнее известное положения пользователя.
Но вот показать точку, где пользователь находится на карте (тот самый синий кругляш) - беда. Опять же аннотации ломают трекинг POIs. Исползование
Про
🟥 Share функциональность
Тут у меня всё ещё хуже, но это в отельном посте 😋
Продолжение следует…
Все это время я не терял ни одного момента и занимался приложением.
В основном концентрировался на 2х вещах:
С картами всё оказалось не так уж просто
Для выбора места где был приобретен товар, решил использовать PointsOfInterest (POI). Эта фича работает прекрасно, в больших городах многие места отмечены на карте, и это облегчает выбор магазинов/кафе/ресторанов.
Однако тут есть проблема, которую, похоже, можно решить только лишь используя UIKit (настало его время
Map(position: $mapPosition, selection: $selectedPlace)
.onChange(of: selectedPlace)
Но при добавлении своих аннотаций, например, уже сохраненная точка, эта функциональность ломается. POI можно выбрать, но в
onChange
выбранные точки не прилетают. Насколько понял, selectedPlace начинает распространяться на созданные мной аннотации. С помощью UIKit, вроде, можно разделить карту на отдельные слои, и тогда это не будет проблемой.Поскольку эта часть оказалась слишком сложнее ожидаемого, решил отложить данную часть на потом. Зачем застревать на одном месте, верно?
Следующиее - нужно показать карту вокруг места где пользователь находится сейчас. С этим ок, работает хорошо, беру локацию и позиционирую карту на этой точке. Дополнительно сохраняю последнее известное положения пользователя.
Но вот показать точку, где пользователь находится на карте (тот самый синий кругляш) - беда. Опять же аннотации ломают трекинг POIs. Исползование
.mapControls { MapUserLocationButton() }
работает только при нажатии на кнопку. При последующем скролинге точка пропадает с карты.Про
overlay
просто ничего, я его пробовал, но не помогло нисколько.Тут у меня всё ещё хуже, но это в отельном посте 😋
Продолжение следует…
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Большая просьба, если кто-то работал с картами, посоветуйте как с ними ладить. Возможно есть волшебная либа, которая сделает всю грязную работу? Да, я тот ещё оптимист 🥺
Документации совсем мало, в основном это видео с wwdc. Чтобы посмотреть их все нужно кучу времени потратить. Предварительно понять что нужно смотреть, а что можно пропустить не очень получается.
Документации совсем мало, в основном это видео с wwdc. Чтобы посмотреть их все нужно кучу времени потратить. Предварительно понять что нужно смотреть, а что можно пропустить не очень получается.
Please open Telegram to view this post
VIEW IN TELEGRAM
Добавлю немного скринов:
🔸 список сохраненных вкусняшек (или наоборот)
🔸 большое вью с картой, где можно выбрать место
🔸 вью редактирования/просмотра с превьюшкой карты (тут можно увидеть кнопку share)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Через полгода как я завел девелоперский аккаунт, apple почему-то поинтересовался моим паспортом и заблокировал 👨💻 AppStore Connect.
Через полдня после того, как я отправил всё, что им было нужно, доступ восстановили 😊
Через полдня после того, как я отправил всё, что им было нужно, доступ восстановили 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Всем привет 👋 Давно не было от меня новостей
Так вот, несу прикольный апдейт.
Я начал параллельно смотреть на геймдев, и познакомился с Godot👩💻
Так уж вышло, что для меня классикой является змейка, поэтому вот моя версия:
Так вот, несу прикольный апдейт.
Я начал параллельно смотреть на геймдев, и познакомился с Godot
Так уж вышло, что для меня классикой является змейка, поэтому вот моя версия:
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Видео с телефона
Так уж получается, что я прыгаю от одного проекта к другому. Мне не хочется сделать проект и забросить его. К тому же, пользователи, знакомые и я пользуемся и хотим видеть какие-то улучшения в приложениях.
Это время я занимался улучшением стратегии подбора слов в DerDieDas🇩🇪
Вот самое интересное:
🔸 Создал отдельный Package в котором храню бизнес логику, и линкую его в основной проект.
Воспользовался подходом, который подсмотрел в упоминаемом ранее проекте: https://github.com/Dimillian/IcySky/tree/main
Самые классные плюшки тут:
- это можно легко тестировать (алгоритм получился не очень простой)
- мокаю всё, что захочу
- дизайн классов построенный на абстракциях
- разбиение проекта на модули, single responsibility наше всё (несмотря на то, что проект небольшой, поддерживать его становится сложнее со временем)
🔸 Алгоритм подбора слов основанный на комбинации стратегий:
- due words (слова, которые пора повторить) способом 4х колод
- примерный уровень пользователя (давать слова из этого же уровня и выше)
- калибровка, если уровень ещё не известен
То, что меня тут больше всего цепляет, это https://en.wikipedia.org/wiki/Sigmoid_function
Я использую её, чтобы откорректировать вес среднего по каждому уровню.
Например, пользователь ответил правильно на 5 из 5 на уровне A2 - вроде в среднем 100%, но 5 вопросов это мало, поэтому с помощью Сигмоида это всего лишь 24%. Как? Сделаю небольшой отдельный пост (там всё просто).
🔸 Отказ от CoreData?
Попробовать было интересно и даже полезно. Но с этим товарищем нам, похоже, не по пути.
Пока вижу так, что вся эта реактивщина изменений мешает. Мне намного удобнее иметь отдельный метод, через который я делаю изменения и контролирую все зависимые от него части.
Более конкретный пример: сложно реализовать локальные кэши, в которых я хочу сделать оптимизации. Например, мне нужно хранить среднее. При реактивном подходе, среднее нужно пересчитывать. Иначе - все изменения под контролем, я могу использовать переменные для хранения различных счетчиков, и использовать их оптимальнее.
Может это излишняя оптимизация, но мне так легче. А это главное!
Не спешу с этим, но похоже придется убрать CoreData. Посмотрим ещё😮
Это время я занимался улучшением стратегии подбора слов в DerDieDas
Вот самое интересное:
Воспользовался подходом, который подсмотрел в упоминаемом ранее проекте: https://github.com/Dimillian/IcySky/tree/main
Самые классные плюшки тут:
- это можно легко тестировать (алгоритм получился не очень простой)
- мокаю всё, что захочу
- дизайн классов построенный на абстракциях
- разбиение проекта на модули, single responsibility наше всё (несмотря на то, что проект небольшой, поддерживать его становится сложнее со временем)
- due words (слова, которые пора повторить) способом 4х колод
- примерный уровень пользователя (давать слова из этого же уровня и выше)
- калибровка, если уровень ещё не известен
То, что меня тут больше всего цепляет, это https://en.wikipedia.org/wiki/Sigmoid_function
Я использую её, чтобы откорректировать вес среднего по каждому уровню.
Например, пользователь ответил правильно на 5 из 5 на уровне A2 - вроде в среднем 100%, но 5 вопросов это мало, поэтому с помощью Сигмоида это всего лишь 24%. Как? Сделаю небольшой отдельный пост (там всё просто).
Попробовать было интересно и даже полезно. Но с этим товарищем нам, похоже, не по пути.
Пока вижу так, что вся эта реактивщина изменений мешает. Мне намного удобнее иметь отдельный метод, через который я делаю изменения и контролирую все зависимые от него части.
Более конкретный пример: сложно реализовать локальные кэши, в которых я хочу сделать оптимизации. Например, мне нужно хранить среднее. При реактивном подходе, среднее нужно пересчитывать. Иначе - все изменения под контролем, я могу использовать переменные для хранения различных счетчиков, и использовать их оптимальнее.
Может это излишняя оптимизация, но мне так легче. А это главное!
Не спешу с этим, но похоже придется убрать CoreData. Посмотрим ещё
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2⚡1👌1
Похоже, получилось громоздко 🤔 Какой размер постов вам удобнее (спасибо, что читаете)?
Final Results
0%
Короткие
67%
Средние
17%
Большие
67%
И так сойдёт!
Всем привет! 👋 Пора бы заполнить тишину 😂
Сейчас я активно работаю над приложением🇩🇪
Переделываю дизай - да, задумку про минимализм не получается реализовать на💯 Хочется чего-то большего, и тут не получится без “Настроек” и прочих мелочей.
Обновляю не только визуал, хотя это большая часть. Но так же разобрался с локальными нотификациями - приложение само планирует когда и что показать. Либо само приложение, но чаще пользователь, настраивает расписание.
Есть ещё и серверные push-нотификации, когда с сервера присылаются уведомления. Это сложнее, и в моём случае пока не нужно было.
Помимо этого, поскольку я планирую использовать Firebase🔥 и для других приложений, то этот проект выступает в роли подопытного кролика, на котором я реализую:
🔸 anonymous login - вполне говорящее название. Даже без регистрации (и смс) можно будет различать пользователей.
🔸 App Check - Firebase может проверять, что запросы приходят именного из твоего приложения. Работает через интеграцию с сервисами Apple. Когда сделаю - потестирую и отпишу о результатах #todo
Сейчас я активно работаю над приложением
Переделываю дизай - да, задумку про минимализм не получается реализовать на
Обновляю не только визуал, хотя это большая часть. Но так же разобрался с локальными нотификациями - приложение само планирует когда и что показать. Либо само приложение, но чаще пользователь, настраивает расписание.
Есть ещё и серверные push-нотификации, когда с сервера присылаются уведомления. Это сложнее, и в моём случае пока не нужно было.
Помимо этого, поскольку я планирую использовать Firebase
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🔥1
Saga. Но не паттерн, а история как я пытался перехитрить Firebase/GCP.
В предыдущем посте я рассказывал о планах подключить anonymous login и App Check в🇩🇪
С этими задачами я разобрался относительно быстро. Больше времени ушло на изучение документации. А у гугла, так уж получается, документация настолько хороша, что после её прочтения всё заводится с полпинка.
❗️ Anonymous Login
В кратце, в приложении всё что нужно сделать - это:
При успешном выполнении, получаем
В моём случае я использую его репортинга ошибок. Так я могу видеть какие баги были зарепорчены одним и тем же пользователем. Как минимум это может быть полезно, если кто-то захочет просто так порепортить всё подряд.
❗️ App Check
Эта фича позволяет проверить, что запросы прилетают из приложения. Firebase интегрируется с Apple и проверяет входящие запросы на валидность.
Настройка так же не занимает много времени. Нужно на стороне Apple выпустить
В предыдущем посте я рассказывал о планах подключить anonymous login и App Check в
С этими задачами я разобрался относительно быстро. Больше времени ушло на изучение документации. А у гугла, так уж получается, документация настолько хороша, что после её прочтения всё заводится с полпинка.
В кратце, в приложении всё что нужно сделать - это:
Auth.auth().signInAnonymously { authResult, error in
При успешном выполнении, получаем
uid
пользователя и используем его как хотим.В моём случае я использую его репортинга ошибок. Так я могу видеть какие баги были зарепорчены одним и тем же пользователем. Как минимум это может быть полезно, если кто-то захочет просто так порепортить всё подряд.
Эта фича позволяет проверить, что запросы прилетают из приложения. Firebase интегрируется с Apple и проверяет входящие запросы на валидность.
Настройка так же не занимает много времени. Нужно на стороне Apple выпустить
private key
, зарегистрировать в Firebase, и настроить приложение выполнив
private func configureFirebaseAppCheck() {
#if DEBUG
// для симуляторов
let providerFactory = AppCheckDebugProviderFactory()
AppCheck.setAppCheckProviderFactory(providerFactory)
#else
// для прода
// хотя, возможно, эта часть не обязательна - в документации об этом ни слова :’(
let providerFactory = DeviceCheckProviderFactory()
AppCheck.setAppCheckProviderFactory(providerFactory)
#endif
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧨 А вот тут самое интересное
Поскольку это ужасно неудобно - проверять firebase console на наличие новых документов ввелосипед нотификатор на базе Telegram Bot.
Радостный я - узнал, что можно использовать💪 ) вызываются всякий раз, когда добавляется (обновляется, и другие события тоже) документ в базе.
Довольный я - написал функцию, но при попытке деплоя обнаружил, что нужно перейти на платный Pricing Plan - Blaze… (Spark дефолтный и полностью бесплатный). В целом платишь, если только используешь выше квоты.
С этим я мириться не смог, стал изучать как можно обойти это ограничение. И тут обнаружил, что
Поскольку это ужасно неудобно - проверять firebase console на наличие новых документов в
Firestore Database
(именно тут я и храню репорты о багах), в добавок у Firebase нет мобильного приложения. Я решил изобрести Радостный я - узнал, что можно использовать
Firebase Functions
. Идея известная, похожие на триггеры в субд - функции (на nodejs Довольный я - написал функцию, но при попытке деплоя обнаружил, что нужно перейти на платный Pricing Plan - Blaze… (Spark дефолтный и полностью бесплатный). В целом платишь, если только используешь выше квоты.
С этим я мириться не смог, стал изучать как можно обойти это ограничение. И тут обнаружил, что
Google Cloud
отлично интегрируется с Firebase, ведь Firebase работает поверх Google Could. Небольшой сложностью было то, что сообщения в функции (Cloud Run) приходят в формате Proto (protobuf). Ну ничего, нашел на гитхабе пример (от гугла) и воспроизвел его. Поковырялся около 4 часов с этим безобразием, я всё же смог задеплоиться. И знаете что? 🤣 Они меня автоматом перевели на Blaze в Firebase. Обнаружил я это только на следующий день, увидев письмо с “поздравлениями”.Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
На этом хитрость века закончилась…
Разочарованный я - решил всё же использовать
В
Но всё же по итогу у меня получился “бесплатный” функционал нотификаций из✈️ через бота.
Через
Сообщение представляет собой markdown форматированный текст с метаданными и некоторыми полезными полями в форме json.
Однако редактировать приходится руками. Если придется заниматься этим часто - буду автоматизировать😉
Разочарованный я - решил всё же использовать
Firebase Functions
, поскольку помимо упрощения, когда приходит сразу json, а не proto, Firebase
предоставляет локальные симуляторы. Очень просто и красиво поднимается web server, с помощью которого, можно создавать документы (прям как в `Firestore Database`) и тестировать свои супер функции.В
Cloud Run
такого функционала я не нашел, поэтому приходилось на каждое изменение деплоить их в клауд. Мало того, что это долго, так ещё и тестирование усложняется в разы.Но всё же по итогу у меня получился “бесплатный” функционал нотификаций из
Firestore Database
в Telegram Через
Bot Father
создал бота и в Firebase Functions
посылаю себе в личку нотификации каждый раз как появляется новый документ.Сообщение представляет собой markdown форматированный текст с метаданными и некоторыми полезными полями в форме json.
Однако редактировать приходится руками. Если придется заниматься этим часто - буду автоматизировать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🆒1
Я наконец-то вернулся из отпуска - но времени я не терял, поэтому есть много чего рассказать. Stay tuned 🏖
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👀1
Даже хейтерам ChatGPT это будет интересно.
🌴 Лежу я значит на пляже - солнце, шум моря, загар ложится ровно, телефон в руке. Но мозг, как обычно, не умеет отдыхать. В голове вертится: "А что если добавить в приложение простенькую фичу? Можно то, и можно это… а ещё и так, да эдак”
И тут я вспоминаю про Copilot в GitHub. Проверил - он доступен с телефона. Думаю: “Дай-ка напишу ему, пусть скажет насколько это вписывается в текущий проект”. А он в ответ предлагает создать Pull Request.
o_O ничоси
Попросил его сделать easy mode для🇩🇪 . Он создает Pull Request, запускается Xcode Cloud CI, сборка проходит успешно, а Copilot ставит меня ревьюером. После нескольких замечаний, он исправляет, то что мне не нравится, объясняет что не понятно. Мой клик на Мерж, сборка Xcode Cloud, отправка в Test Flight, и я не взяв в руки ноутбук и не написав ни единой строчки кода устанавливаю приложение… Итс факинг крейзи 😆
Самое классное, что я понимаю по итогу, что я получаю в проекте, и контролирую, что туда попадает. Ревью как ни как.
До этого я использовал Github Copilot в режиме Agent. Он помогает со всеми делами (жаль не по дому) в VS Code👩💻
У него есть контекст проекта - умеет читать README (для него можно даже писать специальные инструкции в `.github/copilot-instructions.md`), может создать тесты, запустить что-нибудь в терминале, поревьюить, или написать логику.
Это вызывало огромный дискомфорт, поскольку это занятие не высвобождает свободное время - приходится постоянно переписываться и смотреть, что он делает. И главное, я в это время не могу заниматься ничем другим. Мне хотелось, чтобы это было больше похоже на поручение задачи своему коллеге.
Создатели GitHub Copilot coding agent поняли это достаточно быстро. По пути в магазин, на работу, на вечеринку или просто на прогулке, меня посещает мысль - я закидываю её в агента и в свободную минуту могу посмотреть результат, даже с телефона.
Вот это реально экономит время и позволяет больше эксперементировать!😺
И тут я вспоминаю про Copilot в GitHub. Проверил - он доступен с телефона. Думаю: “Дай-ка напишу ему, пусть скажет насколько это вписывается в текущий проект”. А он в ответ предлагает создать Pull Request.
o_O ничоси
Попросил его сделать easy mode для
Самое классное, что я понимаю по итогу, что я получаю в проекте, и контролирую, что туда попадает. Ревью как ни как.
До этого я использовал Github Copilot в режиме Agent. Он помогает со всеми делами (жаль не по дому) в VS Code
У него есть контекст проекта - умеет читать README (для него можно даже писать специальные инструкции в `.github/copilot-instructions.md`), может создать тесты, запустить что-нибудь в терминале, поревьюить, или написать логику.
Это вызывало огромный дискомфорт, поскольку это занятие не высвобождает свободное время - приходится постоянно переписываться и смотреть, что он делает. И главное, я в это время не могу заниматься ничем другим. Мне хотелось, чтобы это было больше похоже на поручение задачи своему коллеге.
Создатели GitHub Copilot coding agent поняли это достаточно быстро. По пути в магазин, на работу, на вечеринку или просто на прогулке, меня посещает мысль - я закидываю её в агента и в свободную минуту могу посмотреть результат, даже с телефона.
Вот это реально экономит время и позволяет больше эксперементировать!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ссылка на Github Copilot coding agent
https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent
Накидайте лайков, если эта тема интересна. Могу про схожее ещё написать😉
https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent
Накидайте лайков, если эта тема интересна. Могу про схожее ещё написать
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub Docs
GitHub Copilot coding agent - GitHub Docs
Find out how Copilot can work on GitHub issues and raise pull requests for you to review.
❤2