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

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

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

Децентрализованная конфигурация webpack или как упростить сборку проекта

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

Довольно частая ситуация, когда с ростом проекта растёт и сложность его сборки. Широкий зоопарк технологий, сторонние компоненты, библиотеки, линтеры, серверный рендеринг и нюансы, связанные с конкретным проектом, — всё это в итоге приводит к тому, что конфигурация сборки достигает более тысячи строк.

Если провести аналогию с обычным кодом, то достижение таких объёмов в рамках одного модуля/класса/компонента/сущности становится сигналом, чтобы заняться декомпозицией и разделить ответственность по более мелким и независимым составляющим.

Но если говорить о конфигурации сборки, то такая декомпозиция скорее редкость, и в больших проектах часто можно встретить огромные webpack.config.js, модификация которых может доставить немало проблем и привести к ошибкам.

Если вам хочется сделать работу со сборкой проще и надёжнее при модификациях, то добро пожаловать под кат.

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

Кластеризация изображений с помощью нейросети CLIP

Время на прочтение 5 мин
Количество просмотров 5.7K

В статье пойдёт речь о том, как можно автоматически разделить датасет изображений на кластеры, которые поделены по качественному контекстному признаку, благодаря эмбедингам из нашумевшей нейронной сети CLIP от компании Илона Маска. Расскажу на примере контента из нашего приложения iFunny.

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

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

Под катом расскажу, как мы построили логичную кластеризацию с помощью библиотеки HDBSCAN и векторов из нейронной сети CLIP, и каких результатов добились на выходе.

Читать далее
Всего голосов 53: ↑52 и ↓1 +51
Комментарии 11

«Право на забвение» или как просто удалять персональные данные по запросу пользователя

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

Удалять персональные данные пользователя по его запросу, чтобы продукт соответствовал законам CCPA или GDPR, можно по-разному. Хоть вручную каждую заявку на почте разбирать. Главное — сделать процесс максимально простым и понятным для пользователя. А это уже хороший повод задуматься о некоторой автоматизации.

В статье на примере мобильного приложения iFunny расскажу про систему обработки запросов на удаление данных. Теперь заявки приходят сразу конкретизированными, а саппорт тратит в 2 раза меньше времени на их рассмотрение.

Под катом — о том, как происходит приём заявки, обработка, выставление статусов, хранение в системе учёта и так далее.

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

Посмеяться над мемами, стать мемологом, найти связь между «Симпсонами» и «Риком и Морти»: итоги конкурса про мемы

Время на прочтение 6 мин
Количество просмотров 2.4K

На прошлой неделе прошла конференция по мобильной разработке Mobius 2021, на которой мы выступили с докладом про анализ данных в приложениях, а также предложили участникам поиграть в мем-квиз и Memology Game. Cуть последней — найти связь между мемами и выстроить их в единую логическую цепочку.

Под катом поделимся результатами, а также расскажем, как появилась идея, какие шишки набили при её создании, и что интересного для себя открыли.

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

А еще предлагаем поучаствовать в разработке Memology 2.0 и дать обратную связь — что подкрутить, чтобы игра стала лучше/понятнее/интереснее/смешнее.

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

Как добавить обязательный запрос на IDFA через App Tracking Transparency

Время на прочтение 6 мин
Количество просмотров 4.3K

С весны этого года каждый iOS-разработчик должен запрашивать разрешение пользователя на использование рекламного идентификатора IDFA. В предыдущей статье мы сделали подробный обзор изменений в App Store и их влияния на мир iOS-разработки.

А сегодня — практический материал. Расскажем, как с помощью нового фреймворка App Tracking Transparency добавить в своё приложение обязательный запрос на использование персональных данных, как потом эти данные передавать рекламным сетям и что делать, если пользователь решил не делиться своей активностью. 

Читать далее
Всего голосов 48: ↑45 и ↓3 +42
Комментарии 6

Чаты на вебсокетах. Теперь про бэкенд

Время на прочтение 4 мин
Количество просмотров 14K

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

Ниже подробности о том, что было до написания кастомных чатов и какие стояли требования к реализации, из каких компонентов они состоят, как вписываются в нашу инфраструктуру и что получилось в итоге. А в конце статьи — ссылки про особенности разработки наших чатов на вебсокетах для iOS и Android.

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

App Tracking Transparency: что изменилось с новой политикой приватности от Apple

Время на прочтение 6 мин
Количество просмотров 6.1K

