Forwarded from Mobile VK Hub
This media is not supported in your browser
VIEW IN TELEGRAM
Конец года, и снова заканчиваются все подписки 😱
Узнали? Согласны? Не беда — мы как раз разыгрываем промокоды на год от Облака Mail и VK Музыки!
Условия участия простые:
🔹 подпишитесь на наш канал @mobilehubvk
🔹нажмите кнопку «Участвовать»
🔹 дождитесь 30 декабря — в этом посте мы выберем случайным образом 6 победителей
Информацию об организаторе, правилах и призах ищите по ссылке.
Удачи!
Узнали? Согласны? Не беда — мы как раз разыгрываем промокоды на год от Облака Mail и VK Музыки!
Условия участия простые:
🔹 подпишитесь на наш канал @mobilehubvk
🔹нажмите кнопку «Участвовать»
🔹 дождитесь 30 декабря — в этом посте мы выберем случайным образом 6 победителей
Информацию об организаторе, правилах и призах ищите по ссылке.
Удачи!
Локализация в Jetpack Compose
Локализация относится к изменению текста приложения, форматов валют и других визуальных элементов для соответствия локали пользователя на основе его региональных предпочтений.
С введением языковых предпочтений для каждого приложения (Per-app Language Preference) в Android 13 (API уровня 33) управление языками, специфичными для приложений, стало намного проще.
https://blog.kotlin-academy.com/localization-in-jetpack-compose-71b7f7233243
#Android
Локализация относится к изменению текста приложения, форматов валют и других визуальных элементов для соответствия локали пользователя на основе его региональных предпочтений.
С введением языковых предпочтений для каждого приложения (Per-app Language Preference) в Android 13 (API уровня 33) управление языками, специфичными для приложений, стало намного проще.
https://blog.kotlin-academy.com/localization-in-jetpack-compose-71b7f7233243
#Android
⚡️ Docker-Android - запуск Android-эмулятора в Docker-контейнере
Минимальный и настраиваемый Docker-образ с Android-эмулятором, который запускается в контейнере как сервис.
Он особенно полезен для автоматизации, CI/CD и тестирования мобильных приложений, когда нужен работающий эмулятор в изолированной среде без физического устройства.
Это Docker-образ на базе лёгкого Linux, со встроенным Android-эмулятором, поддержкой аппаратной виртуализации (KVM) и Java Runtime. Внутри контейнер поднимает эмулятор, ADB-сервер и инструменты виртуализации. Работа происходит в headless-режиме, то есть без графического интерфейса — удобно для серверов и CI.
Основные возможности:
• минималистичный образ с Android-эмулятором и ADB
• поддержка KVM и аппаратного ускорения
• выбор версии Android и типа образа
• проброс портов для ADB
• работа без GUI
• возможность подключать инструменты удалённого управления экраном
Плюсы:
✔ изолированная, воспроизводимая среда
✔ не нужен GUI
✔ удобно для автоматизации тестов
✔ поддержка аппаратного ускорения
docker-android — это удобный способ запускать Android-эмулятор как сервис внутри контейнера. Он упрощает автоматизацию тестирования и делает окружение предсказуемым и повторяемым.
https://github.com/HQarroum/docker-android
Минимальный и настраиваемый Docker-образ с Android-эмулятором, который запускается в контейнере как сервис.
Он особенно полезен для автоматизации, CI/CD и тестирования мобильных приложений, когда нужен работающий эмулятор в изолированной среде без физического устройства.
Это Docker-образ на базе лёгкого Linux, со встроенным Android-эмулятором, поддержкой аппаратной виртуализации (KVM) и Java Runtime. Внутри контейнер поднимает эмулятор, ADB-сервер и инструменты виртуализации. Работа происходит в headless-режиме, то есть без графического интерфейса — удобно для серверов и CI.
Основные возможности:
• минималистичный образ с Android-эмулятором и ADB
• поддержка KVM и аппаратного ускорения
• выбор версии Android и типа образа
• проброс портов для ADB
• работа без GUI
• возможность подключать инструменты удалённого управления экраном
Плюсы:
✔ изолированная, воспроизводимая среда
✔ не нужен GUI
✔ удобно для автоматизации тестов
✔ поддержка аппаратного ускорения
docker-android — это удобный способ запускать Android-эмулятор как сервис внутри контейнера. Он упрощает автоматизацию тестирования и делает окружение предсказуемым и повторяемым.
https://github.com/HQarroum/docker-android
👍5🔥3❤1💊1
This media is not supported in your browser
VIEW IN TELEGRAM
Подборка лучших материалов и инструментов для реверс-инжиниринга Android.
Что есть:
- 📚 обучение: курсы, видео, книги
- 🛠 инструменты: статический и динамический анализ
- 🔎 декомпиляторы: JADX, Apktool, dex2jar
- 🧪 CTF/CrackMe для практики
- 📘 статьи и ресурсы по безопасности
Зачем:
— всё в одном месте
— удобно для обучения и аудита безопасности
— хорошая база для практики
Полезный старт для разработчиков и security-инженеров.
📌 GitHub: https://github.com/user1342/Awesome-Android-Reverse-Engineering
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🚀 Spring Boot: настрой graceful shutdown с таймаутом
Когда сервис перезапускается (deploy / autoscaling / rolling update), без graceful shutdown часть HTTP-запросов может:
- оборваться на полпути
- вернуть 5xx
- прервать фоновые потоки слишком рано
В Spring Boot это решается одной настройкой - задаёшь таймаут на “мягкое” завершение:
✅ сервер перестанет принимать новые запросы
✅ но даст текущим запросам и бинам закончить работу
✅ и только потом завершится
Пример:
Идеально для продакшена, особенно если у тебя:
- Kubernetes rolling update
- долгие запросы
- async обработчики / очереди
- фоновые задачи
Когда сервис перезапускается (deploy / autoscaling / rolling update), без graceful shutdown часть HTTP-запросов может:
- оборваться на полпути
- вернуть 5xx
- прервать фоновые потоки слишком рано
В Spring Boot это решается одной настройкой - задаёшь таймаут на “мягкое” завершение:
✅ сервер перестанет принимать новые запросы
✅ но даст текущим запросам и бинам закончить работу
✅ и только потом завершится
Пример:
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 20sИдеально для продакшена, особенно если у тебя:
- Kubernetes rolling update
- долгие запросы
- async обработчики / очереди
- фоновые задачи
❤3👍2
💡 Java совет: избегай шаринга данных между потоками
Одна из главных причин багов в многопоточке - общий изменяемый state (shared mutable state). Чем больше потоков трогают одни и те же объекты - тем выше шанс словить race condition, deadlock или “плавающие” ошибки.
Что делать правильно:
✅ 1) Используй immutable-объекты
Если объект нельзя изменить - потокам нечего “делить”, и синхронизация почти не нужна.
В Java это удобно делать через
✅ 2) Общайся через сообщения, а не через общую память
Вместо того чтобы менять общий объект - передавай события через очередь:
-
-
- Actor-style подход
Это снижает связанность и делает поведение системы предсказуемым.
Простой принцип:
Не “разделяй память”, а “разделяй сообщения”.
#Java #SoftwareDevelopment
Одна из главных причин багов в многопоточке - общий изменяемый state (shared mutable state). Чем больше потоков трогают одни и те же объекты - тем выше шанс словить race condition, deadlock или “плавающие” ошибки.
Что делать правильно:
✅ 1) Используй immutable-объекты
Если объект нельзя изменить - потокам нечего “делить”, и синхронизация почти не нужна.
В Java это удобно делать через
record, final поля и неизменяемые коллекции.✅ 2) Общайся через сообщения, а не через общую память
Вместо того чтобы менять общий объект - передавай события через очередь:
-
BlockingQueue-
ConcurrentLinkedQueue- Actor-style подход
Это снижает связанность и делает поведение системы предсказуемым.
Простой принцип:
Не “разделяй память”, а “разделяй сообщения”.
#Java #SoftwareDevelopment
❤3👍1🔥1
🚀 LiteRT - универсальная основа для AI прямо на устройстве
Google представил LiteRT — новый универсальный фреймворк для on-device AI, который развивается из TensorFlow Lite и становится базой для высокопроизводительного ML и генеративного AI на устройствах.
🔥 Что важно
⚡ До 1.4× быстрее GPU-ускорение
LiteRT показывает прирост производительности на GPU по сравнению с TensorFlow Lite, снижая задержку и улучшая отклик моделей.
🌐 Кроссплатформенность
Работает на Android, iOS, macOS, Windows, Linux и Web. Использует OpenCL, OpenGL, Metal и WebGPU через новый движок.
🤖 Поддержка NPU
Добавлено ускорение на нейропроцессорах с единым API, что упрощает разработку под разные чипы и повышает скорость инференса.
⚙️ Модели из PyTorch и JAX
Есть удобная конвертация моделей, что упрощает перенос современных AI-моделей на устройство.
📦 Open-source
Фреймворк открыт и подходит для продакшена — можно строить реальные on-device AI-приложения.
LiteRT позволяет запускать современные AI и GenAI модели прямо на устройстве — быстрее, с меньшей задержкой и лучшей приватностью, без постоянной зависимости от облака.
https://developers.googleblog.com/litert-the-universal-framework-for-on-device-ai/
Google представил LiteRT — новый универсальный фреймворк для on-device AI, который развивается из TensorFlow Lite и становится базой для высокопроизводительного ML и генеративного AI на устройствах.
🔥 Что важно
⚡ До 1.4× быстрее GPU-ускорение
LiteRT показывает прирост производительности на GPU по сравнению с TensorFlow Lite, снижая задержку и улучшая отклик моделей.
🌐 Кроссплатформенность
Работает на Android, iOS, macOS, Windows, Linux и Web. Использует OpenCL, OpenGL, Metal и WebGPU через новый движок.
🤖 Поддержка NPU
Добавлено ускорение на нейропроцессорах с единым API, что упрощает разработку под разные чипы и повышает скорость инференса.
⚙️ Модели из PyTorch и JAX
Есть удобная конвертация моделей, что упрощает перенос современных AI-моделей на устройство.
📦 Open-source
Фреймворк открыт и подходит для продакшена — можно строить реальные on-device AI-приложения.
LiteRT позволяет запускать современные AI и GenAI модели прямо на устройстве — быстрее, с меньшей задержкой и лучшей приватностью, без постоянной зависимости от облака.
https://developers.googleblog.com/litert-the-universal-framework-for-on-device-ai/
👍5❤2🔥1
💡 Java-совет: WeakHashMap для кэша без утечек памяти
Если ты используешь HashMap как кэш - будь осторожен. Пока карта жива, ключи и значения не будут удалены GC, даже если они больше нигде не используются.
WeakHashMap решает эту проблему:
• Ключи хранятся через weak reference
• Если на ключ нет сильных ссылок в коде - GC может его удалить
• Запись автоматически исчезает из мапы
• Отлично подходит для кэшей, метаданных, listener-ов
Пример идеи:
• Положил объект в WeakHashMap
• Убрал на него все обычные ссылки
• GC очистил объект → запись исчезла сама
Когда использовать:
• Кэш, который не должен раздувать память
• Вспомогательные данные, завязанные на жизненный цикл объекта
• Framework-код, плагины, reflection-кэши
Когда не стоит:
• Если ключи должны жить строго контролируемо
• Если логика зависит от стабильного наличия записи
Коротко:
HashMap - контроль у тебя
WeakHashMap — контроль у GC 🧹
Полезный инструмент, если понимаешь его семантику.
Если ты используешь HashMap как кэш - будь осторожен. Пока карта жива, ключи и значения не будут удалены GC, даже если они больше нигде не используются.
WeakHashMap решает эту проблему:
• Ключи хранятся через weak reference
• Если на ключ нет сильных ссылок в коде - GC может его удалить
• Запись автоматически исчезает из мапы
• Отлично подходит для кэшей, метаданных, listener-ов
Пример идеи:
• Положил объект в WeakHashMap
• Убрал на него все обычные ссылки
• GC очистил объект → запись исчезла сама
Когда использовать:
• Кэш, который не должен раздувать память
• Вспомогательные данные, завязанные на жизненный цикл объекта
• Framework-код, плагины, reflection-кэши
Когда не стоит:
• Если ключи должны жить строго контролируемо
• Если логика зависит от стабильного наличия записи
Коротко:
HashMap - контроль у тебя
WeakHashMap — контроль у GC 🧹
Полезный инструмент, если понимаешь его семантику.
👍3❤2🔥1
⚡️Spring Boot: отправка email за 5 минут
Если нужно быстро добавить отправку писем в Java-приложение — используйте
Он уже содержит всю необходимую конфигурацию и зависимости, поэтому не нужно вручную настраивать SMTP-клиенты.
Что нужно сделать:
1. Добавить зависимость
Отправить письмо через JavaMailSender
Когда это полезно:
• регистрация пользователей
• подтверждение email
• уведомления
• отчёты и алерты
Главный плюс - минимум кода и быстрая интеграция. Spring Boot берёт всю сложность настройки на себя.
Если нужно быстро добавить отправку писем в Java-приложение — используйте
spring-boot-starter-mail.Он уже содержит всю необходимую конфигурацию и зависимости, поэтому не нужно вручную настраивать SMTP-клиенты.
Что нужно сделать:
1. Добавить зависимость
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
Настроить SMTP (например, Gmail)
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=your_email@gmail.com
spring.mail.password=your_app_password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
Отправить письмо через JavaMailSender
@Autowired
private JavaMailSender mailSender;
public void sendEmail(String to, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(text);
message.setFrom("your_email@gmail.com");
mailSender.send(message);
}
Когда это полезно:
• регистрация пользователей
• подтверждение email
• уведомления
• отчёты и алерты
Главный плюс - минимум кода и быстрая интеграция. Spring Boot берёт всю сложность настройки на себя.
👍3
🚀 CLI для управления iOS и Android устройствами
agent-device — это инструмент командной строки для управления мобильными устройствами, позволяющий AI-агентам взаимодействовать с приложениями на iOS и Android. Проект находится на ранней стадии разработки и открыт для вкладов.
🚀 Основные моменты:
- Поддержка iOS (симулятор) и Android (эмулятор).
- Основные команды: открытие приложений, взаимодействие с элементами интерфейса.
- Минимальные зависимости и работа напрямую с Node.js.
- Возможность создания и управления сессиями.
📌 GitHub: https://github.com/callstackincubator/agent-device
#typescript
agent-device — это инструмент командной строки для управления мобильными устройствами, позволяющий AI-агентам взаимодействовать с приложениями на iOS и Android. Проект находится на ранней стадии разработки и открыт для вкладов.
🚀 Основные моменты:
- Поддержка iOS (симулятор) и Android (эмулятор).
- Основные команды: открытие приложений, взаимодействие с элементами интерфейса.
- Минимальные зависимости и работа напрямую с Node.js.
- Возможность создания и управления сессиями.
📌 GitHub: https://github.com/callstackincubator/agent-device
#typescript
GitHub
GitHub - callstackincubator/agent-device: CLI to control iOS and Android devices for AI agents
CLI to control iOS and Android devices for AI agents - callstackincubator/agent-device
👍2🔥1
🚀 Spring Boot: когда использовать static-классы, а когда Bean
Частая ошибка в Spring - использовать static-утилиты там, где нужен управляемый компонент.
Правило простое
Используйте static-классы только если:
- они не хранят состояние
- у них нет зависимостей
- не требуется mock в тестах
- не нужен AOP (логирование, транзакции и т.д.)
Во всех остальных случаях — лучше Spring Bean.
Почему это важно
Пример с static-кэшем:
Такой кэш:
• общий для всех потоков
• может случайно изменяться
• сложно контролировать и тестировать
нет управления жизненным циклом
Правильный подход — Bean со scope:
@Component
@Scope("request")
public class CacheService {
private Map<String, String> cache = new HashMap<>();
}
Теперь:
Spring управляет жизненным циклом
можно задать scope (request, session, singleton)
легко тестировать и мокать
можно добавить AOP
Главная мысль
Static — только для чистых функций.
Состояние и логика — пусть управляет Spring.
Spring лучше всего работает, когда управляет stateful-объектами.
Частая ошибка в Spring - использовать static-утилиты там, где нужен управляемый компонент.
Правило простое
Используйте static-классы только если:
- они не хранят состояние
- у них нет зависимостей
- не требуется mock в тестах
- не нужен AOP (логирование, транзакции и т.д.)
Во всех остальных случаях — лучше Spring Bean.
Почему это важно
Пример с static-кэшем:
public class CacheUtils {
private static Map<String, String> cache = new HashMap<>();
}
Такой кэш:
• общий для всех потоков
• может случайно изменяться
• сложно контролировать и тестировать
нет управления жизненным циклом
Правильный подход — Bean со scope:
@Component
@Scope("request")
public class CacheService {
private Map<String, String> cache = new HashMap<>();
}
Теперь:
Spring управляет жизненным циклом
можно задать scope (request, session, singleton)
легко тестировать и мокать
можно добавить AOP
Главная мысль
Static — только для чистых функций.
Состояние и логика — пусть управляет Spring.
Spring лучше всего работает, когда управляет stateful-объектами.
❤1👍1🔥1