- PVSM.RU - https://www.pvsm.ru -

Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта)

В нашем новом выпуске рассказываем про то, как потратить миллион на создание собственного переводчика, про виртуальные митапы для Android-разработчиков, про влияние эпидемии на рынок приложений, про рекордные траты пользователей и многое другое!

Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 1

Когда у меня в очередной раз закончились деньги, наступил кризис. Я не смог найти работу, ситуация стала критической. Пришло время посмотреть на все вещи трезвым взглядом. Нужно было честно признаться себе, что я не знаю, какие ниши выбрать для бизнеса. Создавать проекты, которые просто нравятся, — путь в никуда.

Предлагаем вашему вниманию цикл статей, посвященных оптимизации рендера под мобильные устройства: телефоны и планшеты на базе iOS и Android. Цикл будет состоять из трех частей. В первой части мы рассмотрим особенности популярной на Mobile тайловой архитектуры GPU.

Этот дайджест доступен в виде еженедельной рассылки [3]. А ежедневно новости мы рассылаем в Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 4Telegram-канале [4].

Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 5 iOS

(+4) MVVM на основе Combine в UIKit и SwiftUI приложениях [5]
(+4) Проблемы инструментария в больших проектах [6]
(+3) Добавляем темную тему в iOS [7]
Apple представила новый iPad Pro с лидаром [8]
В App Store запретили и игры про коронавирус [9]
Конференция Apple WWDC 2020 пройдёт в онлайн-формате [10]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 6 5 расширений Swift, которые сделают вашу жизнь проще [11]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 7 Как изменить иконку вашего приложения в SwiftUI [12]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 8 Что такое фреймворк vDSP в Swift? [13]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 9 Быстрое руководство по лучшей типографике для iOS [14]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 10 Как реализовать UITableView и UICollectionView с RxDataSources [15]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 11 Дебаг Apple L8 — основы реверс-инжинеринга [16]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 12 Swift-ери это сам — список задач с CloudKit [17]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 13 Генерация видео-субтитров на iOS-устройстве с помощью SwiftUI и ML Kit [18]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 14 CoronaTracker: трекер коронавируса [19]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 15 Simple iOS Login: экраны входа [20]

Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 16 Android

(+10) Раскладываем на части FragmentLifecycleCallbacks [21]
(+6) Осваиваем разработку через тестирование в Android с помощью UI-тестов [22]
(+4) 30+ лаконичных профессиональных рекомендаций для Android разработчика [23]
(+3) Передаем Android логи через интернет с Timber и Node.JS [24]
(+3) Работaем с View асинхронно с использованием корутин [25]
Открываются Android Dev Virtual Meetup [26]
Аудитория Android Go превысила 100 млн. человек [27]
Google запрещает установку сторонних приложений (для пользователей Advanced Protection Program) [28]
Время рассмотрения приложений в Google Play увеличено до недели [29]
Обзор Material Design Components [30]
51 ресурс для начинающих и профессиональных Android-разработчиков [31]
Конференция I/O 2020 полностью отменена [32]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 17 Обновление запросов без изменения адаптера RecyclerView с использованием FirebaseUI [33]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 18 8 веских причин для модульности в Android [34]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 19 Интерфейс чата для Android с использованием RecyclerView и Groupie [35]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 20 Исследуем Server-Driven UI [36]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 21 Внедрение систем движения с материальными компонентами для Android [37]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 22 Как уменьшить размер вашего Android-приложения с помощью R8 [38]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 23 Создание компонентной архитектуры в Android Jetpack Compose [39]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 24 Нативные зависимости в Android Studio 4.0 [40]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 25 Диалоги для Android на Kotlin: туториал [41]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 26 Motion Toast: уведомления для Android на Kotlin [42]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 27 Material Components Android Examples: работаем с Material Components [43]

Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 28 Разработка

(+27) Машинное обучение в Unity: учим МО-агентов перепрыгивать через стены [44]
(+26) Погружение в Charles Proxy [45]
(+19) «Разрабатывая что-то заранее и полностью спроектированное, ты делаешь мертворожденную штуку» — разговор с The Breakfast [46]
(+17) Чем больше, тем хуже или почему важен игровой цикл [47]
(+11) Интервью с Вячеславом Уточкиным, директором образовательных программ по геймдеву ВШБИ НИУ ВШЭ: 20 вопросов о геймдеве [48]
(+10) Война с тормозами. Оптимизация количества рендеров компонентов в React Native [49]
(+6) Увлекательные сайд-проекты, которыми можно заняться уже сегодня [50]
(+2) Размытие фонового изображения в Unity [51]
(0) Геотрекинг в React Native [52]
Podlodka #155: Бьёрн Страуструп [53]
Android Broadcast #9: Как сделать крутую конференцию [54]
Вышел Magicverse SDK от Magic Leap [55]
Приложение GitHub вышло из беты [56]
Предустановку приложений ускоряют [57]
Темная тема или светлая: что лучше для пользователей? [58]
Snap запустил веб-редактор масок Lens Web Builder [59]
Ощущения дефицита в UX: как можно манипулировать пользователями [60]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 29 Как GitHub заблокировал меня (и все мои библиотеки) [61]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 30 ArangoDB: идеальная база данных для проектов с высоким уровнем неопределенности [62]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 31 Flutter vs Native vs React-Native: проверка производительности [63]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 32 Список из 100 классных и интересных публичных API для вашего следующего проекта [64]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 33 Использование ИИ для UX-дизайна мобильных приложений [65]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 34 Создание кросс-платформенного приложения с вкладками на Flutter [66]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 35 Естественное отображение на практике: новый регулятор громкости в iOS 13 [67]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 36 Как «Принц Персии» победил ограничения памяти Apple II [68]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 37 Как сделать универсальное приложение [69]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 38 Я разработал, построил и запустил MVP-продукт за 5 дней [70]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 39 Как писать хорошую документацию к коду [71]

Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 40 Аналитика, маркетинг и монетизация

(+27) Как связать вовлечение с монетизацией в мобильных играх и приложениях [72]
(+9) Правила локализации для разработчиков [73]
(+8) Локализация инди-игр: стоит ли игра свеч? [74]
(+6) Источник правды: как аналитик учит менеджера и разработчика работать вместе [75]
Кейс от inDriver: как создать идеальное райд-шеринговое приложение для 31 страны с разными языками и культурой? [76]
Tapjoy запустил Multi-Reward Engagements [77]
В 2019 средний пользователь iPhone в США потратил на приложения $100 [78]
Proxy: бесконтактные двери [79]
Влияние коронавируса на экономику приложений — исследование App Annie [80]
Приложение Kitche, помогающее уменьшить пищевые отходы, получило инвестиции [81]
Расходы на приобретение пользователей для игр в 2022 году достигнут $48.5 млрд [82]
В Иране запустили приложение для диагностики коронавируса, но оно только следит за пользователями [83]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 41 MVP против прототипа против PoC: каков наилучший подход для измерения Product/Market Fit? [84]

Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 42 AI, Устройства, IoT

(+33) Как мы используем item2vec для рекомендаций похожих товаров [85]
(+24) Как мы создавали галерею нейросетевого искусства и почему не даём копировать картины [86]
(+12) На вкус и цвет: градации подходов к Умному дому [87]
(+5) Работаем с датчиком CO? Xiaomi ClearGrass Air Detector локально, без китайских серверов [88]
Google представил Pigweed — инструменты разработки для встроенных систем [89]
Переводчик Google научили переводить речь в реальном времени [90]
Google начал сертифицировать разработчиков TensorFlow [91]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 43 Самые полезные инструменты машинного обучения 2020 [92]
Дайджест интересных материалов для мобильного разработчика #337 (16 — 22 марта) - 44 Обнаружение коронавируса на рентгеновских изображениях с Keras, TensorFlow и глубоким обучением [93]

< Предыдущий дайджест [94]. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту [95].

Автор: DigitalEcosystems

Источник [96]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/razrabotka-pod-ios/350451

Ссылки в тексте:

[1] Как я заработал 1 000 000 $ без опыта и связей, а потом потратил их, чтобы сделать свой переводчик: https://habr.com/ru/post/492524/

[2] Оптимизация рендера под Mobile: https://habr.com/ru/company/playrix/blog/492874/

[3] рассылки: http://apptractor.us3.list-manage2.com/subscribe?u=fbdb52f18301080a3cc983f4b&id=bb7bc0a9c0

[4] Telegram-канале: https://t.me/apptractor

[5] MVVM на основе Combine в UIKit и SwiftUI приложениях: https://habr.com/ru/post/492530/

[6] Проблемы инструментария в больших проектах: https://habr.com/ru/company/surfstudio/blog/492606/

[7] Добавляем темную тему в iOS: https://habr.com/ru/company/bcs_company/blog/493096/

