Kotlin Adept Notes @kotlin_adept Channel on Telegram

Kotlin Adept Notes

@kotlin_adept


Канал о разработке на Kotlin и обо всем, что с ним связано
По всем вопросам и рекламе: @ajiekcx

Kotlin Adept Notes (Russian)

Добро пожаловать на канал Kotlin Adept Notes! Если вы увлечены разработкой на Kotlin или интересуетесь этим языком программирования, то вы попали по адресу. Здесь вы найдете полезные заметки, советы, и новости о Kotlin, а также многое другое, что поможет вам стать настоящим экспертом в этой области. Наша цель - поделиться знаниями и опытом, чтобы помочь вам расти и развиваться в мире программирования. Не упустите возможность быть в курсе всех последних тенденций и инноваций в области разработки на Kotlin. Присоединяйтесь к нам прямо сейчас! Для всех вопросов и предложений по рекламе обращайтесь к администратору канала @ajiekcx. Будем рады видеть вас в нашем сообществе Kotlin Adept Notes!

Kotlin Adept Notes

05 Dec, 15:26


Как подключить KMP в iOS проект без CocoaPods

Я задумался об этом еще в прошлом году и подключил всё, как описано в инструкции. Но как только в Xcode-проекте появились кастомные конфигурации, начало происходить нечто странное...

Проект продолжал компилироваться, но при этом все новые изменения в общем коде перестали отображаться в Xcode. А если почистить кеш, то и вовсе выводилась ошибка: "No such module Shared". Я поспрашивал в чате, сталкивался ли кто-то с подобной проблемой, но узнал лишь, что с CocoaPods всё работает хорошо. Поэтому я просто забил и перешел на CocoaPods, думая, что, если проблема есть, её наверняка исправят 🔥

Однако CocoaPods стали deprecated, и вся наша iOS-команда уже давно мигрировала на SPM. Представьте лица iOS-разработчиков, к которым вы не только притащили KMP, но еще и хотите заставить их вернуться на CocoaPods 👍

Поэтому я снова вернулся к этой задаче и, к моему удивлению, спустя год ничего не изменилось: проблема всё ещё присутствует даже на новых версиях. Я стал разбираться и выяснил, что по каким-то причинам Xcode визуально подтягивает только фреймворк по пути build/xcode-frameworks/debug. Но путь для сборки фреймворка меняется, как только появляются кастомные конфигурации, и отвечает за это переменная окружения CONFIGURATION.

Тут я подумал: а зачем нам вообще разделять на разные папки для каждой конфигурации? В любом случае каждую конфигурацию мы маппим в Debug или Release build type с помощью переменной KOTLIN_FRAMEWORK_BUILD_TYPE.

Поэтому я для себя сделал следующий workaround. В Build Phase в Xcode, где собирается Kotlin-фреймворк, нужно переопределить переменную окружения конфигурации:


export CONFIGURATION=$KOTLIN_FRAMEWORK_BUILD_TYPE
cd "$SRCROOT/.."
./gradlew :shared:embedAndSignAppleFrameworkForXcode


Таким образом, для всех конфигураций, которые маппятся в Debug, всё будет работать, а для релизных конфигураций нам важнее успешная сборка, нежели подсветка кода в Xcode.

Официального ответа по этому issue я всё ещё не получил, поэтому поддержите лайком, чтобы команда JetBrains заметила и дала официальные рекомендации.

#KMP #Xcode #iOS
@kotlin_adept

Kotlin Adept Notes

28 Nov, 10:24


Тем временем я вернулся на проект с KMP для JS, и вот так выглядит загрузка файлов...

Kotlin Adept Notes

28 Nov, 06:31


SwiftExport

Вчера вышел Kotlin 2.1, и мы стали еще на один шаг ближе к тому, чтобы отказаться от прослойки с Objective-C хедерами и использовать скомпилированный Kotlin-код напрямую в Swift 😎

Но интересно даже не это — теперь, наконец, станет возможным разделять код на разные модули для Swift. Раньше все фичи, использующие KMP, могли обращаться к любой его части, а теперь это можно инкапсулировать.

🐱 Посмотреть пример кода можно здесь.

P.S. Я же очень жду возможность использования нескольких KMP библиотек в одном Swift проекте без создания umbrella модуля, чтобы была возможность переиспользовать рантайм Kotlin Native и общие библиотеки.

#KMP #Swift
@kotlin_adept

Kotlin Adept Notes

23 Nov, 07:25


Написал небольшую статью о рефакторинге архитектуры приложения с запутанной логикой.

По итогу получилось значительно  упростить логику приложения и повысить надёжность. В этом помогли корутины, а точнее их не совсем стандартное применение.

