Как стать автором
Обновить
218.27
Рейтинг
FunCorp
Разработка развлекательных сервисов
Сначала показывать
  • Новые
  • Лучшие

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

Блог компании FunCorpРазработка мобильных приложенийРазработка под AndroidПовышение конверсии

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

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

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

Новости

Показать еще

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

Блог компании FunCorpРазработка мобильных приложенийТестирование мобильных приложенийМедийная рекламаКонтекстная реклама

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

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

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

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

Блог компании FunCorpИнформационная безопасностьРазработка мобильных приложенийРазработка под AndroidGoogle API

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

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

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

«Почему Kotlin хуже, чем Java?»

Блог компании FunCorpJavaРазработка мобильных приложенийKotlin
Перевод

Такой провокационный вопрос задал реддитор nenemen в сабреддите Java:

«Я думаю о том, чтобы свой следующий проект сделать на Kotlin + Spring Boot, но мощь всенародной любви к Kotlin и одновременно ненависти к Java заставляют всё это походить на какой-то культ. Поэтому хотел бы услышать аргументы «против».

Мы в FunCorp в своё время сделали именно такой выбор в пользу Kotlin. И сегодня соотношение Java/Kotlin у нас составляет примерно 20 на 80, продолжая уменьшаться при каждом удобном случае. Поэтому ответы на этот вопрос меня заинтересовали, и я стал листать секцию комментариев. Там наткнулся на реплику реддитора rzwitserloot, которая мне показалась настолько взвешенной, многосторонней и рациональной, что я захотел поделиться ей с нашей командой, а заодно и читателями Хабра.

Далее перевод его аргументов.

Читать далее
Всего голосов 157: ↑143 и ↓14 +129
Просмотры58.7K
Комментарии 675

Особенности практического использования различных алгоритмов Многорукого бандита

Блог компании FunCorpНенормальное программированиеЗанимательные задачкиПрограммированиеАлгоритмы

Большинство статей про алгоритмы, используемые для решения задачи многорукого бандита, очень академичны. Они пестрят формулами, графиками и статистическими таблицами. При этом как будто подразумевается, что у нас есть неизменяемый набор ручек для дёргания и n→∞ попыток. В этой статье я постараюсь рассказать об этих алгоритмах с колокольни обычного разработчика применительно к реальным условиям, в которых работает наш продукт (но графики будут — с ними красивее).

Дисклеймер: эта статья написана обычным разработчиком, не дата-саентистом или аналитиком. Не стоит рассматривать её в качестве серьёзного научного труда и искать неточности, неполноту и крайности. Она не про это.

Так как это статья про конкретное практическое применение, то и термины буду использовать из нашего домена:

• просмотр(n) = попытка;
• смайл(s) = победа;
• смайлрейт(w, от worth) = количество смайлов/количество просмотров;
• контент = то, у чего есть эти самые просмотры и смайлы.

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

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

Давайте будем прямыми в своих intent

Блог компании FunCorpРазработка мобильных приложенийРазработка под AndroidТестирование мобильных приложений
Перевод

В Android 12 появится важное изменение, улучшающее безопасность платформы целиком и всех приложений, предназначенных для работы с этой версией ОС. Активити, сервисы и бродкаст ресиверы (broadcast receivers), в которых указаны интент-фильтры (intent-filters), должны явно обозначать, будут ли они доступны для других приложений или компонентов системы.

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

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

Провели внутренний хакатон впервые после карантина: как мы обучали машинки устраивать в офисе ДТП

Блог компании FunCorpЗанимательные задачкиАлгоритмыХакатоныРазработка на Raspberry Pi

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

Задание полностью отличалось от того, чем мы привыкли заниматься, разрабатывая мобильные приложения — нужно было научить машинку на основе Raspberry Pi 4.0 с камерой объезжать препятствия, искать врага определённого цвета и идти на таран. Кто показал в среднем лучший результат — тот и выиграл.

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

Read more
Всего голосов 40: ↑40 и ↓0 +40
Просмотры3.2K
Комментарии 8

Доказательная разработка или как data-driven подход добавил смысла работе

Блог компании FunCorpРазработка мобильных приложенийУправление разработкойКарьера в IT-индустрииIT-компании

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

С этих собеседований вынес интересное наблюдение: в первую тройку «пожеланий» попадает такая трудно формулируемая вещь, как «хочется, чтобы в работе был смысл». Если начать раскручивать этот клубок, то часто приходим к более негативной формулировке «прошлый заказчик/бизнес не знает, чего хочет и постоянно меняет требования».

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