[8] Apple представила новый iPad Pro с лидаром: https://apptractor.ru/info/devices/ipad-pro-11.html

[9] В App Store запретили и игры про коронавирус: https://apptractor.ru/deploy/app-stores/apple-ban-coronavirus.html

[10] Конференция Apple WWDC 2020 пройдёт в онлайн-формате: https://apptractor.ru/info/news/wwdc-2020.html

[11] 5 расширений Swift, которые сделают вашу жизнь проще: https://medium.com/flawless-app-stories/5-swift-extensions-to-make-your-life-easier-1accb384cbac

[12] Как изменить иконку вашего приложения в SwiftUI: https://medium.com/better-programming/how-to-change-your-apps-icon-in-swiftui-1f2ff3c44344

[13] Что такое фреймворк vDSP в Swift?: https://medium.com/better-programming/what-is-the-vdsp-framework-in-swift-fe2539693e9a

[14] Быстрое руководство по лучшей типографике для iOS: https://uxdesign.cc/a-five-minute-guide-to-better-typography-for-ios-4e3c2715ceb4

[15] Как реализовать UITableView и UICollectionView с RxDataSources: https://medium.com/better-programming/how-to-implement-uitableview-and-uicollectionview-with-rxdatasources-1afcd68729bf

[16] Дебаг Apple L8 — основы реверс-инжинеринга: https://www.youtube.com/watch?v=PTCKXTPUeqY

[17] Swift-ери это сам — список задач с CloudKit: https://medium.com/@RaulFerrer_dev/swift-it-yourself-develop-a-to-do-app-with-cloudkit-e029e820df43

[18] Генерация видео-субтитров на iOS-устройстве с помощью SwiftUI и ML Kit: https://heartbeat.fritz.ai/on-device-video-subtitle-generation-on-ios-with-swiftui-and-ml-kit-6ed28dd2734c

[19] CoronaTracker: трекер коронавируса: https://apptractor.ru/info/github/coronatracker.html

[20] Simple iOS Login: экраны входа: https://apptractor.ru/info/github/simple-ios-login.html

[21] Раскладываем на части FragmentLifecycleCallbacks: https://habr.com/ru/company/yamoney/blog/492272/

[22] Осваиваем разработку через тестирование в Android с помощью UI-тестов: https://habr.com/ru/company/otus/blog/492712/

[23] 30+ лаконичных профессиональных рекомендаций для Android разработчика: https://habr.com/ru/company/otus/blog/493274/

[24] Передаем Android логи через интернет с Timber и Node.JS: https://habr.com/ru/post/467373/

[25] Работaем с View асинхронно с использованием корутин: https://habr.com/ru/post/492604/

[26] Открываются Android Dev Virtual Meetup: https://apptractor.ru/info/conferences/android-dev-virtual-meetup.html

[27] Аудитория Android Go превысила 100 млн. человек: https://apptractor.ru/info/news/android-go-100.html

[28] Google запрещает установку сторонних приложений (для пользователей Advanced Protection Program): https://apptractor.ru/info/news/googles-advanced-protection-program-apps.html

[29] Время рассмотрения приложений в Google Play увеличено до недели: https://apptractor.ru/deploy/app-stores/google-play-app-review-times-7.html

[30] Обзор Material Design Components: https://apptractor.ru/info/media/material-design-components.html

[31] 51 ресурс для начинающих и профессиональных Android-разработчиков: https://apptractor.ru/develop/51-resurs-dlya-nachinayushhih-i-professionalnyih-android-razrabotchikov.html

[32] Конференция I/O 2020 полностью отменена: https://apptractor.ru/info/conferences/i-o-out.html

[33] Обновление запросов без изменения адаптера RecyclerView с использованием FirebaseUI: https://medium.com/firebase-developers/update-queries-without-changing-recyclerview-adapter-using-firebaseui-android-32098b3082b2

[34] 8 веских причин для модульности в Android: https://www.techyourchance.com/modularization-android

[35] Интерфейс чата для Android с использованием RecyclerView и Groupie: https://medium.com/swlh/android-chat-interface-using-recyclerview-and-groupie-9c1a67e28e3e

[36] Исследуем Server-Driven UI: https://medium.com/better-programming/exploring-server-driven-ui-cf67b3da919

[37] Внедрение систем движения с материальными компонентами для Android: https://proandroiddev.com/implementing-the-motion-system-with-material-components-for-android-75bfeef8de9e

[38] Как уменьшить размер вашего Android-приложения с помощью R8: https://medium.com/better-programming/shrink-your-android-app-with-r8-afe17c4d393

[39] Создание компонентной архитектуры в Android Jetpack Compose: https://medium.com/better-programming/create-a-component-based-architecture-in-android-jetpack-compose-96980c191351

[40] Нативные зависимости в Android Studio 4.0: https://android-developers.googleblog.com/2020/02/native-dependencies-in-android-studio-40.html

[41] Диалоги для Android на Kotlin: туториал: https://levelup.gitconnected.com/android-alert-dialogs-in-kotlin-tutorial-fbbe1f787015

[42] Motion Toast: уведомления для Android на Kotlin: https://apptractor.ru/info/github/motion-toast.html

[43] Material Components Android Examples: работаем с Material Components: https://apptractor.ru/info/github/material-components-android-examples.html

[44] Машинное обучение в Unity: учим МО-агентов перепрыгивать через стены: https://habr.com/ru/company/pixonic/blog/492548/

[45] Погружение в Charles Proxy: https://habr.com/ru/company/funcorp/blog/492940/

[46] «Разрабатывая что-то заранее и полностью спроектированное, ты делаешь мертворожденную штуку» — разговор с The Breakfast: https://habr.com/ru/post/492774/

[47] Чем больше, тем хуже или почему важен игровой цикл: https://habr.com/ru/company/playgendary/blog/493172/

[48] Интервью с Вячеславом Уточкиным, директором образовательных программ по геймдеву ВШБИ НИУ ВШЭ: 20 вопросов о геймдеве: https://habr.com/ru/company/southbridge/blog/493014/

[49] Война с тормозами. Оптимизация количества рендеров компонентов в React Native: https://habr.com/ru/post/492390/

[50] Увлекательные сайд-проекты, которыми можно заняться уже сегодня: https://habr.com/ru/company/plarium/blog/493146/

[51] Размытие фонового изображения в Unity: https://habr.com/ru/post/493452/

[52] Геотрекинг в React Native: https://habr.com/ru/company/simbirsoft/blog/493312/

[53] Podlodka #155: Бьёрн Страуструп: https://apptractor.ru/info/media/podlodka-155.html

[54] Android Broadcast #9: Как сделать крутую конференцию: https://apptractor.ru/info/conferences/android-broadcast-9.html

[55] Вышел Magicverse SDK от Magic Leap: https://apptractor.ru/develop/sdk/magicverse-sdk.html

[56] Приложение GitHub вышло из беты: https://apptractor.ru/info/apps/github-for-mobile-2.html

[57] Предустановку приложений ускоряют: https://apptractor.ru/info/news/pre-installed-rush.html

[58] Темная тема или светлая: что лучше для пользователей?: https://apptractor.ru/develop/design/dark-mode.html

[59] Snap запустил веб-редактор масок Lens Web Builder: https://apptractor.ru/info/news/lens-web-builder.html

[60] Ощущения дефицита в UX: как можно манипулировать пользователями: https://apptractor.ru/info/articles/oshhushheniya-defitsita-v-ux-kak-mozhno-manipulirovat-polzovatelyami.html

[61] Как GitHub заблокировал меня (и все мои библиотеки): https://medium.com/@catamphetamine/how-github-blocked-me-and-all-my-libraries-c32c61f061d3

[62] ArangoDB: идеальная база данных для проектов с высоким уровнем неопределенности: https://techhype.io/?story=arangodb-a-perfect-database-for-projects-with-a-high-level-of-uncertainty

[63] Flutter vs Native vs React-Native: проверка производительности: https://medium.com/swlh/flutter-vs-native-vs-react-native-examining-performance-31338f081980

[64] Список из 100 классных и интересных публичных API для вашего следующего проекта: https://medium.com/better-programming/a-curated-list-of-100-cool-and-fun-public-apis-to-inspire-your-next-project-7600ce3e9b3

[65] Использование ИИ для UX-дизайна мобильных приложений: https://onedegree.ca/2020/03/16/using-ai-for-mobile-app-ux-design-why-do-it-and-how-to-do-it/

[66] Создание кросс-платформенного приложения с вкладками на Flutter: https://medium.com/better-programming/create-a-cross-platform-tabbed-app-in-flutter-c728ca5e30f6