Приятного чтения 📖

#Architecture #Coroutines
@kotlin_adept

Kotlin Adept Notes

20 Nov, 08:51


Конференция по системному ПО, железу, Linux и open source  — OS DevConf от SberDevices

5 декабря | 11:00 | онлайн и офлайн в Москве

Приглашаем всех, кто в low-level — разработчиков системного и встраиваемого ПО, специалистов по разработке ядра и драйверов, специалистов по SoC, сетевых инженеров.

В программе — 17 выступлений. Вы услышите про:
— Инструмент DORSECC для обработки событий и выполнения сопрограмм без использования ОС — доклад от Петра Минина, архитектора системы валидации банкнот BVS.
— Опыт работы в QEMU, прототипирования SoC и запуска AOSP на FPGA-прототипах.
— Драйверы на Rust и управление памятью в них, слои абстракции и выбор между прошивками.
— Безопасность в системной разработке, обновления embedded-устройств, трассировку и решение бинарной несовместимости.
— NAND, сетевые решения с DPDK, DMA Engine API и безопасность при работе с ядром Linux.

Полная программа и регистрация — на сайте конференции.

Реклама. ПАО Сбербанк. ИНН 7707083893

Kotlin Adept Notes

11 Nov, 15:56


Мы в команде недавно подняли свой сервис автоматизации на Kotlin и реализовали там много всяких полезных штук:

🟣 Интеграция YouTrack и GitLab для автоматического перевода тасок в актуальное состояние и заполнения данных
🟣 Напоминание о забытых ревью
🟣 Уведомления о релизах
🟣 И другие полезные мелочи

🔖 Подробнее о наших процессах и как мы делали такой сервер читайте в статье.

〰️ И пишите в комментарии какие must have автоматизации есть в ваших процессах

#Kotlin #Ktor #Server
@kotlin_adept

Kotlin Adept Notes

07 Nov, 17:54


Live stream finished (1 hour)

Kotlin Adept Notes

07 Nov, 16:00


Live stream started

Kotlin Adept Notes

07 Nov, 16:00


Live stream scheduled for

Kotlin Adept Notes

07 Nov, 15:50


Начинаем через 10 минут

Kotlin Adept Notes

07 Nov, 07:00


🔔 Напомню, что сегодня в 19:00 мск пройдет стрим, где будут два интересных доклада. Подробнее здесь.

🤖🍏 Доклады будут полезны как Android, так и iOS разработчикам.

Так что приходите посмотреть доклады, пообщаться в чате с другими участниками, задать вопросы спикерам, ну и просто с пользой провести время 😉

Kotlin Adept Notes

05 Nov, 10:38


Адаптивный 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

Kotlin Adept Notes

01 Nov, 16:58


⚡️ Новость для тех, кто пишет на React Native

Теперь можно присоединиться к разработчикам iOS, Android, Unity и Flutter, которые повышают доход от рекламы с помощью Яндекса. Вот почему советую эту рекламную сеть:

Удобство
👉Простая интеграция рекламного SDK, техподдержка 24/7 и регулярные выплаты.

База рекламодателей
👉 Можно показывать объявления от 300 000 прямых рекламодателей Яндекса и 60+ сторонних источников рекламы.

Лучшие предложения
👉 Платформа медиации Яндекса показывает самую выгодную цену за рекламу позволяя подключить до 15 рекламных сетей.

К РСЯ уже подключены более 15 000 приложений, чьи разработчики зарабатывают на рекламе. Узнать больше и стать одним из них можно по ссылке.

Kotlin Adept Notes

31 Oct, 15:11


🎥 Рад анонсировать первый онлайн-митап на этом канале, в программе будут два доклада:

🔸 Данил Колесников покажет концептуально новый подход к навигации, где есть всего две команды: open и close. И расскажет о том, как это работает на основе декларации иерархии экранов, алгоритмам поиска в деревьях, а также Decompose.

🔸 Алексей Панов расскажет про отличия двух декларативных UI-фреймворков: Compose и SwiftUI, разберет как они устроены под капотом и сравнит основные концепции.

📍 Стрим будет проходить в Толке, а также параллельно в этом telegram-канале. Лучше подключаться через Толк, так как можно будет задать вопросы спикерам в прямом эфире.

🗓 Начинаем 7 ноября в 19:00 мск.

Прийти на стрим могут все желающие, записи стрима не будет, так что не пропустите!

Kotlin Adept Notes

30 Oct, 15:46


Сегодня на ревью прислали нижний код. Это вообще законно?

Kotlin Adept Notes