Читать далее
Всего голосов 52: ↑49 и ↓3 +46
Просмотры6.1K
Комментарии 2
Senior Python Backend Developer (Machine Learning)
от 250 000 до 350 000 ₽FunCorpМосква
QA Web Engineer
от 140 000 ₽FunCorpМосква
Senior/Middle iOS Developer
от 200 000 ₽FunCorpМосква
Technical Writer
от 150 000 ₽FunCorpМосква
Senior QA Backend Engineer
от 160 000 ₽FunCorpМосква

Гайд по мобильной рекламе для тех, кто задумался о монетизации

Блог компании FunCorpТестирование мобильных приложенийМонетизация мобильных приложенийМедийная рекламаКонтекстная реклама

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

Читать далее
Всего голосов 41: ↑40 и ↓1 +39
Просмотры5.4K
Комментарии 5

Осмысленные интерфейсы

Блог компании FunCorpPHPРазработка мобильных приложенийИнтерфейсы
Перевод

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

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

Буквально через два уровня абстракций я оказался в коде, датированном 2016-2017 годами, то есть занялся software archeology. В какой-то момент меня возмутило, что вместо интерфейса репозитория в конструктор класса сервиса была передана реализация. Ещё одним уровнем абстракции ниже оказалось, что это всё-таки был интерфейс, но назывался он просто ContentRepository, а не ContentRepositoryInterface, как написал бы любой адепт ООП и принципов SOLID. Это уже не лезло ни в какие ворота, и я потребовал у архитектора оснований (кстати, рекомендую его статью о том, как мы вдвое ускорили построение лент подписок). Он в свою очередь невозмутимо показал пункт внутренних правил оформления кода, где была проставлена ссылка на статью 2013 года («А» — археология, как и было сказано).

Под катом — перевод этого материала.

Читать далее
Всего голосов 44: ↑41 и ↓3 +38
Просмотры7.5K
Комментарии 10

DVC — Git для данных на примере ML-проекта

Блог компании FunCorpРазработка мобильных приложенийGitBig DataМашинное обучение
Tutorial

Data-science развивается очень быстро, в том числе благодаря росту объема доступных данных для анализа или построения моделей. Но для создания сложных моделей командам аналитиков нужно работать совместно и эффективно управлять большими датасетами. И вот здесь может помочь, например, DVC — open-source система контроля версий для проектов машинного обучения.

Нашел не так много информации по ней в рунете, поэтому под катом на примере простого ML-проекта расскажу, как работать с инструментом для хранения и обновления датасета.

Читать далее
Всего голосов 44: ↑44 и ↓0 +44
Просмотры4.4K
Комментарии 8

Как мы в 2 раза увеличили скорость формирования ленты в UGC-приложении

Блог компании FunCorpРазработка под iOSРазработка мобильных приложенийРазработка под Android

Несколько лет назад мы добавили в мобильное приложение iFunny социальные механики: подписку и фид с мемами, которые запостили друзья. В этом материале обсудим вызовы времени и ответы на них в виде нескольких подходов в технической реализации на бэкенде.

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

Читать далее
Всего голосов 47: ↑46 и ↓1 +45
Просмотры2.4K
Комментарии 6

SafetyNet Attestation — описание и реализация проверки на PHP

Блог компании FunCorpPHPРазработка под AndroidGoogle API
Tutorial

В эту тему пришлось детально погрузиться во время работы над обеспечением стандартных механизмов верификации устройств для разных мобильных платформ. Задача сводилась к разработке полноценной реализацию проверки JWS-токенов по протоколу SafetyNet на серверной стороне.

После многочасовых поисков и скрупулёзного изучения официальной документации Google решил поделиться полученным опытом. Потому что, кроме официальной документации, я нашел только отрывочные описания частных примеров реализации на разных ЯП. И ни намека на комплексное объяснение особенностей проверки по SafetyNet на сервере.

Статья будет полезна разработчикам, которые хотят подробнее разобраться с технологией верификации устройств по протоколу SafetyNet Attestation. Для изучения описательной части не обязательно знать какой-либо язык программирования. Я сознательно убрал примеры кода, чтобы сфокусироваться именно на алгоритмах проверки. Сам пример реализации на PHP сформулирован в виде подключаемой через composer библиотеки и будет описан ниже.

