Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
564 - Telegram Web
Telegram Web
Роман Елизаров про Kotlin, корутины и работу в Jetbrains / ЧТУК

00:00:00 Как стал программистом
00:11:39 Алгоритмы
00:24:47 Собеседования
00:26:44 Как попал в JetBrains
00:30:13 "Котлин - новый Си?"
00:33:42 Tracing GC в Kotlin
00:36:49 "Что революционного в корутинах?"
00:45:24 Почему Котлин популярный в мобилке
00:48:16 Менеджмент
00:57:19 История и перспективы Kotlin
01:02:45 Уход из JetBrains и олимпиадное программирование
01:11:36 Яндекс
01:15:11 Новое поколение разработчиков
01:21:16 "Современные айти технологии устойчивы"
01:24:23 "Своя" разработка и Open Source
01:35:12 ИИ в разработке
01:51:55 Вопросы подписчиков
02:00:11 Всем пока

https://www.youtube.com/watch?v=PlykPBtsL8E

✍️ @kotlin_lib
👍3
Возможности Kotlin для создания DSL на примере JsonBuilder

Приглашаем на открытый урок.

🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».

Что вас ждёт:
✔️ рассмотрим общую теорию о DSL: назначение, особенности, практика;
✔️ попрактикуемся в создании DSL на примере JsonBuilder;
✔️ рассмотрим возможности Kotlin, полезные для создания DSL.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5

👉 Регистрация на вебинар: https://vk.cc/cLUeee

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблемы масштабируемости Kotlin Multiplatform на крупном проекте

Я начал заниматься нативной разработкой под Android в 2015 году, а в 2017 меня вдохновили два новых мультиплатформенных фреймворка: Flutter и Kotlin Multiplatform. Хотя KMP было сложнее собирать и использовать по сравнению с Flutter, с самого начала я верил, что у него больше потенциала.
В основном потому, что он использует родной язык и практики Android, предлагая при этом максимально тонкий подход к мультиплатформенности.

С тех пор я продолжал следить за его развитием, экспериментируя с новыми возможностями в своих open-source проектах, таких как Coffegram.

Когда KMP стал стабильным, я начал искать возможность применить его в реальном проекте. Здесь я опишу свой опыт работы с ним в одном крупном проекте.

https://proandroiddev.com/kotlin-multiplatform-scalability-challenges-on-a-large-project-b3140e12da9d

✍️ @kotlin_lib
👍2
BikeShare — шаринг велосипедов на Kotlin Multiplatform

BikeShare — проект Kotlin Multiplatform с Jetpack Compose и SwiftUI на основе CityBikes API. Поддерживает iOS, Android, десктопы, веб. Для сборки нужна Android Studio Arctic Fox и Xcode 13.2.

https://github.com/joreilly/BikeShare

✍️ @kotlin_lib
👍6
Через два дня — живой разбор AI в Flutter

20 мая, 20:00 МСК. Бесплатный вебинар «Интеллект внутри: делаем умные Flutter‑приложения с ML и AI».

Почему стоит подключиться:
— увидите, как запустить нейросети офлайн без серверных счетов;
— разберётесь, чем MediaPipe лучше готовых SDK для жестов;
— научитесь подключать LLM‑подсказки к любому экрану приложения;
— получите скидку на курс «Flutter Mobile Developer».

Код пишем в прямом эфире вместе с Дмитрием Золотовым (Yandex).

Не откладывайте — регистрация закроется при наборе группы.

Забронировать место

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Video Player App — приложение для просмотра видео на MVVM и Kotlin

Пример приложения для Android, написанный на Kotlin и Jetpack Compose, поддерживающий различное расположение навигации в зависимости от размера экрана. Media 3 Exoplayer реализован на основе single activity архитектуры. Он полностью функционален и поддерживает функцию «картинка в картинке».

Еще в приложении используется MVVM, корутины и Flow, Dagger Hilt, Material 3, динамический лейаут с Windows Size Class, Gradle Kotlin DSL, базовые профили.

https://github.com/ryanw-mobile/video-player-app

✍️ @kotlin_lib
👍6
Секреты Kotlin: 7 мощных фич, которые ежедневно используют топ-1% разработчиков