Apple в прошлом году заставила понервничать весь мобильный рекламный рынок, анонсировав для App Store новую политику приватности данных. Теперь создатели приложений обязаны спрашивать разрешение пользователей на рекламный трекинг (да-да, тот самый нашумевший IDFA). Правила, которые несколько раз откладывали, вступили в силу в начале этого года. 

В этой статье разберемся, как повлияла новая политика на рынок, и что именно изменилось для пользователей, разработчиков и рекламодателей. А также расскажем, как заполнить анкету по сбору данных, чтобы ваше приложение прошло ревью в App Store.

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

Дообучаем готовую нейросеть для классификации данных

Время на прочтение 12 мин
Количество просмотров 6.5K

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

• approved — картинки идут в раздел collective (развлекательный контент и мемы);
• not suitable — не попадают в общую ленту, но остаются в ленте пользователя (селфи, пейзажи и другие);
• risked — получают бан и удаляются из приложения (расизм, порнография, расчленёнка и всё, что попадает под определение «противоправный контент»).

Сегодня расскажу на наглядных примерах, как мы перестраивали модель под наши классы, обучали её и выделяли паттерны распознавания картинок. Технические подробности — под катом.

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

Jetpack Compose — как легко построить UI на Android

Время на прочтение 4 мин
Количество просмотров 14K

В июле этого года вместе с Android Studio Arctic Fox вышла одна из долгожданных библиотек — Jetpack Compose. Она позволяет создавать пользовательский интерфейс в декларативном стиле и обещает быть революцией в построении UI.

Разбираемся, так ли это на самом деле, какие у библиотеки преимущества и недостатки. Подробности — в статье.

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

Jetpack Microbenchmark — тестируем производительность кода

Время на прочтение 6 мин
Количество просмотров 4K

В мобильной разработке периодически возникают ситуации, когда нужно оценить время выполнения кода. Помимо теоретических подходов (например, Big O), которые позволяют отсеять очевидно неудачные решения, существуют бенчмарки для тестирования кода и поиска более мелких отличий. 

В этой статье расскажу, как устроена и работает библиотека Microbenchmark от Google, а также покажу примеры использования. С ней можно не только оценить производительность, но и решить спорные ситуации на код-ревью.

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

Как классифицировать данные без разметки

Время на прочтение 7 мин
Количество просмотров 8.5K

Пользователи iFunny ежедневно загружают в приложение около 100 000 единиц контента, среди которого не только мемы, но и расизм, насилие, порнография и другие недопустимые вещи. 

Раньше мы отсматривали это вручную, а сейчас разрабатываем автоматическую модерацию на основе свёрточных нейросетей. Систему уже обучили на разделение контента по трём классам: она распознает, что пропустить в ленты пользователей, что удалить, а что скрыть из общей ленты. Чтобы сделать алгоритмы точнее, решили добавить конкретизацию причины удаления контента, у которого до этого не было подобной разметки. 

Как мы это в итоге сделали — расскажу под катом на наглядном примере. Статья рассчитана на тех, кто знаком с Python (при этом необязательно разбираться в Data Science и Machine Learning).

Читать далее
Всего голосов 56: ↑55 и ↓1 +54
Комментарии 8

Защита данных пользователя: как добавить поддержку правил CCPA и GDPR в мобильное приложение

Время на прочтение 16 мин
Количество просмотров 4.5K

Значительная часть жизни уже давно перетекла в гаджеты, онлайн-сервисы, соцсети и мессенджеры, которые ежедневно собирают тонны персональных данных. А ими часто обмениваются компании, например, в сфере рекламы или финансового бизнеса. 

Поэтому приватность и безопасность данных сейчас сложно переоценить. В большинстве IT-компаний это понимают и работают над собственными инструментами защиты (Apple, например, на каждой презентации делает особый акцент). Страны, в свою очередь, регулируют всё это специальными законами.

Основными из них являются Европейский General Data Protection Regulation (GDPR) и, принятый в Калифорнии, California Consumer Privacy Act (CCPA). Сегодня подробно разберёмся, что это за законы, чего требуют и как внедрить их поддержку в свой сервис, сайт или мобильное приложение.

Это первая статья из цикла про приватность на iOS, где поговорим не только про законы, но и про изменения в политике App Store, AppTracking Transparency и IDFA.

Читать далее
Всего голосов 45: ↑44 и ↓1 +43
Комментарии 10

Готовимся к Windows 11: добавляем поддержку полноценной клавиатуры в Android-приложение

Время на прочтение 4 мин
Количество просмотров 9.1K

