Последние посты

Kotlin
26 авг., 15:56
🚧 Ваш Mutex тормозит корутины. Как перестать лочить и начать житьВы пишете многопоточный код. У вас есть общий ресурс (например, in-memory кэш сессий). Вы знаете, что synchronized в корутинах - это зло (блокирует системный поток). Вы берете Mutex и оборачиваете код в mutex.withLock { ... }.Поздравляю, вы сделали лучше. Но под большим contention (высокой конкуренцией) ваш код всё равно будет страдать.В чем проблема Mutex? Да, он не блокирует поток. Но withLock - это suspend функция. Когда 100 корутин ломятся в один лок, 1 получает доступ, а 99 - саспендятся. Саспенд - это не бесплатно. Это сохранение стейт-машины, аллокации Continuation, а потом дорогой диспетчеризированный возврат (resume) каждой корутины к жизни.🛠 Как от этого уходят Сеньоры? (2 пути)Путь 1: Lock-free (Для простых стейтов) Если у вас счетчик или простая ссылка на объект, забудьте про локи. Используйте
Kotlin
25 июл., 11:10
🚀 Подборка полезных IT каналов в MaxСистемное администрирование, DevOps 📌https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхакMAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
Kotlin
1 июл., 19:56
🌪 Ваша дата в опасности: flatMapConcat vs Merge vs LatestВам нужно взять поток ID-шников и для каждого скачать детали из сети. Задача банальная:val detailsFlow = idsFlow.flatMap??? { id -> repository.fetchDetailsAsFlow(id) }IDE услужливо подсказывает три варианта: Concat, Merge, Latest. И вот тут кроется разница между "работает как часы", "тормозит" и "тихо теряет данные".Давайте разберем на пальцах.1. flatMapConcat (Очередь в поликлинику)• Как работает: Строго последовательно. Ждет, пока полностью завершится внутренний Flow для первого ID, и только потом переходит ко второму. • Плюс: Сохраняет идеальный порядок элементов. Безопасно для транзакций/БД. • Минус (Bottleneck): Это ОЧЕНЬ медленно. Если у вас 10 картинок, и каждая качается по секунде - весь процесс займет 10 секунд. Никакой параллельности.2. flatMapMerge (Броуновское движение)
Kotlin
24 июн., 07:48
🤖 Android-приложение — это не только красивый экран. За ним стоят работа с внешним API, загрузка данных, разделение логики по слоям и архитектура, которую можно поддерживать без хаоса в коде.🗓 2 июля в 20:00 МСК приглашаем вас на открытый урок в преддверии старта курса «Android-разработчик. Базовый уровень». На занятии разберём путь данных в Android-приложении: от запроса к серверу до отображения информации на экране.Посмотрим, как работать со сторонним API, реализовать выход в интернет для загрузки фотографии и описания, разделить приложение на слои по принципам чистой архитектуры и MVVM, а также прописать логику отображения данных.➡️ Урок подойдёт тем, кто начинает карьеру в Android-разработке и хочет понять, как создаются приложения в реальной работе. Регистрируйтесь и разберитесь, как связать сервер,