[67] Естественное отображение на практике: новый регулятор громкости в iOS 13: https://uxdesign.cc/the-new-ios-13-volume-hud-a-stellar-design-that-demonstrates-natural-mapping-77e05039ad1c

[68] Как «Принц Персии» победил ограничения памяти Apple II: https://techhype.io/?story=how-prince-of-persia-defeated-apple-iis-memory-limitations

[69] Как сделать универсальное приложение: https://medium.com/connected/how-to-build-a-universal-app-53b07e07f864

[70] Я разработал, построил и запустил MVP-продукт за 5 дней: https://medium.com/better-programming/i-designed-built-and-launched-an-mvp-platform-in-5-days-c06fa629adb9

[71] Как писать хорошую документацию к коду: https://levelup.gitconnected.com/how-to-write-good-code-documentation-23d4d4297a

[72] Как связать вовлечение с монетизацией в мобильных играх и приложениях: https://habr.com/ru/company/playgendary/blog/492806/

[73] Правила локализации для разработчиков: https://habr.com/ru/company/alconost/blog/492292/

[74] Локализация инди-игр: стоит ли игра свеч?: https://habr.com/ru/company/alconost/blog/492594/

[75] Источник правды: как аналитик учит менеджера и разработчика работать вместе: https://habr.com/ru/company/redmadrobot/blog/492462/

[76] Кейс от inDriver: как создать идеальное райд-шеринговое приложение для 31 страны с разными языками и культурой?: https://apptractor.ru/info/articles/indriver-localization.html

[77] Tapjoy запустил Multi-Reward Engagements: https://apptractor.ru/marketing-monetization/ad-networks/tapjoy-multi-reward-engagements.html

[78] В 2019 средний пользователь iPhone в США потратил на приложения $100: https://apptractor.ru/info/analytics/revenue-per-iphone-2019.html

[79] Proxy: бесконтактные двери: https://apptractor.ru/info/techhype/proxy.html

[80] Влияние коронавируса на экономику приложений — исследование App Annie: https://apptractor.ru/measure/app-store-analytics/coronavirus-impact-mobile-economy.html

[81] Приложение Kitche, помогающее уменьшить пищевые отходы, получило инвестиции: https://apptractor.ru/info/news/kitche.html

[82] Расходы на приобретение пользователей для игр в 2022 году достигнут $48.5 млрд: https://apptractor.ru/marketing-monetization/app-promotion-campaign-analytics/gaming-app-install-ad-spend.html

[83] В Иране запустили приложение для диагностики коронавируса, но оно только следит за пользователями: https://apptractor.ru/info/news/iran-corona-app.html

[84] MVP против прототипа против PoC: каков наилучший подход для измерения Product/Market Fit?: https://techhype.io/?story=mvp-vs-prototype-vs-poc-whats-the-best-approach-to-measure-product-market-fit

[85] Как мы используем item2vec для рекомендаций похожих товаров: https://habr.com/ru/company/avito/blog/491942/

[86] Как мы создавали галерею нейросетевого искусства и почему не даём копировать картины: https://habr.com/ru/company/yandex/blog/493190/

[87] На вкус и цвет: градации подходов к Умному дому: https://habr.com/ru/company/barsgroup/blog/492898/

[88] Работаем с датчиком CO? Xiaomi ClearGrass Air Detector локально, без китайских серверов: https://habr.com/ru/post/493220/

[89] Google представил Pigweed — инструменты разработки для встроенных систем: https://apptractor.ru/info/news/pigweed.html

[90] Переводчик Google научили переводить речь в реальном времени: https://apptractor.ru/info/apps/google-translate-live-transcribe.html

[91] Google начал сертифицировать разработчиков TensorFlow: https://apptractor.ru/learn/tensorflow-developer-certificate.html

[92] Самые полезные инструменты машинного обучения 2020: https://towardsdatascience.com/the-most-useful-ml-tools-2020-e41b54061c58

[93] Обнаружение коронавируса на рентгеновских изображениях с Keras, TensorFlow и глубоким обучением: https://www.pyimagesearch.com/2020/03/16/detecting-covid-19-in-x-ray-images-with-keras-tensorflow-and-deep-learning/

[94] Предыдущий дайджест: https://habr.com/ru/company/digital-ecosystems/blog/491584/

[95] почту: mailto:lbogolubov@gmail.com

[96] Источник: https://habr.com/ru/post/493520/?utm_source=habrahabr&utm_medium=rss&utm_campaign=493520