В начале 2021 года я написал статью, посвященную сбору детальных метрик Pi-Hole с помощью telegraf и influxdb с последующим отображением на дашбордах Grafana. Прошло несколько лет и я перешел на Graylog (для логирования) и Zabbix (для контроля за ошибками и производительностью).
В связи с этим я решил пересмотреть свою старую реализацию и перенести весь функционал с оригинального TIG-стека в Graylog, используя агент Zabbix для мониторинга и инициации загрузки данных.
Читать далееВ работе над смарт-системой на базе AI нам понадобились специалисты по разметке данных — MarkUp-инженеры. Рынок труда быстро трансформируется, и новые позиции не всегда можно закрыть готовыми специалистами, поэтому мы сосредоточились на формировании навыков внутри команды. Мы поняли, что навыки QA-инженеров пересекаются с компетенциями, необходимыми для работы с данными в AI-системах, и решили организовать производственное обучение внутри команды. Рассказываем о том, кто такие разметчики, как тестировщики осваивали MarkUp, и что из этого вышло.
Читать далееДобрый день! Мы – команда сопровождения банковских телекоммуникаций Национального Расчетного Депозитария (Группа «Московская Биржа»). В НРД мы отвечаем за сопровождение информационных сервисов, которые используются на ежедневной основе при отправке платежей/сообщений через каналы SWIFT и СПФС, сдачи отчетности, взаимодействию со Федеральными органами исполнительной власти и других не менее важных направлений.
В этой статье расскажем о тех изменениях, которые затронули все банки, работающие через Транспортный Шлюз Банка России (ТШ БР), и как удалось найти альтернативное решение там, где это казалось невозможным.
Читать далееПоскольку все больше разработчиков Android переходят на Jetpack Compose из-за его декларативного подхода к пользовательскому интерфейсу, ему необходимо быстро просматривать сложные макеты. Однако не так-то просто отображать изображения с URL-адреса в Preview Jetpack Compose, поскольку редактор дизайна Android Studio не поддерживает сетевые вызовы. В этой статье я рассмотрю некоторые стратегии по преодолению ограничений; уделив особое внимание реальным решениям для улучшения рабочего процесса разработки.
Читать далееRedis — хранилище из семейства нереляционных (NoSQL) баз данных. Redis является очень быстрым хранилищем данных благодаря своей архитектуре in-memory. Он идеально подходит для задач, требующих быстрого доступа к данным, таких как кэширование, очереди сообщений, сессионная информация и многое другое. Go также известен своей высокой производительностью за счет компиляции в машинный код и эффективного управления памятью.
Читать далееВ феврале 1977 года, во втором выпуске журнала с говорящим названием «Байт» было опубликовано письмо некоего Вернера Бухгольца, который приоткрыл тайну появления этого термина. Почему? Потому что именно он стоял у его основ и вспомнил, что первое применение термина было в далёком 1955 году, в первые дни разработки IBM 7030 Stretch. Через год из многих вариантов «стандартным» стал восьмибитный байт, но эта информация содержалась во внутренних документах для IBM 7030 Stretch и в статье «система связей», которая предназначалась для внутреннего пользования. Именно Вернер решил использовать написание byte, чтобы не допустить случайной путаницы с bit. Лишь в июне 1959 года, в статье «Обработка данных по частям», термин официально «родился» во всем привычном значении и «ввёл» Вернера Бухгольца в историю информационных технологий. Ключевую роль в этом сыграл успех и провал суперкомпьютера Stretсh.
Читать далееМетод CUPED уже давно завоевал популярность в анализе A/B-тестов, предоставляя возможность выявлять эффекты меньших размеров. В этой статье мы подробно рассмотрим применение данного подхода на этапе дизайна эксперимента. Мы исследуем, как можно сократить размеры выборок, не теряя при этом в статистической мощности теста.
Читать далееСегодня расскажем вам о нестандартном подходе к защите веб-приложений
с помощью PTAF PRO. Мы с коллегами столкнулись с интересной задачей:
как защитить уязвимое приложение от вредоносных JSON-запросов, если WAF официально не поддерживает их обработку в пользовательских правилах?
В этой статье пройдем путь от постановки проблемы до ее решения, используя регулярные выражения и нестандартные настройки PTAF PRO. Руслан Ануфренка, инженер в группе технической поддержки информационной безопасности
в К2 Кибербезопасность расскажет, как:
1. Настроить систему для работы с внешним агентом PT AF PRO;
2. Закрыть уязвимость Zero Stars в Juice Shop;
3. Создать и применить пользовательское правило с помощью регулярных выражений;
4. Оценить эффективность и ограничения такого решения.
Статья будет полезна специалистам по информационной безопасности, разработчикам и всем, кто интересуется тонкостями настройки WAF и защиты веб-приложений.
Читать далееВ начале лета 2024 года мы получили предложение от правительства Ярославской области проверить качество сервисов передачи данных, предоставляемых сотовыми операторами, на автотрассе М8 «Холмогоры». Выражаясь на профессиональном сленге – провести драйв-тест в границах области.
Рутинная задача для отдела качества сотового оператора или специализирующихся на подобных сервисах компаний, для нас стала небольшим вызовом – готового комплекса для проведения таких измерений у нас не было.
Стандартно подобный измерительный комплекс состоит из следующих компонентов:
• специализированного программного обеспечения, позволяющего собирать, синхронизировать и сохранять измерения;
• измерительного приемника – сканера, при помощи которого оценивают покрытие сотовой сети;
• измерительных терминалов, которые позволяют оценить предоставляемые сервисы – качество голосовой связи, скорость передачи данных и прочее;
• GPS-приемника, осуществляющего геопривязку измерений.
У нас в наличии не было главного – измерительного терминала. Как правило, это смартфон или сотовый модем, чаще всего определенной модели со специализированной прошивкой, совместимой с измерительным ПО. Обычно их продают те же компании, что и производят измерительное ПО. Но вот беда - после известных событий 2022 года эти компании официально ушли с российского рынка и покупка их продукции стала если и не невозможной, то очень долгой и затратной. При таких вводных предстояло придумать обходной путь, чем мы и занялись.
Читать далееКоманда Spring АйО перевела и адаптировала доклад "Endpoint versioning made simple" Бауке Найхаус (Bouke Nijhuis) с последнего Devoxx Belgium.
В докладе автор объясняет, зачем нужно версионировать API, и подробно сравнивает различные подходы к реализации этой задачи.
Читать далееSpring Data JPA считается швейцарским ножом для работы с БД в Java. Однако Spring Data JPA не заслуживает своего триумфа и вот почему...
Читать далееИспользуя данные всепланетного обзора eROSITA, астрономы создали 3D-карту низкоплотного пузыря рентгеновского излучения, состоящего из горячего газа с температурой в миллион градусов, который окружает Солнечную систему.
Исследование выявило крупномасштабный температурный градиент внутри этого т.н. местного горячего пузыря (МГП) — то есть в нём есть как горячие, так и холодные области. Команда подозревает, что этот температурный градиент мог быть вызван превращением массивных звёзд в сверхновые, что привело к повторному нагреву пузыря. Такое нагревание должно было привести к расширению кармана с газом низкой плотности.
Читать далееРазбирая очередной инцидент, связанный с атакой шифровальщика, и услышав в очередной раз вопрос «как же так, ведь у нас есть антивирус!?», мы решили поделиться с комьюнити информацией о возобновившейся активности группировки DсHelp.
В этой статье расскажем про участившиеся атаки DсHelp, рассмотрим тактики и техники данной группы, а также отметим, почему антивирус — не панацея и как легитимное ПО может быть использовано против вас.
Читать далееВ 2023 году Huawei заявили об окончательном уходе от Android и переходе на собственную HarmonyOS Next. Для разработчиков это значит, что не получится создавать нативные приложения силами одной команды. Бизнес ждут новые расходы или снижение охвата аудитории.
Меня зовут Сергей, я техлид Android-разработки в Surf. В статье расскажем, чего ожидать владельцам приложений в России, стоит ли готовиться к очередной разработке на новой ОС и как это сделать.
Читать дальшеПаттерны проектирования на языке Kotlin
Это вторая часть статьи. Первая её часть здесь.
Поведенческие паттерны
13. Chain of Responsibility (Цепочка обязанностей)
Описание: Позволяет передавать запросы последовательно по цепочке обработчиков.
Когда использовать: Когда есть более одного объекта, который может обработать запрос.
Пример кода:
abstract class Handler(private val next: Handler?) { open fun handle(request: String) { next?.handle(request) } } class AuthenticationHandler(next: Handler?) : Handler(next) { override fun handle(request: String) { if (request.contains("auth")) { println("Аутентификация прошла") super.handle(request) } else { println("Аутентификация не удалась") } } } class LoggingHandler(next: Handler?) : Handler(next) { override fun handle(request: String) { println("Логирование запроса: $request") super.handle(request) } } fun main() { val handler = AuthenticationHandler(LoggingHandler(null)) handler.handle("auth: запрос к ресурсу") }
14. Command (Команда)
Описание: Инкапсулирует запрос как объект, позволяя параметризовать клиентов с разными запросами.
Когда использовать: Когда нужно параметризовать объекты выполняемым действием.
Пример кода:
interface Command { fun execute() } class Light { fun turnOn() = println("Свет включен") fun turnOff() = println("Свет выключен") } class TurnOnCommand(private val light: Light) : Command { override fun execute() = light.turnOn() } class TurnOffCommand(private val light: Light) : Command { override fun execute() = light.turnOff() } class RemoteControl { private val commands = mutableListOf<Command>() fun addCommand(command: Command) = commands.add(command) fun executeCommands() = commands.forEach { it.execute() } } fun main() { val light = Light() val turnOn = TurnOnCommand(light) val turnOff = TurnOffCommand(light) val remote = RemoteControl() remote.addCommand(turnOn) remote.addCommand(turnOff) remote.executeCommands() }
15. Iterator (Итератор)
Описание: Предоставляет способ последовательного доступа к элементам агрегатного объекта без раскрытия его внутреннего представления.
Когда использовать: Когда нужно предоставить единый интерфейс для обхода различных коллекций.
Пример кода:
class Notification(val message: String) class NotificationCollection { private val notifications = mutableListOf<Notification>() fun addNotification(notification: Notification) = notifications.add(notification) fun iterator(): Iterator<Notification> = notifications.iterator() } fun main() { val collection = NotificationCollection() collection.addNotification(Notification("Уведомление 1")) collection.addNotification(Notification("Уведомление 2")) collection.addNotification(Notification("Уведомление 3")) val iterator = collection.iterator() while (iterator.hasNext()) { val notification = iterator.next() println(notification.message) } }
16. Mediator (Посредник)
Читать далееРассмотрим одну задачу, которая на leetcode маркирована как "medium", хотя на самом деле это невероятно сложная задача. Примечательна она тем, что допускает в разной степени оптимальные решения, самые упрощённые из которых действительно весьма просты, а самые оптимальные ещё не найдены современной наукой. В этой задаче ценно то, что на её примере можно изучать целый ряд техник программирования.
Читать далееВсё, что я делал после одобрения петиции по программе талантов EB-1A и до въезда в США в статусе резидента. Все формы, которые я заполнял. Каждый полученный ответ и каждый скриншот на пути.
Читать далееНастоящий рассвет в дизайне советских товарных знаков наступил после принятия одноименного Постановления Совета Министров СССР в 1962 году.
Читать далее