Kotlin Adept Notes
Поздравляю победителя, но никому не советую разыгрывать Telegram Premium, если вы вдруг собирались.
По итогу пришлось забанить 195 ботов в канале😀 и сделать на сегодня канал частным, чтобы не налетело ещё больше ботов на розыгрыш.
Очень странно, что ТГ сам не умеет отсеивать ботов, в целом там довольно понятные паттерны как их можно определять🤔
По итогу пришлось забанить 195 ботов в канале
Очень странно, что ТГ сам не умеет отсеивать ботов, в целом там довольно понятные паттерны как их можно определять🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔23👍5❤2🔥1😱1
Продолжим череду розыгрышей на канале, мы с ребятами подготовили для вас очередной сезон Podlodka Android Crew про автоматизацию разработки.
Удалось собрать сильных спикеров и интересную программу, но думаю вы и без меня уже видели кучу рекламы в каналах, поэтому повторяться не буду. Перейдем сразу к делу, и разыграем билет на конференцию.
От вас всего два условия:
1. Быть подписанным на канал @kotlin_adept
2. Написать любой комментарий про автоматизацию разработки. Может есть что-то, что надоело делать вручную или, наоборот, вы что-то уже автоматизировали
Победителя выберем рандомно среди всех, кто выполнил условия, и подведем итоги 14 сентября.
Ну а те, кто не верит в фортуну, ловите промокод на скидку: android_crew_12_o1TLih
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
Автоматизации в умном доме
Раз астрологи объявили неделю автоматизации, хочется немного пооффтопить на тему умного дома и поделиться с вами крутым девайсом (не реклама).
Тема уже не нова, но я недавно сделал ремонт и наконец-то настроил себе умный дом, который всегда хотел🕺 поэтому хочу поделиться с вами мыслями.
Собрать умный дом можно на базе чего угодно:
1️⃣ Использовать HomeAssistant, с ним можно сделать все что угодно, но все в коде.
2️⃣ Использовать готовые экосистемы вроде Aqara, тут все просто с настройкой, но ограничены линейкой устройств и никаких гибких кастомизаций.
💟 Я выбрал что-то среднее, а именно SprutHub, это универсальный хаб, который поддерживает большое количество устройств и позволяет делать сценарии с помощью блоков, но при этом очень гибко, как не позволяют Aqara и умный дом от Яндекса.
Давайте рассмотрим пример освещения в ванной. Базовый сценарий простой, мы хотим, чтобы свет горел, пока кто-то есть в ванной.
Для этого потребуется как минимум умный выключатель и два датчика: движения и присутствия.
🔵 Датчик движения быстро срабатывает при обнаружении движения и не имеет ложных срабатываний, но также быстро теряет движение, если оно малозаметное.
🔵 Датчик присутствия, наоборот, хорошо держит присутствие, но может ложно срабатывать на стиралку или сушилку.
То есть свет включается по датчику движения, а отключается по датчику присутствия.
☹️ Хотелось бы сказать, что все работает как часы, но датчики тоже не идеальны и могут сбоить, поэтому можно сделать ещё дополнительный сценарий с датчиком закрытия двери:
🔵 Если закрыли дверь и по датчику присутствия мы какое-то время находились в помещении, то чтобы выйти нам нужно снова открыть дверь, а значит до этого момента можно смело отключить предыдущий сценарий с датчиками.
А что если вы хотите днём включать свет, а вечером подсветку? Это все можно настроить внутри SprutHub, поэтому смело рекомендую эту экосистему, если соберётесь делать умный дом👍
Если у вас есть вопросы по умному дому, смело оставляйте комментарии💬
#Offtop #SmartHome
@kotlin_adept
Раз астрологи объявили неделю автоматизации, хочется немного пооффтопить на тему умного дома и поделиться с вами крутым девайсом (не реклама).
Умный дом – это не голосовое управление, умный дом – это автоматизации
Тема уже не нова, но я недавно сделал ремонт и наконец-то настроил себе умный дом, который всегда хотел
Собрать умный дом можно на базе чего угодно:
Давайте рассмотрим пример освещения в ванной. Базовый сценарий простой, мы хотим, чтобы свет горел, пока кто-то есть в ванной.
Для этого потребуется как минимум умный выключатель и два датчика: движения и присутствия.
То есть свет включается по датчику движения, а отключается по датчику присутствия.
А что если вы хотите днём включать свет, а вечером подсветку? Это все можно настроить внутри SprutHub, поэтому смело рекомендую эту экосистему, если соберётесь делать умный дом
Если у вас есть вопросы по умному дому, смело оставляйте комментарии
#Offtop #SmartHome
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤2👍1
iOS библиотеки в Kotlin коде
Не все знают, что в KMP мы не только можем скомпилировать Kotlin код в iOS фреймворк, но и, наоборот, использовать сторонние iOS библиотеки в Kotlin коде.
▶️ Например, есть две нативные библиотеки под Android и iOS, и вы хотите объединить их в одну KMP библиотеку и сделать все на Kotlin, тогда у вас есть два пути:
1️⃣ Использовать cocoapods (сторонний менеджер зависимостей в iOS), тогда подключение iOS фреймворка делается в одну строчку кода
2️⃣ Подключать фреймворк вручную, но тут все намного сложнее
Проблема cocoapods в том, что недавно их перевели в режим поддержки и большинство iOS разработчиков мигрируют свои зависимости на официальное решение SPM (Swift Package Manager), поэтому пойдем по второму пути и подключим iOS framework вручную:
1. Необходимо создать файл с расширением .def, где опишем некоторые параметры:
2. В build.gradle вашей библиотеки необходимо добавить конфигурацию для создания klib из фреймворка с помощью cinterop🤯 :
Сделать это необходимо для всех iOS таргетов❗️ Также как и в следующем шаге.
3. В build.gradle файле, где будете собирать итоговый фреймворк для iOS нужно прилинковать тот же фреймворк:
💡 Как видите, делается это довольно сложно, поэтому не рекомендую использовать сторонние iOS библиотеки в Kotlin коде, лучше в общем коде сделать интерфейс, а реализацию оставить нативной на каждой платформе.
❌ А еще если в iOS проекте уже использовалась эта библиотека, но другой версии, то все конечно же развалится 😂
#KMP #Kotlin #iOS
@kotlin_adept
Не все знают, что в KMP мы не только можем скомпилировать Kotlin код в iOS фреймворк, но и, наоборот, использовать сторонние iOS библиотеки в Kotlin коде.
Проблема cocoapods в том, что недавно их перевели в режим поддержки и большинство iOS разработчиков мигрируют свои зависимости на официальное решение SPM (Swift Package Manager), поэтому пойдем по второму пути и подключим iOS framework вручную:
1. Необходимо создать файл с расширением .def, где опишем некоторые параметры:
language = Objective-C
modules = YourFrameworkName
package = YourFrameworkName
2. В build.gradle вашей библиотеки необходимо добавить конфигурацию для создания klib из фреймворка с помощью cinterop
KotlinNativeTarget.compilations.getByName("main") {
val YourFramework by cinterops.creating {
defFile = project.file("src/nativeInterop/cinterop/YourFramework.def")
compilerOpts("-framework", "YourFramework", "-F${projectDir}/../YourFramework.xcframework/$frameworkArch/")
compilerOpts("-fmodules")
}
}
Сделать это необходимо для всех iOS таргетов
3. В build.gradle файле, где будете собирать итоговый фреймворк для iOS нужно прилинковать тот же фреймворк:
KotlinNativeTarget.binaries.all {
linkerOpts("-framework", "YourFramework", "-F${projectDir}/../YourFramework.xcframework/$frameworkArch/")
}
#KMP #Kotlin #iOS
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
😍9👍8
Как вкатиться в KMP без MacOs
Сегодня, слушая доклад Никиты Куликова на Podlodka Android Crew, получил для себя интересный инсайт.
Довольно часто видел вопросы в стиле, как мне вкатиться в Kotlin Multiplatform, если под рукой нет мака? Ведь на другой ОС запустить приложение под iOS не выйдет.
Решение довольно интересное, GitHub предоставляет вам бесплатное и безлимитное использование разных раннеров для Open source проектов, в том числе и на MacOs, соответственно вы можете собирать iOS проекты на CI и затем тестировать их на iPhone, если он у вас конечно есть🙃
Если хотите больше таких инсайтов и интересных обсуждений с разными экспертами, то вы ещё успеваете залететь на конференцию со скидкой по промокоду android_crew_12_o1TLih😉
#KMP
@kotlin_adept
Сегодня, слушая доклад Никиты Куликова на Podlodka Android Crew, получил для себя интересный инсайт.
Довольно часто видел вопросы в стиле, как мне вкатиться в Kotlin Multiplatform, если под рукой нет мака? Ведь на другой ОС запустить приложение под iOS не выйдет.
Решение довольно интересное, GitHub предоставляет вам бесплатное и безлимитное использование разных раннеров для Open source проектов, в том числе и на MacOs, соответственно вы можете собирать iOS проекты на CI и затем тестировать их на iPhone, если он у вас конечно есть
Если хотите больше таких инсайтов и интересных обсуждений с разными экспертами, то вы ещё успеваете залететь на конференцию со скидкой по промокоду android_crew_12_o1TLih
#KMP
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Шаблонный код в пару кликов
Коллега из Контура, Евгений Мельцайкин, поделился Geminio шаблонами для генерации boilerplate кода.
В репозитории вы найдете несколько полезных примеров, которые сможете смело переиспользовать в своем проекте:
🔸 Шаблон для создания Data и Domain слоя
🔸 Шаблон для создания Compose экрана
🔥 Шаблон для создания Decompose компонента + MviKotlin
🌟 Давайте накинем звёздочек в репозиторий этому джентльмену 😊
#Kotlin #Decompose #MviKotlin
@kotlin_adept
Коллега из Контура, Евгений Мельцайкин, поделился Geminio шаблонами для генерации boilerplate кода.
Geminio – это плагин от HeadHunter для генерации кода из freemarker-ных шаблонов.
В репозитории вы найдете несколько полезных примеров, которые сможете смело переиспользовать в своем проекте:
#Kotlin #Decompose #MviKotlin
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥8👎1
Перевернутые модификаторы
Неудивительно, что Android и iOS разработчики часто не могут найти общий язык, ведь у них (у нас) все перевернуто с ног на голову 🇦🇺
Это касается и модификаторов в декларативных UI фреймворках. На картинке видно, что цепочка из одинаковых модификаторов для Compose и SwiftUI дают один и тот же результат, при этом располагаясь в обратном порядке.
➡️ В Compose первый модификатор size задает минимальные и максимальные констрейнты и мы не можем выйти за эти ограничения, не переопределяя их.
➡️ В SwiftUI таких ограничений нет и там всегда padding применяется во вне, что может быть даже удобнее, так как не приходится об этом задумываться.
🗓 Но к чему я это все? На ближайшей конференции Мобиус буду рассказывать доклад, где сравню ключевые отличия обоих фреймворков, и если тема интересна, то буду рад видеть всех на докладе 😉
#Compose #SwiftUI
@kotlin_adept
Неудивительно, что Android и iOS разработчики часто не могут найти общий язык, ведь у них (у нас) все перевернуто с ног на голову 🇦🇺
Это касается и модификаторов в декларативных UI фреймворках. На картинке видно, что цепочка из одинаковых модификаторов для Compose и SwiftUI дают один и тот же результат, при этом располагаясь в обратном порядке.
#Compose #SwiftUI
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥9❤1😁1🤪1
В публичный доступ опубликовали воркшоп от Павла Стрельченко по созданию плагинов для любых IDE от JetBrains 👩💻
Очень рекомендую глянуть воркшоп, даже если вы не собираетесь разрабатывать плагины, ведь из воркшопа можно вынести много всего полезного, а именно:
💡 Почерпнуть идеи для плагинов и автоматизаций
🔮 Понять как мыслить при работе с незнакомым кодом
🐞 Увидеть как эффективно работать с дебаггером
✏️ Услышать полезные советы и многое другое
Приятного просмотра✅
#Plugins #Kotlin #IDE
@kotlin_adept
Очень рекомендую глянуть воркшоп, даже если вы не собираетесь разрабатывать плагины, ведь из воркшопа можно вынести много всего полезного, а именно:
Приятного просмотра
#Plugins #Kotlin #IDE
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Пока готовился к докладу, нашел неплохой репозиторий с набором разных анимаций для Compose Multiplatform.
Там вы найдете множество разных примеров:
🟣 Анимации заставок разных приложений (Netflix, Twitter, GitHub, Slack и др.)
🟣 Кастомный pull-to-refresh
🟣 Анимация горения свечи
🟣 Упоротая сова из Duolingo
А если вы iOS разработчик, то вот вам еще более классный репозиторий с кучей красивых анимаций для SwiftUI💅
#Animation #Compose #KMP #SwiftUI
@kotlin_adept
Там вы найдете множество разных примеров:
А если вы iOS разработчик, то вот вам еще более классный репозиторий с кучей красивых анимаций для SwiftUI
#Animation #Compose #KMP #SwiftUI
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25😍1
Коллега из Контура, Василий Рылов, поделился архитектурным примером KMP проекта 🔥
В репозитории вы найдете пример приложения построенного по следующим принципам:
🟣 Каждая фича представлена группой модулей: feature-component, feature-domain, feature-ui и feature-data
🟣 Комбинация FSM-based MVI и MVVM+ подхода с простой небиблиотечной ViewModel
🟣 Навигация абстрагирована от Decompose, Decompose компоненты выделены в собственные модули
🟣 Многомодульный DI, каждый модуль может использовать собственную реализацию DI
В примере использованы библиотеки:
🔵 Multiplatform Room
🔵 Multiplatform Settings
🔵 Decompose
🔵 Compose Multiplatform
🔵 Варианты с Kotlin-inject и Koin DI
#KMP #Decompose #Sample
@kotlin_adept
В репозитории вы найдете пример приложения построенного по следующим принципам:
В примере использованы библиотеки:
#KMP #Decompose #Sample
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
Веб – это скам
Мобильный разработчик решил сделать веб-приложение, что могло пойти не так?
Контекст: мне нужно было сделать простое веб-приложение, в котором нужно дёрнуть пару запросов из апишки, предварительно получив токен аутентификации. Очень простая задача для мобильного разработчика.
Итак я расчехлил Compose Multiplatform для JS, начал работу и сразу же огреб
Нужно редиректить на страницу аутентификации, а как это вообще сделать? Документация по KMP в JS оставляет желать лучшего, но благо ChatGPT тут помог и говорит, что мы можем просто использовать js подобный код в main функции, поэтому делаем так:
window.location.href = "your_url"
Ок, с этим разобрались, переходим на страницу входа и говорим, что хотим после успешного входа вернуться обратно в наше приложение, но ничего не работает, так как есть whitelist доменов, на которые можно возвращаться.. Поэтому идём в etc/hosts и прописываем другой домен заместо localhost.
Редирект заработал и после успешного логина в браузере проставляется кука, и я хочу ее прочитать в приложении, чтобы авторизовать запросы в апишку, но не тут то было, эту куку нельзя читать в js
Я думаю ок, токен можно и другими способами достать, пробуем дёрнуть запрос к апишке сервиса и получаем пинок от CORS. Браузер запрещает вам дергать произвольные апишки, если сервер, на который вы стучитесь не настроил корректные политики.
Тут моя жопа окончательно сгорела и я понял, что без своего бека, который тупо будет проксировать запросы к другому апи не обойтись
Поэтому в очередной раз убедился, что никакая кроссплатформа не избавляет вас от знания особенностей среды выполнения!
А про приключения мобильного разработчика в бекенде читайте в следующей серии
#KMP #JS #WEB
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
😁35🔥8👍6😍5🙉3 3
Сегодня буду выступать на Mobius с докладом про отличия Compose и SwiftUI.
В докладе сравним следующие моменты:
🟣 Принцип работы под капотом
🟣 Стейт и жизненный цикл
🟣 Система модификаторов
🟣 Корутины в UI
🟣 Подход к анимациям
Если вы на площадке, то приходите во второй зал в 12:15 мск или подключайтесь онлайн, если у вас есть билет на Mobius.
До встречи 🤝
В докладе сравним следующие моменты:
Если вы на площадке, то приходите во второй зал в 12:15 мск или подключайтесь онлайн, если у вас есть билет на Mobius.
До встречи 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33👍7
Обзор Mobius 2024 Autumn
Давайте уже по традиции сделаем обзор докладов с прошедшего Mobius, напишу свой личный топ докладов, которые удалось посмотреть:
Последнее слово в Android-навигации
🔵 Отличная подача и повествование, очень красивая и проработанная презентация, интересный подход к навигации, чтобы свести ее к вызову двух методов open/close и уменьшить бойлерплейт.
🔸 Однако не факт, что такой подход подойдет именно вам, у него есть свои ограничения и очень не хватило реального примера, где все это можно опробовать.
Совместная работа Kotlin/Native GC и ARC в iOS
🔵 Хороший, а главное понятный доклад, чтобы узнать каким образом происходит интероп между двумя моделями памяти в Swift и Kotlin Native, в каких случаях в игру будет вступать ARC, а когда Kotlin Native GC
🔸 Доклад безусловно хорош для общего развития, но вряд ли вам эти знания пригодятся на практике.
Танцы вокруг дерева семантики
🔵 Интересный доклад про проблемы UI-тестирования в Compose и недостатки API в Kakao/Kaspresso, а также о том, как эти недостатки можно исправить.
🔸 Для людей незнакомых с UI-тестированием в Compose может быть сложен для восприятия.
Опасности в Android: уязвимости и защитные меры
🔵 Хороший обзор частых уязвимостей в Android и как от них защититься, что-то я уже знал, с чем-то сталкивался на практике, а что-то было в новинку.
🔸 Но большинство уязвимостей неактуальны на новых API и если нельзя открыть произвольный URL в приложении.
Как проводить собеседования интересно и продуктивно
🔵 Классный доклад о том, как превратить собеседование из экзамена в живое общение, а также возможность вспомнить о чем спрашивают на большинстве собеседований и сделать пометки, что еще стоит подучить.
🔸 В целом уже не новый подход, мы у себя в компании уже давно стараемся проводить собеседования в формате диалога без заготовленного списка вопросов, но заместо кучи этапов сжали все это в одно собеседование.
🫠 На этом все, если хотите, чтобы я написал выжимку каких-либо докладов в посте, пишите в комментарии интересующий доклад ⬇️
#Mobius
@kotlin_adept
Давайте уже по традиции сделаем обзор докладов с прошедшего Mobius, напишу свой личный топ докладов, которые удалось посмотреть:
Последнее слово в Android-навигации
Совместная работа Kotlin/Native GC и ARC в iOS
Танцы вокруг дерева семантики
Опасности в Android: уязвимости и защитные меры
Как проводить собеседования интересно и продуктивно
#Mobius
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍19
SQLDelight vs Exposed
Для моего бека на Ktor нужно было выбрать ORM для реляционной БД и я решил посмотреть на решение от JetBrains под названием Exposed.
Библиотека довольно интересная, но сильно непривычная, так как с SQL вообще не нужно контактировать, поверх него написан свой dsl на Kotlin, который не такой уж интуитивный и без документации никакой более менее сложный запрос не напишешь. Однако там хотя бы можно из коробки создавать таблицы, в отличие от SQLDelight, но при этом в Exposed напрочь отсутствует поддержка миграций.
Поэтому я решил сделать небольшое сравнение в изображении к этому посту 👆
По итогу я все же выбралSQLDelight в связке с Flyway для миграций и HikariCP для соединения с БД, так как этот инструмент уже привычный и его более чем достаточно для моих целей.
А что выбрали бы вы?
#SQLDelight #Exposed #ORM #Kotlin
@kotlin_adept
Для моего бека на Ktor нужно было выбрать ORM для реляционной БД и я решил посмотреть на решение от JetBrains под названием Exposed.
Библиотека довольно интересная, но сильно непривычная, так как с SQL вообще не нужно контактировать, поверх него написан свой dsl на Kotlin, который не такой уж интуитивный и без документации никакой более менее сложный запрос не напишешь. Однако там хотя бы можно из коробки создавать таблицы, в отличие от SQLDelight, но при этом в Exposed напрочь отсутствует поддержка миграций.
Поэтому я решил сделать небольшое сравнение в изображении к этому посту 👆
По итогу я все же выбрал
А что выбрали бы вы?
#SQLDelight #Exposed #ORM #Kotlin
@kotlin_adept
❤6🔥4👍2
Прийти на стрим могут все желающие, записи стрима не будет, так что не пропустите!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🎉20👍4 2
Рубрика идиоматичный Kotlin. Что вернет выражение listOf(false).any() ?
Anonymous Quiz
54%
true
46%
false
🤝17😁1🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
Адаптивный UI проще, чем кажется
Раньше с Android View, если требовалось поддержать верстку для планшетов, довольно часто просто делали отдельную верстку с нуля, и несмотря на то, что можно было расположить несколько фрагментов на одном экране, это не избавляло от сложностей навигации🥲
Теперь же с приходом Compose и нового api делать адаптивную верстку стало значительно проще. И вот несколько рекомендаций как сделать современный адаптивный UI:
1️⃣ Не используйте флаги вроде isTablet и т.д., используйте window size classes для динамического определения размера окна: Compact, Medium, Expanded
2️⃣ Используйте готовые адаптивные компоненты вроде ListDetailPaneScaffold, SupportingPaneScaffold, NavigationSuiteScaffold
3️⃣ Рассмотрите возможность использования LazyGrid вместо LazyList
4️⃣ Меняйте расположение UI компонентов с помощью BoxWithConstraint и movableContentOf во избежание лишних рекомпозиций
5️⃣ Не блокируйте ориентацию экрана и не отключайте resizeableActivity
6️⃣ Меняйте размер и соотношение сторон у UI компонентов в зависимости от размеров окна
🌳 В Decompose также появилась поддержка адаптивной навигации и благодаря ChildPanels реализовать list-detail навигацию стало очень просто без лишнего бойлерплейта.
А есть ли адаптивная верстка в вашем приложении❓
🫡 — только screenOrientation portrait, только хардкор
😎 — есть адаптивная верстка под любые экраны
#Compose #AdaptiveUI
@kotlin_adept
Раньше с Android View, если требовалось поддержать верстку для планшетов, довольно часто просто делали отдельную верстку с нуля, и несмотря на то, что можно было расположить несколько фрагментов на одном экране, это не избавляло от сложностей навигации
Теперь же с приходом Compose и нового api делать адаптивную верстку стало значительно проще. И вот несколько рекомендаций как сделать современный адаптивный UI:
А есть ли адаптивная верстка в вашем приложении
🫡 — только screenOrientation portrait, только хардкор
😎 — есть адаптивная верстка под любые экраны
#Compose #AdaptiveUI
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🫡55😎6👍5❤🔥2❤1