29 Oct, 06:26


SQLDelight vs Exposed

Для моего бека на Ktor нужно было выбрать ORM для реляционной БД и я решил посмотреть на решение от JetBrains под названием Exposed.

Библиотека довольно интересная, но сильно непривычная, так как с SQL вообще не нужно контактировать, поверх него написан свой dsl на Kotlin, который не такой уж интуитивный и без документации никакой более менее сложный запрос не напишешь. Однако там хотя бы можно из коробки создавать таблицы, в отличие от SQLDelight, но при этом в Exposed напрочь отсутствует поддержка миграций.

Поэтому я решил сделать небольшое сравнение в изображении к этому посту 👆

По итогу я все же выбрал SQLDelight в связке с Flywave для миграций и HikariCP для соединения с БД, так как этот инструмент уже привычный и его более чем достаточно для моих целей.

А что выбрали бы вы?

#SQLDelight #Exposed #ORM #Kotlin
@kotlin_adept

Kotlin Adept Notes

22 Oct, 14:06


Обзор 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

Kotlin Adept Notes

19 Oct, 08:37


Сегодня буду выступать на Mobius с докладом про отличия Compose и SwiftUI.

В докладе сравним следующие моменты:
🟣Принцип работы под капотом
🟣Стейт и жизненный цикл
🟣Система модификаторов
🟣Корутины в UI
🟣Подход к анимациям

Если вы на площадке, то приходите во второй зал в 12:15 мск или подключайтесь онлайн, если у вас есть билет на Mobius.

До встречи 🤝

Kotlin Adept Notes

11 Oct, 05:28


Стартует конференция Mobius и сегодня Community day, поэтому можно бесплатно посмотреть некоторые доклады.

Приходите послушать интересный доклад Kotlin in GitHub Actions. Расширяем горизонты KMP от Макса Качинкина.

Я там тоже буду присутствовать в качестве "эксперта", так что до встречи 🤝

Kotlin Adept Notes

06 Oct, 14:31


Коллега из Контура, Василий Рылов, поделился архитектурным примером 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

Kotlin Adept Notes

04 Oct, 08:51


Пока готовился к докладу, нашел неплохой репозиторий с набором разных анимаций для Compose Multiplatform.

Там вы найдете множество разных примеров:
🟣Анимации заставок разных приложений (Netflix, Twitter, GitHub, Slack и др.)
🟣Кастомный pull-to-refresh
🟣Анимация горения свечи
🟣Упоротая сова из Duolingo

А если вы iOS разработчик, то вот вам еще более классный репозиторий с кучей красивых анимаций для SwiftUI 💅

#Animation #Compose #KMP #SwiftUI
@kotlin_adept

Kotlin Adept Notes

26 Sep, 18:09


В публичный доступ опубликовали воркшоп от Павла Стрельченко по созданию плагинов для любых IDE от JetBrains 👩‍💻

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

💡 Почерпнуть идеи для плагинов и автоматизаций
🔮 Понять как мыслить при работе с незнакомым кодом
🐞 Увидеть как эффективно работать с дебаггером
✏️ Услышать полезные советы и многое другое

Приятного просмотра

#Plugins #Kotlin #IDE
@kotlin_adept

Kotlin Adept Notes

25 Sep, 08:20


🔥 Самые нужные каналы для Kotlin разработчика, чтобы расти в доходе 💸

• Kotlin | Вопросы собесов
• Kotlin | LeetCode
• Kotlin | Тесты
• Kotlin | Удалёнка

Подпишись, чтобы не потерять ☝️

#Реклама

Kotlin Adept Notes

24 Sep, 19:19


Перевернутые модификаторы

Неудивительно, что Android и iOS разработчики часто не могут найти общий язык, ведь у них (у нас) все перевернуто с ног на голову 🇦🇺

Это касается и модификаторов в декларативных UI фреймворках. На картинке видно, что цепочка из одинаковых модификаторов для Compose и SwiftUI дают один и тот же результат, при этом располагаясь в обратном порядке.

➡️ В Compose первый модификатор size задает минимальные и максимальные констрейнты и мы не можем выйти за эти ограничения, не переопределяя их.

➡️ В SwiftUI таких ограничений нет и там всегда padding применяется во вне, что может быть даже удобнее, так как не приходится об этом задумываться.

🗓 Но к чему я это все? На ближайшей конференции Мобиус буду рассказывать доклад, где сравню ключевые отличия обоих фреймворков, и если тема интересна, то буду рад видеть всех на докладе 😉

#Compose #SwiftUI
@kotlin_adept

Kotlin Adept Notes

16 Sep, 10:51


