gram news
Kotlin Adept Notes channel avatar

Kotlin Adept Notes

@kotlin_adept

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

ProjectsRUProgramming

2,410subscribers

Open the Channel

Latest posts

  • Kotlin Adept Notes

    2 Sept, 10:51

    Если вы тоже городили костыли для поддержки смены системной темы внутри Compose Multiplatform-приложения, как описано в документации, то в Compose Multiplatform 1.12.0 проект на iOS просто перестанет компилироваться.Я создал issue по теме и накидал workaround. Проголосуйте за issue, если столкнулись с такой же проблемой.Как считаете, норм ли сносить публичное API, хоть и предназначавшееся для внутреннего использования в минорном обновлении?
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    1,05014653Open in Telegram
  • Kotlin Adept Notes

    18 Aug, 08:57

    ⚡️⚡️Мобильные разработчики снова соберутся на Mobius этой осенью!21–22 октября в Санкт-Петербурге и онлайне пройдет Mobius — конференция JUG Ru Group для мобильных разработчиков. По традиции в фокусе — практические задачи, нативный и кроссплатформенный подходы, архитектура и реальный опыт продуктовых команд.✨Программа уже активно формируется, делимся наиболее интересными докладами:🔹Портирование Android-приложений под HarmonyOS NEXT. Спикер расскажет про автоматизированный перенос с сохранением архитектуры: от преобразования Kotlin-кода в ArkTS до трансляции Jetpack Compose в ArkUI.🔹AI-driven T-shape. Разбор реального опыта команды о том, как искусственный интеллект помогает осваивать соседние платформы и бэкенд, ускоряя развитие инженеров и уменьшая time-to-market.🔹Liquid Glass своими руками на Metal. Анатомия визуального эффекта из iOS 26 и его воссоздание для более старых
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    1,9009311Open in Telegram
  • Kotlin Adept Notes

    10 Aug, 16:22

    Сколько стоит отказ от OpenCVВесь препроцессинг в сканере, о котором я рассказывал в прошлых постах, держится на OpenCV — библиотеке компьютерного зрения, написанной на C++.Нам из неё нужно меньше десятка функций: гомография, ресайз, гауссово размытие, CLAHE, Otsu и другое. Платим за это мы, конечно, размером: библиотека добавляет к APK около 200 МБ 😱Здесь сразу оговорюсь, что это цифра для универсального APK со всеми ABI внутри, и очевидно, что App Bundle столько не весит: на устройство прилетает один ABI из четырёх, то есть пятьдесят мегабайт. Вот только это всё ещё много, так что AAB проблему полноценно не решает.Идея кажется очевидной: функций немного, может быть, переписать всё это на Kotlin и выкинуть зависимость целиком? Благо теперь, в мире AI, это можно сделать почти бесплатно. Как ни странно, по бенчмаркам удалось добиться почти того
    2,250112Open in Telegram
  • Kotlin Adept Notes

    5 Aug, 17:26

    Как читать плохо пропечатанные кодыВ прошлый раз я упомянул, что returnErrors в ZXing подготавливает почву и для других препроцессингов. Сегодня разберём ещё один пример препроцессинга для исправления плохой печати.Речь про коды, у которых модули (те самые чёрные и белые квадратики, из которых состоит DataMatrix) напечатались с разрывами.1️⃣ Первый шаг кажется максимально контринтуитивным: чтобы прочитать код, картинку сначала придётся намеренно испортить. Для этого накладываем гауссово размытие по вертикали, чтобы склеить разорванные модули.2️⃣ Далее уменьшаем изображение методом INTER_AREA, то есть с усреднением по площади, до трёх пикселей на модуль. Всё, что мельче модуля (шум матрицы, зернистость бумаги), просто исчезает, а модуль в три пикселя выживает. Порядок здесь важен: размывать нужно именно до
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    2,380186Open in Telegram
  • Kotlin Adept Notes

    1 Aug, 11:11

    Перспективное отображениеПродолжаю заниматься сканером и хочу поделиться одним интересным инсайтом, как улучшить качество сканирования кодов маркировки.Базовый пайплайн выглядит так:1. Кадр с камеры уходит в детектор (tflite-модель), который находит на нём координаты потенциальных кодов. 2. По каждому боксу вырезается ROI с небольшим паддингом, переводится в grayscale и отдаётся в декодер, например, ZXing.То есть качество сканирования напрямую зависит от качества детектора и декодера. И часто происходит так, что код сфотографирован под углом или наклеен на слегка изогнутую поверхность: детектор такой код находит без проблем, а вот декодер прочитать его уже не может.Чтобы улучшить ситуацию, можно применить так называемое перспективное отображение или гомографию, чтобы скорректировать перспективу и получить изображение кода, как будто снятого в лоб. Чтобы это сделать, достаточно
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    2,2105719Open in Telegram
  • Kotlin Adept Notes

    22 Jul, 07:43

    Как сделать свой SDK для Remote ConfigЕсли вы используете Firebase Remote Config для работы с фиче-флагами, то, возможно, для вас он станет платным, и кто-то начнёт искать альтернативу.Мы, на самом деле, уже давно с него мигрировали на другое стороннее решение из-за высоких рисков блокировки, а теперь полностью переходим на собственный сервис. Хочется поделиться особенностями разработки такого SDK.Начать стоит с выделения фасада с базовыми методами fetch, activate и get<Type> с Timber-подобным API. Тогда вы сможете с лёгкостью заменить одно решение другим.При реализации собственного SDK нужно учесть несколько важных моментов.1. Понадобятся три вида хранилища данных: персистентное для хранения актуальных значений, персистентное для хранения временных значений (после fetch и до activate) и memory cache для моментального получения актуальных значений.2. Нужно хорошо продумать,
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    2,53021Open in Telegram
  • Kotlin Adept Notes

    20 Jul, 10:00

    Новые AI модели и инструменты выходят каждую неделю, городские сумасшедшие хоронят программирование, а кто-то, обложившись сотней агентов, создает супер-успешные проекты. Как с этим жить, решительно непонятно.Чтобы помочь с этим справиться, ребята из подкаста Подлодка запустили закрытое сообщество инженеров, которые уже активно используют AI в работе и хотят делать это системно. Вот кому туда стоит подключиться:👉Если вы хотите просто держать руку на пульсе происходящего в индустрииПодлодка вытаскивает очень крутых экспертов из Uber, xAI, Google, Яндекса, Cursor и других компаний. Они рассказывают, как работают их команды – и вы можете узнать у них то, о чем на конференциях начнут говорить только через год.А в закрытом чате разбирают все важные новости и изменения подходов к разработке. Если нет времени читать – вам приходит дайджест с главными выводами.👉Если вы хотите
  • Kotlin Adept Notes

    18 Jul, 07:50edited

    Страх начать сначалаТри месяца назад я пытался улучшить сканер кодов маркировки на Android, и первый подход не дал мне ровным счётом ничего, что даже загнало меня в некоторую апатию. Тогда пришлось перейти к тяжёлой артиллерии, а именно к написанию кастомного пайплайна на C++ с использованием MediaPipe. Это было то ещё приключение: весь код, разумеется, писался агентами, а я пытался понять, что там вообще происходит 🚬В итоге мне удалось добиться определённых успехов в улучшении качества сканирования, однако работа с MediaPipe была больше похожа на ад:🔘Как это добро дебажить 🔘Как нормально поставлять собранную либу в Kotlin-проект 🔘Как задать критерии успеха, ведь сканирование статического изображения ≠ сканированию с камерыЯ отложил эту задачу,
    2,25035Open in Telegram
  • Kotlin Adept Notes

    8 Jul, 13:31edited

    Особенности безопасной реализации локального пин-кодаКогда-то давно мы реализовали локальный пин-код на основе этой библиотеки. Со временем эта реализация морально устарела, поэтому мы переписали модуль на KMP и Compose Multiplatform. Однако принципы безопасной реализации локального пин-кода остаются актуальными:🟢В идеале вообще не использовать локальный пин-код. Но если приложение работает только в офлайн, то особого выбора нет. 🟢Пин-код не должен нигде храниться. Из него криптографически выводится ключ шифрования, например с помощью PBKDF2 (реализация есть как для Android, так и для iOS) 🟢Пин-код должен защищать реальные данные, а не просто закрывать экран. Если он лишь блокирует интерфейс, такую защиту можно обойти, подменив флаг в памяти или в хранилище. Поэтому в идеале не
    2,2801788Open in Telegram
  • Kotlin Adept Notes

    6 Jul, 13:51

    Обманчивая легкость из-за AIПродолжая тему захода в чужие роли с помощью AI, в комментариях справедливо отметили, что AI лишь создает иллюзию легкости. И это действительно так, особенно когда речь идет о легаси-проектах, в которых весь контекст хранится в головах разработчиков.Мне нужно было всего лишь вынести в публичное API некоторую функциональность из Telegram-бота. При этом бэкенд был написан на Kotlin 🏝Казалось, что это просто подарок судьбы и все можно сделать с агентом за пару часов. Но что-то пошло не так 🤔🔴AI отлично подстраивается под проект и хорошо работает по аналогии. Но если проект состоит из большого количества легаси и в нем используется множество разных подходов, то AI просто не знает, как делать правильно. И ты тоже не знаешь
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    2,08044322Open in Telegram
  • Kotlin Adept Notes

    29 Jun, 05:31

    Насколько AI ускоряет TTM в большой компании🧠 Мы запустили первое приложение, которое целиком написано с помощью AI: от прототипов и бэкенда до мобильных приложений. И хочется обсудить, насколько это реально ускорило общий TTM.Можно услышать сотни историй о том, как вайбкодеры одновременно работают над десятком проектов и пишут по 30 тысяч строк кода в день. Это всё работает, пока ты делаешь это один. Но в большой компании, где куча команд, ещё больше микросервисов, своя инфраструктура, дизайн-система, правила безопасности и многое другое, тогда без полноценной перестройки процессов на уровне всей компании такой подход просто не получится внедрить.Поэтому сейчас речь идёт именно о применении AI-агентов для написания кода, без глобального изменения процессов и с тем же уровнем качества кода, что и раньше.Итак, я замерил показатели предыдущих MVP
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    2,120211Open in Telegram
  • Kotlin Adept Notes

    11 Jun, 07:59edited

    Как сделать аналог availability check из iOS в KMPВ Swift есть специальный механизм проверки доступности API на разных версиях ОС:if #available(iOS 17.4, ) { newAPI() } else { legacyAPI() }Это позволяет выполнять код только на определённых версиях ОС, где нужный API гарантированно существует.Но, к сожалению, такого механизма нет в Kotlin Native при работе над KMP-проектами. И если мы хотим реализовать данную возможность только в Kotlin-коде, то придётся искать обходное решение.В первую очередь понадобится метод для определения версии iOS:internal fun isIosVersionAtLeast(major: Int, minor: Int = 0, patch: Int = 0): Boolean { val target = cValue<NSOperatingSystemVersion> { majorVersion = major.toLong() minorVersion = minor.toLong()
    2,64011221Open in Telegram
  • Kotlin Adept Notes

    10 Jun, 07:04edited

    Особенности работы с OAuth 2.0 в KMP Во многих мобильных приложениях аутентификация и авторизация пользователей происходят через протокол OAuth 2.0, который является индустриальным стандартом. В нём предусмотрены различные флоу авторизации, и наиболее подходящим
    2,730224Open in Telegram
  • Kotlin Adept Notes

    25 May, 15:32

    Решили тут перейти в дизайн-системе на state-based TextField, чтобы порешать разные проблемы предыдущей версии. И, как говорится, что же могло пойти не так 😐Какие плюсы получили: 🟢Упростилась работа с курсором — страшные хаки больше не нужны 🟢Перестали лагать быстрые изменения текста на старых устройствах 🟢VisualTransformation теперь разделился на InputTransformation и OutputTransformation, что позволяет гибче работать с изменением текстаКакие минусы: 🔘Пришлось костылить обёртку с двумя LaunchedEffect, чтобы сохранить перегрузку с предыдущим API 🔘Ну и самое бесячее: в новом TextField почему-то решили поменять отступ от клавиатуры. Теперь экран подскролливается к каретке ввода, и
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    3,2502032Open in Telegram
  • Kotlin Adept Notes

    21 May, 15:12edited

    Особенности работы с OAuth 2.0 в KMPВо многих мобильных приложениях аутентификация и авторизация пользователей происходят через протокол OAuth 2.0, который является индустриальным стандартом.В нём предусмотрены различные флоу авторизации, и наиболее подходящим для мобильных приложений считается Authorization Code + PKCE. Этот флоу предотвращает перехват данных благодаря генерации временных параметров: codeChallenge и codeVerifier.Я не сторонник использования сторонних неофициальных библиотек в целом, и тем более для такой критичной вещи, как аутентификация. А в мире KMP найти что-то подходящее ещё сложнее, поэтому часто приходится делать всё самому.🤖 AndroidДля Android в пакете androidx.browser появился очень удобный механизм AuthTabIntent, который берёт на себя почти всю работу, хотя и не без нюансов.Если выбранный в системе браузер по
    3,28056421Open in Telegram
  • Kotlin Adept Notes

    19 May, 15:54edited

    Переход на AGP 9 в KMP-проектахМы долго откладывали миграцию на AGP 9, ждали, пока всякие авторы по типу Huawei адаптирует свои плагины, и наконец решились ⚪️Казалось бы, спустя столько времени это должна была быть легкая прогулка, но не тут-то было.С какими проблемами столкнулись 🟢Теперь нельзя использовать плагин android.application в KMP-модулях. 🟢Все модули нужно было мигрировать на новый Android Gradle Plugin. 🟢Больше нельзя генерировать BuildConfig в KMP-модулях. 🟢Значительно изменились многие API, которые мы использовали в своих Gradle-плагинах.Помимо этого, обновление Kotlin и Compose нам тоже вставило палки в колеса, но сегодня не об этом. Так что поделюсь рекомендациями для тех, кто еще не перевел свои
  • Kotlin Adept Notes

    1 May, 16:15

    Особенности работы с Passkeys в Android и iOSМы наконец-то реализовали мультиплатформенный модуль для работы с Passkeys и хочу поделиться нюансами, с которыми столкнулись.Passkeys — более безопасная и простая альтернатива паролям, где аутентификация в сервисе происходит по биометрии.В случае с Android поддержка Passkeys появилась с Android 9, в то время как на iOS только с iOS 16. При этом технология значительно совершенствовалась в последних версиях ОС, например, предоставляя выбор кастомного менеджера паролей.🤖 В Android работа с Passkeys происходит через CredentialManager и реализована довольно удобно: почти всё происходит под капотом, достаточно лишь передать JSON с бэкенда. Но есть две проблемы: обработка ошибок и необходимость в Activity context, что создаёт определённые архитектурные сложности. В случае обработки ошибок приходится вручную
    3,2901154Open in Telegram
  • Kotlin Adept Notes

    22 Apr, 16:06

    Генерация макетов через Figma MCP 🖌Пока все говорят про "убийцу Figma", хочу рассказать о том, как мне удалось примерить шапочку дизайнера и собрать макеты приложения в Figma с использованием корпоративной дизайн-системы с помощью Figma MCP.Не так давно Figma сделала скил под названием figma-use, который даёт доступ к рисованию на канвасе, переменным, стилям и компонентам. И это стало отличным шансом собрать макеты приложения без навыков работы в Figma.Я не стал сразу пытаться собирать макеты в Figma, а начал с генерации макетов в виде сайта, скормив бизнес-сценарии приложения и несколько изображений-референсов по стилю AI-агенту. В целом Claude с одного промта справился очень даже неплохо, дальше пришлось просто допилить некоторые моменты.И уже после этого я решил зафиксировать макеты в Figma на основе сгенерированного сайта. Но первое, во что
    2,91073Open in Telegram
  • Kotlin Adept Notes

    29 Mar, 18:31

    Как защитить API от нежданных клиентовНа днях я делал приложение для bug bounty активности на конференции, в котором нужно будет найти секретную ссылку. Мне не хотелось, чтобы всё решилось простым запросом в AI или пересборкой приложения с отключением SSL-пиннинга, поэтому я задумался о том, как защититься от пересборки приложения, чтобы только версия с моей подписью могла делать запросы к серверу.Я решил попробовать Play Integrity. Всё бы ничего, но приложение должно быть обязательно опубликовано в Google Play, хотя бы во внутреннем тестировании, иначе аттестация устройства не будет проходить. Поэтому этот вариант мне не подошёл, и я решил реализовать собственный сервер аттестации, который проверяет цепочку сертификатов, извлекает из сертификата отпечаток подписи приложения и сравнивает его с заданным.Звучит круто, но почему тогда это не используется массово? Дело в том, что,
    3,150214Open in Telegram
  • Kotlin Adept Notes

    26 Mar, 06:23

    Розыгрыш билета на Podlodka Android Crew #15Мы снова подготовили для вас новый сезон конференции Podlodka Android Crew, который пройдет с 30 марта по 3 апреля.В этот раз неделя будет посвящена безопасности в Android-разработке, и, на мой взгляд, нам удалось собрать интересную программу.Мой личный топ докладов, которые хотелось бы послушать: 🔘Про защиту видеоконтента 🔘Про passkeys, так как прямо сейчас мы имплементируем это у себя 🔘Про то, как работает защита Play Integrity 🔘Про reverse engineering на практике от моего коллегиИ в связи с этим хочу провести розыгрыш билета.Условия розыгрыша💬 Вам нужно написать комментарий под этим постом на тему безопасности мобильных приложений. Можно рассказать про самый
    Image from a post by Kotlin Adept NotesImage from a post by Kotlin Adept Notes
    3,67054111Open in Telegram