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

Пользователь

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

Разрешение конфликтов в транзитивных зависимостях — Хороший, Плохой, Злой

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

Вместо предисловия


В ближайшую субботу мы с EvgenyBorisov будем выступать в Питере на JUG.ru. Будет много веселого трэша и интересной инфы (иногда не разберешь, где проходит граница), и одно из моих выступлений будет посвящено WTF-нутости модульной разработки программ. Я расскажу несколько ужастиков, один из которых будет о том, как все пытаются быстро, гибко и корректно описать зависимости в проекте, и что из этого обычно получается. Интересно? Тогда добро пожаловать в ад!


Скорее, конечно, «Хороший, Удобный и WTF-ный».
Погрузиться в конфликт...
Всего голосов 52: ↑46 и ↓6+40
Комментарии83

Как мы внедрили ML в приложение с почти 50 миллионами пользователей. Опыт Сбера

Время на прочтение10 мин
Количество просмотров18K
Привет, Хабр! Меня зовут Николай, и я занимаюсь построением и внедрением моделей машинного обучения в Сбербанке. Сегодня расскажу о разработке рекомендательной системы для платежей и переводов в приложении на ваших смартфонах.


Дизайн главного экрана мобильного приложения с рекомендациями

У нас было 2 сотни тысяч возможных вариантов платежей, 55 миллионов клиентов, 5 различных банковских источников, полсолонки разработчиков и гора банковской активности, алгоритмов и всего такого, всех цветов, а ещё литр рандомных сидов, ящик гиперпараметров, пол-литра поправочных коэффициентов и две дюжины библиотек. Не то чтобы это всё было нужно в работе, но раз начал улучшать жизнь клиентов, то иди в своём увлечении до конца. Под катом история о сражении за UX, о правильной постановке задачи, о борьбе с размерностью данных, о вкладе в open-source и наших результатах.

Читать дальше →
Всего голосов 50: ↑38 и ↓12+26
Комментарии57

Как мы использовали отложенную репликацию для аварийного восстановления с PostgreSQL

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


Репликация — не бэкап. Или нет? Вот как мы использовали отложенную репликацию для восстановления, случайно удалив ярлыки.


Специалисты по инфраструктуре на GitLab отвечают за работу GitLab.com — самого большого экземпляра GitLab в природе. Здесь 3 миллиона пользователей и почти 7 миллионов проектов, и это один из самых крупных опенсорс-сайтов SaaS с выделенной архитектурой. Без системы баз данных PostgreSQL инфраструктура GitLab.com далеко не уедет, и что мы только не делаем для отказоустойчивости на случаи любых сбоев, когда можно потерять данные. Вряд ли такая катастрофа случится, но мы хорошо подготовились и запаслись разными механизмами бэкапа и репликации.


Репликация — это вам не средство бэкапа баз данных (см. ниже). Но сейчас мы увидим, как быстро восстановить случайно удаленные данные с помощью отложенной репликации: на GitLab.com пользователь удалил ярлык для проекта gitlab-ce и потерял связи с мерж-реквестами и задачами.


С отложенной репликой мы восстановили данные всего за 1,5 часа. Смотрите, как это было.

Читать дальше →
Всего голосов 27: ↑26 и ↓1+25
Комментарии2

Микросервисная архитектура, Spring Cloud и Docker

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

Привет, Хабр. В этой статье я кратко расскажу о деталях реализации микросервисной архитектуры с использованием инструментов, которые предоставляет Spring Cloud на примере простого концепт-пруф приложения.



Код доступен для ознакомления на гитхабе. Образы опубликованы на докерхабе, весь зоопарк стартует одной командой.

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

Структуры данных в картинках. LinkedList

Время на прочтение4 мин
Количество просмотров543K
Приветствую вас, хабражители!

Продолжаю начатое, а именно, пытаюсь рассказать (с применением визуальных образов) о том как реализованы некоторые структуры данных в Java.



В прошлый раз мы говорили об ArrayList, сегодня присматриваемся к LinkedList.

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

Прочитать чуть больше
Всего голосов 50: ↑46 и ↓4+42
Комментарии22

Структуры данных в картинках. HashMap

Время на прочтение6 мин
Количество просмотров1.2M
Приветствую вас, хабрачитатели!

Продолжаю попытки визуализировать структуры данных в Java. В предыдущих сериях мы уже ознакомились с ArrayList и LinkedList, сегодня же рассмотрим HashMap.