Как вкатиться в KMP без MacOs

Сегодня, слушая доклад Никиты Куликова на Podlodka Android Crew, получил для себя интересный инсайт.

Довольно часто видел вопросы в стиле, как мне вкатиться в Kotlin Multiplatform, если под рукой нет мака? Ведь на другой ОС запустить приложение под iOS не выйдет.

Решение довольно интересное, GitHub предоставляет вам бесплатное и безлимитное использование разных раннеров для Open source проектов, в том числе и на MacOs, соответственно вы можете собирать iOS проекты на CI и затем тестировать их на iPhone, если он у вас конечно есть🙃

Если хотите больше таких инсайтов и интересных обсуждений с разными экспертами, то вы ещё успеваете залететь на конференцию со скидкой по промокоду android_crew_12_o1TLih 😉

#KMP
@kotlin_adept

Kotlin Adept Notes

13 Sep, 19:49


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, где опишем некоторые параметры:

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/")
}


💡 Как видите, делается это довольно сложно, поэтому не рекомендую использовать сторонние iOS библиотеки в Kotlin коде, лучше в общем коде сделать интерфейс, а реализацию оставить нативной на каждой платформе.

А еще если в iOS проекте уже использовалась эта библиотека, но другой версии, то все конечно же развалится 😂

#KMP #Kotlin #iOS
@kotlin_adept

Kotlin Adept Notes

07 Sep, 06:59


🎁 Розыгрыш билета на Podlodka Android Crew

Продолжим череду розыгрышей на канале, мы с ребятами подготовили для вас очередной сезон Podlodka Android Crew про автоматизацию разработки.

Удалось собрать сильных спикеров и интересную программу, но думаю вы и без меня уже видели кучу рекламы в каналах, поэтому повторяться не буду. Перейдем сразу к делу, и разыграем билет на конференцию.

От вас всего два условия:
1. Быть подписанным на канал @kotlin_adept
2. Написать любой комментарий про автоматизацию разработки. Может есть что-то, что надоело делать вручную или, наоборот, вы что-то уже автоматизировали 💬

Победителя выберем рандомно среди всех, кто выполнил условия, и подведем итоги 14 сентября.

Ну а те, кто не верит в фортуну, ловите промокод на скидку: android_crew_12_o1TLih 🤦‍♂️

Kotlin Adept Notes

03 Sep, 15:41


Поздравляю победителя, но никому не советую разыгрывать Telegram Premium, если вы вдруг собирались.

По итогу пришлось забанить 195 ботов в канале 😀 и сделать на сегодня канал частным, чтобы не налетело ещё больше ботов на розыгрыш.

Очень странно, что ТГ сам не умеет отсеивать ботов, в целом там довольно понятные паттерны как их можно определять🤔

Kotlin Adept Notes

01 Sep, 11:31


Топ 4 незаметных бага при смене стека

Помните я похвастался, что переписал проект с RX на корутины без багов? Так вот я соврал 😼

Ну или не совсем, так как баги не связаны напрямую с асинхронщиной, поэтому давайте посмотрим на топ незаметных багов при смене стека технологий.

1️⃣ Переходя с Rx на корутины у вас может сломаться Retrofit, при этом только для специфичных кейсов, когда в ответе приходит код 204, Retrofit начинает воспринимать успешный ответ как ошибку из-за отсутствия Body.

2️⃣ Переходя с Retrofit на Ktor проверьте все экстеншены для определения сетевых ошибок, зависимость на OkHttp у вас останется, но работать экстеншены перестанут так как исключение уже будет не HttpException, а ResponseException.

3️⃣ А также проверьте места, где возвращается Response, а не Body, в Retrofit это всегда успешная операция вне зависимости от ответа, в Ktor же это будет ошибкой, если выставлен флаг expectSuccess.

4️⃣ При переходе с GSON на KotlinxSerialization убедитесь, что все опциональные поля моделей помечены nullable и имеют дефолтное значение, так как GSON мог засунуть null даже в non-nullable поле и все могло работать, если к этому полю не обращаться.

💭 А какие незаметные баги просачивались у вас при рефакторинге стека технологий?

#Android #Kotlin
@kotlin_adept

Kotlin Adept Notes

27 Aug, 15:34


Канал незаметно перевалил за тысячу подписчиков 🎉

Спасибо, что читаете мои редкие записки!

В честь этого давайте разыграем Telegram Premium (поддержим Пашу и я смогу редактировать оформление канала 👏), а также чуть позже будет розыгрыш билета на следующий сезон Podlodka Android Crew, так что stay tuned 🎩

1,405

subscribers

31

photos

4

videos