🔹1. run для безопасной работы с null

Когда тебе нужно выполнить несколько операций с переменной, которая может быть null, вместо длинного if лучше использовать run:


val user: User? = getUser()
user?.run {
println(name)
println(email)
}



🔹2. takeIf и takeUnless

Эти функции позволяют элегантно фильтровать значения:


val input = readLine()

val number = input?.toIntOrNull()?.takeIf { it > 0 }
// number будет null, если условие не выполнено



🔹3. Расширения для sealed классов и enum

Расширения можно использовать, чтобы "добавить" поведение к sealed классам или enum'ам:


sealed class Result
object Success : Result()
object Error : Result()

fun Result.log() = when (this) {
Success -> println("Успех")
Error -> println("Ошибка")
}



🔹4. Smart cast с кастомными проверками

Можно создавать собственные методы-проверки с smart cast внутри:


fun Any.isString(): Boolean = this is String

val value: Any = "Hello"
if (value.isString()) {
println((value as String).length) // не очень
}


Лучше использовать:


if (value is String) {
println(value.length) // безопаснее
}



🔹5. Nothing как маркер "никогда не возвращается"

Тип Nothing указывает, что функция либо кидает исключение, либо бесконечна:


fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}



🔹6. Рефлексия через ::class

В Kotlin можно получить ссылку на класс:


fun <T : Any> printClassName(value: T) {
println(value::class.simpleName)
}



🔹7. Деструктуризация для data классов и пар

Kotlin позволяет удобно "распаковывать" объекты:


data class User(val name: String, val email: String)

val user = User("Oleg", "email@example.com")
val (name, email) = user



Эти фичи не просто украшения синтаксиса — они помогают писать чище, безопаснее и выразительнее. Изучи их и попробуй внедрить в свою повседневную разработку.

https://proandroiddev.com/kotlin-secrets-7-powerful-features-the-top-1-of-developers-use-daily-161e16e2464d

✍️ @kotlin_lib
👍5
5 фишек Kotlin, которые должен освоить каждый Android-разработчик

Kotlin — мощный и выразительный язык, который помогает писать чистый и лаконичный код. Ниже — пять возможностей, которыми стоит овладеть каждому Android-разработчику.


1. Расширения функций (Extension Functions)

Расширения позволяют добавлять функции к существующим классам без необходимости наследования. Это особенно полезно для повышения читаемости кода.


fun String.capitalizeFirstLetter(): String {
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
}


Теперь можно использовать эту функцию так:


val name = "john"
println(name.capitalizeFirstLetter()) // John



2. Инлайновые функции (Inline Functions)

Инлайновые функции — это способ уменьшить накладные расходы на вызов лямбда-выражений. Часто применяются с higher-order функциями.


inline fun <T> measureTime(block: () -> T): T {
val start = System.currentTimeMillis()
val result = block()
println("Заняло времени: ${System.currentTimeMillis() - start} мс")
return result
}



3. Объекты-одиночки (Object Declarations / Singletons)

В Kotlin ключевое слово object позволяет создавать синглтоны — это удобно, например, для хранения глобальных зависимостей.


object NetworkManager {
fun makeRequest(endpoint: String) {
// логика запроса
}
}



4. Sealed классы

Sealed классы дают возможность моделировать ограниченные иерархии. Это особенно полезно в when выражениях без необходимости писать else.


sealed class Result {
object Click Me Load More : Result()
data class Success(val data: String) : Result()
data class Error(val error: Throwable) : Result()
}



fun handleResult(result: Result) {
when (result) {
is Result.Click Me Load More -> println("Загрузка...")
is Result.Success -> println("Успех: ${result.data}")
is Result.Error -> println("Ошибка: ${result.error}")
}
}



5. Корутины (Coroutines)

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


suspend fun fetchData(): String {
delay(1000)
return "Данные получены"
}

fun main() = runBlocking {
val result = fetchData()
println(result)
}



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

https://artemasoyan.medium.com/5-kotlin-features-every-android-developer-should-master-6ebe8e4e1abd

✍️ @kotlin_lib
2👍2
Ищете эффективные инструменты для создания DSL?