HashMap — основан на хэш-таблицах, реализует интерфейс Map (что подразумевает хранение данных в виде пар ключ/значение). Ключи и значения могут быть любых типов, в том числе и null. Данная реализация не дает гарантий относительно порядка элементов с течением времени. Разрешение коллизий осуществляется с помощью метода цепочек.

А почему бы и нет?
Всего голосов 81: ↑75 и ↓6+69
Комментарии42

Структуры данных в картинках. LinkedHashMap

Время на прочтение4 мин
Количество просмотров276K
Привет Хабрачеловеки!

После затяжной паузы, я попробую продолжить визуализировать структуры данных в Java. В предыдущих статьях были замечены: ArrayList, LinkedList, HashMap. Сегодня заглянем внутрь к LinkedHashMap.



Из названия можно догадаться что данная структура является симбиозом связанных списков и хэш-мапов. Действительно, LinkedHashMap расширяет класс HashMap и реализует интерфейс Map, но что же в нем такого от связанных списков? Давайте будем разбираться.

Tell me more!
Всего голосов 28: ↑27 и ↓1+26
Комментарии14

Структуры данных в картинках. ArrayList

Время на прочтение3 мин
Количество просмотров872K
Приветствую вас, хабралюди!

Взбрело мне в голову написать несколько статей, о том как реализованы некоторые структуры данных в Java. Надеюсь, статьи будут полезны визуалам (картинки наше всё), начинающим java-визуалам а также тем кто уже умеет писать new ArrayList(), но слабо представляет что же происходит внутри.



Сегодня поговорим о ArrayList-ах

ArrayList — реализует интерфейс List. Как известно, в Java массивы имеют фиксированную длину, и после того как массив создан, он не может расти или уменьшаться. ArrayList может менять свой размер во время исполнения программы, при этом не обязательно указывать размерность при создании объекта. Элементы ArrayList могут быть абсолютно любых типов в том числе и null.

Поверить на слово
Всего голосов 89: ↑82 и ↓7+75
Комментарии66

Вулканический поросенок, или SQL своими руками

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


Сбор, хранение, преобразование и презентация данных — основные задачи, стоящие перед инженерами данных (англ. data engineer). Отдел Business Intelligence Badoo в сутки принимает и обрабатывает больше 20 млрд событий, отправляемых с пользовательских устройств, или 2 Тб входящих данных.


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


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

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

Как было устроено хранилище DWH в TELE2

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

Здравствуйте, дорогие друзья.


Сегодня хочу поделиться историей из жизни, как было устроено хранилище DWH в Tele2 до внедрения КХД (EDW).


Поступил я в ИТ подразделение Tele2 в 2012 в отдел по системам отчетности. На тот момент в компании уже было создано хранилище DWH, на котором уже крутилось много процессов по предоставлению отчетности и не только.


Немного по поводу технического стека, который там использовался на тот момент. Для хранилища использовалась Оракловая база объемом 60-100 Тб сервер T4-4 c оперативой под 1 Тб. Туда загружались данные из различных источников. Но основными из них были 4 оракловые биллинговые базы, которые были по сути платформой тарификации. И был отдел, который занимался поддержкой этих баз и предоставлением сервисов. Разделение этих баз было по макрорегионам. Причина: слишком большие объемы. Т.е если абонент звонит, скажем, из Московской сим-карты то и расчет стоимости звонка производится в соответствующем биллинге.

Читать дальше →
Всего голосов 26: ↑23 и ↓3+20
Комментарии25

Не работайте в плохих проектах

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

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


Читать дальше →
Всего голосов 220: ↑197 и ↓23+174
Комментарии574

Древности: функциональный магнитофон

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


Если перевести эту риторику на компьютерный язык, то это как если бы вы до сих пор использовали, и для себя, и для работы, компьютер Apple II, потому что это прекрасный образец инженерного искусства, и ничто в нём не отвлекает вас от ваших скромных компьютерных дел. Звучит странно: уж слишком мы привыкли в нашей цифровой реальности к логике «быстрее, выше, сильнее». Больше возможностей, даже если они подчас и вовсе не нужны.

В третьей статье, посвященной моему аудиокассетному хобби, я изучаю магнитофон с максимальным количеством функций на квадратный сантиметр поверхности. Во времена актуальности этого устаревшего формата, я бы предпочел этот двухкассетник любому более аскетичному, пусть и более достойному аппарату. Сегодня ситуация скорее обратная, поэтому я применяю массу цифровых инструментов работы со звуком, чтобы оценить, насколько серьезно аналоговый звук восьмидесятых отличается от современности. В программе также немного 3D-печати и странные эксперименты с кодированием в звук изображений, просто потому что теперь мы это можем!
Всего голосов 65: ↑64 и ↓1+63
Комментарии57

