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
adb shell am broadcast – отправка broadcast-интентов из командной строкиМощный инструмент для тестирования обработки broadcast-сообщений в вашем приложении без необходимости эмулировать системные события через UI.
# Отправка кастомного broadcast
adb shell am broadcast -a "com.yourapp.action.CUSTOM_ACTION"
# С дополнительными данными
adb shell am broadcast -a "com.yourapp.action.CUSTOM_ACTION" --es "key" "value"
1. Тестирование системных событий:
# Имитация подключения зарядки
adb shell am broadcast -a android.intent.action.ACTION_POWER_CONNECTED
# Имитация изменения языка системы
adb shell am broadcast -a android.intent.action.LOCALE_CHANGED
2. Тестирование кастомных broadcast receivers:
# Отправка с дополнительными extras
adb shell am broadcast -a "com.yourapp.action.DATA_REFRESH" \
--es "refresh_type" "full" \
--ei "user_id" 12345 \
--ez "force_update" true
3. Отправка конкретному пакету:
# Только для вашего приложения
adb shell am broadcast -a "com.yourapp.action.TEST" -n com.yourapp.package/.ReceiverName
Уведомление о низком заряде:
adb shell am broadcast -a android.intent.action.BATTERY_LOW
Изменение конфигурации:
adb shell am broadcast -a android.intent.action.CONFIGURATION_CHANGED
События времени:
adb shell am broadcast -a android.intent.action.TIME_SET
Какие broadcast-ы вы чаще всего тестируете через командную строку?
#буст #MiddlePath #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Чем важна математика расскажет Мария Тихонова - кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ на курсе «Математика для Data Science» от Proglib Academy.
Курс предусматривает выполнение практического проекта с фидбеком от экспертов. За проект можно взять темы:
• обучите градиентный спуск для предсказания цен на квартиры
• создадите классификатор тональности или тематики текста
• построите простую рекомендательную систему на матричных разложениях
Бонусы:
- скидка 40% до 30 ноября
- если оплатить до конца ноября, получите курс «Базовая математика» в подарок
➡️ Пройти бесплатный тест на знание математики
Записаться на курс
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня большинство компаний разрабатывают мобильные приложения, поэтому умение работать с ними становится почти обязательным скиллом. Мобильное приложение — это не просто веб в миниатюре, это отдельный мир со своей архитектурой, устройствами, операционными системами и ограничениями.
В статье автор расскажет об основных особенностях мобильных платформ, с которыми тестировщики сталкиваются на практике.
#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👾 Compose Stability Analyzer — аналитика стабильности композабл в Android Studio
Compose Stability Analyzer анализирует стабильность ваших композабл функций Jetpack Compose в режиме реального времени непосредственно в Android Studio или IntelliJ. Он помогает понять, почему компонуемая функция стабильна или нестабильна, и предоставляет подробную информацию благодаря трассировке и журналированию рекомпозиции.
Кроме того, вы можете отслеживать причину, по которой ваша компонуемая функция запускает рекомпозицию, с помощью аннотации
💻 Compose Stability Analyzer на GitHub
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
🐸 Библиотека мобильного разработчика
#буст #Android
Compose Stability Analyzer анализирует стабильность ваших композабл функций Jetpack Compose в режиме реального времени непосредственно в Android Studio или IntelliJ. Он помогает понять, почему компонуемая функция стабильна или нестабильна, и предоставляет подробную информацию благодаря трассировке и журналированию рекомпозиции.
Кроме того, вы можете отслеживать причину, по которой ваша компонуемая функция запускает рекомпозицию, с помощью аннотации
TraceRecomposition и экспортировать отчёты о стабильности и совместимости с помощью тасков Gradle для просмотра изменений.🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#буст #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰1
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему происходит ошибка "index out of range"?
Anonymous Quiz
7%
Неправильное использование weak self
32%
Race condition между обновлением данных и прокруткой
5%
Проблема с асинхронной загрузкой данных
39%
Данные обновляются, но таблица еще не обновила индексы
16%
Посмотреть ответ
This media is not supported in your browser
VIEW IN TELEGRAM