Узнайте, как Kotlin может упростить разработку с помощью JsonBuilder!

Приглашаем на открытый урок.

🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».

На открытом уроке вы разберете, как Kotlin позволяет создавать DSL (Domain-Specific Languages), оптимизируя процесс разработки. Мы покажем теорию и практику создания DSL на примере JsonBuilder.

Вы не только научитесь создавать собственные DSL, но и освоите замыкания и extension-методы Kotlin, которые дадут вам дополнительные преимущества при написании чистого и гибкого кода.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5

👉 Регистрация на вебинар: https://vk.cc/cM6Wwm

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Konfeature — библиотека на Kotlin для работы с удалённой конфигурацией фич

Работа с удалённой конфигурацией стала стандартной частью процесса разработки почти любого приложения. В зависимости от сложности могут потребоваться:

* удобный синтаксис для объявления элементов конфигурации
* возможность разделять конфигурацию по разным файлам для разных фич
* возможность использовать локальную конфигурацию на этапе активной разработки фич
* поддержка нескольких источников данных для удалённой конфигурации
* возможность просматривать список всех конфигураций и изменять их значения в целях отладки
* логирование значения и его источника при обращении к конфигурации, а также не‐критичных ошибок

Мы постарались учесть все эти требования при разработке Konfeature.

Установка


repositories {
mavenCentral()
}

dependencies {
implementation("com.redmadrobot.konfeature:konfeature:<версия>")
}


Использование

FeatureConfig

Определяет набор элементов конфигурации с помощью делегатов:

* by toggle(...) — для Boolean
* by value(...) — для остальных типов


class ProfileFeatureConfig : FeatureConfig(
name = "profile_feature_config",
description = "Конфигурация фич для профиля"
) {
val isProfileFeatureEnabled: Boolean by toggle(
key = "profile_feature",
description = "показывать точку входа в профиль",
defaultValue = false,
)

val profileFeatureTitle: String by value(
key = "profile_feature_title",
description = "заголовок кнопки профиля",
defaultValue = "Feature number nine",
sourceSelectionStrategy = SourceSelectionStrategy.Any
)

val profileButtonAppearDuration: Long by value(
key = "profile_button_appear_duration",
description = "длительность появления кнопки профиля в мс",
defaultValue = 200,
sourceSelectionStrategy = SourceSelectionStrategy.Any
)
}


Регистрация конфигурации:


val profileFeatureConfig = ProfileFeatureConfig()
val konfeatureInstance = konfeature {
register(profileFeatureConfig)
}


FeatureSource

Абстракция источника значений:


interface FeatureSource {
val name: String
fun get(key: String): Any?
}


Пример для FirebaseRemoteConfig:


class FirebaseFeatureSource(
private val remoteConfig: FirebaseRemoteConfig
) : FeatureSource {
override val name: String = "FirebaseRemoteConfig"

override fun get(key: String): Any? {
return remoteConfig
.getValue(key)
.takeIf { source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE }
?.let { value ->
value.getOrNull { asBoolean() }
?: value.getOrNull { asString() }
?: value.getOrNull { asLong() }
?: value.getOrNull { asDouble() }
}
}

private fun FirebaseRemoteConfigValue.getOrNull(getter: FirebaseRemoteConfigValue.() -> Any?): Any? {
return try {
getter()
} catch (error: IllegalArgumentException) {
null
}
}
}


Добавление источника:


val konfeatureInstance = konfeature {
addSource(FirebaseFeatureSource(remoteConfig))
register(profileFeatureConfig)
}


SourceSelectionStrategy

Позволяет гибко выбирать, из каких источников запрашивать значение:


public interface SourceSelectionStrategy {
fun select(names: Set<String>): Set<String>

companion object {
val None: SourceSelectionStrategy = SourceSelectionStrategy { emptySet() }
val Any: SourceSelectionStrategy = SourceSelectionStrategy { it }
fun anyOf(vararg sources: String): SourceSelectionStrategy = SourceSelectionStrategy { sources.toSet() }
}
}


Предопределённые стратегии:

* None — всегда использовать только defaultValue
* Any — разрешает брать значения из любого источника
* anyOf("Source1", …) — только из указанных источников


