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
Новые города

В новогодний уикенд случился налет на 4 города. Несколько наблюдений:

🇨🇳 Гуанчжоу (Китай)

Комфортные 25 градусов тепла. Людей много. Еда страшная. Инглиш мазафака никто не спикинг. Удобное метро из аэропорта. Олени и прочая новогодняя шушера смотрятся неуместно.

🇻🇳 Хошимин (Вьетнам)

Очередная хакуна-матата страна. Живут в раю и мешки не ворочают. Все дешевое. У денег большие номиналы, не удобно цены считать. Можно отобедать на лям. Хрючево стало ещё страшнее. Но я готов питаться только сушами, соломкой и нарезанной дыней. Прохладные бичклабы. В коктейлях трубки из крахмала. Постоянно просят расписываться на чеках. Очень много скутеров. Дорогу надо переходить без суеты, чтобы они тебя обтекали. Попадаются няшные электробимбокары VinFast.
Море теплое, пляжи чистые, крэбс плодится. Будда и Иисус делят религиозную поляну. Скама нет, один таксист отказывался поездку в грабе начать, но был поставлен на место. Больше не приеду.

🇹🇭 Бангкок (Тайланд)

Огромный город-маркетплейс. На такси передвигаться неудобно – кривые, понастроенные кое-как дороги и постоянные пробки. Таксисты люто сопротивляются уберизации. Прикольный скайволк между станциями метро и торговыми центрами. Этакий двухэтажный город. Красивый монорельс. Есть тук-туки. Помимо мутных районов имеются очень приличные, как в Токио. Ледибоев не обнаружено. Выпил всю мокку в Старбаксах. Пульс пробил сотку на аттракционе I-Tilt. Сами тайцы – чрезвычайно вежливые ребята. Воду в бутылки наливают краев не видят, несколько раз облился. Чаевые включены в счет – очень удобно. В центральном парке бегают бегуны и ползают вараны. Продолжается период траура в связи со смертью королевы. Дважды в день в общественных местах включают национальный гимн. Бегуны замерают по стойке смирно. Вараны продолжают хавать. Приеду ещё не раз.

🇲🇾 Куала-Лумпур (Малайзия)

Удобно добираться на местном лоукостере Air Asia. Страна ничем не известна кроме своих петронасов. Вокруг них фотографов как собак нерезанных. Шагу не ступить, чтобы не предложили сфоткаться. Весь город провонял дурианом. Жители похожи на индусов. У населения очень понятный разговорный английский. На ресепшене сделали мозг не развешивать шмот на телеке и не готовить в номере. Также двухэтажный скайволк. Больше не буду покупать старые доллары, они кроме японцев уже никому не нужны. Везде принимают карты.
Please open Telegram to view this post
VIEW IN TELEGRAM
95311
Обновление эмодзипака

Добавлено 100 новых эмодзи.

🐗 Google Code Wiki

🐗 YouTube Create

🐗 YouTube Gaming

🐗 Yandex SourceCraft

🐗 LiveLib

🐗 NVIDIA Nemotron

🐗 Home Assistant

🐗 Stepik

🐗 DTF

🐗 vc.ru

🐗 Whoosh

🐗 DEV Community

🐗 Amazon Luna

🐗 Facebook Gaming

🐗 Hugging Face

🐗 CapCut

🐗 TechRadar

🐗 Apache ActiveMQ

🐗 Apache Druid

🐗 Apache Cordova

🐗 Microsoft Planner

🐗 Microsoft PlayWright

🐗 Proton Docs

🐗 Proton Sheets

🐗 Atlassian Rovo

🐗 Opera Mini

🐗 Opera GX

🐗 Assembly Script

🐗 Liquibase

🐗 wikiHow

🐗 Product Hunt

🐗 PYUSD

🐗 Feedburner

🐗 Supremo

🐗 Block

🐗 OpenAPI

🐗 Mockoon

🐗 Apollo

🐗 Insomnia

🐗 Hinge

🐗 Edvibe

🐗 Half-Life

🐗 Capcom

🐗 Obsidian Entertainment

🐗 Relic Entertainment

🐗 Creative Assembly

🐗 Gearbox Software

🐗 Guerrilla Games

🐗 Insomniac Games

🐗 Remedy Entertainment

🐗 Kaggle

🐗 2K Games

🐗 Deep Silver

🐗 Hazelight Studios

🐗 Warhorse Studios

🐗 Hangar 13

🐗 Sui

🐗 Zcash

🐗 Shiba Inu

🐗 Roo Code

🐗 Avalanche

🐗 uBlock Origin

🐗 KeyDB

🐗 Ceph

🐗 MinIO

🐗 HAProxy

🐗 Qemu

🐗 Sonar

🐗 Thanos

🐗 Proxmox

🐗 Anysphere

🐗 GOG.com

🐗 Meetup

🐗 Avast

🐗 Wrike

🐗 Trino

🐗 Machine Games

🐗 FunPlus

🐗 Shopee

🐗 Sucker Punch

🐗 Trip.com

🐗 Langfuse

🐗 Hackster.io

🐗 Spaceship

🐗 MiniMax

🐗 SWE-bench

🐗 Tripadvisor

🐗 OxygenOS

🐗 Sony Interactive Entertainment

🐗 Groq

🐗 Quizlet

🐗 StarRocks

🐗 Keycloak

🐗 OpenShift

🐗 Chainlink

🐗 МТС Музыка

🐗 Calm

🐗 Cardano

🐗 Hyper Foundation

🐗 Istio

Все паки:
Dev Emoji 1
Dev Emoji 2
Dev Emoji 3
Dev Emoji 4
Dev Emoji 5
Dev Emoji 6
Text Emoji
Adaptive Emoji

Миниапп с названиями, поиском и фильтрами

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
32
Обновлено 6 эмодзи

🐗 ➡️ 🐗 Facebook Messenger

🐗 ➡️ 🐗 Opera

🐗 ➡️ 🐗 PayPal

🐗 ➡️ 🐗 Mediatek

🐗 ➡️ 🐗 Robinhood

🐗 ➡️ 🐗 Appium
Please open Telegram to view this post
VIEW IN TELEGRAM
84311
🐗 Обновление карьерного роадмапа

изменения с 18 марта

• обновленная главная страница
• новые обложки
• добавлены новые вопросы с собеседований

🐗 Job Interview
Покер планирования

🐗 Live Coding
Новый дизайн раздела.
Новые задачи от Т-Банк, Urent, Яндекс, Альфа, Wildberries.

🐗 Algorithms
Колонка Beat для литкод-решений.

🐗 CodeRun
• Решены все задачи из подборки Бэкенд первый сезон с компилятором Kotlin/Java
• Решены все задачи из подборки Code-life balance с компилятором Kotlin/Java
• Решены все задачи из подборки Впечатляющие тренировки
• Решены все задачи из подборки CodeRun Boost Challenge
• Решены все задачи из подборки Стажировка // Бэкенд
• Решены все задачи из подборки Тренировки. Забег по алгоритмам

🐗 DevOps
Добавлены кастомные Detekt-правила.

🐗 HeadHunter
Новый дизайн раздела.
Ответы на тесты по API.
Ответы на тесты по Алгоритмам и структурам данных.
Ответы на тесты по SQL Практика.

🐗 Java
Multiple Variable Declaration

🐗 RxJava
Вопросы с собеседований.

🐗 Kotlin
when.
Guard conditions.
Semicolon ;
spread-оператор * в vararg.
Обновилось описание inline-функций.
Multi-dollar string interpolation.
Overload resolution for suspend lambdas.

🐗 KMP
Вопросы с собеседований.

🐗 Swift
Синтаксис языка.
Concurrency.

🐗 Android
@UiContext, @DisplayContext, @NonUiContext.
Android 5 и Android 5.1 устарели.
Aliases.
Plurals.
TEA arch.

🐗 Jetpack
Room @Upsert.
Navigation Component устарел.

🐗 Compose
Modifier Offset.
Modifier Shadow.
Modifier Visibility.
Modifier.keepScreenOn.
rememberLifecycleOwner.
retain.
rememberSerializable.
rememberCoroutineScope.
snapshotFlow.
@UiComposable.
@RememberInComposition.
@FrequentlyChangingValue.

🐗 Material3
MaterialExpressiveTheme.
HorizontalFloatingToolbar
VerticalFloatingToolbar
ButtonGroup
FloatingActionButtonMenu
SplitButtonLayout
LinearWavyProgressIndicator
CircularWavyProgressIndicator

🐗 Gradle
Обновлено описание файла gradle.properties.

🐗 Git
Команда для отображения количества строк кода в проекте.

🐗 GitHub
Добавлены новые проекты.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
94321
🐗 Секретутка бот

В телеграме можно сделать себе бота и общаться с людьми через него. Человек пишет сообщение твоему боту. Оно сразу прилетает тебе в этом же боте. Отвечаешь реплаем. Сообщение улетает обратно написавшему. Быстро и безопасно.

Если много писать не контактам, то очень скоро получишь мьютом по голове. Сработает антиспам-ограничение по совокупности факторов: жалобы, блокировки, доля ответов и возраст аккаунта. Через бота можно переписываться сколько угодно.

1. Создаем бота через @BotFather и получаем BOT_TOKEN.

2. Узнаем свой chat_id. Для этого пишем сообщение боту и вызываем
https://api.telegram.org/bot<TOKEN>/getUpdates

3. Регистрируемся на Cloudflare

4. BuildCompute & AIWorkers & PagesCreate application

5. Открываем Editor и вставляем этот код

6. В WorkerSettingsVariables and Secrets добавляем переменные BOT_TOKEN (токен от BotFather) и ADMIN_CHAT_ID (свой chat_id)

7. Сохраняем и деплоим воркер. Получаем его адрес:
https://xxxx.your-name.workers.dev

8. Подключаем вебхук Telegram к Worker, открыв ссылку в браузере:
https://api.telegram.org/bot<TOKEN>/setWebhook?url=<WORKER_URL>

Cloudflare бесплатный, пока не упрешься в лимиты. Работает 24/7.

Вот так можно открыть профиль пользователя, зная только его chat_id:
tg://user?id=149707658

Мой секретарь
Please open Telegram to view this post
VIEW IN TELEGRAM
755
eSIM

Продаю щас айфон на авито, который только eSIM-версия. И неожиданно столкнулся с многочисленными отказами по причине отсутствия лотка для физической симки.

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

Как человек, родившийся с цифровой ложкой во рту, поясняю: это какая-то шиза. Формат симки никоем образом не влияет на уровень сигнала. Он зависит он модема телефона, качества сети оператора и условий вокруг (подвал, парковка).

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

Это будущее.

Все на свете производители смартфонов мечтают увеличить аккумулятор за счет места под слот. Пора привыкать и не морщить попу.

Если беспокоит плохая связь – надо купить симки разных операторов. С eSIM их будет удобно переключать в настройках телефона.
64421
На протяжении многих лет, когда слушал песню Cigarettes After Sex – Apocalypse, думал ее поет женщина. Такая за 30, с легкой хрипотцой, сигареткой в зубах и бокалом вина в руке. Я был в этом уверен.

Потом вздумалось мне клип на ютубе глянуть. У песни как оказалось мужской вокал. И вообще это бойсбенд. Женщина там рядом не стояла.

Вот так просто меня наебали. Мой мозг не способен тонер и фальцет классифицировать как мужскую форманту.
6432🤣111
У приложения, над которым я работаю, 100% Crash Free с первого релиза

Как получилось добиться столь выдающихся результатов?

• Trunk Based Development. Никаких конфликтов и мерджей.

• Чистейшая архитектура со слабыми связями между слоями.

• Новый стек и стабильные версии библиотек. Нет альфа/бета зависимостей.

• Compose Only. Никаких AndroidView. Рисуем на канвасе.

• Бизнес-логика покрыта тестами.

• Настроены Lint и Detekt.

• Код проанализирован Gemini 3 Pro и Opus 4.5. В Code Inspect 0 предупреждений.

• Мой огромный опыт с предыдущих работ, где я вдоволь набажился.

• Хорошая документация.

• Хорошие тестировщики.

• Логирование и аналитика.

• У приложения ~30 пользователей. Все используют одну модель смартфона (не сяоми, не хуавей).
239332
🐗 Наблюдение про App Store

Непонятно, зачем нужна армия индусов, которая проверяет обновления приложения в сторах. Еще тестовые учетки им подавай. Уже тыщу лет есть BDUI, где за учетом надоя прячется казик, фишинг и тинек. Целевая аудитория так или иначе получит, что хочет. Индусы бесполезны. Всех уволить или перевести в отдел аппеляций.

🐗 Наблюдение про Google Play

К армии модераторов добавилась политика для новых личных аккаунтов Google Play Console. Перед публикацией в прод будь добр проведи closed testing и держи минимум 12 тестировщиков 14 дней подряд. Из-за этого мне теперь по 10 раз в неделю пишут с просьбой продать мой аккаунт разработчика, созданный в 2017 году, где таких жестких требований нет. Ну или просто просят выложить чужое приложение от своего имени.

🐗 Наблюдение про RuStore

Протыкали мое приложение в хвост и в гриву. Не допустили к публикации. Накатали огромный отчет в вежливой форме что и где поправить. Премного благодарен за такой труд.
Please open Telegram to view this post
VIEW IN TELEGRAM
8321
За что платят в эпоху AI

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

Напрашивается вопрос: почему андроид-разработчики еще не штурмуют биржу труда?

Ответы на поверхности:

• Инфраструктура просто напросто не готова. За десятилетия айти без машин люди наплодили столько несовместимых интерфейсов, что теперь это создает нам огромный лаг в переходный период. Сначала строится дорога, потом по ней едет машина. Когда нет ни того, ни другого – приходится выбирать коня. LLM не хватает рабочих данных для обучения. Значимая часть информации секьюрна: внутренние доки, продуктовая логика, контракты команд, ограничения бизнеса. Удобные API и MCP не завезли.

• Разработка слишком быстро меняется. Чтобы проект в студии открывался и собирался – его надо регулярно обновлять. То новый плагин добавят, то старый выпилят. Библиотеки, языки, компиляторы – все постоянно меняется. Проект на AGP 7.1.1 сбилдить в новой студии нереально. Плюс требования сторов: без того и сего не пустим, это обнови, таргет подними, фолдаблы поддержи, вырезы покажи, политику соблюди. Разработчик во всем этом варится и бдит контекст, потому что информация до сих пор пишется и шлифуется для людей. Модели не умеют учиться в моменте – они достаются нам предобученными. Чтобы шарить за новые изменения их нужно дополнительно накормить контекстом: репозиторий, документация, новые релизы.

• Командное взаимодействие и ответственность. Конечно же, агенты умеют ходить на дейлики, внимательно слушать, не зевать и не засыпать. Робот Оптимус может за тебя лежать на диване парить ашку и листать тикток. Но большая часть работы – не писать код, который не имеет ценности, а ходить договариваться, выявлять требования, разруливать конфликты, протаскивать решения, выстраивать процессы, обучать новичков и принимать риски. Каждый человек – целая вселенная, с которой нужно уметь взаимодействовать, чтобы позже продать результат. Ответственность за этот результат все еще стоит денег.

Мы всеми силами поможем машинам нас заменить. А сами отчалим в закат. Но не сегодня.
74311
Обновление эмодзипака

Добавлено 100 новых эмодзи.

🐗 TOON

🐗 AltStore

🐗 OpenCode

🐗 Tether USAT

🐗 Dia Browser

🐗 1Password

🐗 Rippling

🐗 Android Police

🐗 Clawd Bot

🐗 Qase

🐗 Organic Maps

🐗 Microsoft Intune

🐗 Microsoft SQL Server

🐗 Microsoft Network

🐗 Microsoft Visio

🐗 Google BigQuery

🐗 Google Data Studio

🐗 Google Fiber

🐗 Artix Linux

🐗 RedLab

🐗 Worldline

🐗 Konami

🐗 Asobo Studio

🐗 Fanatics

🐗 FLYR

🐗 InnoGames

🐗 Momentive

🐗 Feedly

🐗 Weave

🐗 NAVER

🐗 LangChain

🐗 Moonshot AI

🐗 Kimi AI

🐗 BioRenderer

🐗 Alpaca

🐗 Blinkist

🐗 Drata

🐗 Egnyte

🐗 Hex

🐗 Jam AI

🐗 Prettier

🐗 GitKraken

🐗 D3

🐗 AllTrails

🐗 gulp.js

🐗 LMArena

🐗 Rollup

🐗 Widevine

🐗 Scaleway

🐗 Quantic Dream

🐗 Novita AI

🐗 Fireworks AI

🐗 Cohere

🐗 Fal.ai

🐗 CodeScene

🐗 Nscale

🐗 T-Mobile

🐗 FrontierMath

🐗 Kioxia

🐗 Peercoin

🐗 PublicAI

🐗 OKX

🐗 Hyperbolic

🐗 Cerebras

🐗 Hetzner

🐗 IGN

🐗 CodeRabbit

🐗 MetaHuman

🐗 OVHcloud

🐗 Telenor Group

🐗 Workato

🐗 Plaid

🐗 Substack

🐗 Chakra UI

🐗 Gumroad

🐗 Immich

🐗 Bitget

🐗 Emercoin

🐗 Samsara

🐗 Zscaler

🐗 ServiceNow

🐗 SentinelOne

🐗 Lobsters

🐗 Context7

🐗 Neon Serverless Postgres

🐗 Cypress

🐗 Presto

🐗 GrowthBook

🐗 Phantom

🐗 Redmine

🐗 Superwall

🐗 wgpu

🐗 Fileverse

🐗 ComfyUI

🐗 SimpleX Chat

🐗 Nextcloud

🐗 arXiv

🐗 Descript

🐗 Krea AI

🐗 Bigo Live

Dev Emoji 1
Dev Emoji 2
Dev Emoji 3
Dev Emoji 4
Dev Emoji 5
Dev Emoji 6
Dev Emoji 7
Text Emoji
Android Emoji
Adaptive Emoji

Миниапп с названиями, поиском и фильтрами

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
5221
Обновлено 7 эмодзи

🐗 ➡️ 🐗 YouTube

🐗 ➡️ 🐗 Roblox

🐗 ➡️ 🐗 Microsoft Visual Studio

🐗 ➡️ 🐗 Microsoft Clipchamp

🐗 ➡️ 🐗 Bethesda

🐗 ➡️ 🐗 AMD

🐗 ➡️ 🐗 Huawei AppGallery
Please open Telegram to view this post
VIEW IN TELEGRAM
521
Новый Android эмодзипак

Добавлен новый пак с 50 Android-эмодзи. Размер 100х100. Без рамок. Без фона.

🐗 Android

🐗 Android Jetpack

🐗 Android Jetpack

🐗 Android Studio

🐗 Android Studio Nightly

🐗 Android App Bundle

🐗 Compose

🐗 Material3

🐗 Google Play

🐗 Google Play Console

🐗 Google Play Games

🐗 Google Play Books

🐗 Android 5 Lollipop

🐗 Android 6 Marshmallow

🐗 Android 7 Nougat

🐗 Android 8 Oreo

🐗 Android 9 Pie

🐗 Android 10

🐗 Android 11

🐗 Android 12

🐗 Android 13

🐗 Android 14

🐗 Android 15

🐗 Android 16

🐗 Google

🐗 ARCore

🐗 Google Play Services

🐗 Wear OS

🐗 Android Auto

🐗 ML Kit

🐗 Google I/O

🐗 Gemini

🐗 Firebase

🐗 Firebase Studio

🐗 Flatter

🐗 Dart

🐗 JetBrains

🐗 Kotlin

🐗 KMP

🐗 CMP

🐗 Gradle

🐗 Java

🐗 Rx

🐗 F-Droid

🐗 Huawei

🐗 AppGallery

🐗 RuStore

🐗 Coil

🐗 Detekt

🐗 Realm

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
7331
Религия трудных времен

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

В такие периоды прошивка, стараясь защитить себя, переходит в оборону. Часто – через деструктивные установки. Вот какие обнаружил я:

• Вера в перерождение. В следующей жизни всё будет кучеряво, в этой можно не напрягаться. Чуть со стула не упал, когда такое услышал. Я принимаю религию как модель философии или нравственную опору, в дополнение к тому, что нас в конце концов сожрут черви. Но перерождение? Это уже клиника. И почему твоя прошлая жизнь не оставила тебе пароль от текущей?

• Отказ от достигаторства. Буду жить середнячком, не отсвечивать, звезд с неба не хватать, выйду из игры. Старый добрый дауншифтинг в обертке выбираю себя и отказываюсь копить начальнику на машину. Главный здесь самообман – что мир замедлится вместе с тобой. Ты просто снимаешь себя с дистанции, пока другие продолжат идти. Твой родезийский прапрадед не предпочел чилл на дереве антропогенезу.

• Поиск волшебной пилюли от всех бед. Про нее снят один из моих любимых фильмов 2011 года. И хотя это было во все времена, сейчас явление вошло в абсолют. 170 млн охвата набирает статья как изменить целую жизнь за один день. Никак. Дам три совета бесплатно: разведись с женой и найди молодую любовницу, переезжай в другой город, уволься с текущей работы. Перемены будут кардинальными.

Есть парадокс: в сложное время жить проще. Половина твоих конкурентов тильтует на автопилоте в ожидании чуда. Они начнут действовать, только когда станет легче. А сейчас может выиграть тот, кто идеального момента не ждет.
8532
BaseViewModel

Вчера на ютубе попался видос с критикой базовых классов, таких как BaseActivity и BaseViewModel. Антипаттерны это и нарушение принципа единственной ответственности. Полностью согласен. Если с активити все ясно – одна на проект и base-класс не нужен, то вокруг вьюмоделей не прекращается дискуссия с момента их появления.

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

К какому выводу пришел автор видео? Давайте просто переименуем BaseViewModel в MviViewModel! Тьфу, блять! У меня она так всегда и называлась.

В общем простенькая структура со скрина остается. Если где-то придумали лучше – с радостью бы подсмотрел. Я стал мало копаться в чужом коде, насмотренность падает, ощущаю деградацию. Надеюсь безосновательно.

По сути у нас есть Compose и подход Model–View–Intent. Один источник истины в виде единого State. Предсказуемые переходы состояний и понятный контракт между UI и логикой. UI отправляет намерения, ViewModel их обрабатывает, обновляет State и при необходимости отправляет разовые события через отдельный поток эффектов. События можно перенести куда-нибудь, но много ли выиграем? Я пошел дальше – у меня две базовые вьюмодели. Корутинная вторая отвечает за общий хэндлинг ошибок. Тут исходники.

Вижу здесь как минимум три недостатка:
• Подвешивание one-off эффектов. Событие может приходить не в нужный момент из-за паузы UI.
• Гонка асинхронных интентов между собой при росте их количества.
• Нарушение принципа LSP, когда базовая ViewModel параметризована локальным FeatureEvent и нельзя отправить глобальный AppEvent.

Но для приложений на 20 экранов с 3 кнопками на каждом – более чем достаточно и просто в реализации.
55311