Android | Михаил Белый
310 subscribers
272 photos
32 videos
127 links
Авторская песочница о карьере в IT в роли Mobile Dev (Android, Kotlin, Multiplatform) и разных вещах, которые мне интересны.

Посты каждый день в 5 вечера.

Автор: @michaelbel

Забустить: t.me/boost/foundout

Задонатить: boosty.to/michaelbel
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Битовые маски в Kotlin

Представим ситуацию – мы пилим соцсеть с юзерами. Перекладываем джейсон в интерфейсный список. Как-то раз нам нужно добавить рядом с именем юзера значок верификации. Бэк напрягается и меняет контракт юзера в API, добавляя новое поле isVerified: Boolean. Теперь в зависимости от полученного значения мы манипулируем отображением галки на фронте.

Проходит время, настает потребность добавить значок олда для наших самых преданных пользователей. Опять меняем контракт и заводим дополнительное поле – isOld: Boolean. Теперь на фронте возможны 3 комбинации отображения бейджей:
1. юзеры с верификацией и олдом.
2. только юзеры с верификацией.
3. только юзеры с олдом.

Вскоре хотим разгуляться и добавить еще штук 5 самых разных бейджей. Менять контракт и добавлять кучу полей уже не кажется хорошей идеей. Здесь нам на помощь спешат битовые маски, а именно оператор сдвига влево – shl.

Про операторы над двоичными представлениями чисел когда-нибудь в другом посте. Сейчас остановимся на практическом примере.

Будет прекрасно каждому нашему значку присвоить уникальное число. На фронт будем отправлять сумму этих чисел (список значков). Таким образом это:

{
"username": "Zak Lewis",
"isVerified": true,
"isOld": false
}


превращается в это:

{
"username": "Zak Lewis",
"badges": 1
27
}


Список значков на фронте будет enum-списком:


enum class BadgeEnum(
val bit: Int
) {
BADGE_EMPTY(0), // 0
BADGE_VERIFIED(1 shl 0), // 1
BADGE_OLD(1 shl 1), // 2
BADGE_NEW(1 shl 2), // 4
BADGE_STAR(1 shl 3), // 8
BADGE_CROWN(1 shl 4), // 16
BADGE_HEART(1 shl 5), // 32
BADGE_RICH(1 shl 6); // 64
}


Для каждого следующего значка двигаем биты на 2 разряда влево, то есть возводим число в степень двойки. Теперь, чтобы сообщить фронту, что юзер – верифицированный олд с короной, достаточно прислать badges: 19 (1 + 2 + 16). Сумма всегда будет уникальной.

Выявлять значок в присланное маске будем сравнивая числа побитно оператором and внутри инфиксной функции hasFlag. Например:


val Int.isVerified: Boolean
get() = this hasFlag BADGE_VERIFIED

val Int.isOld: Boolean
get() = this hasFlag BADGE_OLD


Мы также можем смапить все значки из маски в один список функцией mapEnabled.
Для badges: 19 результат будет:
listOf(
BADGE_VERIFIED,
BADGE_OLD,
BADGE_CROWN
)

Или наоборот, узнать каких значков в маске нет с помощью функции mapNotEnabled.

Пример, экстеншены и тесты в репозитории на гитхабе:
🐗 github.com/michaelbel/EnumBitmask
Please open Telegram to view this post
VIEW IN TELEGRAM
5211
🐗 Обновление эмодзипака

72 новые иконки прибыли!

🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 Добавились разные видеохостинги, так как ютуб на ладан дышит.

🐗 🐗 🐗 🐗 🐗 🐗 Популярные браузеры.

🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 🐗 Языки и фреймворки.

🐗 🐗 🐗 🐗 🐗 Порицаемые соцсети компании мета.

🐗 🐗 Продукция адобе.

🐗 🐗 🐗 🐗 🐗 Продукция мелкомягких.

🐗 🐗 Продукция гугла.

🐗 Продукция эпла.

🐗 🐗 Соцсети для дизайнеров.

🐗 🐗 🐗 🐗 Геймдев.

🐗 🐗 Корпоративный софт.

🐗 🐗 Две буквы из фаанга.

🐗 Реддит объемный. Поиграли в плоский дизайн и хватит.

🐗 Айос 18 (выходит скоро).

🐗 Дакдакго (лучший поисковик кста).

🐗 Миджорни.

🐗 Саундклауд.

🐗 Хабр.

🐗 Телеграф.

🐗 Википедия.

🐗 Хуавей.

🐗 Апаче.

🐗 Бинанс.

🐗 Докер

🐗 Дропбокс.

🐗 Линукс.

🐗 Пэйпал.

🐗 Progressive web app.

🐗 Снэпчат.

🐗 Торрент.

🐗 Вайбер.

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
505221
🐗🐗 Обновление карьерного роадмапа

