Спасибо за то что делитесь опытом! А можете коротко описать как правильно применять TDD в мобильной разработке? Я могу себе это предстваить когда речь идет о логике (создание той же модели, изменение ее состояний или покрытие API). Но неужели вы и для интерфейса сначала пишете UI тест который падает? Или вы проверяете генерацию UI в коде юнит-тестами?
macOS в целом неохотно освобождает память, в основном по требованию. Она таким же образом ведет себя на intel машинах. Это связано с ускорением переключения между приложениями и перезапуском приложений. Смысл в том что если память свободна - значит она простаивает. Но Activity Monitor может пугать видом "ой сейчас память закончится и начнется свап". На скриншоте ноутбук с 16Гб и кажется что осталось только четыре свободных. На самом деле действительно занято ~6.7, все остальное система освободит по требованию. Это косвенно видно и по зеленому Memory Pressure и по 0 Swap.
Правда объяснить почему отдельно взятое приложение (Safari или Control Center) занимает десятки гигабайт я не могу. Может быть кэши закрытых страниц или какие-то состояния виджетов в Control Center.
Спасибо, очень интересная статья!
Особенно методология и организация работ по рефакторингу.
Я так понимаю что ошибку с миграций (которая была первым звоночком) не получилось поймать в CI тестах на апдейт приложения, поскольку она случалась не между текущей и предыдущей версией а между текущей и какой-то древней?
Большое спасибо за подробную статью!
Немного выбивается, что настройки сети для iOS указаны на русском. Я из-за этого пропустил, что кроме установки (которая сама по себе требует подтверждения) нужно ДОПОЛНИТЕЛЬНО разерешить полное доверие сертификату.
'Settings' > 'General' > 'About' > 'Certificate Trust Settings' > Enable Full Trust
Спасибо, очень интересно!
В немецкой википедии (https://de.wikipedia.org/wiki/Tek_Sing#Fund_und_Bergung) описаны дополнительные детали расхищения: 600000 находок были просто уничтожены, чтоб не занижать цену 350000 выставленных на аукцион. При этом (по крайней мене по документам) мероприятие не окупилась. Было потрачено около 20 миллионов, выручка от аукциона составила 14.5
Китайские археологические институты были очень недовольны, чтоб побудило Китай усовершенствовать работы в области защиты национальных культурных достояний.
Спасибо большое за статью, интересный подход!
Ошибки с аналитикой опасны тем что они не видны сразу и обнаруживаются только через месяц-другой когда маркетинг анализирует собранные данные.
Я использую такой алгоритм:
1) Если задача не решается по ходу я трачу на нее дополнительно час-полтора (обычно это не критично для других задач)
2) Если решение не находится я советуюсь с коллегами (тут как раз можно получить взгляд со стороны или подсказку)
3) Если подсказки не нашлось и взгляд со стороны ничего внятного не дал я сообщаю менеджеру что есть проблема: появилась не прогнозируемая по времени задача. Тут или можно пойти на компромис и сделать что-то предсказуемое и по-проще или менеджер решает сколько еще времени я могу потратить на поиск решения.
4) Если я потратил и дополнительное время, а решения все равно нет — тут уже надо думать. Или передавать задачу другому человеку или решать проблему с точки зрения бизнеса (отказываться вообще, ощутимо менять требования и т.д.)
Пока все с чем сталкивался решалось именно так и все были довольны.
Спасибо, очень интересно!
И хорошо показано что и в мобильной разработке можно до бесконечности копать в глубину и ширину.
Судя по примерам вы используете Obj-C, но правильно ли я понимаю, что все то же самое можно написать на swift?
Ещё интересно не проводили ли вы сравнительного тестирования похожих UI на классике и SwiftUI?
При инициализации Firebase можно ей прямо указать какой plist использовать. Единственно в документации предупреждают, что это нужно делать как можно раньше, чтоб не потерять события которые собираются на старте приложения.
let options = FirebaseOptions.init(contentsOfFile: optionFilePath) {
FirebaseApp.configure(options: options)
}
Интересно, спасибо!
Действительно, если детей правила психологически меньше связывают можно начинать использовать Каркассон как совместный сбор пазла, а уже потом добавлять соревновательную составляющую. Я играл с детьми 8+ и они были сразу ориентированы на выигрыш.
А можете дать чуть более развернутую оценку стратегии «Кооперация как выход из проигрышной ситуации.»
Я не обладаю знаниями психологии, но довольно много играл в настольные игры. Если мои оппоненты применят такую стратегию я постараюсь больше не садиться с ними за один стол. Поскольку это обычно выход за формальные правила игры (в Каркассоне так точно) и очевидная несправедливость: против меня играют два человека. В целом мне кажется, что такая стратегия превращает игру с умеренной конкуренцией в жестко конфликтную ситуацию.
Напрямую не встречал, но к примеру если сравнить описания:
A JSON Web Token (JWT) that securely communicates information about the user to your app.
и
A short-lived token used by your app for proof of authorization when interacting with the app’s server counterpart.
то мне кажется понятно как Apple предполагает их использовать.
Можно при следующей попытке попросить пользователя ввести любые имя и мейл.
О, спасибо! Это третий вариант. Ну он тоже не без недостатков, поскольку Apple возвращает «проверенный» мейл, а так пользователь может ввести все что угодно. Плюс пользователи не очень любят руками что-то вводить.
Я бы советовал добавить в Нюансы как раз реализацию logout. Если пользователь разорвал ассоциацию Apple ID с приложением в Settings (Settings/ Apple ID / Password & Security / Apple ID logins / Edit) вы должны выполнить logout в приложении / на сервере. Apple рекомендует проверять это на старте приложения с помощью ASAuthorizationAppleIDProvider().getCredentialState
Я так понимаю это рекомендация Apple.
В плане безопасности authorizationCode лучше — он одноразовый.
А по-поводу identityToken — он не такой удобный как кажется… В первый раз он содержит имя и мейл, во все последующие нет (даже если ты указываешь их в requestedScopes).
Пока я встречал два пути решения проблемы:
1) Хранить локально имя и мейл до завершения регистрации на сервере, как предлагает автор статьи.
2) Если регистрация была прервана, при следующей попытке просить пользователя удалить ассоциацию с приложением в Settings.
Спасибо за то что делитесь опытом!
А можете коротко описать как правильно применять TDD в мобильной разработке?
Я могу себе это предстваить когда речь идет о логике (создание той же модели, изменение ее состояний или покрытие API). Но неужели вы и для интерфейса сначала пишете UI тест который падает? Или вы проверяете генерацию UI в коде юнит-тестами?
macOS в целом неохотно освобождает память, в основном по требованию. Она таким же образом ведет себя на intel машинах. Это связано с ускорением переключения между приложениями и перезапуском приложений. Смысл в том что если память свободна - значит она простаивает. Но Activity Monitor может пугать видом "ой сейчас память закончится и начнется свап". На скриншоте ноутбук с 16Гб и кажется что осталось только четыре свободных. На самом деле действительно занято ~6.7, все остальное система освободит по требованию. Это косвенно видно и по зеленому Memory Pressure и по 0 Swap.
Правда объяснить почему отдельно взятое приложение (Safari или Control Center) занимает десятки гигабайт я не могу. Может быть кэши закрытых страниц или какие-то состояния виджетов в Control Center.
В смысле "можно навсегда забрать кусок земли себе"? В википедии на которую вы ссылаетесь написано:
Вот два американских индекса и оба с октября в целом ощутимо выросли:
www.finanzen.net/index/s&p_500
www.finanzen.net/index/dow_jones_global_dow
Особенно методология и организация работ по рефакторингу.
Я так понимаю что ошибку с миграций (которая была первым звоночком) не получилось поймать в CI тестах на апдейт приложения, поскольку она случалась не между текущей и предыдущей версией а между текущей и какой-то древней?
Прямо космические технологии.
www.macrumors.com/2020/12/10/caviar-launches-custom-iphone-12-pro
Немного выбивается, что настройки сети для iOS указаны на русском. Я из-за этого пропустил, что кроме установки (которая сама по себе требует подтверждения) нужно ДОПОЛНИТЕЛЬНО разерешить полное доверие сертификату.
'Settings' > 'General' > 'About' > 'Certificate Trust Settings' > Enable Full Trust
В немецкой википедии (https://de.wikipedia.org/wiki/Tek_Sing#Fund_und_Bergung) описаны дополнительные детали расхищения: 600000 находок были просто уничтожены, чтоб не занижать цену 350000 выставленных на аукцион. При этом (по крайней мене по документам) мероприятие не окупилась. Было потрачено около 20 миллионов, выручка от аукциона составила 14.5
Китайские археологические институты были очень недовольны, чтоб побудило Китай усовершенствовать работы в области защиты национальных культурных достояний.
Ошибки с аналитикой опасны тем что они не видны сразу и обнаруживаются только через месяц-другой когда маркетинг анализирует собранные данные.
1) Если задача не решается по ходу я трачу на нее дополнительно час-полтора (обычно это не критично для других задач)
2) Если решение не находится я советуюсь с коллегами (тут как раз можно получить взгляд со стороны или подсказку)
3) Если подсказки не нашлось и взгляд со стороны ничего внятного не дал я сообщаю менеджеру что есть проблема: появилась не прогнозируемая по времени задача. Тут или можно пойти на компромис и сделать что-то предсказуемое и по-проще или менеджер решает сколько еще времени я могу потратить на поиск решения.
4) Если я потратил и дополнительное время, а решения все равно нет — тут уже надо думать. Или передавать задачу другому человеку или решать проблему с точки зрения бизнеса (отказываться вообще, ощутимо менять требования и т.д.)
Пока все с чем сталкивался решалось именно так и все были довольны.
И хорошо показано что и в мобильной разработке можно до бесконечности копать в глубину и ширину.
Судя по примерам вы используете Obj-C, но правильно ли я понимаю, что все то же самое можно написать на swift?
Ещё интересно не проводили ли вы сравнительного тестирования похожих UI на классике и SwiftUI?
let options = FirebaseOptions.init(contentsOfFile: optionFilePath) {
FirebaseApp.configure(options: options)
}
Действительно, если детей правила психологически меньше связывают можно начинать использовать Каркассон как совместный сбор пазла, а уже потом добавлять соревновательную составляющую. Я играл с детьми 8+ и они были сразу ориентированы на выигрыш.
Я не обладаю знаниями психологии, но довольно много играл в настольные игры. Если мои оппоненты применят такую стратегию я постараюсь больше не садиться с ними за один стол. Поскольку это обычно выход за формальные правила игры (в Каркассоне так точно) и очевидная несправедливость: против меня играют два человека. В целом мне кажется, что такая стратегия превращает игру с умеренной конкуренцией в жестко конфликтную ситуацию.
и
то мне кажется понятно как Apple предполагает их использовать.
О, спасибо! Это третий вариант. Ну он тоже не без недостатков, поскольку Apple возвращает «проверенный» мейл, а так пользователь может ввести все что угодно. Плюс пользователи не очень любят руками что-то вводить.
В плане безопасности authorizationCode лучше — он одноразовый.
А по-поводу identityToken — он не такой удобный как кажется… В первый раз он содержит имя и мейл, во все последующие нет (даже если ты указываешь их в requestedScopes).
Пока я встречал два пути решения проблемы:
1) Хранить локально имя и мейл до завершения регистрации на сервере, как предлагает автор статьи.
2) Если регистрация была прервана, при следующей попытке просить пользователя удалить ассоциацию с приложением в Settings.