Kotlin
23 июн., 17:56
🔮 Убийца бойлерплейта: Встречайте Context Parameters (Kotlin 2.x)Мы так привыкли к Dependency Injection (Dagger/Hilt/Koin), что перестали замечать, как он раздувает наш код. Сценарий из жизни: вам нужно залогировать событие глубоко в слое бизнес-логики. Вы берете интерфейс Logger и прокидываете его через конструкторы пяти промежуточных классов, хотя он нужен только в одном методе на самом дне.В Kotlin 2.1+ (KEEP-367) активно допиливают киллер-фичу, которая меняет правила игры - Context Parameters.Историческая справка: Если вы помните экспериментальные Context Receivers (синтаксис context(Logger)), забудьте их. JetBrains официально задепрекейтили их в версии 2.0.20, заменив на более строгие и читаемые Context Parameters.Как это выглядит теперь?Допустим, у нас есть TransactionScope и Logger. Мы не хотим инжектить их в классы-прослойки, мы хотим потребовать их наличие в функции
Kotlin
3 июн., 14:00
Яндекс обновил Yandex Mobile Ads SDK для монетизации мобильных приложений — и это интересноВо-первых, Yandex Mobile Ads SDK 8 поддерживает Kotlin Coroutines и Swift async/await. А значит, рекламу можно загружать линейно и предсказуемо.Во-вторых, в новой версии появился скрипт для автогенерации идентификаторов SKAdNetwork в Info.plist. Данные о конверсиях в установку теперь точнее для iOS-приложений.В-третьих, переход на новый SDK автоматизирован. ИИ-агент анализирует код и адаптирует его под API версии 8 — на переход уходит около 15 минут.При всех этих фичах SDK стал весить на 30% меньше для Android и на 15% — для iOS. Приложение скачивается быстрее и весит меньше — а это влияет на конверсию в установку.Подробнее об изменения и переходе на новую версию читайте здесь.


Kotlin
3 июн., 13:13
ktorgen - Kotlin + KSP + Ktor Client Code GeneratorЛегкий процессор Kotlin KSP для генерации клиентского кода Ktor с аннотациямиhttps://github.com/kingg22/ktorgen✍️ @kotlin_lib


Kotlin
19 мая, 11:55
🧩 Kotlin учится деструктурировать не по позиции, а по имениВ Kotlin 2.3.20 появилась экспериментальная фича name-based destructuring.Раньше деструктуризация работала через componentN() и зависела от порядка полей:data class User( val firstName: String, val lastName: String )val user = User("Alice", "Husseini")val (lastName, firstName) = userИ всё: переменные названы красиво, но значения уже перепутаны.Теперь Kotlin предлагает другой подход - связывать переменные с property по имени, а не по позиции:(val firstName = firstName, val lastName = lastName) = user


Kotlin
12 мая, 19:33
🛑 Как задушить свое приложение, используя Dispatchers.IOМы привыкли думать, что Dispatchers.IO - это бездонная бочка. Закинул туда сетевой запрос или чтение файла, и корутины сами всё разрулят.Но у Dispatchers.IO есть жесткий лимит - 64 потока (или количество ядер процессора, если их больше).Сценарий катастрофы: Вам нужно скачать 100 картинок или сделать батч-запросы к очень мееееедленному стороннему API. Вы запускаете 100 корутин на IO. Первые 64 запроса занимают все доступные потоки пула и зависают в ожидании ответа от сервера (I/O block).В этот момент пользователь нажимает кнопку "Сохранить профиль". Метод сохранения идет в локальную БД (Room/Realm), которая тоже использует Dispatchers.IO. Результат: Запрос в БД не выполняется. Он встает в очередь и ждет, пока хотя бы одна из 64 картинок скачается и освободит системный поток. Пользователь видит бесконечный лоадер. Приложение
Kotlin
18 апр., 09:16
🧨 SharedFlow для Side Effects - это ошибка. Разбираем официально лучший подходВ MVI/MVVM есть вечная проблема: разовые события (Side Effects). Показать Snackbar, перейти на другой экран, проиграть звук. Это не стейт, это событие, которое должно произойти ровно один раз.Долгое время комьюнити пыталось решить это через SharedFlow. Выглядело это так:private val _effects = MutableSharedFlow<Effect>() val effects = _effects.asSharedFlow()Почему это выстрел в ногу? По дефолту SharedFlow не имеет буфера (replay = 0). Если ViewModel пушит событие (_effects.emit(...)), когда UI находится в фоне (пользователь свернул приложение или открыл другой экран), у потока в этот момент нет активных подписчиков. Результат? Событие просто дропается. Улетает в пустоту. Юзер разворачивает апп - а перехода или сообщения об ошибке нет.Как это обычно пытаются костылить? Начинают играться с буфером:
Kotlin
16 мар., 05:57
Освой Kotlin и Android за 60 часовЭтот обширный курс по Kotlin и Android проведёт вас от основ до продвинутых концепций с практическими заданиями. В ходе курса для начинающих научит вас создавать несколько реальных приложений, включая впечатляющий клон Uber, демонстрирующий профессиональные приёмы разработки.Курс охватывает Firestore, SQLite, MVVM, Retrofit, Navigation Component, Jetpack Compose и многое другое.https://www.youtube.com/watch?v=blKkRoZPxLc✍️ @kotlin_lib


