Forwarded from Стой под стрелой (Nikita Prokopov)
Работа со временем, часть 3/3
Тут уже будет про всякие курьезы. Во-первых, сильно не завидую составителям tz database, потому что им приходится иметь дело со сложностью человеческого мира и неточностью «обыденных» определений. Скажем, были города, в которых половина жила по одному времени, а половина — по другому. Какие-то города, например, Берлин, находились вообще в двух странах.
Другая штука — путешествие в прошлое. Как вы видели, Unix timestamp начинается с 1970-го, но можно ли продолжить его в прошлое? Немножко можно, насколько позволяет tz database, но там уже начинается неполнота данных о часовых поясах и прочий разброд. Если совсем сильно продолжать, то начинаются вопросы, скажем, переход между Юлианским календарем и Грегорианским был довольно долгим и хаотичным географически и зафиксирован не очень точно.
Сколько дней в феврале? 28-29, да? Часов в сутках? 23-25, как мы определили выше. А вот сколько секунд в часе? 3600, да? Не всегда 🙂 Про високосный год все знают, а как вам високосная секунда?
Но давайте по порядку. В 1972 запустили атомные часы, которые без остановки и прочего булшита отсчитывали по одной секунде каждую секунду 🙂 Их время называется International Atomic Time (TAI) и является, наверное, самой базовой величиной которая у нас есть (да, я говорил, что unix timestamp, но нет). С момента запуска они обогнали UTC на 37 секунд.
Далее есть UT1. Это время, основанное на вращении Земли, в предположении, что каждый новый год наступает ровно в 00:00:00 по UT1. Но! Штука в том, что вращение Земли, во-первых, замедляется, а во-вторых неравномерно и непредсказуемо (!! да, блин! Потому что по ней всякий хлам типа морей, магмы и материков болтается) и в итоге каждый год (по астрономическим наблюдениям вращения Земли) имеет слегка разную продолжительность в секундах.
UTC это компромисс для удобства обычных людей: это тот же TAI (т.е. атомные стабильные секунды), к которому иногда добавляют или отнимают по одной секунде в год, чтобы Новый год наступал как можно ближе к 00:00:00 по UT1 (астономическому).
Пока секунды только добавляли, обычно это делают как 23:59:60 31 декабря или 30 июня. Это происходит нерегулярно, основано на астрономических измерениях и никто заранее не может сказать, когда и сколько их в будущем будет добавлено. Последнюю добавляли в 2016-м.
Как это все переносится на Unix time? А никак 🙂 В Unix time такое понятие не заложено. Если число делится на 3600000, значит это граница часа. Удобно — но также и слегка неправда.
Что же делают компьютеры? Вариантов немного — можно либо повторить 23:59:59 два раза (перевести на секунду назад), либо заморозить часы, либо размазывать эту секунду тонким слоем на целые сутки (вроде Гугл этим хвастался, но не подскажу где).
Именно поэтому Unix time это очень удобная точка отсчета в практическом смысле, но немножко неправда до самого конца. Но на деле — скорее всего, о високосной секунде вам париться не придется. Правда в JVM был какой-то баг на эту тему (скорее всего, что-то про немонотонность часов), и я лично вроде как в 2012-м что-то там из-за этого у нас перезапускал.
Но это слишком редко, чтобы на самом деле имело смысл париться. А немонотонность часов — ну, из-за синхронизации времени они точно так же могут скакнуть назад, так что доверять нельзя никому.
Такие дела. Практически про работу со временем — как только понимашь, что происходит, сразу перестает быть сложно. Надеюсь, гайд вам чем-то поможет. Распространяйте, это может спасти чью-нибудь жизнь 🙂
Тут уже будет про всякие курьезы. Во-первых, сильно не завидую составителям tz database, потому что им приходится иметь дело со сложностью человеческого мира и неточностью «обыденных» определений. Скажем, были города, в которых половина жила по одному времени, а половина — по другому. Какие-то города, например, Берлин, находились вообще в двух странах.
Другая штука — путешествие в прошлое. Как вы видели, Unix timestamp начинается с 1970-го, но можно ли продолжить его в прошлое? Немножко можно, насколько позволяет tz database, но там уже начинается неполнота данных о часовых поясах и прочий разброд. Если совсем сильно продолжать, то начинаются вопросы, скажем, переход между Юлианским календарем и Грегорианским был довольно долгим и хаотичным географически и зафиксирован не очень точно.
Сколько дней в феврале? 28-29, да? Часов в сутках? 23-25, как мы определили выше. А вот сколько секунд в часе? 3600, да? Не всегда 🙂 Про високосный год все знают, а как вам високосная секунда?
Но давайте по порядку. В 1972 запустили атомные часы, которые без остановки и прочего булшита отсчитывали по одной секунде каждую секунду 🙂 Их время называется International Atomic Time (TAI) и является, наверное, самой базовой величиной которая у нас есть (да, я говорил, что unix timestamp, но нет). С момента запуска они обогнали UTC на 37 секунд.
Далее есть UT1. Это время, основанное на вращении Земли, в предположении, что каждый новый год наступает ровно в 00:00:00 по UT1. Но! Штука в том, что вращение Земли, во-первых, замедляется, а во-вторых неравномерно и непредсказуемо (!! да, блин! Потому что по ней всякий хлам типа морей, магмы и материков болтается) и в итоге каждый год (по астрономическим наблюдениям вращения Земли) имеет слегка разную продолжительность в секундах.
UTC это компромисс для удобства обычных людей: это тот же TAI (т.е. атомные стабильные секунды), к которому иногда добавляют или отнимают по одной секунде в год, чтобы Новый год наступал как можно ближе к 00:00:00 по UT1 (астономическому).
Пока секунды только добавляли, обычно это делают как 23:59:60 31 декабря или 30 июня. Это происходит нерегулярно, основано на астрономических измерениях и никто заранее не может сказать, когда и сколько их в будущем будет добавлено. Последнюю добавляли в 2016-м.
Как это все переносится на Unix time? А никак 🙂 В Unix time такое понятие не заложено. Если число делится на 3600000, значит это граница часа. Удобно — но также и слегка неправда.
Что же делают компьютеры? Вариантов немного — можно либо повторить 23:59:59 два раза (перевести на секунду назад), либо заморозить часы, либо размазывать эту секунду тонким слоем на целые сутки (вроде Гугл этим хвастался, но не подскажу где).
Именно поэтому Unix time это очень удобная точка отсчета в практическом смысле, но немножко неправда до самого конца. Но на деле — скорее всего, о високосной секунде вам париться не придется. Правда в JVM был какой-то баг на эту тему (скорее всего, что-то про немонотонность часов), и я лично вроде как в 2012-м что-то там из-за этого у нас перезапускал.
Но это слишком редко, чтобы на самом деле имело смысл париться. А немонотонность часов — ну, из-за синхронизации времени они точно так же могут скакнуть назад, так что доверять нельзя никому.
Такие дела. Практически про работу со временем — как только понимашь, что происходит, сразу перестает быть сложно. Надеюсь, гайд вам чем-то поможет. Распространяйте, это может спасти чью-нибудь жизнь 🙂
👍1
Forwarded from Android Broadcast
#compose
Fixing Font Padding in Compose Text (11 мин)
Статья про улушчения работы с отступами в шрифтах в Compose 1.2, что направлено на реализацию дизайна из Figma и Sketch легче. Новые изменения в 1.2 не применяются по умолчанию, а вот в 1.3 будут стандартом.
Fixing Font Padding in Compose Text (11 мин)
Статья про улушчения работы с отступами в шрифтах в Compose 1.2, что направлено на реализацию дизайна из Figma и Sketch легче. Новые изменения в 1.2 не применяются по умолчанию, а вот в 1.3 будут стандартом.
👍1
Forwarded from Android Live 🤖
Navigation в Jetpack Compose
#compose
Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.
Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:
👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;
У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.
🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
#compose
Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.
Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:
👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;
У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.
🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
👍1
Forwarded from Android Broadcast
#compose
Creating a graph in Jetpack Compose (4 мин)
Автор рассказывает как реализовать отрисовку графика по заданным точкам в Jetpack Compose.
Creating a graph in Jetpack Compose (4 мин)
Автор рассказывает как реализовать отрисовку графика по заданным точкам в Jetpack Compose.
👍1
Forwarded from Android Broadcast
#compose
Custom Layouts with jetpack Compose (Deep Dive)
Разбор как реализовать собcтвенный layout в Compose. Такие задачи появляются не так часто, но в Jetpack Compose сделать это проще чем в View
Custom Layouts with jetpack Compose (Deep Dive)
Разбор как реализовать собcтвенный layout в Compose. Такие задачи появляются не так часто, но в Jetpack Compose сделать это проще чем в View
👍1
Forwarded from Mobile AppSec World (Yury Shabalin)
Инструмент для загрузки приложений из систем дистрибуции и магазинов приложений
Всем привет!
Очень часто возникает необходимость загрузить что-то из Google Play или Apple Appstore.
А бывает и такое, что нужно автоматизировать загрузку промежуточных версий из какого-то Firebase, например или AppCenter.
Мы тоже сталкиваемся постоянно с этими задачами, поэтому решили их автоматизировать и оформить в виде репо на гитхаб, а также питоновского пакета и докер-образа :)
Вообще, это наш cli для автоматического сканирования приложений, но если вам нужно просто приложение, достаточно указать флаг —download_only
И если интересно почитать, как мы это разрабатывали - прошу на Хабр!
Пользуйтесь на здоровье :)
#habr #integratios #firebase #googleplay #appstore
Всем привет!
Очень часто возникает необходимость загрузить что-то из Google Play или Apple Appstore.
А бывает и такое, что нужно автоматизировать загрузку промежуточных версий из какого-то Firebase, например или AppCenter.
Мы тоже сталкиваемся постоянно с этими задачами, поэтому решили их автоматизировать и оформить в виде репо на гитхаб, а также питоновского пакета и докер-образа :)
Вообще, это наш cli для автоматического сканирования приложений, но если вам нужно просто приложение, достаточно указать флаг —download_only
И если интересно почитать, как мы это разрабатывали - прошу на Хабр!
Пользуйтесь на здоровье :)
#habr #integratios #firebase #googleplay #appstore
Хабр
Один в поле не воин. Полезные интеграции для инструментов анализа мобильных приложений
Привет, Хабр! Как вы уже наверняка помните, меня зовут Юрий Шабалин и я занимаюсь разработкой динамического анализатора мобильных приложений Стингрей. Сегодня мне хотелось бы затронуть тему интеграций...
👍1
Forwarded from Mobile AppSec World (Yury Shabalin)
Переход на 64-битную архитектуру в Android
Как мы знаем, ещё в далеком 2017 (блин, 5 лет прошло уже 😰), Apple полностью отказалась от поддержки 32-битных приложений и этой архитектуры как таковой. Google же, в свою очередь нет-нет, да и посматривал на своего оппонента и вот, долгожданные новости. В ближайшее время компания планирует отказаться от поддержки x86!
Уже сейчас, в новых линейках процессоров из 8 доступных ядер для выполнения 32-битных операций будут доступны только 3 ядра. А к следующему году планируется полностью исключить их выполнение.
Android давно к этому готовился и вот, Android 12 первая версия операционной системы, которая поддерживает выполнение только 64-битных приложений! Небольшая выдержка из статьи:
The latest revision to the CDD explicitly requires device makers to build 32-bit Android for low RAM devices. The goal is to reduce the types of Android builds to two — Android 32-bit only and Android 64-bit only — to reduce fragmentation until 32-bit support can be fully deprecated years from now.
Больше подробностей в статье. За что мне нравится этот ресурс - это огромное количество ссылок в процессе повествования, по которым интересно походить и прочитать интересующую информацию.
#android #fragmentation #x86 #x64
Как мы знаем, ещё в далеком 2017 (блин, 5 лет прошло уже 😰), Apple полностью отказалась от поддержки 32-битных приложений и этой архитектуры как таковой. Google же, в свою очередь нет-нет, да и посматривал на своего оппонента и вот, долгожданные новости. В ближайшее время компания планирует отказаться от поддержки x86!
Уже сейчас, в новых линейках процессоров из 8 доступных ядер для выполнения 32-битных операций будут доступны только 3 ядра. А к следующему году планируется полностью исключить их выполнение.
Android давно к этому готовился и вот, Android 12 первая версия операционной системы, которая поддерживает выполнение только 64-битных приложений! Небольшая выдержка из статьи:
The latest revision to the CDD explicitly requires device makers to build 32-bit Android for low RAM devices. The goal is to reduce the types of Android builds to two — Android 32-bit only and Android 64-bit only — to reduce fragmentation until 32-bit support can be fully deprecated years from now.
Больше подробностей в статье. За что мне нравится этот ресурс - это огромное количество ссылок в процессе повествования, по которым интересно походить и прочитать интересующую информацию.
#android #fragmentation #x86 #x64
www.esper.io
Android 12 ultimate compatibility guide — all the changes for enterprise and device makers
Ready to build Android 12? If you plan to include GMS in your software, you'll need to meet Android 12's compatibility requirements.
👍1
Forwarded from Mobile Compose
#Video #Youtube #JetpackCompose
Positional memoization, или Как работает одна из главных концепций Jetpack Compose
На YouTube канале Mobius начали публиковать первые записи докладов с прошедшей конференции, среди которых появился и мой, в котором я рассказываю о том, как устроена одна из ключевых концепций Jetpack Compose — позиционная мемоизация. Приятного просмотра!
Positional memoization, или Как работает одна из главных концепций Jetpack Compose
На YouTube канале Mobius начали публиковать первые записи докладов с прошедшей конференции, среди которых появился и мой, в котором я рассказываю о том, как устроена одна из ключевых концепций Jetpack Compose — позиционная мемоизация. Приятного просмотра!
YouTube
Дмитрий Григорьев — Positional memoization. Как работает одна из главных концепций Jetpack Compose
Подробнее о конференции Mobius: https://jrg.su/ojGU3B
— —
Дмитрий Григорьев – Android-разработчик, интересуется декларативной и кроссплатформенной разработкой. Пишет и рассказывает про Jetpack Compose в своем Telegram — https://news.1rj.ru/str/mobile_compose, и на YouTube…
— —
Дмитрий Григорьев – Android-разработчик, интересуется декларативной и кроссплатформенной разработкой. Пишет и рассказывает про Jetpack Compose в своем Telegram — https://news.1rj.ru/str/mobile_compose, и на YouTube…
👍1
Forwarded from Android Broadcast (Кирилл Розов)
This media is not supported in your browser
VIEW IN TELEGRAM
#compose #animation
Orbitary - Compose библиотека для создания анимация с переходом элементов (transition with shared element)
Orbitary - Compose библиотека для создания анимация с переходом элементов (transition with shared element)
👍1
Forwarded from Android Broadcast (Кирилл Розов)
#performance
Performance Considerations for Memory Leaks: An Android Cookbook (6 мин)
Неплохая статья с примерами основных причин утечек памяти и как с ними бороться. Тем кто не знаком с этим рекомендую пройтись, тем кто в курсе - вспомнить лишний раз про возможные причины:
👉 Статические ссылки
👉 Взаимодействие с UI не из UI слоя/Android классов
👉 Хранение Bitmap
👉 Строгие ссылки на объекты с жизненным циклом
👉 Вложенные нестатические классы
Performance Considerations for Memory Leaks: An Android Cookbook (6 мин)
Неплохая статья с примерами основных причин утечек памяти и как с ними бороться. Тем кто не знаком с этим рекомендую пройтись, тем кто в курсе - вспомнить лишний раз про возможные причины:
👉 Статические ссылки
👉 Взаимодействие с UI не из UI слоя/Android классов
👉 Хранение Bitmap
👉 Строгие ссылки на объекты с жизненным циклом
👉 Вложенные нестатические классы
👍2
Forwarded from Android Good Reads (Egor Tolstoy)
Команда Касперского делится своим опытом использования Baseline profiles для оптимизации перфоманса. Помимо итоговых результатов, статья дает хороший обзор принципов работы этих профилей.
Хабр
Улучшаем производительность android-приложения с помощью Baseline profiles
Производительность важна для формирования положительного пользовательского опыта использования приложения, поэтому разработчики стремятся ускорить работу своих программ. Для приложений в области...
👍1
Forwarded from Mobile AppSec World (Yury Shabalin)
Как написать собственный эмулятор
Огненная статья по написанию самого худшего эмулятора Android в мире (да, она именно так и называется).
Статья очень информативная и интересная, покрывает широкий спектр различных тем, ведь чтобы написать эмулятор, нужно абсолютно точно понимать, как работает операционная система, которую мы собираемся эмулировать. В данном случае в статье покрыты темы:
• Базовая архитектура операционной системы Android
• Что такое системные вызовы
• Как обрабатываются системные вызовы в AArch64
• Как работает сопоставление памяти
• Как операционная система загружает ELF в память и запускает его
• Как эмулировать поведение операционной системы для загрузки ELF в память и его запуска
Советую всем неравнодушным к Android!
#android #emulator #rust
Огненная статья по написанию самого худшего эмулятора Android в мире (да, она именно так и называется).
Статья очень информативная и интересная, покрывает широкий спектр различных тем, ведь чтобы написать эмулятор, нужно абсолютно точно понимать, как работает операционная система, которую мы собираемся эмулировать. В данном случае в статье покрыты темы:
• Базовая архитектура операционной системы Android
• Что такое системные вызовы
• Как обрабатываются системные вызовы в AArch64
• Как работает сопоставление памяти
• Как операционная система загружает ELF в память и запускает его
• Как эмулировать поведение операционной системы для загрузки ELF в память и его запуска
Советую всем неравнодушным к Android!
#android #emulator #rust
fuzzing.science
Rudroid - Writing the World's worst Android Emulator in Rust 🦀 | fuzzing.science
Introduction
👍1
Forwarded from Mobile Compose
#Article #Medium
Introducing Jetpack Compose’s New Layout: “LookaheadLayout”
Вместе с появлением новой альфа версии Jetpack Compose (1.3.0-alpha01) API фреймворка пополнился новым и уже горячо обсуждаемым layout-ом — LookaheadLayout. Если кратко, это первый layout в Compose, способный отслеживать кадры используемой анимации, при помощи чего, к примеру, легко можно реализовать анимацию типа “Shared Element Transition”. Подробнее о том, как работает этот компонент — в сегодняшней статье.
Introducing Jetpack Compose’s New Layout: “LookaheadLayout”
Вместе с появлением новой альфа версии Jetpack Compose (1.3.0-alpha01) API фреймворка пополнился новым и уже горячо обсуждаемым layout-ом — LookaheadLayout. Если кратко, это первый layout в Compose, способный отслеживать кадры используемой анимации, при помощи чего, к примеру, легко можно реализовать анимацию типа “Shared Element Transition”. Подробнее о том, как работает этот компонент — в сегодняшней статье.
👍2
Forwarded from StartAndroid
В Android Studio Electric Eel была добавлена интеграция с Firebase Crashlytics.
Теперь креши можно смотреть прямо в студии. Кроме того, студия будет подсвечивать строки кода, которые приводят к крешам.
#androidstudio #firebase #crashlytics
https://developer.android.com/studio/preview/features#aqi
Теперь креши можно смотреть прямо в студии. Кроме того, студия будет подсвечивать строки кода, которые приводят к крешам.
#androidstudio #firebase #crashlytics
https://developer.android.com/studio/preview/features#aqi
👍1
Forwarded from Android Good Reads (Egor Tolstoy)
Разбор всех этапов совершения сетевого вызова, способов их инструментации, сбора метрик перфоманса и различных способов оптимизации времени совершения запроса. Кейс интересен тем, что для авторов производительность сетевых запросов особенно важна – они делают приложение, основные пользователи которого живут в сельской местности в Индии со слабым сетевым соединением.
Medium
How OkCredit Android App boosted Network Performance by 30%
By instrumenting network calls on production and following best practices, we can make huge improvements to an app’s network performance…
👍1
Forwarded from Mobile Developer (Алексей Гладков)
Кстати, если кто-то хочет начать делать проект на КММ, но не хочет заморачиваться с собственными решениями, то есть репозиторий, где собраны почти все либы, которые работают для КММ
https://github.com/terrakok/kmm-awesome
https://github.com/terrakok/kmm-awesome
GitHub
GitHub - terrakok/kmp-awesome: An awesome list that curates the best Kotlin Multiplatform libraries, tools and more.
An awesome list that curates the best Kotlin Multiplatform libraries, tools and more. - GitHub - terrakok/kmp-awesome: An awesome list that curates the best Kotlin Multiplatform libraries, tools a...
👍3
Forwarded from Android Broadcast (Кирилл Розов)
This media is not supported in your browser
VIEW IN TELEGRAM
#compose
Compose Image on Steroids - набор Compose API для расширения ваших возможностей по работе с изображениями в новомодном UI фреймворке от Google
Compose Image on Steroids - набор Compose API для расширения ваших возможностей по работе с изображениями в новомодном UI фреймворке от Google
👍1
Forwarded from Android Good Reads (Egor Tolstoy)
Еще один скриншот нового легкого UI IntelliJ, который появится и в Android Studio.
👍3👎2
Forwarded from Mobile AppSec World (Yury Shabalin)
Как установить более старую версию приложения поверх нового и не потерять данные в Android
По умолчанию, Android-система не позволяет устанавливать более старую версию поверх новой для одного приложения. В целом, это правильный подход, так и должно быть, потому что внутренние базы и структуры данных уже могут быть изменены под новую версию и старая может работать некорректно.
Но, иногда такая необходимость возникает. И тут на помощь нам придет статья, в которой описано несколько способов как это совершенно легально провернуть и оставить данные на месте.
Это может быть крайне полезно!
#android #downgrade
По умолчанию, Android-система не позволяет устанавливать более старую версию поверх новой для одного приложения. В целом, это правильный подход, так и должно быть, потому что внутренние базы и структуры данных уже могут быть изменены под новую версию и старая может работать некорректно.
Но, иногда такая необходимость возникает. И тут на помощь нам придет статья, в которой описано несколько способов как это совершенно легально провернуть и оставить данные на месте.
Это может быть крайне полезно!
#android #downgrade
🔥1
Forwarded from Голос из-под шторки | Миша Левченко
Почти 3 года назад я “продал” TEA своей команде в Авто.ру. С тех пор наша команда написала 180 TEA-компонентов - от простых экранов с парой кнопок до сложных форм-визардов с кучей логики. Тогда одним из ключевых требований дизайна, которые я перед собой ставил, был интероп с тогдашним стеком приложения - MVP + Clean Architecture, RxJava, Dagger 2. С тех пор я много думал о том, как бы выглядела архитектура, если убрать ограничение на совместимость с наследием эпохи Clean Architecture. Эта статья - компиляция моих заметок на эту тему.
t.me
The Elm Architecture в Android проекте: 3 года спустя
Почти 3 года назад я “продал” TEA своей команде в Авто.ру. С тех пор наша команда написала 180 TEA-компонентов - от простых экранов с парой кнопок до сложных форм-визардов с кучей логики. Тогда одним из ключевых требований дизайна, которые я перед собой ставил…
👍2