Из визуального:

Новые иконки и сочные обложки для каждой страницы. Единый стиль заголовков. Ссылки на статьи и видосы стали меншенами и теперь сопровождаются датой публикации.

По разделам:

🐗 Job Interview
Список ключевых навыков для резюме.
Вопросы по cultural fit.
Вопросы будущему руководителю.
Больше моков по system design + вопросы/ответы.
Асимптотика алгоритмов сортировки.
Задачи «‎что произойдет»‎ на лайвкодинг.

🐗 Kotlin
Битовые операторы: shl, shr, ushr.
Функции валидации аргументов: require, check, error.
Все варианты применения Object.
Про корутины: supervisorScope, withTimeout, Channel.
Про StateFlow: update, collectAsState, collectAsStateWithLifecycle.
Бестпрактисы по KMP, как пересесть с Java, какие androidx-библиотеки уже переехали.
Инструкция как генерировать мультиплатформенные ресурсы, запускать и паковать WebApp.

🐗 Java
Иерархия исключений.
Примеры лямбд.
Iterator в коллекциях. HashMap vs Hashtable.
Young vs Old Generation в мусорке, подробнее про StrongReference и PhantomReference.
Java Memory Model, Happens Before, стек, куча, мьютекс, монитор, семафор, deadlock, race condition, stop the world и другие страшные вещи.

🐗 Compose
Аннотации Stable и Immutable.
compositionLocalOf vs staticCompositionLocalOf.
nestedScrollConnection.

🐗 Android
Добавились 2 графических роадмапа.
Параметры манифеста.
Вопросы про пермишены и сервисы.
Новые коллекции: ScatterMap, ObjectFloatMap, IntIntPair.
Вопросы и ответы про отрисовку и состояние View.
Про RenderThread и частоту отрисовки UI.
Плюсы/минусы/различия MVP/MVI/MVVM.
Про подключение зависимостей и модулей: implementation, api, compileOnly, runtimeOnly.
DI vs Service locator.
Добавилась страничка для ExoPlayer.

🐗 Jetpack
Подробное описание Hilt: Multibindings, Singleton, Subcomponent, Binds vs Provides, Component vs Module.
Про SavedStateHandle у ViewModel.
Аннотации в Room.

🐗 Studio
Инструкция как выделить под студию больше памяти.

🐗 Git
Ссылка на бесплатный курс по Git.
Инструкция как развернуть свой web-проект на Github Pages.

🐗 Samples
Тип и краткое описание для всех проектов и библиотек.
Добавились новые проекты.

Дальнейшие планы:

• Оптимизации в Compose.
• Внутренности корутин.
• Многопоточность в JVM.
• Алгоритмы и структуры данных.
• Мультиплатформа: iOS, Desktop и Web.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
11631
🐗 Несколько новостей про эмодзипак

1. Cтарый набор со 160 иконками в формате PNG перестает обновляться.

2. Ему на замену приходят новые эмодзипаки: РАЗ и ДВА. 400 эмодзи в высоком разрешении. Первый набор про мобильную разработку, второй про техсферу в целом.

Если грузить эмодзи в форматах PNG или WEBP качество будет страдать. Чтобы это исправить, в телеге придумали собственный формат TGS для анимированных стикеров и эмодзи (по сути переупакованный плагином SVG). Грузим статику под видом анимации и на выходе получаем уже не стыдный материал. Также у телеги обнаружилось ограничение на 200 эмодзи в одном паке, поэтому теперь их два.

Новинки:

Apple:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

Microsoft:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

Производители техники:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

Клепатели смартфонов:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

Игровые студии:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

Крипта и эквайринг:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

Языки:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

IDE-шки:
🐗🐗🐗🐗🐗🐗🐗🐗🐗🐗

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
5221
Media is too big
VIEW IN TELEGRAM
🐗 Сайт MobileDevEmoji

У эмодзипака появился свой сайт! Работает во всех браузерах 🐗🐗🐗🐗🐗🐗.

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

Главная фича – возможность кликнуть на эмодзи и получить название продукта. Например, тебе не понятно, что за голубой хомчик 🐗 затесался слева в шестом ряду. Тык и вуаля – перед нами маскот языка программирования Go. Пойман и опознан.

michaelbel.github.io/MobileDevEmoji

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
4211
Настроить айфон

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

НастройкиЗвуки и вибрацияОтклик клавиатурыТактильные сигналы🐗
Поразительно, что такая великолепная вещь как виброотклик клавы при наборе текста появилась в iOS только в 2022 году! Я когда перешел с андроида, недоумевал как можно без этой штуки печатать текст.

НастройкиУниверсальный доступКасаниеТактильное касаниеБыстро
Лонгтап во всей системе станет быстрым. Наша жизнь ускоряется, нет сил ждать целую секунду пока интерфейс одумается.

НастройкиЭкран и яркостьПоднятие для активации🐗
Экран будет включаться, когда берешь айфон в руки. Если можно не делать лишний тап по экрану - я его не делаю.

НастройкиКамераУровень🐗
Горизонт на фоточках будет ровным.

НастройкиAirPodsПодкл. к этому iPhoneПоследнее подключение к iPhone
Наушники не будут подключаться к айфону автоматически. Особенно полезно, когда смотришь кинцо на маке через наушники, потом на айфоне полез послушать кружок в телеге и эйрподсы не начинают скакать тудым-сюдым. Правда потом меня начинает бесить, что эйрподсы не подключаются к айфону автоматически. Нужен третий вариант для таких как я.

НастройкиЗвуки и вибрацияБезопасность наушниковГромкость аудио тише🐗
Хочется, чтобы во время тренировки музыка наваливала погромче. А эппл со своей гиперзаботой не мешал.

НастройкиApp StoreОценки и отзывы🐗
Больше ни одно приложение не будет клянчить себе оценку в сторе.
Please open Telegram to view this post
VIEW IN TELEGRAM
511
🐗🐗 Обновление карьерного роадмапа

• Список вложенных страниц переместился наверх.
• Добавились вопросы с собесов в те разделы, где их не было.
• Алгоритмическая секция переехала в отдельный раздел.

🐗 Job Interview
Добавлен роадмап тимлида.
Как себя вести на лайвкодинге?
Добавлены новые задачи на лайвкодинг.
Добавлены решения для существующих задач на лайвкодинг.

🐗 Algorithms
Временная и пространственная сложность.
О-Нотация.
Оптимизация алгоритма.
Структуры данных.
Бинарный поиск.
Бинарное дерево.
Красно-черное дерево.
Подробное описание решения 13 задач с литкода:
Строки: Longest Common Prefix, Roman to Integer, Valid Anagram, Reverse String.
Массивы: Two Sum.
Связные списки: Linked List Cycle, Merge Two Sorted Lists, Reverse Linked List.
Математические задачи: Palindrome Number.
Манипуляция с битами: Single Number.
Бинарный поиск: Sqrt(x).
Префиксные суммы: Running Sum of 1d Array.
Стек: Valid Parentheses.

🐗 Kotlin
Channels переехали на отдельную страницу.
Описание Rendezvous, Buffered и Conflated channels. Операторы send, receive, offer, poll.
Kotlin Contracts.
Оператор ::.
Делегаты: observable, vetoable и map.
Дженерики: star-projection.
Логические битовые операции: and, or, xor.
Битовые методы: inv, countOneBits, countLeadingZeroBits, countTrailingZeroBits, takeHighestOneBit, takeLowestOneBit, rotateLeft, rotateRight.
Локальные функции.
Data Class: сопоставление с образом.
Coroutines: Жизненный цикл Job и описание методов: start, join, cancel, cancelAndJoin, isActive, isCancelled, isCompleted, invokeOnCompletion.

🐗 Java
Boxing и Unboxing примитивов в обертки.
Object: описание методов wait, notify, notifyAll.
ReentrantLock.
HashMap: сложность операций.

🐗 Compose
Функция mutableStateListOf.
Снапшоты: SnapshotStateList, Snapshot, snapshotFlow.
UI Components: полный список всех Compose-компонентов.

🐗 Android
Отдельная страничка для Fragment.
Описание всех видов Drawable.
Как сделать обмен данных между Activity и Service.
Зачем нужен Choreographer.
Как работает Bundle в транзакциях.
Подробно про метод onMeasure у View.
Network: SSL pinning.
Build: Компоненты APK, структура, как уменьшить размер, как взломать. Zygote. Doze Mode, различия miSdk, compileSdk и targetSdk.
XML-теги <merge> и <include>.
LayoutInflater.
Явный и неявный BroadcastReceiver.

🐗 Jetpack
Обновилась страничка про ViewBinding.

🐗 Studio
Инструкция: отключение отображения имен параметров в коде.

🐗 Git
Команды поделены на разделы: настройка, работа с репозиторием, работа с ветками, работа с удаленным репозиторием, история и отмена изменений, работа с тегами, продвинутые команды.
Подробное описание файла .gitignore: расположение, формат, настройка для android-проекта.

🐗 Samples
Список библиотек и приложений разделен на android и kotlin-multiplatform.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
13111
Как делать сайт на Kotlin + Compose

С какими проблемами придется столкнуться. И как их решать.

Обо всем этом в небольшом посте с картинками, видосиками и кусками кода.

🐗 Читать на Boosty

#emoji
Please open Telegram to view this post
VIEW IN TELEGRAM
1133
🐗 Обновление эмодзипака

200 НОВЫХ ИКОНОК

Новинки:

🐗 Duolingo

🐗🐗🐗 Такси

🐗🐗🐗 Работа

🐗 Apple Pkl

🐗🐗🐗 Android

🐗 Google Wallet

🐗 Google I/O

🐗 Google Play Services

🐗 Fuchsia

🐗 Kubernetes

🐗🐗🐗 Microsoft

🐗🐗🐗 CI

🐗🐗 Obsidian

🐗 Airtable

🐗 Calendly

🐗🐗🐗🐗 Крипта

🐗 Solidity

🐗 Codewars

🐗 LeetCode

🐗 HuckerRank

🐗 Haskell

🐗 Qt

🐗 SyanogenMod

🐗 LineageOS

🐗 HarmonyOS

🐗 Mi Home

🐗 Eclipse

🐗 Buy Me a Coffee

🐗 DonationAlerts

🐗 Clubhouse (забыл про него)

🐗 Proton Mail

🐗 Medium

🐗 Redis

🐗 Gitea

🐗 Dependabot

🐗 Atlassian

🐗 Ruby on Rails

и другие.

НАБОР 1НАБОР 2САЙТ

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
521
🐗🐗 Обновление карьерного роадмапа

• В блоке «вопросы на собесе» добавились вопросы с вариантами ответа, чтобы нас запутать (+ правильный ответ). Также добавились новые вопросы и лаконичные ответы на них.
• Ускорилась загрузка страниц за счет оптимизации картинок.

🐗 Job Interview
Новая страница – Скрининг от HR c вопросиками про прошлый опыт и будущую работу.
Пополнился список ключевых навыков для резюме.

🐗 Algorithms
Решение 10 задач с литкода:
• Строки: Find the Index of the First Occurrence in a String, Length of Last Word, Valid Palindrome.
• Массивы: Remove Duplicates from Sorted Array, Remove Element, How Many Numbers Are Smaller Than the Current Number, Sum of Unique Elements, Merge Sorted Array.
• Связные списки: Remove Duplicates from Sorted List.
• Бинарный поиск: Search Insert Position.

🐗 Kotlin
Обновлено описание Sequences: отличие от коллекций, методы asSequence, map, filter, generateSequence.
Обновлено описание Coroutine Dispatchers, CoroutineName, билдеров launch и async, функций runCatching и runBlocking, suspend и Continuation.
Функция suspendCoroutine.
Синхронизация в корутинах, класс Mutex.
Обновлено описание метода collect у Flow.
Обновлено описание inline-функций и reified.
Обновлено описание sealed class.
Ограничения у Extension Functions.
Подробнее про методы data-класса.
Обновлено описание аннотаций @JvmStatic, @JvmOverloads, @JvmField и @JvmInline.
Добавлено описание аннотаций @JvmName, @JvmSynthetic и @JvmDefault.

🐗 Java
GC: Reference Counting.
ThreadPool: FixedThreadPool, CachedThreadPool, SingleThreadExecutor, ScheduledThreadPool.
Что такое String Pool.
Инфа про алгоритмическую сложность операций доступа/вставки/удаления элементов в ArrayList и LinkedList.

🐗 RxJava
Операторы управления потоками: doOnNext, doOnComplete, doOnError, doAfterTerminate, doOnDispose.
Операторы трансформации: just, fromIterable, filter, skip, skipLast, take, takeLast, concat, combineLatest, join, onErrorResumeNext, onErrorReturnItem, retry, retryWhen, delay, debounce, scan.

🐗 Android
Обновлен раздел про ООП - теперь с примерами кода: class, abstract class, interface, наследование, композиция, агрегация.
Обновлено описание принципов SOLID.
Что такое сигнатура метода.
Как работает UDF.
Reducer и Middleware в MVI.
Приоритеты процессов в Android.
Аннотации для потоков @MainThread, @UiThread и @WorkerThread.
View: методы invalidate, postInvalidate, requestLayout, forceLayout, onLayout.
MotionLayout.
ViewStub.
WebView.
Сервисы: Bound, IBinder, onBind, onUnbind.
Activity: ActivityManager и его методы, taskAffinity, OnBackPressedDispatcher, TaskStackBuilder, Launch Modes.
Фрагменты: методы add и replace.
AsyncLayoutInflater и параметр attachToRoot.

🐗 Jetpack
Обновлен раздел про Hilt: Scopes, ленивая инициализация через Lazy и Provider, аннотации @Named, @Qualifier, @IntoSet, @IntoMap, @Subcomponent, @Binds и @Provides.

🐗 Compose
Adaptive Layouts: BoxWithConstraints, NavigationSuiteScaffold, ListDetailPaneScaffold, SupportingPaneScaffold, NavigableListDetailPaneScaffold.
Обновлен раздел про рекомпозицию и жизненный цикл Composable-функций.
Обновлено описание SideEffects.
BackHandler.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6321