👾 Kotlin и контекстно-ориентированное мышление
Еще одно ?-ориентированное программирование. На этот раз контекстно. Александр рассказал, что такое контекстно-ориентированное программирование, как оно работает (да!) в разных языках. Разумеется, затронули контекстные ресиверы и контекстные параметры в Kotlin (параметры выходят в 2.2) и зачем они нужны.
👀 Cмотреть видео
🐸 Библиотека мобильного разработчика
#свежак
Еще одно ?-ориентированное программирование. На этот раз контекстно. Александр рассказал, что такое контекстно-ориентированное программирование, как оно работает (да!) в разных языках. Разумеется, затронули контекстные ресиверы и контекстные параметры в Kotlin (параметры выходят в 2.2) и зачем они нужны.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему данные теряются при повороте экрана?
Anonymous Quiz
2%
Неправильное использование CoroutineScope
35%
Отсутствие сохранения состояния в savedInstanceState
50%
Activity пересоздается, а переменная temperature обнуляется
7%
Проблема с жизненным циклом корутины
6%
Посмотреть ответ
Разработчик Мэтт Тиссен (Matt Thiessen) выпустил библиотеку Any Language Model для Swift. Она полностью совместима со стандартной Foundation Models, и с ней можно использовать любые LLM, а не только решения от Apple.
В 2025 году Apple представила библиотеку Foundation Models. С её помощью в приложения можно интегрировать модели от Apple: локальную LLM с 3 млрд параметров или облачную VLM. Разработчики в сообществе оценили удобный синтаксис адаптера и оптимизацию под устройства экосистемы, но привязка к определённым нейросетями разрушила потенциальную универсальность.
Проблему решил Мэтт Тиссен. В его API-совместимой библиотеке Any Language Model разработчики могут сами выбирать бэкенд для запуска моделей. Например, можно использовать Apple Foundation Models, CoreML, MLX, llama.cpp (GGUF), OpenAI API, Anthropic API или Google Gemini API. При этом не надо создавать отдельный адаптер для каждого LLM-провайдера.
Для установки Any Language Model в файле
Package.swift надо указать следующую зависимость:dependencies: [
.package(url: "https://github.com/mattt/AnyLanguageModel.git", from: "0.3.0")
]
Для снижения размера готового приложения можно импортировать только нужные провайдеры. Например, код импорта адаптеров для CoreML и MLX выглядит так:
dependencies: [
.package(
url: "https://github.com/mattt/AnyLanguageModel.git",
branch: "main",
traits: ["CoreML", "MLX"] // Enable CoreML and MLX support
)
]
Пример использования Any Language Model выглядит следующим образом:
import AnyLanguageModel
struct WeatherTool: Tool {
let name = "getWeather"
let denoscription = "Retrieve the latest weather information for a city"
@Generable
struct Arguments {
@Guide(denoscription: "The city to fetch the weather for")
var city: String
}
func call(arguments: Arguments) async throws -> String {
"The weather in \(arguments.city) is sunny and 72°F / 23°C"
}
}
let model = SystemLanguageModel.default
let session = LanguageModelSession(model: model, tools: [WeatherTool()])
let response = try await session.respond {
Prompt("How's the weather in Cupertino?")
}
print(response.content)
#свежак #iOS #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Хотите, чтобы ваше приложение работало даже без интернета? Этот промпт поможет реализовать надежный офлайн-режим и синхронизацию данных.
Implement offline-first approach for a mobile app that includes:
— Set up local database (Room/SQLite/CoreData)
— Implement data synchronization strategy
— Handle conflict resolution for concurrent modifications
— Manage offline queue for pending operations
— Add network connectivity detection
— Implement cache management and expiration policies
— Provide user feedback for sync status
— Добавьте
Implement reactive UI updates using observables для автоматического обновления интерфейса— Добавьте
Add retry mechanisms with exponential backoff для надежной синхронизации— Добавьте
Support large file caching with storage management для работы с медиа в офлайне#буст #MiddlePath
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2🔥1🤔1
📘 Хочешь в Data Science, но есть пробелы в знаниях математики?
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩3
🔹 TECH WEEK 2025 — 17-19 ноября, Москва. Это крупная IT-конференция с различными направлениями — будет интересно и мобильным разработчикам, особенно в части трендов и инфраструктуры.
🔹 Enterprise Agile Russia 2025 — 17 ноября, Москва. Конференция об agile-практиках, гибкой разработке и трансформации команд.
🔹 Mobius 2025 Autumn — 18-19 ноября, Санкт-Петербург + онлайн. Профильная конференция именно по мобильной разработке: iOS, Android, кроссплатформенные технологии.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5
Это обновление призвано повысить вашу продуктивность и улучшить взаимодействие с разработчиками благодаря сокращённым точкам и обновлениям для предварительных просмотров виджетов.
Благодаря сообществу этот релиз включает в себя в общей сложности 825 коммитов от 145 уникальных участников, 37 из которых — новички. Давайте разберёмся, что же нового в этом релизе.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2❤1🥱1
Приготовили для вас дайджест по актуальному из мира iOS, Android.
Разработчики, участвующие в программе, могут воспользоваться сниженной комиссией в размере 15% от продаж соответствующих покупок внутри приложения.
В сочетании с trunk-based разработкой они позволяют мерджить работу на ранних этапах и часто не беспокоясь о прерывании выпуска.
Автор расскажет, какие инструменты реально работают на последних версиях системы и как их правильно использовать. Везде также будут примеры кода и ссылки на документацию.
Представьте, что вы Flutter-разработчик. Вы заходите на Хабр. В комменты статьи про Flutter. И там опять: «Flutter уже не развивается давно, нет 3д», «Dart — зачем нужен этот новый странный язык», «Google закроет проект, там в Индии всех разрабов уволили, они уже на кладбище».
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Типы могут быть вложенными (nested). Класс или структура может содержать определение другого класса или структуры. Например:
class User{
var name: String
var age: Int
var profile: UserProfile
struct UserProfile{
var login: String
var password: String
func authenticate(_ login: String, _ password: String) -> Bool{
return self.login == login && self.password == password
}
}
init(name: String, age: Int, login: String, password: String){
self.name = name
self.age = age
self.profile = UserProfile(login: login, password: password)
}
}
var tom = User(name: "Tom", age: 23, login: "querty", password: "12345")
print(tom.profile.authenticate("sdf", "456")) // false
print(tom.profile.authenticate("querty", "12345")) // trueЗдесь структура UserProfile является вложенной. Вложенные типы также могут определять свойства, методы, инициализаторы. А внешний тип может хранить объект вложенного типа.
Также вложенные типы могут использовать вне своего типа, в котором они определены. В этом случае к ним необходимо обращаться через имя внешнего типа:
var profile = User.UserProfile(login: "ssdf", password: "345")
var isLoged = profile.authenticate("ssdf", "345") // true
#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 В IT ценится не перфекционизм, а движение вперёд, и если вы давно откладывали обучение — самое время начать.
❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!
Что нужно:
⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.
🎓 Курсы, которые участвуют
👉 Участвовать
❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!
Что нужно:
⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.
🎓 Курсы, которые участвуют
👉 Участвовать
ЭЛТ-мониторы — это размытые края, линии сканирования и лёгкое свечение. Такой эффект можно воспроизвести в Compose с помощью
GraphicsLayer, градиентов и размытия.🔹 Базовый принцип
Мы один раз записываем контент во внеэкранный буфер и многократно перерисовываем его разными слоями.
val graphicsLayer = rememberGraphicsLayer()
Box(Modifier.drawWithContent {
graphicsLayer.record { drawContent() }
}) {
content()
}
Теперь
drawLayer(graphicsLayer) можно использовать в любых эффектах.🔹 Линии сканирования
Создаём повторяющиеся градиенты — вертикальные и горизонтальные:
private fun DrawScope.drawScanLines(alpha: Float, blend: BlendMode) {
val c = Colors.Black.copy(alpha)
drawRect(
brush = Brush.verticalGradient(
0f to c, 0.4f to c, 0.4f to Colors.Transparent, 1f to Colors.Transparent,
tileMode = TileMode.Repeated, endY = 10f
),
blendMode = blend
)
}Добавляем их поверх слоя:
.drawBehind {
layer {
drawLayer(graphicsLayer)
drawScanLines(alpha = 1f, blend = BlendMode.DstOut)
}
}DstOut вычитает градиент и создаёт характерный "CRT-срез".🔹 Размытие и свечение
Для реалистичного свечения рисуем несколько слоёв с разным blur/scale/alpha:
val blurLayers = listOf(
Triple(5.dp, .3f, 1.02f to 1.03f),
Triple(0.dp, .8f, 1f to 1f),
Triple(10.dp, .6f, 1.001f to 1f),
)
Каждый слой:
Box(
Modifier
.matchParentSize()
.blur(blur, BlurredEdgeTreatment.Unbounded)
.graphicsLayer { scaleX = scale.first; scaleY = scale.second; this.alpha = alpha }
.drawBehind {
layer {
drawLayer(graphicsLayer)
drawScanLines(1f, BlendMode.DstOut)
}
}
)
🔹 Дрожание экрана
var shake by remember { mutableStateOf(Offset.Zero) }
LaunchedEffect(Unit) {
while (true) {
shake = Offset(
Random.nextFloat() * Random.nextInt(-1, 1),
Random.nextFloat() * Random.nextInt(-1, 1),
)
delay(32)
}
}И применяем:
.graphicsLayer {
translationX = shake.x
translationY = shake.y
}#PixelPerfect #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🤖 Нужны ли UI-тесты в мобильной разработке
Одни уверяют:
«UI-тесты — это инвестиция. Они ловят самые подлые баги и экономят время всей команде!»
Другие отвечают:
«Писать UI-тесты дольше, чем сам экран. Ломаются от любого чиха. Зачем оно вообще?»
А правда — где-то между стабильным билдом и бесконечным падением тестов в CI.
А ты что думаешь?💬
❤️ — Пишу UI-тесты — люблю надёжность
👍 — Не пишу — быстрее руками проверить
🤝 — Идеально: только критические сценарии
🐸 Библиотека мобильного разработчика
#междусобойчик
Одни уверяют:
«UI-тесты — это инвестиция. Они ловят самые подлые баги и экономят время всей команде!»
Другие отвечают:
«Писать UI-тесты дольше, чем сам экран. Ломаются от любого чиха. Зачем оно вообще?»
А правда — где-то между стабильным билдом и бесконечным падением тестов в CI.
А ты что думаешь?
❤️ — Пишу UI-тесты — люблю надёжность
👍 — Не пишу — быстрее руками проверить
🤝 — Идеально: только критические сценарии
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤5🤝3
Старший iOS разработчик / Senior iOS разработчик — от 300 000 ₽, гибрид (Санкт-Петербург)
Android Developer | Middle+ - Senior — до 350 000 ₽, удалёнка
iOS Developer — от 270 000 до 300 000 ₽, удалёнка
Senior Android Developer — от 4 000 до 6 000 $, удалёнка
Senior iOS Developer (Swift) — от 4 500 до 5 000 $, удалёнка
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
А вы знали, что почти все ViewModels нестабильны?
Когда мы только изучаем Compose,
нас учат использовать стабильный класс, а не нестабильный.
Но ViewModels нестабильны. Так почему же никто ничего не говорит о том, что мы используем нестабильные ViewModels?
🔹 Как Compose определяет стабильность?
Компилятор Compose считает класс стабильным, если:
val/var) неизменяемы (val).MutableState<T>).Взгляните на примеры:
// Стабильный класс
data class Stable(
val a: Int, // Стабильно
val b: MutableState<Int>, // Стабильно, отслеживается Compose
val c: SnapshotStateList<Int> // Стабильно, отслеживается Compose
)
// Нестабильный класс
data class Unstable(
var b: Int // Нестабильно из-за `var`
)
// "Неопределенная" стабильность
data class Runtime(
val i: Interface // Компилятор не знает, какая реализация будет на runtime.
)
Но есть важный нюанс: это правило работает только внутри модуля, где подключен компилятор Compose.
🔹 Что происходит на границах модулей?
Допустим, вы создали стабильную
data class в слое данных (data) и внедрили её в ViewModel в слое презентации.Логично ожидать, что
ViewModel тоже будет стабильным. Но на практике — нет!Compose-компилятор в модуле презентации не может заглянуть в модуль данных, чтобы проверить стабильность вашего класса. Поэтому он перестраховывается и помечает любой класс извне как нестабильный.
А раз наш
ViewModel зависит от репозиториев и UseCase из других модулей (domain/data), то и он сам автоматически становится нестабильным.🔹 Так почему же нестабильный ViewModel — это норма?
Ответ простой и лежит на поверхности: мы не передаем сам ViewModel в дочерние композаблы.
Вместо этого мы:
1. Создаем
ViewModel один раз наверху (например, в NavGraph).2. Коллектим его состояние (
state), которое уже является стабильным.3. Пробрасываем это стабильное состояние вниз по дереву композиции.
@Composable
fun Screen(viewModel: TestViewModel) { // ViewModel нестабилен, и это ок
val state by viewModel.state.collectAsState() // Состояние - стабильно
Child(state) // Передаем стабильный state
}
@Composable
fun Child(state: TestState) { // Стабильный пропс -> рекомпозиции оптимизированы
Text(state.data)
}
Compose-рантайм следит за изменениями в
state. Сам ViewModel как объект не «пробрасывается» глубже и не триггерит лишних рекомпозиций.🔹 Итоги
Так что можете спать спокойно — с вашим кодом всё в порядке.
#АрхитектурныйКод #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1❤🔥1🔥1🤔1
🎓 Экспресс-курс «Математика для Data Science» стартует 4 декабря
Этот курс для вас, если вы:
🧑💻 Программист
Когда нужно понять, что происходит «под капотом» ML-алгоритмов.
📊 Начинающий DS / аналитик / студент
Чтобы закрыть теорию, подтянуть фундамент и собрать портфолио.
📈 Смежный специалист
Чтобы уверенно работать с моделями, статистикой и гипотезами.
🎁 Сейчас лучший момент стартовать:
— скидка 40% на курс до конца ноября
— можно пройти бесплатный тест на знание основ математики
👉 Записаться на курс
Этот курс для вас, если вы:
🧑💻 Программист
Когда нужно понять, что происходит «под капотом» ML-алгоритмов.
📊 Начинающий DS / аналитик / студент
Чтобы закрыть теорию, подтянуть фундамент и собрать портфолио.
📈 Смежный специалист
Чтобы уверенно работать с моделями, статистикой и гипотезами.
🎁 Сейчас лучший момент стартовать:
— скидка 40% на курс до конца ноября
— можно пройти бесплатный тест на знание основ математики
👉 Записаться на курс
Please open Telegram to view this post
VIEW IN TELEGRAM