🧹 пост хозяйке на заметку
Получить истинно рандомное число (строку) программно не так уж просто
Ведь для генерации числа нужен алгоритм, а алгоритм по определению вещь предсказуемая
Поэтому для получения максимально непредсказуемого значения нужно добавлять энтропию — хаотичное число, взятое за пределами алгоритма
Довольно известный фокус — для энтропии брать напряжение процессора в моменте, шум микрофона, значение датчика температуры...
А в мобильных приложениях аж два раза за последнее время наткнулся на получение случайного числа с помощью действий пользователя:
Плюсы:
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥7❤2
Это база , но если никогда не работали с cookies, может быть интересно
В мобильной разработке про cookies вспоминаешь в 2 случаях:
Коротко:
В хранилище для cookies. За это отвечают классы
OkHttp: CookieJar, CookieHandler, CookieStore
WebView: webkit.CookieManager
cookie-хранилища сами разруливают, на какие запросы нужно отправлять куку, а на какие нет — гибко настраивать это поведение можно с помощью cookie-атрибутов (httpOnly, secure, sameSite...)
"Set-Cookie"
Перед каждый сетевым запросом сетевой клиент (или WebView) идет в cookie-хралище и сообщает ему, на какой домен и путь (path) собирается сделать http-запрос
cookie-хранилище отдает список cookies, "привязанных" к этому домену
Сетевой клиент добавляет эти cookies в хэдер
"Cookies"
и отправляет вместе с сетевым запросом@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34❤5🦄5
Часто слышал этот термин, но не вдавался в подробности
Аппаратное ускорение — это перенос определенных расчетов с основного процессора на другие компоненты
Цель — разгрузить CPU и ускорить операции за счет специализированной архитектуры других чипов
В мобилке можно встретить следующие примеры аппаратного ускорения:
По умолчанию аппаратное ускорение включено, но его можно отключить через настройки разработчика
Реальных кейсов не встречал, зачем это надо, но в интернетах пишут, что на GPU-могут флаковать snapshot-тесты — иногда помогает отключить GPU
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
c Compose все немного сложнее — на отдельную composable-функцию отключить GPU нельзя
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
✍9👍6⚡4❤3
Вы же не забываете радоваться золотым годам бесплатных нейронок?
Пока все компании пытаются отжать себе долю рынка пожирнее, мы получаем крутейший продукт забесплатно
Причем абсолютно бесплатно — даже без рекламы
Одно из преимуществ нейнронок в том, что они сразу дают конкретные названия продуктов / моделей / версий. Могут выбрать лучшее и описать плюсы-минусы вариантов
Но как долго эти подсказки будут неподкупными?
Ведь это огромный простор для рекламы:
ждем появления нативной рекламы через пару лет
а потом подписку для отключения рекламы и подписку ultima-pro для полного отключения рекламы
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😁20🔥9🌭4👍3❤2
Dolgo.polo Dev | Денис Долгополов
кстати запомните, этот канал всегда будет бесплатный. Без рекламы. Без платных подписок.
😁21🤡17❤8✍4👍2
Утренняя рутина
Для этого часто требуется ввод одноразового кода с телефона — подтверждение фактора владения
дорого
для примерных подсчетов можно умножить 50 копеек на количество сотрудников в компании — это расходы за день
Поэтому прибегают к бесплатному TOTP (Time-based One-Time Password)
Как это работает:
Это безопасно:
Если время на телефоне и компьютере не совпадает, TOTP не сработает. Уехать на Гаити и скинуть код другу, чтобы он зачекинился с рабочего компа в офисе, не получится
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17⚡6🔥4❤1
🍏 Итоги WWDC 2025
Ничего нового для Android Studio не показали
Ничего нового для Android Studio не показали
😁43✍5❤2🔥1
Расскажите, если был удачный опыт — интересно узнать, мерите ли вы локально / в джобах на CI скорость работы приложения от тикета к тикету?
Мой опыт подсказывает, что это нереально. Потому что на перф влияет:
Поэтому увидеть реальное отклонение в десятках-сотнях миллисекунд можно только на биг дате, собранной хотя бы с нескольких тысяч пользователей
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤔5
Во что упороться, если надоел обычный Android #2
Год назад выходила первая часть
Если мир стал снова абсолютно понятен, то вот еще области, куда можно прокачаться с перспективой практической пользы:
🌸 Native c++.so
Нативные библиотеки нужны далеко не только для драйверов
С помощью них можно повысить скорость работы и создать проблемы реверс-хакерам
А также станет легче изучать исходники низкоуровневых либ, таких как WebView, Sentry, Cronet... на удивление иногда пригождается
🌸 ML/AI локальные
Последний год подарил нам кучу ИИ-игрушек, которые можно запускать локально, не заплатив ни цента
Первый уровень — посмотреть API их подключения и возможности
Второй уровень — разобраться, какие параметры на что влияют и какие педали надо жать, чтобы получить желаемый бизнесом результат
🌸 CI/CD и системы сборки
Нестареющая классика — пока не изобретут волшебную кнопку "собрать все типы сборок за ноль секунд со всеми комбинациями флагов и версий библиотек из всех мульти-репозиториев, доставить во все альсторы и синхронизировать в жиру", работа будет
🌸 Ktor как бэкенд-сервер
Ktor позволяет за пару строк на коленке собрать https/gRPC сервер на Kotlin
Это порой позволяет быстро протестировать сложные клиент-серверные сценарии, не дожидаясь реализации на бэке и не мучаясь с моками в Charles/Proxyman
Ну и начинаешь чувствовать больше общности с бэкендерами✨
@dolgo_polo_dev
Год назад выходила первая часть
Если мир стал снова абсолютно понятен, то вот еще области, куда можно прокачаться с перспективой практической пользы:
Нативные библиотеки нужны далеко не только для драйверов
С помощью них можно повысить скорость работы и создать проблемы реверс-хакерам
А также станет легче изучать исходники низкоуровневых либ, таких как WebView, Sentry, Cronet... на удивление иногда пригождается
Последний год подарил нам кучу ИИ-игрушек, которые можно запускать локально, не заплатив ни цента
Первый уровень — посмотреть API их подключения и возможности
Второй уровень — разобраться, какие параметры на что влияют и какие педали надо жать, чтобы получить желаемый бизнесом результат
Нестареющая классика — пока не изобретут волшебную кнопку "собрать все типы сборок за ноль секунд со всеми комбинациями флагов и версий библиотек из всех мульти-репозиториев, доставить во все альсторы и синхронизировать в жиру", работа будет
Ktor позволяет за пару строк на коленке собрать https/gRPC сервер на Kotlin
Это порой позволяет быстро протестировать сложные клиент-серверные сценарии, не дожидаясь реализации на бэке и не мучаясь с моками в Charles/Proxyman
Ну и начинаешь чувствовать больше общности с бэкендерами
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍7❤5
Приходит поручик Ржевский устраиваться мобильным разработчиком в крупную ИТ компанию. HR ему говорит:
- Вы готовы до конца жизни писать на Java в одном файле на 150 тысяч строк?
- Как можно, вы с ума сошли! Есть же MVVM, MVI, Clean architecture...!
- Зарплата — $1M / year after tax🧻
- А можно весь код в onCreate?
- Вы готовы до конца жизни писать на Java в одном файле на 150 тысяч строк?
- Как можно, вы с ума сошли! Есть же MVVM, MVI, Clean architecture...!
- Зарплата — $1M / year after tax
- А можно весь код в onCreate?
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤣73🔥30❤10😁10🤡5
Если не хочется ждать реализации бэка
Программы-снифферы, которые позволяют перехватывать и модифицировать трафик через UI-кнопочки
код писать не надо, но придется разобраться куда тыкать
а также не очень удобно проверять сложные сценарии, когда важно замокать несколько запросов подряд
Можно быстро (за 20 строк кода и 2 запроса к нейронке) набросать свой локальный сервер, который позволит на определенные запросы получать определенные ответы
получаем почти реальный сервер с полной свободой действий
embeddedServer(Netty, port = 8080) {
routing {
get("/shop/{category}/{id}") {
val category = call.parameters["category"]
val id = call.parameters["id"]
call.respondText("Категория: $category, ID товара: $id")
}
}
}.start(wait = true)
Это самая легкая штука. По сути класс, в который можно накидать респонсов, а потом по-очереди их забрать
// псевдокод
val server = MockWebServer()
server.enqueue("1")
server.enqueue("2")
api.load() // "1"
api.load() // "2"
из плюсов:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍10⚡4✍3❤2
попался прикольный сайт, который умеет в реальном времени компилировать Kotlin в байт-код через kotlinc и в машинный код через ART
зачем такое надо не знаю, но можно поиграться вечерком и посмотреть, как наш высокоуровневый сахарный смузи-вайб код превращается в настоящий мужской построчный трушный набор инструкций
зачем такое надо не знаю, но можно поиграться вечерком и посмотреть, как наш высокоуровневый сахарный смузи-вайб код превращается в настоящий мужской построчный трушный набор инструкций
👍22😁17✍3
Узнали? Это Java сегодня
кто теперь шугар daddy, пора ли переписывать все с умирающего kotlin🤮 на красивую современную java 🌈 ?
sealed interface Payment permits CreditCard, Crypto {
BigDecimal amount();
}
record CreditCard(String number, BigDecimal amount) implements Payment {}
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
var futures = IntStream.range(1, 4)
.mapToObj(i -> executor.submit(() -> STR."Running"))
.map(Product::name)
.toList();
for (var f : futures) {
System.out.println(f.get());
}
}
record Customer(String name, int age, List<Product> products) {
public Customer {
products = List.copyOf(products);
}
}
String productType = switch (obj) {
case Product p -> p.name().contains("1") ? "2" : "3";
case null -> "null";
default -> "def";
};
cheapProduct.ifPresentOrElse(
p -> "p",
() -> "else"
);
ScopedValue<String> USER = ScopedValue.newInstance();
ScopedValue.where(USER, "superadmin").run(() -> {
System.out.println(STR."\{USER.get()}");
});
кто теперь шугар daddy, пора ли переписывать все с умирающего kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁34🔥9👍4🤡3❤1👏1
Альтернативный способ замера перфа
Попался интересный доклад — идея заключается в том, чтобы отслеживать как много зарядки тратит приложение + мониторить нагрузку на процессор
Если приложение начинает тратить больше энергии и сильнее грузить процессор, то возможно кто-то ушатал перф
➡ тезисы:
🔵 мерить энергопотребление можно как программно через API системы, так и через прямое подключение ваттметром к плате
🔵 темная тема и понижение частоты кадров заметно снижает энергопотребление экрана
🔵 передача данных по сети (особенно по мобильному интернету) хавает много энергии
Также приводятся доказательства того, что стоит группировать сетевые запросы и отправлять их одной пачкой, чтобы как можно реже переводить модем в "активный" режим. Это же говорит и официальная дока андроида
Но к реальности, кажется, это мало применимо, так как всегда приоритетнее отправить запрос как можно раньше и показать контент пользователю, чем сэкономить несколько микроватт. Хотя у экоактивистов может быть другое мнение
Ведь еще стоит учитывать, сколько энергии и времени тратится на сжатие/разжатие данных, когда система фактически решит отправить запрос, как долго живет кэш, сколько потоков отведено под сетевые запросы, сколько живет соединение, размер запроса и ответа... слишком много параметров, чтобы можно было сделать однозначный вывод
Попался интересный доклад — идея заключается в том, чтобы отслеживать как много зарядки тратит приложение + мониторить нагрузку на процессор
Если приложение начинает тратить больше энергии и сильнее грузить процессор, то возможно кто-то ушатал перф
Также приводятся доказательства того, что стоит группировать сетевые запросы и отправлять их одной пачкой, чтобы как можно реже переводить модем в "активный" режим. Это же говорит и официальная дока андроида
Но к реальности, кажется, это мало применимо, так как всегда приоритетнее отправить запрос как можно раньше и показать контент пользователю, чем сэкономить несколько микроватт. Хотя у экоактивистов может быть другое мнение
Ведь еще стоит учитывать, сколько энергии и времени тратится на сжатие/разжатие данных, когда система фактически решит отправить запрос, как долго живет кэш, сколько потоков отведено под сетевые запросы, сколько живет соединение, размер запроса и ответа... слишком много параметров, чтобы можно было сделать однозначный вывод
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤6⚡6✍1
а го хайпить идею, что мобильная разработка умирает?
отпугнем новичков, обеспечим себе стабильную пенсию из-за дефицита кадров уже сегодня
отпугнем новичков, обеспечим себе стабильную пенсию из-за дефицита кадров уже сегодня
😁86🔥20👍9😱3
По умолчанию кэш http-запросов сохраняется по url:
https://g.com?timestamp=123
Если идем на тот же url, то можем попасть в кэш
Но есть нюанс
А некоторые query-параметры не влияют на респонс. Например, в них может быть зашит timestamp, аналитический маркер или прочая ерунда
Соответственно, чтобы повысить процент попадания в кэш, достаточно при записи и чтении из кэша вырезать из url незначащие query-параметры:
g.com?timestamp=123&b=1
Более того, на OkHttp реализован так, что даже порядок query-параметров играет роль. Соответственно, если всегда сортировать их в алфавитном порядке, то попадание в кэш еще вырастет
g.com?b=1&a=1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤6🔥5🤔2
Ё
Пробовал оформить заявку на подключение домашнего интернета по адресу "Зеленая улица", а такой улицы не существует, хотя я вроде существую и нахожусь прямо на ней
Но существует "ЗелЁная улица"
Выходит была такая цепочка ввода фичи:
1. разработчик забыл разработать автозамену E на Ё и написать юнит-тест с Ё✅
2. тестировщики не проверили Ё✅
3. продакт принял заказ, не попробав ввести Ё✅
4. бизнес потерял клиентов, живущих на Ё-ных улицах✅
а у кого такого не было, чо уж тут
но есть интересный вопрос — насколько эффективнее начнут работать алгоритмы сжатия текста, если убрать Ё из алфавита?
Пробовал оформить заявку на подключение домашнего интернета по адресу "Зеленая улица", а такой улицы не существует, хотя я вроде существую и нахожусь прямо на ней
Но существует "ЗелЁная улица"
Выходит была такая цепочка ввода фичи:
1. разработчик забыл разработать автозамену E на Ё и написать юнит-тест с Ё
2. тестировщики не проверили Ё
3. продакт принял заказ, не попробав ввести Ё
4. бизнес потерял клиентов, живущих на Ё-ных улицах
а у кого такого не было, чо уж тут
но есть интересный вопрос — насколько эффективнее начнут работать алгоритмы сжатия текста, если убрать Ё из алфавита?
Please open Telegram to view this post
VIEW IN TELEGRAM
😁24🤡7👎2👍1
одна папка, а сколько контента
блоги с авторским контентом по Android собрались в одной папке
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍5❤3👎3🤔1
к началу 2028 года:
верстка будет генерироваться автоматически, а разработчикам останется править баги / оптимизировать скорость
среднему мобильному разработчику придется больше шарить за смежную платформу iOS/Android, уметь верстать вебсайты и знать как работает бэк
в нем не будет такой строгой модерации, но будет плашка "качайте на свой страх и риск"
пинганите в 2028, посмотрим, насколько обосрался
Please open Telegram to view this post
VIEW IN TELEGRAM
✍37🤡11👍7❤4🔥2❤🔥1😱1
Google выпустил новый шрифт для кода — Google Sans Code
киллер-фича🤩 :
i, l и 1 начертаны нарочито по-разному, чтобы не путать
шрифт уже доступен в Android Studio
KRACUBOE?
а вы говорите в мобильной разработке ничего важного не происходит, как вам такое? 🚬
киллер-фича
i, l и 1 начертаны нарочито по-разному, чтобы не путать
шрифт уже доступен в Android Studio
KRACUBOE?
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥36😱17🤣16👎1