А в конце статьи — ссылка на разработанную мной библиотеку на PHP, которая обеспечивает полный цикл верификации JWS.

Читать далее
Всего голосов 41: ↑41 и ↓0 +41
Просмотры3.8K
Комментарии 10

Как мы просто сократили объем входящего в дата-центр трафика на 70%

Блог компании FunCorpРазработка под iOSРазработка мобильных приложенийРазработка под AndroidАналитика мобильных приложений

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

Единственное, о чем мы пожалели — что не применили это решение раньше.

Читать далее
Всего голосов 137: ↑136 и ↓1 +135
Просмотры29.8K
Комментарии 53

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

Блог компании FunCorpJavaРазработка мобильных приложенийРазработка под AndroidKotlin

Мой коллега уже писал про наш опыт разработки чатов на вебсокетах для iOS, поэтому часть про особенности бэкенда с точки зрения клиента у нас общая. А вот реализация на Android, конечно, отличается. И ещё мне не приходилось, как в первой статье, искать библиотеку для поддержки старых версий операционной системы, потому что на Android каких-то глобальных изменений в сетевой части не было, всё работало и так.

К реализации вернёмся чуть ниже, а начнём с ответов на вопросы про бэкенд, которые появились после первой статьи: почему WAMP, какой брокер используем и некоторые другие моменты.

Читать далее
Всего голосов 50: ↑50 и ↓0 +50
Просмотры5.3K
Комментарии 3

Не баян: ищем дубликаты изображений на основе Milvus с индексом FAISS внутри

Блог компании FunCorpПоисковые технологииPythonРазработка мобильных приложенийKotlin


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

Под катом рассмотрим используемые инструменты, а потом перейдём к примеру реализации.
Читать дальше →
Всего голосов 55: ↑54 и ↓1 +53
Просмотры3.3K
Комментарии 6

Чаты на вебсокетах в iOS, если у вас WAMP

Блог компании FunCorpРазработка под iOSРазработка мобильных приложенийSwift


Разработка заняла примерно 9 месяцев, а я занимался реализацией клиент-серверного общения по сокету для iOS. Особенности нашей ситуации:

  1. Поддержка старых версий iOS, где нативных методов для общения по сокетам ещё не было — пришлось искать рабочую библиотеку и фиксить баги.
  2. Протокол WAMP на бэкенде — предстояло научить клиент декодировать any, декодировать протоколы и создать объект, который отвечает за отправку и приём сообщений.

Примечание: описанные ниже способы декодирования, можно применить и в других задачах.
Читать дальше →
Всего голосов 44: ↑44 и ↓0 +44
Просмотры3.9K
Комментарии 18

Финальные классы в PHP, Java и других языках

Блог компании FunCorpPHPПрограммированиеJava
Перевод
Использовать финальные классы или не использовать финальные классы? Вот в чём вопрос. А ещё в том, когда и как это делать правильно.


Читать дальше →
Всего голосов 45: ↑40 и ↓5 +35
Просмотры7.7K
Комментарии 23

Корутины и синхронизация. Лучше не смешивать

Блог компании FunCorpПрограммированиеKotlin
Перевод

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

В мире Java одним из стандартных решений является добавление ключевого слова synchronized к сигнатуре метода. В Kotlin для получения того же эффекта используется аннотация @Synchronized

Читать далее
Всего голосов 38: ↑34 и ↓4 +30
Просмотры9.7K
Комментарии 24

Дополняем чек-лист тестирования при обновлении иконки и сплеша в мобильных приложениях

Блог компании FunCorpРазработка мобильных приложенийТестирование мобильных приложений


Алоха! Меня зовут Даша, я тестирую мобильные приложения. Скоро Хэллоуин, а FunCorp традиционно обновляет к некоторым праздникам иконку и сплеш. Сейчас именно такой случай, потому что большинство наших пользователей находятся в США. Задача показалась тривиальной, я быстро составила базовый чек-лист на 8 пунктов, но в процессе нашла ещё несколько кейсов, и он вырос до 13-ти (прилагается).

Здесь нет rocket science, я лишь расскажу, на что стоит обращать внимание в таких тасках, чтобы не пропустить лишних багов в прод — и на Android, и на iOS.
Читать дальше →
Всего голосов 56: ↑55 и ↓1 +54
Просмотры5.7K
Комментарии 8

Информация

Дата основания
Местоположение
Кипр
Сайт
fun.co
Численность
101–200 человек
Дата регистрации
Представитель
Account_is_busy