Airflow — инструмент, чтобы удобно и быстро разрабатывать и поддерживать batch-процессы обработки данных

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

image


Привет, Хабр! В этой статье я хочу рассказать об одном замечательном инструменте для разработки batch-процессов обработки данных, например, в инфраструктуре корпоративного DWH или вашего DataLake. Речь пойдет об Apache Airflow (далее Airflow). Он несправедливо обделен вниманием на Хабре, и в основной части я попытаюсь убедить вас в том, что как минимум на Airflow стоит смотреть при выборе планировщика для ваших ETL/ELT-процессов.


Ранее я писал серию статей на тему DWH, когда работал в Тинькофф Банке. Теперь я стал частью команды Mail.Ru Group и занимаюсь развитием платформы для анализа данных на игровом направлении. Собственно, по мере появления новостей и интересных решений мы с командой будем рассказывать тут о нашей платформе для аналитики данных.

Читать дальше →
Всего голосов 29: ↑26 и ↓3+23
Комментарии26

Figma — делаем дизайн системно

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

Приветствую вас коллеги! Меня зовут Дмитрий Волков и я работаю в профессии больше десяти лет. Решил написать статью для тех, кто создает web и mobile дизайн в современных программах.
Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Комментарии18

12 шагов по поиску удаленной работы

Время на прочтение9 мин
Количество просмотров64K
Привет, меня зовут Игорь. Я десять лет работал в офисе, но год назад решился и перешел на удаленную работу. Для начала скажу, что теперь меня палкой не загонишь в офис! Перейти на удаленку было лучшее решение в моей жизни.
... Написание каркаса резюме... Анализ рынка... Анализ конкурентов... Написание резюме...
Всего голосов 48: ↑39 и ↓9+30
Комментарии111

Spring изнутри. Этапы инициализации контекста

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


Доброго времени суток уважаемые хабравчане. Уже 3 года я работаю на проекте в котором мы используем Spring. Мне всегда было интересно разобраться с тем, как он устроен внутри. Я поискал статьи про внутреннее устройство Spring, но, к сожалению, ничего не нашел.

Всех, кого интересует внутреннее устройство Spring, прошу под кат.
Читать дальше →
Всего голосов 57: ↑53 и ↓4+49
Комментарии16

Prometheus — практическое использование

Время на прочтение6 мин
Количество просмотров87K
Одной из важнейших задач при разработке приложений с микросервисной архитектурой является задача мониторинга. Слежение за состоянием сервисов и серверов позволяет не только вовремя реагировать на неисправности, но и анализировать их работу. Наличие такой информации трудно переоценить, ведь она предоставляет дополнительные возможности по улучшению производительности и качества работы Вашего ПО.

image

К счастью, существует множество решений задачи мониторинга, как платных, так и бесплатных. Я же хочу поделиться опытом практического использования open source системы мониторинга Prometheus.
Читать дальше →
Всего голосов 16: ↑15 и ↓1+14
Комментарии8

Диагностика утечек памяти в Java

Время на прочтение2 мин
Количество просмотров55K
В данной заметке я хочу показать каким образом можно определять и устранять утечки памяти в Java на примере из моей повседневной работы. Мы не будем здесь рассматривать возможные причины появления утечек, об этом будет отдельная статья, так как тема достаточно обширная. Стоит заметить, что речь пойдет о диагностике именно Heap Memory, об утечках в других областях памяти будет отдельная статья.
Читать дальше →
Всего голосов 18: ↑15 и ↓3+12
Комментарии22

Как нашего заказчика не хотел отпускать провайдер

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


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

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

А теперь добивающий аккорд: переезд вам по факту осложняют, ставя в рамки и согласовывая каждый чих по месяцу. Потому что вы же много платите провайдеру, зачем вас отпускать?
Читать дальше →
Всего голосов 78: ↑71 и ↓7+64
Комментарии49

Усы, лапы и хвост: как нейронная сеть распознает котиков и другие объекты

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

Распознавание изображений — классический пример использования нейронных сетей. Вспомним, как происходит процесс обучения сети, в чем возникают сложности и зачем в разработке использовать биологию. Подробности под катом.
Читать дальше →
Всего голосов 18: ↑15 и ↓3+12
Комментарии4

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность