Новый подход к безопасному управлению состояниями в Kotlin-приложениях
Вот уже несколько лет я занимаюсь разработкой высокопроизводительных, полностью асинхронных, реактивных, мультиплатформенных приложений. За это время я успел наткнуться на несколько довольно тонких и трудно отлаживаемых проблем с управлением состояниями. В этой статье я хотел бы поделиться с вами своим опытом, который поможет вам сэкономить множество часов и нервных клеток, и предложить новый подход к управлению состояниями, который лично я никогда раньше не встречал и который навсегда избавит вас от этих проблем.
Статья: https://habr.com/ru/companies/otus/articles/847888/
Платформа: Android
Вот уже несколько лет я занимаюсь разработкой высокопроизводительных, полностью асинхронных, реактивных, мультиплатформенных приложений. За это время я успел наткнуться на несколько довольно тонких и трудно отлаживаемых проблем с управлением состояниями. В этой статье я хотел бы поделиться с вами своим опытом, который поможет вам сэкономить множество часов и нервных клеток, и предложить новый подход к управлению состояниями, который лично я никогда раньше не встречал и который навсегда избавит вас от этих проблем.
Статья: https://habr.com/ru/companies/otus/articles/847888/
Платформа: Android
❤1
Видео и подкасты за неделю @AppFiles
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
#ios #android #mobile #video
•
(iOS Ru) Как мы запекали 3D-пиццу•
(iOS Ru) Есть ли ORM круче SwiftData•
(iOS Ru) Макросы спустя полгода: не все так гладко•
(iOS Ru) DriverKit: гоняем данные по проводу без мам, пап и MFi•
(iOS En) Recreate Apple's Stopwatch: Mastering Millisecond Precision in SwiftUI•
(iOS En) Видео SwiftCraft 2024•
(iOS En) Alternative App Icons in Xcode 16•
(iOS En) New in Xcode16: the macro @Previewable•
(iOS En) SwiftUI - Support Prior iOS Versions - Backward Compatibility•
(iOS En) Embedded Swift and 16x16 LED Matrix Animation Overview•
(iOS En) Preview Updates in Xcode 16•
(iOS En) Auto Scrolling Infinite Carousel - iOS 18•
(And En) Integrating the Gemini API in Android•
(And En) How to Navigate From ViewModels With a Custom Navigator•
(And En) Android Application with Microsoft Identity Platform•
(And En) Applying the Factory Method and Abstract Factory Patterns in Kotlin•
(Crs En) Multiplayer drawing with Flutter and Serverpod. Full tutorial.•
(Dev Ru) Уволить нельзя терпеть•
(Dev Ru) Lua – идеальный встраиваемый язык•
(Dev En) The reality of the developer job market with ex-Googler YK Sugi#ios #android #mobile #video
KLogX - это библиотека логирования Kotlin, разработанная для обеспечения гибкого и эффективного способа протоколирования сообщений в вашем приложении. Она поддерживает различные уровни регистрации (INFO, WARN, ERROR и т.п.) и цели (INTERNAL, EXTERNAL, REMOTE), а также позволяет регистрировать пользовательские функции для обработки сообщений лога на основе фильтра.
KLogX на GitHub: https://github.com/mohsenoid/KLogX
Платформа: Android
⭐️: 8
KLogX на GitHub: https://github.com/mohsenoid/KLogX
Платформа: Android
⭐️: 8
Создание уведомлений на языке Kotlin
Недавно мне нужно было добавить в мое мобильное приложение уведомление, которое писало бы определенный текст в 9 утра. Я потратила некоторое время на чтение документации и разговор с чатом, чтоб понять как и что делать, и я думаю таким же начинающим программистам будет интересно или полезно почитать мои заметки и разбор кода.
Статья: https://habr.com/ru/articles/847020/
Платформа: Android
Недавно мне нужно было добавить в мое мобильное приложение уведомление, которое писало бы определенный текст в 9 утра. Я потратила некоторое время на чтение документации и разговор с чатом, чтоб понять как и что делать, и я думаю таким же начинающим программистам будет интересно или полезно почитать мои заметки и разбор кода.
Статья: https://habr.com/ru/articles/847020/
Платформа: Android
Как Discord сократил Websocket трафик на 40%
В Discord мы постоянно думаем о том, как улучшить наши сервисы и повысить производительность. Ведь чем быстрее работает наше приложение, тем быстрее вы сможете вернуться к своим друзьям и разговорам!
В течение последних шести месяцев мы работали над снижением трафика в каналах связи, используемых нашими клиентами, особенно на iOS и Android, надеясь, что уменьшение передаваемых данных приведет к более быстрому отклику.
Статья: https://apptractor.ru/info/articles/kak-discord-sokratil-websocket-trafik-na-40.html
Платформа: разработка
В Discord мы постоянно думаем о том, как улучшить наши сервисы и повысить производительность. Ведь чем быстрее работает наше приложение, тем быстрее вы сможете вернуться к своим друзьям и разговорам!
В течение последних шести месяцев мы работали над снижением трафика в каналах связи, используемых нашими клиентами, особенно на iOS и Android, надеясь, что уменьшение передаваемых данных приведет к более быстрому отклику.
Статья: https://apptractor.ru/info/articles/kak-discord-sokratil-websocket-trafik-na-40.html
Платформа: разработка
This media is not supported in your browser
VIEW IN TELEGRAM
Swipe Cell SwiftUI - это простое swipe-to-reveal представление. Оно поддерживает iOS/iPadOS 14 или более поздние версии. Цель - заменить стандартный модификатор SwiftUI List .onDelete(perform: ...), поскольку его функциональность ограничена только удалением и работает только со строками списка. Кроме того, строки в iOS 14 LazyVStack по умолчанию не поддерживают пролистывание для раскрытия кнопок. Swipe Cell SwiftUI позволяет добавлять несколько кнопок меню с левой и правой стороны, а также поддерживает функцию смахивания (например, для удаления).
Swipe Cell SwiftUI на GitHub: https://github.com/DominikButz/SwipeCellSUI
Платформа: iOS
⭐️: 61
Swipe Cell SwiftUI на GitHub: https://github.com/DominikButz/SwipeCellSUI
Платформа: iOS
⭐️: 61
Восстановление базы для миллионов пользователей
Это история о приложении для обмена сообщениями, которым пользуются миллиарды пользователей.
Приложение придерживается чрезвычайно строгой модели конфиденциальности. Приложение никогда не хранит данные пользователя на серверах. Все сообщения end-to-end шифруются.
Многие пользователи этого приложения, особенно на Android, регулярно удаляли и переустанавливали его. Чтобы предотвратить потерю сообщений, их резервное копирование осуществляется на SD-карту пользователя. В модели безопасности Android SD-карта является общедоступным местом хранения данных, доступным всем приложениям. Поэтому, чтобы сохранить конфиденциальность сообщений, резервные копии зашифровались.
И вдруг неожиданно поступил всплеск жалоб от пользователей на то, что приложение не смогло восстановить их сообщения. Хотя у нас были некоторые внутренние показатели, подтверждающие это, не было возможности отладить ошибку без доступа к некоторым образцам для воспроизведения ситуации.
Статья: https://apptractor.ru/info/articles/vosstanovlenie-bazy-dlya-millionov-polzovateley.html
Платформа: разработка
Это история о приложении для обмена сообщениями, которым пользуются миллиарды пользователей.
Приложение придерживается чрезвычайно строгой модели конфиденциальности. Приложение никогда не хранит данные пользователя на серверах. Все сообщения end-to-end шифруются.
Многие пользователи этого приложения, особенно на Android, регулярно удаляли и переустанавливали его. Чтобы предотвратить потерю сообщений, их резервное копирование осуществляется на SD-карту пользователя. В модели безопасности Android SD-карта является общедоступным местом хранения данных, доступным всем приложениям. Поэтому, чтобы сохранить конфиденциальность сообщений, резервные копии зашифровались.
И вдруг неожиданно поступил всплеск жалоб от пользователей на то, что приложение не смогло восстановить их сообщения. Хотя у нас были некоторые внутренние показатели, подтверждающие это, не было возможности отладить ошибку без доступа к некоторым образцам для воспроизведения ситуации.
Статья: https://apptractor.ru/info/articles/vosstanovlenie-bazy-dlya-millionov-polzovateley.html
Платформа: разработка
Как перехватывают зашифрованный HTTS-трафик на мобильном устройстве
Реверс-инжиниринг VPN-сервиса Onavo Protect под Android позволил определить методы, которые можно использовать для перехвата зашифрованного HTTPS-трафика на мобильном устройстве. Если вкратце, злоумышленник должен поставить на телефон собственное приложение и сертификат УЦ (удостоверяющего центра).
Например, в РФ вступил в действие закон, который требует с 2025 года обязательной предустановки на все смартфоны конкретных приложений. Теоретически, при наличии уязвимостей это может угрожать безопасности многих пользователей.
Статья: https://habr.com/ru/companies/globalsign/articles/848632/
Платформа: Android
Реверс-инжиниринг VPN-сервиса Onavo Protect под Android позволил определить методы, которые можно использовать для перехвата зашифрованного HTTPS-трафика на мобильном устройстве. Если вкратце, злоумышленник должен поставить на телефон собственное приложение и сертификат УЦ (удостоверяющего центра).
Например, в РФ вступил в действие закон, который требует с 2025 года обязательной предустановки на все смартфоны конкретных приложений. Теоретически, при наличии уязвимостей это может угрожать безопасности многих пользователей.
Статья: https://habr.com/ru/companies/globalsign/articles/848632/
Платформа: Android
Реализация Shared With You в SwiftUI
Эта функция была введена в iOS 16, но лишь немногие приложения используют ее в своих интересах. Как вы скоро увидите, ее очень легко реализовать, поэтому если в вашем приложении есть контент, которым можно поделиться, я настоятельно рекомендую добавить эту функцию в ваше приложение.
Статья: https://apptractor.ru/info/articles/shared-with-you.html
Платформа: iOS
Эта функция была введена в iOS 16, но лишь немногие приложения используют ее в своих интересах. Как вы скоро увидите, ее очень легко реализовать, поэтому если в вашем приложении есть контент, которым можно поделиться, я настоятельно рекомендую добавить эту функцию в ваше приложение.
Статья: https://apptractor.ru/info/articles/shared-with-you.html
Платформа: iOS
Виртуализация iOS на Apple Silicon
В этой статье я рассказываю о том, как мне удалось добиться виртуализации iOS на компьютерах Apple Mac, попутно исследуя многие внутренние компоненты.
Статья: https://nickb.website/blog/virtualizing-ios-on-apple-silicon
Платформа: iOS
В этой статье я рассказываю о том, как мне удалось добиться виртуализации iOS на компьютерах Apple Mac, попутно исследуя многие внутренние компоненты.
Статья: https://nickb.website/blog/virtualizing-ios-on-apple-silicon
Платформа: iOS
🤔1
Transcribro - это приватная клавиатура и сервис распознавания речи для Android-устройств. Он использует whisper.cpp для запуска семейства моделей OpenAI Whisper и Silero VAD для распознавания голосовой активности.
В приложении есть клавиатура голосового ввода, позволяющая набирать текст с помощью речи. Оно также может использоваться другими приложениями либо явно, либо при установке в качестве выбранного пользователем приложения для преобразования речи в текст.
Transcribro на GitHub: https://github.com/soupslurpr/Transcribro
Платформа: Android
⭐️: 370
В приложении есть клавиатура голосового ввода, позволяющая набирать текст с помощью речи. Оно также может использоваться другими приложениями либо явно, либо при установке в качестве выбранного пользователем приложения для преобразования речи в текст.
Transcribro на GitHub: https://github.com/soupslurpr/Transcribro
Платформа: Android
⭐️: 370
This media is not supported in your browser
VIEW IN TELEGRAM
Паря в космосе: анимации с помощью Compose и Canvas
В своей предыдущей статье «Рисуя звезды: рисование с помощью Compose и Canvas» я рассказала о том, как я хотела улучшить свои навыки работы с Canvas и Compose и создала иллюстрацию с планетами и звездами. В этой статье я расскажу, как анимировать эти элементы.
Статья: https://apptractor.ru/info/articles/parya-v-kosmose-animatsii-s-pomoschyu-compose-i-canvas.html
Платформа: Android
В своей предыдущей статье «Рисуя звезды: рисование с помощью Compose и Canvas» я рассказала о том, как я хотела улучшить свои навыки работы с Canvas и Compose и создала иллюстрацию с планетами и звездами. В этой статье я расскажу, как анимировать эти элементы.
Статья: https://apptractor.ru/info/articles/parya-v-kosmose-animatsii-s-pomoschyu-compose-i-canvas.html
Платформа: Android
Перевод в текст живого звука с помощью фреймворка Speech
К концу этой статьи вы поймете, как получить доступ к звуковому буферу микрофона, а затем сделать его доступным для обработки и преобразования в текст средствами распознавания речи.
Статья: https://www.createwithswift.com/transcribing-audio-from-live-audio-using-the-speech-framework/
Платформа: iOS
Поставьте 10 👍 если хотите эту статью на русском.
К концу этой статьи вы поймете, как получить доступ к звуковому буферу микрофона, а затем сделать его доступным для обработки и преобразования в текст средствами распознавания речи.
Статья: https://www.createwithswift.com/transcribing-audio-from-live-audio-using-the-speech-framework/
Платформа: iOS
Поставьте 10 👍 если хотите эту статью на русском.
👍3
10 причин НЕ использовать Jetpack Compose (с комментариями)
Jetpack Compose — это отличный набор инструментов для создания пользовательского интерфейса, который был тепло встречен сообществом Android-разработчиков. Мне нравится Jetpack Compose, но, как и любая другая технология, он имеет ряд недостатков. В этой статье мы узнаем, в каких случаях лучше использовать систему View и почему.
Статья: https://apptractor.ru/info/articles/10-prichin-ne-ispolzovat-jetpack-compose.html
Платформа: Android
Jetpack Compose — это отличный набор инструментов для создания пользовательского интерфейса, который был тепло встречен сообществом Android-разработчиков. Мне нравится Jetpack Compose, но, как и любая другая технология, он имеет ряд недостатков. В этой статье мы узнаем, в каких случаях лучше использовать систему View и почему.
Статья: https://apptractor.ru/info/articles/10-prichin-ne-ispolzovat-jetpack-compose.html
Платформа: Android
🤡2
Реверс инжиниринг кормушки для кошек для повышения производительности разработки
После ночных покупок в Amazon я получил PetKit FreshElement Solo. У меня было две проблемы, которые он мог решить: низкая мотивация к побочному проекту и слишком большая любовь к миндалю с морской солью в темном шоколаде от Target. Я помешан на коде — так почему бы не подкормить мой обезьяний мозг, когда я пушу код? Так и возник мой проект — при каждом коммите кормушка для кошек выдает мне порцию конфет.
Статья: https://apptractor.ru/info/devices/revers-inzhiniring-kormushki-dlya-koshek-dlya-povysheniya-proizvoditelnosti-razrabotki.html
Платформа: разработка
После ночных покупок в Amazon я получил PetKit FreshElement Solo. У меня было две проблемы, которые он мог решить: низкая мотивация к побочному проекту и слишком большая любовь к миндалю с морской солью в темном шоколаде от Target. Я помешан на коде — так почему бы не подкормить мой обезьяний мозг, когда я пушу код? Так и возник мой проект — при каждом коммите кормушка для кошек выдает мне порцию конфет.
Статья: https://apptractor.ru/info/devices/revers-inzhiniring-kormushki-dlya-koshek-dlya-povysheniya-proizvoditelnosti-razrabotki.html
Платформа: разработка
😁3❤1💊1
DevTutor for SwiftUI - это приложение, предназначенное для помощи разработчикам в создании исключительных приложений с использованием SwiftUI. Оно предлагает воспроизводимые примеры кода и соответствующие предварительные просмотры пользовательского интерфейса, чтобы упростить процесс программирования. Кроме того, приложение включает локальный офлайн-доступ к официальной документации по языку программирования Swift на китайском и английском языках.
DevTutor for SwiftUI на GitHub: https://github.com/jaywcjlove/devtutor
Платформа: iOS
⭐️: 145
DevTutor for SwiftUI на GitHub: https://github.com/jaywcjlove/devtutor
Платформа: iOS
⭐️: 145
Пишите на Swift как Apple
В этой статье я продемонстрирую некоторые из кодовых соглашений, которых я теперь придерживаюсь, непосредственно переняв подход Apple к программированию в Swift.
• Булево значение должно определять условие
• Не заботьтесь о длине имени типа, уточните намерение
• Прошедшее время для метода, настоящее время или глагол для замыкания
• Избегайте прямого указания объекта, используйте Enum или Static для объявления типа
• Словарь с перечислением в качестве ключа
• Вложенный тип — это нормально
• Протокол — это поведение: найдите нужное существительное, используйте суффикс -able, если оно не найдено
Статья: https://apptractor.ru/info/articles/pishite-na-swift-kak-apple.html
Платформа: iOS
В этой статье я продемонстрирую некоторые из кодовых соглашений, которых я теперь придерживаюсь, непосредственно переняв подход Apple к программированию в Swift.
• Булево значение должно определять условие
• Не заботьтесь о длине имени типа, уточните намерение
• Прошедшее время для метода, настоящее время или глагол для замыкания
• Избегайте прямого указания объекта, используйте Enum или Static для объявления типа
• Словарь с перечислением в качестве ключа
• Вложенный тип — это нормально
• Протокол — это поведение: найдите нужное существительное, используйте суффикс -able, если оно не найдено
Статья: https://apptractor.ru/info/articles/pishite-na-swift-kak-apple.html
Платформа: iOS
😁2
Остерегайтесь UserDefaults: история о трудно понимаемых ошибках и потерянных данных
Оказывается, иногда вы можете запросить сохраненные данные из UserDefaults, а он... просто не захочет их получать! Это довольно большая проблема для системы, которая должна надежно хранить данные для вас.
Это может привести к еще более серьезной проблеме - к безвозвратной потере данных.
Статья: https://apptractor.ru/info/articles/osteregaytes-userdefaults.html
Платформа: iOS
Оказывается, иногда вы можете запросить сохраненные данные из UserDefaults, а он... просто не захочет их получать! Это довольно большая проблема для системы, которая должна надежно хранить данные для вас.
Это может привести к еще более серьезной проблеме - к безвозвратной потере данных.
Статья: https://apptractor.ru/info/articles/osteregaytes-userdefaults.html
Платформа: iOS
MusicSearch - приложение для Android, позволяющее просматривать песни, исполнителей и все, что с ними связано, используя MusicBrainz API.
Мультиплатформенные дистрибутивы находятся в разработке. Только приложение для Android считается стабильным.
MusicSearch на GitHub: https://github.com/lydavid/MusicSearch
Платформа: Android
⭐️: 40
Мультиплатформенные дистрибутивы находятся в разработке. Только приложение для Android считается стабильным.
MusicSearch на GitHub: https://github.com/lydavid/MusicSearch
Платформа: Android
⭐️: 40
Видео и подкасты за неделю @AppFiles
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
#ios #android #mobile #video
•
(iOS Ru) Собеседование iOS-разработчика: проектирование и лайфкодинг (+ все собеседования)•
(iOS En) Improve Scroll Transitions | SwiftUI•
(iOS En) Grid Multi-Selection using Pan Gesture | SwiftUI•
(iOS En) How to Fix UIKit and SwiftUI Menu Buttons (make them easier to tap)•
(iOS En) TDD Basics with SwiftUI•
(iOS En) Adopt iPhone 16 Camera Control into your SwiftUI App•
(iOS En) WWDC22: Design protocol interfaces in Swift •
(And En) Now in Android: 110 - Android 15, Credential Manager, Android Studio Koala, Compose for TV•
(And En) FULL Guide to Kotlin's Inline Keyword (inline, crossinline & noinline)•
(And En) Micro Open Source: From Passion to Pet Project Publication•
(Crs Ru) Flutter Web глазами мобильного разработчика•
(Crs En) Build a Book Library App for Android & iOS using ROOM KMP (MVVM)•
(Dev Ru) Мобильная разработка в Алисе и YaOS: как это работает•
(Dev Ru) Путь тестировщика: ошибки, опыт, деньги•
(Dev Ru) Перформанс мобильных приложений•
(Dev Ru) Дизайн-система 2.0: менеджеры нужны•
(Dev Ru) Двое за ноутом, не считая copilot’а, или Как внедрить парное программирование•
(Dev Ru) Так много тимлидов хороших и разных. А я какой?•
(Dev Ru) Стартап мечты превратился в кошмар•
(Dev En) Databases In-Depth – Complete Course•
(Dev En) Electron Course - Code Desktop Applications (inc. React and Typenoscript)•
(Dev En) AWS Certified AI Practitioner (AIF-C01) – Full Course to PASS the Certification Exam#ios #android #mobile #video
TinyStorage - простая и легкая замена UserDefaults (не обертка, а именно замена, лишенная некоторых недостатков нативного фреймворка) с более надежным доступом и встроенной поддержкой типов Codable.
Как писал автор в этой статье, в последнее время у UserDefaults все чаще возникают проблемы с возвратом нулевых данных, когда устройство заблокировано и iOS предварительно «разогревает» ваше приложение. В сочетании с API, который не очень хорошо раскрывает эту информацию, вы можете легко оказаться в ситуации с трудноотслеживаемыми ошибками и потерей данных. Эта библиотека стремится решить эту проблему, не шифруя файл и обеспечивая более надежный доступ к сохраненным данным (хотя и менее безопасный, так что не храните конфиденциальные данные), и добавляя к этому некоторые приятные мелочи.
Как и UserDefaults, TinyStorage предназначен для использования с относительно небольшими значениями. Не храните в TinyStorage массивные базы данных, так как он не оптимизирован для этого, но он достаточно быстр для извлечения сохраненных типов Codable. В качестве ориентира, размер хранилища не должен превышать 1 МБ.
TinyStorage на GitHub: https://github.com/christianselig/TinyStorage
Платформа: iOS
⭐️: 182
Как писал автор в этой статье, в последнее время у UserDefaults все чаще возникают проблемы с возвратом нулевых данных, когда устройство заблокировано и iOS предварительно «разогревает» ваше приложение. В сочетании с API, который не очень хорошо раскрывает эту информацию, вы можете легко оказаться в ситуации с трудноотслеживаемыми ошибками и потерей данных. Эта библиотека стремится решить эту проблему, не шифруя файл и обеспечивая более надежный доступ к сохраненным данным (хотя и менее безопасный, так что не храните конфиденциальные данные), и добавляя к этому некоторые приятные мелочи.
Как и UserDefaults, TinyStorage предназначен для использования с относительно небольшими значениями. Не храните в TinyStorage массивные базы данных, так как он не оптимизирован для этого, но он достаточно быстр для извлечения сохраненных типов Codable. В качестве ориентира, размер хранилища не должен превышать 1 МБ.
TinyStorage на GitHub: https://github.com/christianselig/TinyStorage
Платформа: iOS
⭐️: 182