https://github.com/RedMadRobot/Konfeature

✍️ @kotlin_lib
👍3
Контракты в Kotlin или как заключить сделку с совестью

Всем привет, меня зовут Иван, я Android-разработчик и сегодня мы с вами поговорим об контрактах. Предвосхищая вопрос попробую сразу дать все ответы:

Контракты - это давний эксперимент языка Kotlin, какой смысл обозревать их сейчас, когда уже столько написано?

Нормальной статьи на русском языке я не обнаружил;

Я решил выбрать эту тему, так как мы сталкиваемся с контрактами в нашей повседневности, при этом не осознавая, как именно работает та или иная вещь;

Это моя первая проба пера и мне хотелось начать с чего-нибудь достаточно легкого, но при этом интересного.

https://habr.com/ru/articles/910924/

✍️ @kotlin_lib
👍3
⌨️ Kotlin: ключ к современным backend-решениям!

📚 Курс «Kotlin Backend Developer. Professional» — всё, что нужно для создания гибких и производительных приложений.

Что вы освоите:

✔️ Работу с Kotlin Multiplatform для JS, JVM, Android, iOS.
✔️ Spring, Ktor, RabbitMQ, Kafka, Postgres.
✔️ Создание архитектуры: монолиты, микросервисы и бессерверные решения.
✔️Реальные кейсы: разработка стартапа с нуля.

Почему выбирают нас?

✔️ Живые лекции от экспертов топовых компаний.
✔️ Диплом OTUS, который признают крупные работодатели.
✔️ Практика, которая готовит к сложным проектам.

🎁 Дарим промокод, который дает скидку на обучение - Kotlin5

Не упустите шанс!

👉 Пройдите тестирование и получите скидку: https://vk.cc/cMkZGW

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Не используй use в Kotlin

Многие считают, что use — это идеальный способ управления ресурсами в Kotlin, так как он автоматически закрывает ресурс после использования. Однако стоит быть осторожнее. Когда в блоке use выбрасывается исключение, ресурс всё равно закроется, но если при закрытии произойдёт ещё одно исключение, то оно может затереть исходное, и ты потеряешь важную информацию о причине ошибки.

В Java 7 для этого появилась конструкция try-with-resources, которая аккуратно складывает все исключения, а в Kotlin use реализован иначе. Например, если внутри блока работы с файлом что-то пошло не так, а потом и при закрытии возникла ошибка — ты увидишь только вторую, а первая просто исчезнет.

Поэтому лучше явно закрывать ресурсы в finally, либо использовать Java-подход, если тебе важно не терять исключения.

https://medium.com/@wn8yura/dont-use-use-in-kotlin-1005c9b6b9d4

✍️ @kotlin_lib
👍6🤣2
Заезжаем в Kotlin Multiplatform. Но какой ценой?

Этот доклад - текстовая версия моего выступления с осеннего Мобиуса 2024 года. Обязательно приложу видео с выступлением после выхода. А вот и оно.

О чем поговорим в статье:
Пройдем путь от идеи Kotlin Multiplatform до её реализации в цифрах.

Обсудим, сколько стоило внедрить Kotlin Multiplatform в продукты и к чему это привело.

Проведём ретроспективу: стоило ли это делать вообще и стоит ли инвестировать в эту технологию дальше. А также разберём, сколько это будет стоить в перспективе.

https://habr.com/ru/articles/887574/

✍️ @kotlin_lib
Не знаешь на кого пойти учиться ?💥

🛑Пройди бесплатные онлайн-курсы

🛑Узнай о самых востребованных профессиях

🛑Получи уникальную возможность поступить в «Алабуга Политех» после 9 или 11 класса

ПРОЙДИ КУРС ПРЯМО СЕЙЧАС!
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1🍾1
Media is too big
VIEW IN TELEGRAM
Наглядный пример, когда не следовать best practices for coroutines от Google
Александр Таганов

Александр показал реальный пример из практики Т-Банка, когда следование best practices for coroutines ведет к проблемам. Объяснил, почему это происходит. Показад, чем еще занимается main dispatcher. И рассказал, как избежать подобных проблем