Kotlin
11 мар., 10:18
🐘 Ловушка MVI: Как мы превратили ViewModel в God-objectВсе мы читали туториалы по MVI (Unidirectional Data Flow). Идея звучит безупречно: у вас есть один Intent (событие от юзера), один Reducer и один State (дата-класс, описывающий весь экран).На экране авторизации это выглядит как поэзия. Но потом вы приходите на реальный прод.Вам дают Главный Экран приложения: здесь лента постов, фильтры, баннеры, статус сети, профиль юзера в шапке и плеер в свернутом виде.И тут начинается MVI-ад:data class DashboardState( val isLoading: Boolean = false, val feed: List<Post> = emptyList(), val searchQuery: String = "", val activeFilters: Set<Filter> = emptySet(), val userProfile: Profile? = null, val unreadNotificationsCount: Int = 0, val miniPlayerState: PlayerState = PlayerState.Idle, // ... и еще 20 полей )
Kotlin
6 мар., 09:03
👨💻 Вы пишете тесты, потому что «так надо»Покрываете несколько функций, проверяете очевидные кейсы, ставите галочку. Тесты проходят, но чувствуете, что это формальность. Они не помогают находить баги, не улучшают код, не дают уверенности в изменениях. Проблема не в тестах. Проблема в том, как вы их пишете.🗓 12 марта в 20:00 — открытый урок «Профессиональные Unit-тесты (модульные тесты) в Android: как тесты улучшают код» Разберём, что отличает хороший Модульный тест (unit-тест) от теста «для галочки» и почему тестируемость — это не про процент покрытия, а про архитектуру.Что рассмотрим: ✅ как писать Модульные тесты (unit-тесты) для ViewModel, репозиториев и сценариев использования (use case'ов) ✅ как требования к тестируемости влияют на качество кода
Kotlin
5 мар., 19:22
Как нарезать Android-монолит с помощью compile-time плагинов?Привет на связи Федотов Михаил и Абдульманов Эдуард, мы технические лидеры Android разработки в Альфа-Банке и занимаемся приложением для физических лиц.В этой статье вспомним наш опыт разбиения большого монолитного android приложения на мини-приложения срезки, занимались мы этим уже довольно давно, но тема все равно актуальная.Переход к таким мини-приложениям позволяет ускорить конфигурацию Gradle и уменьшить время компиляции проекта как локально так и на CI.Думаю это будет полезно тем кто интересуется архитектурой android приложений, KSP, Dagger, а также тем у кого крупное многомодульное приложение и есть проблемы с производительностью работы Gradle в проекте.https://habr.com/ru/companies/alfa/articles/1002998/✍️ @kotlin_lib


Kotlin
3 мар., 07:01
👩💻 Открытый урок «Знакомство с Kotlin: пишем первый код»🗓 5 марта в 20:00 МСК🆓 Бесплатно. Урок в рамках старта курса «Kotlin Developer. Basic» от Otus.Программа вебинара: ✔Разберем три ключевых преимущества Kotlin: безопасность null, лаконичность и совместимость. ✔Напишем небольшой, но полезный фрагмент, который решает понятную задачу. ✔Ответим на главный вопрос: почему Kotlin — это не просто «улучшенная Java», а другой подход к разработке.Вебинар будет полезен: Начинающим разработчикам, разработчикам на Java, которые хотят писать современный, более безопасный и лаконичный код.🔗 Ссылка на регистрацию: https://vk.cc/cUZHP9Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576


Kotlin
2 мар., 10:14
📉 Ваш List убивает перформанс Compose. Разбираемся со StabilityНаписали красивый экран на Compose. Данные не меняются, но Layout Inspector показывает, что ваш Composable со списком перерисовывается каждый чих. Почему?Потому что вы передали туда обычный List.@Composable fun UsersList(users: List<User>) { // ❌ Компилятор вам не верит // ... }В чем проблема? Compose опирается на концепцию Stability (стабильности), чтобы понимать, можно ли «скипнуть» (пропустить) рекомпозицию узла, если параметры не изменились. Но в Kotlin List это просто интерфейс (read-only). Под капотом туда легко может прилететь MutableList или ArrayList. Compose не может гарантировать, что этот список кто-то не изменит из другого потока без ведома фреймворка. Поэтому компилятор помечает List как Unstable. А если параметр Unstable - Compose всегда будет вызывать рекомпозицию этой функции, если перерисовался
Kotlin
28 февр., 13:27
🚀 Подборка полезных IT каналов в MaxСистемное администрирование, DevOps 📌https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1СПрограммирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчикаПрограммирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчикаMAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
Kotlin
24 февр., 14:08
🔥 Ваш StateFlow работает вхолостую. Разбираем SharingStartedПревращение Flow в StateFlow через stateIn - стандартный паттерн в ViewModel. Но третий параметр (started) - это место, где утекают ресурсы процессора и сети.Смотрим типичный код:val uiState: StateFlow<UiState> = repository.observeData() .map { it.toUiState() } .stateIn( scope = viewModelScope, started = SharingStarted.Eagerly, // 👈 Внимание сюда initialValue = UiState.Loading )1. SharingStarted.Eagerly - Режим "Зомби" Поток запускается сразу при создании класса (ViewModel). Даже если UI еще не готов, даже если пользователь свернул приложение, даже если экран находится в бекстеке - этот поток активен. Он качает данные из БД, маппит их, грузит процессор. Вердикт: Используйте только если данные нужны всегда и немедленно (например, глобальный статус сети), и их обновление дешевое.
Kotlin
19 февр., 20:54
⌨️Создание AI-агентов на KotlinЧасть 1: минимальный кодовый агентСтроить агентов - странная штука. Ты пишешь не код, который сам что-то делает. Ты пишешь код, который даёт LLM возможность что-то делать, а что именно делать - решает уже сама модель.К этому сдвигу мышления нужно привыкнуть. Ты даёшь агенту возможность читать файлы - и он сам решает, какие файлы читать и когда. Ты ожидаешь, что он начнёт с main-файла. А он вместо этого сначала читает три тестовых файла, чтобы понять паттерны. Ты его об этом не просил. Он просто так сделал.https://blog.jetbrains.com/ai/2025/11/building-ai-agents-in-kotlin-part-1-a-minimal-coding-agent/Часть 2: более глубокое погружение в инструментыВ предыдущей статье мы увидели, как собрать базового coding-агента с возможностями list, read, write и edit. Сегодня разберём, как расширять возможности агента,




Kotlin
17 февр., 09:09
🛡️ lifecycleScope - бро. Почему Coroutines не текут (почти)В прошлом посте мы выяснили: Callback Hell = Memory Hell. Вам нужно вручную отписываться в onDestroy, иначе this утечет вместе с Activity.Kotlin Coroutines предложили решение: Structured Concurrency. И в Android это реализовано через lifecycleScope и viewModelScope.Как это работает на пальцах:// Внутри Fragment / Activity lifecycleScope.launch { val user = api.getUser() // (1) Suspend point showUser(user) // (2) Update UI }Сценарий: Пользователь открыл экран, запустилась загрузка (1), и он сразу нажал "Назад". Activity уничтожается.Что происходит под капотом:
