Как стать автором
Обновить
153
0
Громов Андрей @rjhdby

И то и сё

Отправить сообщение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Анонимные функции в PHP: сеанс чёрной магии с разоблачением

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


Начать, наверное, следует с того, что анонимная функция(замыкание) в PHP — это не функция, а объект класса Closure. Собственно, на этом статью можно было бы и закончить, но если кому-то интересны подробности — добро пожаловать под кат.

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

Где ошибка, Билли? Нам нужна ошибка…

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

Некоторое время назад мой коллега опубликовал статью про обработку ошибок в Java/Kotlin. И мне стало интересно, а какие вообще в программировании существуют способы передачи ошибок. Если вам тоже интересно, то под катом результат изысканий. Скорее всего, какие-то экзотические методы пропущены, но тут одна надежда на комментарии, которые на Хабре порою бывают интереснее и полезнее самой статьи. :)
Читать дальше →
Всего голосов 27: ↑26 и ↓1+25
Комментарии8

Я мотоцикл покупал, чтобы ездить, а не чтобы падать

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


Эта статья не совсем в формате Хабра, но, наблюдая какими темпами растет количество двухколесных на улицах столицы, в том числе и среди ИТ-шников, я всё же рискну — может это спасёт несколько жизней, что не так уж и плохо.

Когда лет 10 назад я купил себе первый мотоцикл, любая встреча двухколесных на дороге была целым событием. Последние же несколько лет ситуация изменилась кардинально — пробка из мототехники в междурядье уже каждодневная обыденность. Размышлять на тему, почему это происходит я не буду, а постараюсь просто поделиться опытом «выживания в большом городе» с теми, кто только купил или пока просто задумывается. Вполне возможно, что некоторые вещи будут полезны и любителям электротранспорта.
Читать дальше →
Всего голосов 266: ↑227 и ↓39+188
Комментарии1346

PHP, почём абстракции для народа?

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

Joy: What is going on?
Sadness: We’re abstracting! There are four stages. This is the first. Non-objective fragmentation!
Bing Bong: Alright, do not panic. What is important is that we all stay together. [suddenly his abstract arm falls off]
Joy: Oh! [Sadness and Joy start falling apart too]
Sadness: We’re in the second stage. We’re deconstructing! [as Bing Bong falls to pieces]
Bing Bong: I can’t feel my legs! [picks one leg up] Oh, there they are.
© мультфильм Inside Out


Все любят писать красивый код. Чтобы абстракции, лямбды, SOLID, DRY, DI и т.д. и т.п. В этой статье я хочу исследовать, во сколько обходится это всё с точки зрения производительности и почему.

Для этого возьмём простую, оторванную от реальности, задачу и будем постепенно привносить в неё красоту, замеряя производительность и заглядывая под капот.
Читать дальше →
Всего голосов 51: ↑50 и ↓1+49
Комментарии52

Препарируем PHP. Как устроены while, foreach, array_walk и некоторые другие страшные слова

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


Дело было вечером, делать было нечего. Самое время устроить небольшой разбор того, чем изнутри отличаются некоторые способы перебора массивов в PHP.

Исходники от master ветки (это сейчас 7.4 с вкраплениями 8)
Генератор опкодов от php 7.3.0.
Замеры производились на 7.3.6.

Дисклеймер для зануд: упоминание пары наносекунд и тактов процессора – это такой полемический приём под названием «гипербола».

Может быть, на самом деле, там десятки или сотни наносекунд и тысячи тактов, но это всё равно настолько малые величины, что необходимость экономить на них говорит о том, что что-то в вашем коде не так.
Читать дальше →
Всего голосов 62: ↑61 и ↓1+60
Комментарии26

Поиск похожих изображений, разбор одного алгоритма

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


Пришлось мне недавно решать задачку по оптимизации поиска дубликатов изображений.

Существующее решение работает на довольно известной библиотеке, написанной на Python, — Image Match, основанной на работе «AN IMAGE SIGNATURE FOR ANY KIND OF IMAGE» за авторством H. Chi Wong, Marshall Bern и David Goldberg.

По ряду причин было принято решение переписать всё на Kotlin, заодно отказавшись от хранения и поиска в ElasticSearch, который требует заметно больше ресурсов, как железных, так и человеческих на поддержку и администрирование, в пользу поиска в локальном in-memory кэше.

Для понимания того, как оно работает, пришлось с головой погружаться в «эталонный» код на Python, так как оригинальная работа порой не совсем очевидна, а в паре мест заставляет вспомнить мем «как нарисовать сову». Собственно, результатами этого изучения я и хочу поделиться, заодно рассказав про некоторые оптимизации, как по объёму данных, так и по скорости поиска. Может, кому пригодится.
Читать дальше →
Всего голосов 59: ↑56 и ↓3+53
Комментарии25

Про подсчёт битов, беззнаковые типы в Kotlin и про ситуации, когда экономия на спичках оправдана

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

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

Немного контекста


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

Если совсем коротко про алгоритм, то для каждого изображения создаётся его цифровая подпись (сигнатура) из 968 целых чисел, а сравнение производится путем нахождения «расстояния» между двумя сигнатурами. Учитывая, что объём контента только за два последних месяца составил порядка 10 миллионов изображений, то, как легко прикинет в уме внимательный читатель, — это как раз те самые «элементы в миллиардных объёмах». Кому интересно — добро пожаловать под кат.
Читать дальше →
Всего голосов 42: ↑40 и ↓2+38
Комментарии35

PHP. Фееричная расстановка точек над кавычками

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

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

В данной статье будет всего один бенчмарк, куда же без него, а основной упор сделан на разбор того, как же оно устроено внутри.
Читать дальше →
Всего голосов 97: ↑91 и ↓6+85
Комментарии52

Расширение PHP и Kotlin Native. Часть третья, наверное финальная

Время на прочтение7 мин
Количество просмотров2.9K
В первой части рассказываются совсем базовые вещи про настройку инструментария и общие концепции.

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

В этой статье будет чуть больше хардкора про интероп Си и K/N, много макросов, боли, безысходности и «лучей добра». Конечно же будет глава с рассказом о достижениях (сам себя не похвалишь… и в качестве бонуса рассказ о эпичном факапе.
Читать дальше →
Всего голосов 15: ↑15 и ↓0+15
Комментарии0

Расширение PHP и Kotlin Native. Часть вторая, осознанная

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

Краткое содержание первой части:


  1. Установка и настройка инструментария.
  2. Написание функции helloWorld() на Kotlin Native и компиляция ее в shared library.
  3. Доступ к этой функции из C-кода расширения PHP.


В этой статье я буду рассказывать про создание инструментария для написания расширения PHP без необходимости трогать Си, исключительно на K/N.

Кому интересно — добро пожаловать под кат.
Кому читать не интересно, а просто хочется посмотреть — добро пожаловать на github
Читать дальше →
Всего голосов 23: ↑23 и ↓0+23
Комментарии0

Расширение PHP и Kotlin Native. Часть первая, наивная

Время на прочтение5 мин
Количество просмотров5.8K
В этой статье рассматривается самый наивный и простой подход к созданию расширения PHP с использованием Kotlin Native. Обращаю внимание, что не на, а с использованием.

Это скорее некий туториал с описанием возникших при скрещивании ужа с ежом проблем и путей их решения. Откровений не будет, но возможно кому-то и пригодится.

Итак, если интересно, то добро пожаловать под кат.
Читать дальше →
Всего голосов 11: ↑9 и ↓2+7
Комментарии38

Очень простое объяснение принципов SOLID

Время на прочтение5 мин
Количество просмотров67K
Disclaimer: Всем можно, ну а я чем хуже?!

SOLID — это набор принципов по организации кода. Фактически они декларируют некие правила, которые помогут вам сохранить свои и чужие нервы и время. А могут и не помочь.

Попробуем разобраться в этих принципах на пальцах, без примеров кода и СМС.
Читать дальше →
Всего голосов 60: ↑53 и ↓7+46
Комментарии60

Два типа расширений PHP. Zend extension VS PHP module

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

image


Какие расширения вообще бывают


PHP module – оно же обычное расширение PHP
К этому типу относится подавляющее число расширений в PHP. Все то, что подключается в php.ini с помощью инструкции extension=some_library.so — это они и есть.


Zend extension
Расширений такого типа крайне мало, однако они ничуть не менее востребованы.


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

Читать дальше →
Всего голосов 19: ↑18 и ↓1+17
Комментарии0

И снова о переводе документации PHP

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


Предыстория


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

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

Собственно дальше будет довольно сумбурный рассказ про то, как сейчас обстоят дела с русской локализацией, с какими проблемами пришлось столкнуться и какие выводы можно из всего этого сделать.
Читать дальше →
Всего голосов 42: ↑41 и ↓1+40
Комментарии30

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Работает в
Зарегистрирован
Активность