Как стать автором
Обновить

Компания Doubletapp временно не ведёт блог на Хабре

Сначала показывать

Вы кто такие, я вас не знаю, или Как мы делаем JWT-аутентификацию

Уровень сложности Средний
Время на прочтение 11 мин
Количество просмотров 4.3K
Туториал

Привет! Меня зовут Данил, я backend-разработчик в Doubletapp. Почти во всех наших проектах есть пользователи, которые могут войти в систему. А значит, нам почти всегда нужна авторизация. Мы используем авторизацию, построенную на JSON Web Token. Она отлично сочетает в себе простоту реализации и безопасность для приложений.

В интернете есть много разных материалов с объяснением, что такое JWT и как им пользоваться. Но большинство примеров ограничиваются выдачей токена для пользователя. В этой статье я хочу рассказать не только о том, что такое JWT, но и как можно реализовать работу с access и refresh токенами и решить сопутствующие проблемы. Будет немного теории и много практики. Присаживайтесь поудобнее, мы начинаем.

Путеводитель:

Что такое JSON Web Token?
Использование и реализация
Простая реализация JWT
Access и refresh tokens
Как отозвать токены
Доступ с нескольких устройств
Удаление старых данных
Резюмируем

Читать далее
Всего голосов 20: ↑18 и ↓2 +16
Комментарии 43

Два по цене одного: snapshot-тесты на основе SwiftUI Preview

Уровень сложности Средний
Время на прочтение 7 мин
Количество просмотров 472
Туториал

Привет, Хабр! Меня зовут Дима, я iOS-разработчик в компании Doubletapp, и в прошлом году я вместе со своими коллегами и командой Яндекса участвовал в разработке приложения Яндекс Путешествия. В этом проекте мы выбрали фреймворком пользовательского интерфейса SwiftUI (подробнее о том, как мы его выбрали и что из этого получилось, рассказала наша iOS-Head Полина Скалкина здесь).

На начальном этапе реализации приложения мы постоянно вносили изменения во множество вью. Это были и обновления, вызванные переработкой дизайна, и исправление багов, и оптимизации, которые мы делали по мере роста наших знаний о SwiftUI. Нам хотелось контролировать все эти изменения, чтобы еще на этапе разработки отлавливать вызванные ими ошибки верстки. Поэтому наша команда приняла решение использовать snapshot-тесты.

Что такое snapshot-тесты?
Объединение snapshot-тестов и превью
Итог

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 0

Большое обсуждение грейдов и собеседований с руководителями из Яндекса, Okko, Сбера и Doubletapp

Уровень сложности Простой
Время на прочтение 49 мин
Количество просмотров 3.5K
FAQ

В этом году на конференции DUMP в Екатеринбурге прошел круглый стол, на котором руководители из IT-компаний обсуждали пул вопросов, связанных с приемом на работу: как специалисту самому определить свой грейд, как проводить собеседования, с кем приходится работать и стоит ли менять стек, если ты сеньор, а также онбординг внутри компании. 

Мы уже публиковали новость с видео об этом событии, желающие могли посмотреть видеозапись беседы, но читатели рассердились на нас за отсутствие текста. Исправляемся и рассказываем печатным словом, о чем говорили участники. 

Читать далее
Всего голосов 22: ↑9 и ↓13 -4
Комментарии 3

Они заставят вас ненавидеть: знакомство с VAST и VPAID, или Как интегрировать рекламу в web-видеоплеер

Уровень сложности Средний
Время на прочтение 26 мин
Количество просмотров 1.5K
Туториал

Доброго вам времени суток! Меня зовут Валерия, я фронтенд-разработчик из компании Doubletapp. Год своей жизни отдала на разработку видеоплеера с рекламными интеграциями. На старте была только спека, дока, единственная статья на Хабре, поясняющая за рекламу, и огроменное желание заказчика накрутить оную на видеоплеер. Пришло время и вас поближе познакомить с рекламой.

Статья подойдет тем, кто хочет разобраться в специфике работы VAST и VPAID, настроить кастомное управление рекламой, разместить видеорекламу отдельным блоком на сайте (out-stream) или разбить видеоролик рекламными интеграциями (in-stream).

  • Инструментарий, или Основные ингредиенты
  • Подробнее о VAST
  • Запускаем рекламный блок на странице (out-stream)
 • Подключаем IMA SDK
  • Инициализируем
  • Обрабатываем ошибки
  • Обрабатываем событие ADS_MANAGER_LOADED
  • Запрашиваем и воспроизводим рекламу
  • Продвинутое управление (въезжаем в обработку событий рекламы)
  • Локализация
  • Адаптивность
  • Обработка событий
Разбиваем видеоролик рекламными паузами (in-stream, VMAP)
  • Подробнее о VMAP
  • Подключаем VMAP к видеоплееру
  • Ручное управление стартом рекламы
  • Особенности VPAID

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 2

Храним краску с умом: как организовать ресурсы в многомодульном проекте

Уровень сложности Простой
Время на прочтение 9 мин
Количество просмотров 3.4K
Кейс

Привет, меня зовут Никита Чернобрисов, и я делаю Android-приложения в Doubletapp. Полтора года назад мы начали работать над приложением «Яндекс Путешествий» — само приложение доступно в Play Store, а про кейс подробно можно прочитать тут. При старте у нас возникло много архитектурных холиваров, в частности о том, как хранить ресурсы и пользоваться ими. И, как это и заведено, первые решения оказались неудачными. Я расскажу вам, дорогие читатели, удары каких граблей оставили больше следов и к чему мы пришли.

Для кого эта статья?
Начинаем
Договор с дизайнерами
Дизайн-система (пригодная для дальнейшего автоэкспорта)
Первый вариант, который не стоит повторять
Дробим наш монолит
Figma автоэкспорт
Подготовка в Figma
Подключаем FigmaExport в проект
Подводим итоги

Читать далее
Всего голосов 3: ↑3 и ↓0 +3
Комментарии 12

Место QA в тестировании продукта на безопасность

Уровень сложности Простой
Время на прочтение 9 мин
Количество просмотров 1.5K
Обзор

Привет, меня зовут Дмитрий Крылатков, работаю QA-инженером в компании Doubletapp. Я всегда был заинтересован темой тестирования на безопасность, участвую в bug-bounty программах, а также поднимаю осведомленность о существующих уязвимостях   среди команд тестирования и разработки. В статье расскажу, как QA может сэкономить ресурсы компании и обеспечить проверку на наличие основных уязвимостей, на что обращать внимание и почему это полезно как для специалиста, так и для бизнеса.

Что такое уязвимость и чем она отличается от бага?
Уязвимости: начнем с простого
Софт для поиска уязвимостей
Где применимы знания о поиске уязвимостей?

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 5

MacBook Pro 2015 для учебы в 2023-м?

Уровень сложности Простой
Время на прочтение 8 мин
Количество просмотров 7.7K
Обзор

Всем привет! Меня зовут Андрей Жаров, я iOS-разработчик в компании Doubletapp.

Лучшей недорогой рабочей машинкой выступает сейчас MacBook Air на М1. Сочетание его цены и качества даже в 2023-м остается оптимальным из-за мощного процессора, низкого нагрева, долгого времени и скорости работы. Но что делать тем, кто только-только начинает свой путь в iOS-разработке и не может его себе позволить?

Из основных условий — желание изучать iOS и самый минимально допустимый бюджет для приемлемой работы. В этой статье расскажу про самый доступный вариант и альтернативы для погружения в разработку под платформы Apple с нуля.

Бюджетный MacBook
Исторический анализ линейки
Процессор
Оперативная память
Накопитель
Графика
Поддержка и возможные проблемы
Подводя итоги
Что дальше?

Читать далее
Всего голосов 7: ↑5 и ↓2 +3
Комментарии 23

Вас много, а я одна: обзорная система мониторинга на Prometheus и Grafana

Уровень сложности Средний
Время на прочтение 11 мин
Количество просмотров 7.3K
Туториал

Привет, Хабр! Меня зовут Сева, я работаю backend-разработчиком в Doubletapp, а также занимаюсь некоторыми devops-задачами. В этой статье я расскажу о мониторинге наших backend-приложений: сборе метрик, их визуализации и отправке уведомлений. Покажу примеры конфигов с подробными комментами и дам ссылки на гитхаб.

Содержание:
Конфигурация Prometheus
Сбор метрик
Дашборды для визуализации метрик в реальном времени
Настройка уведомлений

Читать далее
Всего голосов 9: ↑9 и ↓0 +9
Комментарии 0

«Внешняя» навигация в многомодульном проекте на Kotlin

Уровень сложности Средний
Время на прочтение 8 мин
Количество просмотров 6.2K
Кейс

Привет, Хабр! Я Дмитрий Воронов из Doubletapp, в этой статье расскажу, как мы делали навигацию в Яндекс Путешествиях. С навигацией в Android, кажется, давно все ясно: бери Jetpack Navigation, читай официальную документацию и следуй ей — и все получится. Если рекомендованная библиотека не подходит — берешь Fragment Manager, прописываешь собственную реализацию и идешь хвастаться коллегам. Если писать свою реализацию нет желания, а официальная библиотека не соответствует модным веяниям — дополняешь свое резюме умением работать с Cicerone. Если твои вкусы специфичны — почему бы не удивить людей неожиданным добавлением в проект Alligator?