00:00 - Про доклад
02:44 - Долгое ожидание простых операций
12:59 - Разбор причины долгих загрузок
21:30 - Выводы после анализа
24:35 - На что стоит заменить Dispatchers.Main
27:50 - Тестирование разных Dispatcher

источник

✍️ @kotlin_lib
👍31
Почему не стоит использовать Array в data class Kotlin:

🔸 В data class методы equals() и hashCode() генерируются автоматически на основе полей.
🔸 Но Array в Kotlin (и Java) сравнивает не содержимое, а ссылки на объекты.
🔸 Из-за этого два объекта с одинаковыми массивами будут не равны:


data class Person(val name: String, val friends: Array<String>)

val p1 = Person("Mike", arrayOf("Mary", "John", "Tom"))
val p2 = Person("Mike", arrayOf("Mary", "John", "Tom"))

println(p1 == p2) // false!


🔸 Такая «ссылочная» проверка приводит к проблемам с коллекциями (HashSet, HashMap) и к «невидимым» багам: дубликаты, неверные кеш-промахи и т. д.

Решение: вместо Array используйте коллекции, которые сравнивают содержимое:


data class Person(val name: String, val friends: List<String>)


Тогда equals() проверит элементы списка по значению, и Person("Mike", listOf("Mary","John","Tom")) == Person("Mike", listOf("Mary","John","Tom")) вернёт true.

https://proandroiddev.com/avoid-using-array-in-the-data-class-constructor-in-kotlin-ebc308e46a95

✍️ @kotlin_lib
👍3
🧩 Ktorfit — это библиотека, вдохновлённая Retrofit, для HTTP-клиентов на Ktor.

Она позволяет описывать HTTP-запросы с помощью аннотаций прямо в интерфейсах, как в Retrofit. Ktorfit использует KSP (Kotlin Symbol Processing) для генерации кода, поэтому не требует рефлексии и работает быстро.

🔧 Пример использования


@HttpApi
interface GitHubApi {
@GET("users/{user}/repos")
suspend fun listRepos(@Path("user") user: String): List<Repo>
}


Ktorfit создаёт реализацию интерфейса, которую можно использовать вот так:


val ktorfit = Ktorfit.Builder()
.baseUrl("https://api.github.com/")
.httpClient(HttpClient())
.build()

val api = ktorfit.create<GitHubApi>()
val repos = api.listRepos("Foso")


📦 Особенности:

* Поддержка всех стандартных аннотаций: @GET, @POST, @Query, @Path, @Header, и др.
* Полная интеграция с Ktor HttpClient
* Генерация кода через KSP — высокая производительность
* Нет зависимости от Android
* Поддержка Kotlin Multiplatform

https://github.com/Foso/Ktorfit

✍️ @kotlin_lib
👍5🥱5
Не хотите поговорить о Kotlin Contracts?

За время собеседований я заметил одну любопытную вещь: даже опытные котлиноводы частенько не в курсе такой мощной фичи, как Kotlin Contracts.

Этой серией статей я хочу простым человеческим языком показать, зачем нужны Contracts, как их использовать на практике и как они работают внутри.

Какую проблему решают Kotlin Contracts?
Все мы любим Kotlin за умные проверки типов. Например, напишешь так:


fun foo(x: Any) {
if (x is List<*>) {
x.size // Всё ок, компилятор молодец!
}
}


И всё работает!

Но стоит вынести ту же проверку в отдельную функцию:


fun isList(x: Any): Boolean = x is List<*>

fun foo(x: Any) {
if (isList(x)) {
x.size // Ошибка: "Unresolved reference: size"
}
}


В чём подвох?

https://habr.com/ru/companies/alfa/articles/916536/

✍️ @kotlin_lib
👍3
Media is too big
VIEW IN TELEGRAM
Klibs.io — the dream of creating a Kotlin Package Index
Ignat Beresnev

So you want to build a Kotlin package index.. What is a package anyway, is it the same as an artifact? What makes a project a library then? And why is it an index and not a repository?

источник

✍️ @kotlin_lib
👍3
2025/07/11 22:49:34
Back to Top
HTML Embed Code: