Мир Plat.Form
Открыть в Telegram
Привет! Это официальная страница Мир Plat.Form в Telegram. И ты тут наверняка не просто так, а чтобы узнать последние новости, послушать экспертов, чему-то научиться или стать частью нашей ИТ-команды.
Больше2 664
Подписчики
+124 часа
Нет данных7 дней
+4630 дней
Архив постов
2 664
Руки так и тянутся переписать код 😁
Как справляешься с такой ситуацией?
😄 — работает? не трогаю
❤️ — аккуратно провожу рефакторинг
🔥 — никакие верёвки меня не удержат
2 664
А задачки заразные?... Ещё как 😄
Поэтому возвращаемся с новой разминкой для бэкенд-разработчиков ⬇️
При внедрении новых фич в СБП изменения часто раскатывают постепенно: сначала для одних банков, потом для других. Их идентификаторы передаются строкой через разделитель:
bankId1;bankId2
Иногда нужно включить фичу сразу для всех банков или, наоборот, для всех, кроме указанных.
Для этого Пётр добавил специальные значения:
ALL — фича включена для всех
I — при добавлении этого значения (в любом количестве) список начинает работать в режиме инверсии.
👍 К сожалению, Пётр заболел Stream'лянкой поэтому реализацию он написал так:
static class StringSet {
private static final String DELIMITER = ";";
private static final String ALL = "ALL";
private static final String INVERTED = "I";
private Set<String> stringSet;
public StringSet(@Nonnull String s) {
stringSet = new HashSet<>(Arrays.asList(s.split(DELIMITER)));
}
public boolean isEntityInSet(String entity) {
return stringSet.stream()
.reduce(false,
(acc, item) -> {
if (item.equals(entity)) return true;
else if (item.equals(ALL)) return true;
else if (item.equals(INVERTED)) return !acc;
else return acc;
},
(a1, a2) -> a1 || a2
);
}
}
Пётр проверил код тестами — и все они успешно прошли:
@Test
void stringSetTest() {
assertTrue(new StringSet("a").isEntityInSet("a"));
assertFalse(new StringSet("a").isEntityInSet("b"));
assertTrue(new StringSet("a;b").isEntityInSet("b"));
assertTrue(new StringSet("a;b").isEntityInSet("a"));
assertTrue(new StringSet("ALL").isEntityInSet("a"));
assertFalse(new StringSet("I;a").isEntityInSet("a"));
assertFalse(new StringSet("a;I").isEntityInSet("a"));
assertFalse(new StringSet("I;I;a").isEntityInSet("a"));
assertFalse(new StringSet("I;ALL;a").isEntityInSet("a"));
}
🏃♀️ Задача: найти ошибку, объяснить, почему тесты успешно проходили, и предложить вариант, при котором проверка будет работать корректно.
➡️ Пиши свою версию в комментариях и не забывай спрятать ответ под спойлер 😄
С правильным ответом вернемся в конце недели 🤝2 664
Исследовали офис на предмет дофамина: нашли уточек и мини-йоду
В карточках делимся своими любопытными находками в офисе, которые со временем стали частью интерьера 😄
👇 Мы в MAX
2 664
31 июля — День системного администратора 💻
Сегодня поздравляем тех, кто держит весь прод на плаву и спасает наши рабочие будни (и иногда нас самих)
🎉 — ура!
2 664
Ой, мы что-то нажали, и у нас всё пропало...
👨💻 — Позвать системного администратора
2 664
Пока мы писали этот пост, через платёжную систему «Мир» прошло более 1 800 000 транзакций 🍃
Хочешь работать в проектах такого масштаба?
Изучай вакансии и откликайся 👇
🎨🎨🎨🎨 Java-разработчик 🎨🎨🎨🎨 приложения 🎨🎨🎨🎨🔨 для Smart-часов Главная задача — разработка платёжного приложения для оплаты с помощью Smart-часов. Чем предстоит заниматься: — создавать и поддерживать платёжные приложения, эмуляторы и системы сертификации; — развивать спецификации платёжных приложений; — разбирать сложные инциденты и причины отказов в обслуживании клиентов на проде. Что важно: — опыт разработки от 3 лет; — уверенное знание Java или Kotlin; — знание алгоритмов, структур данных и принципов работы ПО; — знание стандарта EMV; — понимание основ криптографии. ❤️ Откликнуться
🎨🎨🎨🎨 DevOps-инженер 🎨🎨🎨🎨 в Программу 🎨🎨🎨🎨🔨 лояльности Предстоит развивать CI/CD-процессы и инфраструктуру высоконагруженных сервисов, участвуя во всём цикле разработки — от анализа требований до релиза. Задачи: — проектировать и поддерживать CI/CD-конвейеры; — развивать инфраструктуру как код на Ansible; — контейнеризировать приложения и разворачивать их в Kubernetes; — настраивать мониторинг, логирование и сбор метрик; — помогать командам разработки и тестирования работать с CI/CD-инструментами; — сопровождать установку релизов. Что важно: — опыт в DevOps от 3 лет; — уверенная работа с Jenkins или GitLab CI; — знание Ansible и принципов IaC; — опыт с Kubernetes, Helm и Hashicorp Vault; — понимание Kafka, AMQP, PostgreSQL и принципов отказоустойчивости; — опыт настройки Nginx, Angie или HAProxy. ❤️ Откликнуться
🎨🎨🎨🎨 Администратор 🎨🎨🎨🎨 фермы телефонов 🎨🎨🎨🎨🔨 и часов Предстоит развивать инфраструктуру собственной фермы из десятков смартфонов и часов, которая используется для тестирования платежных сервисов и мобильных кошельков. Чем предстоит заниматься: — развивать и настраивать CI/CD; — автоматизировать разработку, тестирование и деплой; — управлять конфигурацией серверов; — развивать системы мониторинга; — участвовать в проектировании архитектуры; — взаимодействовать с командой, бизнесом и пользователями. Что важно: — уверенное знание Linux, Docker, Git и Ansible; — опыт работы с Jenkins, GitLab CI, TeamCity, Bamboo или другими CI/CD-инструментами; — навыки настройки SQL-серверов и Nginx; — готовность развиваться в DevOps, архитектуре и автоматизации тестирования. ❤️ ОткликнутьсяБольше вакансий — в Сетке 😎 👇 Мы в MAX
2 664
👍 Пока код компилируется...
...есть несколько секунд, чтобы отвлечься от задач.
Следи за движениями нашего кота — небольшая гимнастика для глаз поможет отдохнуть.
Жми 😄, если сделал разминку
2 664
Нашли, куда пропали повторные запросы? 👀
Делимся ответом к задачке ⬇️
Ошибка была в порядке операторов. Дело в том, что
retry срабатывает только при получении сигнала об ошибке onError, а этот сигнал при таймаутах может быть порожден только на следующей строчке.
Чтобы переповторы срабатывали и при превышении времени ожидания, строки нужно поменять местами:
fun getQr(qrcId: String): Mono<QrData> {
return webClient.get()
.uri("/sbp/qr/{qrcId}", qrcId)
.retrieve()
.bodyToMono<QrData>()
.timeout(Duration.ofSeconds(1))
.retry(5)
}
Теперь, если сервер не ответит за одну секунду, timeout сформирует ошибку, а retry получит её и повторит запрос.
Жми 🔥, если хочется больше задачек в канале!2 664
🔥Разминка от наших коллег-джавистов: решаем реальную задачку
Представь: разработчик одного банка Пётр писал интеграцию с СБП по запросу данных QR-кода. В клиентской части он заложил таймауты и переповторы. Но при очередных сбоях интернета он заметил, что его приложение при неполучении ответа от сервера не делает переповторов.
👍 Вот код Петра:
fun getQr(qrcId: String): Mono<QrData> {
return webClient.get()
.uri("/sbp/qr/{qrcId}", qrcId)
.retrieve()
.bodyToMono<QrData>()
.retry(5)
.timeout(Duration.ofSeconds(1))
}
Где спряталась ошибка и как её исправить?
➡️ Делись ответом в комментариях, предварительно скрыв его под спойлер для тех, кто ещё думает.
В конце недели вернёмся с разбором задачи 🤝2 664
+5
Маршрут перестроен 🗺
В нашей команде много коллег с неожиданными карьерными переходами. Дмитрий — один из них.
До Мир Plat.Form он шесть лет работал в авиации, а затем полностью сменил сферу и пришёл в дизайн интерфейсов.
Как решился на перемены и что взял с собой из прошлой профессии — рассказываем в карточках. 😄
2 664
[INFO] RUN IT initialized...
[INFO] Team assembled.
[INFO] Distance completed.
[SUCCESS] Mood boosted.
Проверили этот лог на практике 👍
На прошлой неделе в Мещерском парке вместе с нашим беговым клубом приняли участие в фестивале RUN IT.
Вышли на старт всех дистанций, зарядились энергией и ещё раз доказали себе, что самые приятные километры — те, которые пробегаешь в хорошей компании.
Смотри видео с события — оно заряжено на скорость 🔥2 664
Говорят, самый красивый код пишется в состоянии потока 🙏
Но оставаться в нём постоянно не получится — куда интереснее понять, как находить этот поток снова и снова.
Поэтому в нашем корпоративном расписании есть йога и стретчинг — чтобы переключиться, выдохнуть и восстановиться после рабочего дня 🧘🏻♀️
Почему эту секцию любят:
❤️ Для любого уровня подготовки Неважно, давно ли ты практикуешь или только узнал, что такое шавасана. Тренеры подбирают комфортный вариант упражнений — с учётом подготовки, самочувствия и настроения.
❤️ Четыре тренера — четыре разных подхода Спокойные практики, работа с дыханием, мягкая растяжка или более динамичные занятия — можно попробовать всё и найти свой формат.
❤️ Комфортное пространство Вечерние тренировки проходят прямо в офисе. Коврики и весь необходимый инвентарь уже ждут в зале — остаётся только прийти.
❤️ Забота о себе, которая ощущается Час практики помогает разгрузить спину после дня за ноутбуком, перезагрузить голову и вернуть энергию. А хорошее самочувствие — приятный бонус, который остаётся и после тренировки.Кстати, некоторые асаны подозрительно напоминают рабочие будни. Часть показали в посте, больше — в нашей группе ВКонтакте 👀