В одном коротком абзаце удалось обозначить сразу 4 варианта реализации навигации и, казалось бы, в чем вопрос? Каждый выбирает для своего проекта подходящий ему вариант. Все так, но ровно до того момента, пока не возникает необходимость «поделиться» частью приложения — интегрироваться в другое приложение, и там, как оказывается, другая реализация навигации. И здесь начинается: «Что будем делать? Попробуем написать мост? А может, лучше перепишем навигацию?» 

На этапе проектирования лучше сразу уточнить возможность дальнейшей интеграции с другими приложениями и заранее к этому подготовиться. Помимо всего прочего, нужно подготовить и навигацию, и сделать ее «внешней» — одно из возможных решений этой задачи.

Что такое «внешняя» навигация?
Как это делается?
Реализуем модуль навигации
Примеры реализации

Читать далее
Всего голосов 7: ↑6 и ↓1 +5
Комментарии 7

Как мы делали свой шрифт

Уровень сложности Простой
Время на прочтение 9 мин
Количество просмотров 4.2K
Туториал

Я Павел Лаптев, графический дизайнер Даблтап. В этой статье речь не о том, как нормальные люди делают шрифты. Я расскажу, как мы сами делали свой собственный шрифт и зачем это нам понадобилось.

Если вдруг у вас появится желание повторить этот путь — для этого нужно:

1. Понять, для чего вам нужен свой шрифт (и нужен ли).
2. Определиться с характером шрифта.
3. Долго и много рисовать буквы.
4. Упороться с кернингом.
5. Обратиться к специалисту-шрифтовику.
6. Повторить подход.
7. Да, и хинтинг, конечно.

Дальше больше
Всего голосов 25: ↑22 и ↓3 +19
Комментарии 13

Руки на руль: Bus Factor следит за тобой

Уровень сложности Простой
Время на прочтение 3 мин
Количество просмотров 1.5K
Кейс

Привет, Хабр, меня зовут Антон Рябых, работаю в Doubletapp. Расскажу вам о том, как мы придумали сервис, контролирующий поведение водителей общественного транспорта с помощью алгоритмов машинного обучения и компьютерного зрения.

К нам обратилась компания «Термотех», которая занимается городскими перевозками. Организатору движения нужно было автоматически понимать, что:

водитель общественного транспорта не пользуется телефоном во время движения;
камера, установленная в салоне водителя, снимает с верного ракурса, не отвернута в сторону;
от камеры в целом идет сигнал, она не повреждена, не завешена и не загрязнена.

Ранее задача решалась силами сотрудников «Термотеха» — они вручную просматривали все записи с камер видеонаблюдения, установленных в кабинах водителей. Такой подход занимал огромное количество времени и все равно приводил к ошибкам, основанным на человеческом факторе.

Как мы решали эту задачу?
Как это работает?

Читать далее
Всего голосов 6: ↑3 и ↓3 0
Комментарии 4

Neural Network Optimization: океан в капле

Уровень сложности Простой
Время на прочтение 14 мин
Количество просмотров 7.7K
Обзор

Всех приветствую, меня зовут Антон Рябых, работаю в Doubletapp. Вместе с коллегой Данилом Гальпериным мы написали статью про важный этап в процессе обучения нейронных сетей и получения необходимых нам результатов —  оптимизацию модели. Зачем нужно оптимизировать модель, если и так все работает? Но как только вы начнете разворачивать модель на устройстве, которое будет ее обрабатывать, перед вами встанет множество проблем.

Более крупные модели занимают больше места для хранения, что затрудняет их распространение. Более крупные модели требуют больше времени для работы и могут потребовать более дорогого оборудования. Это особенно важно, если вы создаете модель для приложения, работающего в реальном времени.

Оптимизация моделей направлена на уменьшение размера моделей при минимизации потерь в точности и производительности.

Методы оптимизации

Pruning — устранение части параметров нейронной сети.
Quantization — уменьшение точности обрабатываемых типов данных.
Knowledge distillation — обновление топологии исходной модели до более эффективной, с уменьшенным количеством параметров и более быстрым выполнением.
Weight clustering — сокращение количества уникальных параметров в весах модели.
OpenVino, TensorRT — фреймворки, с помощью которых можно оптимизировать модели.

Читать далее
Всего голосов 28: ↑28 и ↓0 +28
Комментарии 3

Прости нас, Джон Коннор, или Как мы научили нейросеть точечно распознавать звуки выстрелов

Уровень сложности Средний
Время на прочтение 8 мин
Количество просмотров 3.1K
Кейс

Привет, Хабр! Меня зовут Антон Рябых, работаю в Doubletapp и в этой статье расскажу про технические детали применения машинного обучения в проекте HitFactor. 