Многие мобильные приложения уже могут конкурировать с полноценными десктопными вариантами, а иногда и превосходить их. Офисные пакеты, фоторедакторы и IDE вполне неплохо работают на портативных девайсах. Samsung, например, даже сделал специальный режим DeX Mode, который позволяет подключить к смартфону монитор и периферию.

А скорый релиз Windows 11 с возможностью устанавливать любые APK-файлы прямо намекает, что пора озаботиться поддержкой десктопных режимов в своих мобильных приложениях. Один из шагов к этому — добавить полноценную поддержку клавиатуры, чем сегодня и займёмся.

Под катом разберём навигацию по RecyclerView, привязку горячих клавиш к toolbar menu, добавим кастомные сочетания и покажем пользователям, как ими пользоваться.

Читать далее
Всего голосов 54: ↑53 и ↓1 +52
Комментарии 16

Работа с фоновыми задачами в Android 12: переезжаем с foreground service на expedited jobs

Время на прочтение 4 мин
Количество просмотров 10K

С релизом Android 12 приложения, где новая версия операционки будет указана в targetSdkVersion, получат запрет на запуск foreground-сервисов в бэкграунде. В качестве альтернативы Google предлагает WorkManager, который с появлением expedited jobs станет предпочтительным вариантом для запуска высокоприоритетных фоновых задач. 

О нём и пойдёт речь в статье — под катом обсудим новые возможности инструмента, подключим его к приложению и реализуем миграцию с foreground-сервиса.

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

Дебаг-панель для тестирования рекламных интеграций

Время на прочтение 4 мин
Количество просмотров 2.2K

Алоха, Хабр! Тестирование рекламных интеграций — довольно трудоёмкий процесс, который сложно автоматизировать, так как мы работаем со сторонними SDK и практически не можем их контролировать. Но для сокращения времени мы разработали и внедрили рекламную дебаг-панель, о плюсах и минусах которой расскажу в этой статье.

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

Пишем свой профайлер для анализа производительности приложения на Android

Время на прочтение 6 мин
Количество просмотров 3K

По мере развития приложения стоит проводить её аудит для выявления неявных деградаций в производительности. Недавно я проводил аудит раздела комментариев iFunny и написал собственный профайлер. Он не заменит имеющиеся на рынке инструменты Android Profile из Android Studio, Battery Historian и Systrace, но обладает рядом плюсов:

1. Негативное влияние профилировщика на производительность приложения сводится к минимуму.
2. Документация итераций оптимизации работы приложения.
3. Гибкость в сборе метрик.

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

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

Персонализация инвайтов в приложении с использованием AppsFlyer

Время на прочтение 5 мин
Количество просмотров 1.8K

Все, кто выстраивал взаимодействие пользователя с приложением, знают, какой это непростой процесс. Один из механизмов такого взаимодействия — Deep Linking. От его работы зависят пуши, привлечение пользователей и ретеншн.

Под катом расскажу про некоторые инструменты AppsFlyer и их использование на примере фичи для приглашения пользователей, которая поможет сделать регистрацию более персонализированной.

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

Гайд по тестированию рекламы для мобильных приложений

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

Тестировать рекламные механики не так просто, как может показаться. Главные действующие лица здесь — сторонние SDK, которые не особо подконтрольны команде разработки. А так как рекламные интеграции — важная часть наших мобильных приложений, то ниже вместе с @maiscourt и @santypa расскажем, как мы это делаем.

Под катом список инструментов с описаниями, задачи тестирования и некоторые внутренние гайдлайны.

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

Персонализация инвайтов в приложении с использованием AppsFlyer

Время на прочтение 5 мин
Количество просмотров 67

Все, кто выстраивал взаимодействие пользователя с приложением, знают, какой это непростой процесс. Один из механизмов такого взаимодействия — Deep Linking. От его работы зависят пуши, привлечение пользователей и ретеншн.

Под катом расскажу про некоторые инструменты AppsFlyer и их использование на примере фичи для приглашения пользователей, которая поможет сделать регистрацию более персонализированной.

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

Обновляемся на новую версию API Android по наставлению Google

Время на прочтение 7 мин
Количество просмотров 14K

Скоро выходит Android 12, но в этом августе уже с 11-й версии разработчикам придётся использовать новые стандарты доступа приложений к внешним файлам. Если раньше можно было просто поставить флаг, что ваше приложение не поддерживает нововведения, то скоро они станут обязательными для всех. Главный фокус — повышение безопасности.

Переход на новую версию API — довольно трудоёмкая операция, требующая больших затрат на ее поддержку при введении крупных апдейтов. Под катом расскажу немного про наш переход и возникшие при этом трудности. 

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