Что такое hit factor? На соревнованиях по практической стрельбе спортсмены быстро перемещаются, меняют магазин и стреляют по разным, в том числе и подвижным мишеням. Hit factor — это результат соревнования, то есть количество набранных очков, деленное на время прохождения. 

Нам рассказали об этом чемпионы мира по практической стрельбе Алена Карелина и Роман Халитов, которым нужно было мобильное приложение для помощи в тренировках. Двигаться экономнее, стрелять быстрее — анализ записи тренировки поможет понять, как сократить время на прохождение упражнения и повысить эффективность.

В проекте требовалось очень точно определять время начала выстрела и время стартового сигнала. Каких-то готовых решений на момент разработки продукта (2019 год) не было. В статье расскажу:

как решали задачу без машинного обучения
какие были подходы с машинным обучением;
как размечали данные
как использовали промежуточную модель для помощи с разметкой;
как деплоили конечную модель на iOS-девайсы.

Читать далее
Всего голосов 9: ↑9 и ↓0 +9
Комментарии 12

Парсинг ответов на BLE-команды на языке Swift на примере GoPro

Время на прочтение 11 мин
Количество просмотров 1.6K
Туториал

Привет, Хабр! Меня зовут Полина, работаю в Doubletapp iOS‑разработчиком и сегодня хочу рассказать о нашем опыте работы с API GoPro, а конкретно с парсингом ответов на команды BLE, которые описаны в этом API.

Содержание:

Принцип работы с BLE-устройствами
Сервисы и характеристики BLE-устройств
Процесс отправки команд и получения ответов через BLE
Простые ответы
Комплексные ответы
Формирование пакетов
Парсинг комплексных ответов
Общий алгоритм работы с BLE-ответом 

Читать далее
Всего голосов 5: ↑5 и ↓0 +5
Комментарии 0

Как настроить Gitlab CI/CD для Android и Firebase App Distribution для доставки сборок

Время на прочтение 9 мин
Количество просмотров 5.8K
Туториал

Привет, меня зовут Антон Рябых, я технический директор компании Doubletapp, и я расскажу, как реализовать сборку Android-приложений на Gitlab CI/CD с последующей загрузкой в Firebase App Distribution для удобной доставки.

Это позволит нам:

автоматически собирать сборки на каждый пуш или Merge request;
прогонять тесты на сборках и не допускать мерджа веток, которые не прошли тесты;
доставлять сборки заинтересованным лицам (тестирование, менеджеры, клиенты, другие разработчики, и т.д.).

Данная статья будет полезна как людям с опытом в CI/CD, так и Android-разработчикам — новичкам в CI/CD и DevOps теме в целом. Поэтому, кроме непосредственного описания настройки Gitlab CI и Firebase App Distribution, мы также поговорим о том, что такое CI/CD, и о том, что такое Docker. Статья подразумевает, что ваш репозиторий находится в Gitlab. В качестве вычислительных мощностей, собирающих сборки, будет использован сам Gitlab, дающий 2000 бесплатных минут для сборок в месяц (большее количество минут можно докупать, но для небольшой команды бесплатного лимита может быть достаточно. Также можно легко настроить запуск сборок на своих мощностях).

Читать далее
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 5

Как настроить Gitlab CI/CD в связке с Fastlane для iOS-проектов на Mac mini

Время на прочтение 8 мин
Количество просмотров 3.8K
Туториал

Всем привет! Меня зовут Ярослав Фоменко, я iOS-разработчик в компании Даблтап. Мы с моим коллегой по отделу с конца мая работаем над внедрением, улучшением и масштабированием CI/CD на наших проектах. В этой статье мы хотим поделиться гайдом по подготовке проекта в Xcode и настройке раннеров, скриптов и конфигов, а также расскажем, как нам помогает CI/CD.

О том, как и почему мы пришли к решению использовать Mac mini для CI/CD, можно почитать здесь.

Читать далее
Всего голосов 4: ↑4 и ↓0 +4
Комментарии 0

CI/CD для iOS-проектов: на железе или в облаке? Что лучше, по версии Doubletapp

Время на прочтение 6 мин
Количество просмотров 2.6K
Обзор

Привет, Хабр! Меня зовут Ярослав Фоменко, я iOS-разработчик в компании Даблтап. После того, как мы с ребятами из iOS-отдела настроили наш CI/CD на Mac mini, начали задумываться о его масштабировании и инкапсулировании и пошли ресерчить то, как это можно сделать. Первым на ум пришел Docker, но инфы оказалось довольно мало как о нем, так и о других возможных способах. В этой статье мы рассмотрим найденные нами возможные решения по развертыванию Gitlab CI/CD на железе и в облаке.

Читать далее
Всего голосов 4: ↑4 и ↓0 +4
Комментарии 7