Pull to refresh
23
0
Aleksandr Goida @ETman

Software Developer

Send message

Создание Data Lake и Warehouse на GCP

Reading time 9 min
Views 3.8K

Эта статья не будет технически глубокой. Мы поговорим о Data Lake и Data Warehouse, важных принципах, которые следует учитывать, и о том, какие сервисы GCP можно использовать для создания такой системы. Мы коснёмся каждого из GCP сервисов и поймём почему они будут полезны при создании Data Lake и Warehouse.

Прежде чем перейти к своей версии Data Lake и Data Warehouse, я хотел бы привести несколько известных архитектур, с которыми вы, возможно, уже знакомы, если интересуетесь этой темой. Архитектура, которую я бы предложил, будет более общей, чем эти: Cloud Storage as a data lake и Architecture: Marketing Data Warehouse.

В своей более общей версии Data Lake и Data Warehouse я расскажу о таких сервисах GCP, как Data Transfer Service, Dataproc, Cloud Storage, Cloud Scheduler, BigQuery, и Cloud SQL.

Читать далее
Total votes 5: ↑5 and ↓0 +5
Comments 7

Создание автоматической системы борьбы с злоумышленниками на сайте (фродом)

Reading time 7 min
Views 1.6K
Последние примерно полгода я занимался созданием системы борьбы с фродом (fraudulent activity, fraud, etc.) без какой-либо начальной инфраструктуры для этого. Сегодняшние идеи, которые мы нашли и реализовали в нашей системе, помогают нам обнаруживать множество мошеннических действий и анализировать их. В этой статье я хотел бы рассказать о принципах, которым мы следовали, и о том, что мы сделали для достижения текущего состояния нашей системы, не углубляясь в техническую часть.
Читать дальше →
Rating 0
Comments 0

Аутентификация в .NET Core gRpc с помощью JWT

Reading time 6 min
Views 13K
В этой статье я расскажу об особенностях аутентификации API в gRpc сервисах с помощью JWT. Я предполагаю, что вы знакомы с JWT и заголовками HTTP, с их использованием в .NET Core WebAPI, поэтому не буду обсуждать эти детали. Когда я пытался реализовать аутентификацию в gRpc, я столкнулся с тем, что большинство примеров написаны с использованием консольных приложений. Это слишком далеко от реальности, в которой, на мой взгляд, живут разработчики. Например, я не хочу создавать канал каждый раз, когда я хочу вызвать метод сервиса. Еще я не хочу заботиться об отправке токена и пользовательской информации с каждым запросом. Вместо этого я хочу иметь инфраструктурный уровень, который будет заботиться обо всём этом за меня. Если эта тема вам интересна, то под катом будет больше. Все примеры в статье справедливы для .NET Core 3.1.
Читать дальше →
Total votes 8: ↑8 and ↓0 +8
Comments 0

Развертывание в Docker и Kubernetes образа StatsD+Grafana

Reading time 7 min
Views 6.5K
В начале моего изучения Docker и Kubernetes мне нехватало простого и понятного примера, с которым можно было бы «поиграться», изучая особенности этой среды. Этой статьей хотелось бы закрыть этот пробел. Здесь я расскажу об интеграции .NET Core приложения с Telegraf и Grafana, о том, как шлются метрики и как деплоить в Docker и Kubernetes. Примеры в статье расчитаны на тех, кто начинает изучать данную область, но базовыми понятиями желательно обладать, чтобы полностью понять статью. В ней описано, как развернуть контейнер, в котором есть StatsD, InfluxDB и Grafana, а также, как отправлять метрики различных типов из приложения.
Читать дальше →
Total votes 9: ↑9 and ↓0 +9
Comments 8

Полем грядки вовремя, или 5 признаков скрытых проблем в команде

Reading time 6 min
Views 9.9K
Проблем в коммуникациях очень много и их решение всегда очень специфично для каждого случая. Сложность с некоторыми проблемами состоит в том, что они скрыты и дают о себе явно знать, когда уже слишком трудно, или поздно, что-то исправлять. Я вспомнил пять случаев, с которыми лично сталкивался. Не все получилось решить, не все решал осознано. Под катом найдёте пять историй, иллюстрирующие пять признаков проблем. Каждую историю я дополнил очень сухой подсказкой об исправлении потому, что реальное решение очень субъективно.
Читать дальше →
Total votes 27: ↑26 and ↓1 +25
Comments 14

Тёмные стороны деятельного человека

Reading time 5 min
Views 12K
Если в большинстве случаев, когда вы получаете новую задачу, вы больше думаете о возможностях сделать её любой ценой, вместо того, чтобы искать препятствия и причины, почему она не может быть выполнена, то вы, в моем понимании, деятельный человек. Пока другие думают, что это невозможно, вы всё еще ищете возможности и находите их. Но на пути поиска и воплощения решения в жизнь вы можете создавать напряжение между людьми. И об этом следует помнить, преследуя цели. И речь идет не о преодолении стены, а о поиске компромиссов, работающих решений и синхронизации с другими людьми. Существует такой набор черт, которые могут создать напряженность и об этом под катом.
Читать дальше →
Total votes 18: ↑17 and ↓1 +16
Comments 14

Несколько простых рекомендаций работы в команде

Reading time 2 min
Views 4.7K
Несколько рекомендаций работы в команде, которые могут сохранить нервные клетки всех в сложные моменты. Бывает, работы так много, что некоторые моменты забываются. Поэтому важно создать некоторый чек-лист, хотя бы для себя, чтобы иметь возможность быстро вернуть себя в эффективное состояние хорошего Team Player. Под катом рекомендации, которые вывел для себя.
Читать дальше →
Total votes 27: ↑14 and ↓13 +1
Comments 34

Когда тестирование через public-метод начинает вонять (пример)

Reading time 4 min
Views 6.6K
В статье про тестирование public-методов коснулся юнит-тестирования приватной логики классов. Думаю, мне стоило бы переделать тезис, так как большинство, на мой взгляд, восприняло, что речь идет о тестировании именно private-методов, хотя речь шла о приватной логике. В этой статье хочу проиллюстрировать практическим примером главный тезис. Под катом пример с небольшим анализом.
Читать дальше →
Total votes 23: ↑15 and ↓8 +7
Comments 35

Тестировать только через public-методы плохо

Reading time 4 min
Views 6.4K
В программировании и в TDD, в частности, есть хорошие принципы, которых полезно придерживаться: DRY и тестирование через public-методы. Они неоднократно оправдали себя на практике, но в проектах с большим legacy-кодом могут иметь «тёмную сторону». Например, ты можешь писать код, руководствуясь этими принципами, а потом обнаружить себя разбирающим тесты, охватывающие связку из 20+ абстракций с конфигурацией, несоизмеримо превосходящей по объему тестируемую логику. Эта «тёмная сторона» пугает людей и тормозит использование TDD в проектах. Под катом я рассуждаю, почему тестировать через public-методы плохо и как можно уменьшить проблемы, возникающие из-за этого принципа.
Читать дальше →
Total votes 26: ↑13 and ↓13 0
Comments 29

Стратегия Bottom-Up по внедрению изменений в организации

Reading time 4 min
Views 3.8K
Я точно не первый, кто сталкивался с препятствиями при внедрении изменений в организации снизу-вверх, и не последний. Хочу поделиться некоторыми наблюдениями, выводами и ошибками, которые я сделал на этом пути. Возможно, кто-то был в похожей ситуации, сталкивался с похожими препятствиями и ему удалось их преодолеть. Было бы интересно услышать их опыт.

Упрощенно история выглядит следующим образом. Есть потребность в специалистах Data Science. Есть некоторое видение топ-менеджмента о том, как это должно быть и оно игнорирует людей, которые интересуются данным направлением и уже являются сотрудниками компании. Некоторые из них изучают DS самостоятельно. Чтобы ускорить обучение в этом направлении и сделать его более релевантным для нужд компании я решил организовать группу и заручиться поддержкой архитекторов и глав департаментов. Тут начинается самое интересное в этой истории. Под катом стратегия и мои выводы.
Читать дальше →
Total votes 3: ↑3 and ↓0 +3
Comments 0

Еще про внедрение таймзон в долгоживущий проект

Reading time 5 min
Views 9.1K
Некоторое время назад начали адаптировать систему под требования нового рынка, где поддержка таймзон обязательна. Начальные изыскания описывал в предыдущей статье. Сейчас подход немного эволюционировал под влиянием реалий. Под катом описание проблем, с которыми пришлось столкнуться в ходе обсуждений, и окончательное решение, которое воплощается в жизнь.
Читать дальше →
Total votes 14: ↑10 and ↓4 +6
Comments 62

Переход от DateTime к DateTimeOffset

Reading time 6 min
Views 22K
Представим, что вы хотите преобразовать свою систему из одного состояния в другое. Начальное состояние — это когда DateTime используется везде, в C# коде и в БД. Конечное состояние — когда везде используется DateTimeOffset. Вы хотите сделать переход плавно и внести как можно меньше изменений. Это описание может быть началом очень интересной задачи с тупиком в конце.
Читать дальше →
Total votes 24: ↑24 and ↓0 +24
Comments 39

Цели обмена знаниями в IT компании

Reading time 5 min
Views 7.6K
«Знание есть сила», и я считаю, что компании должны поощрять культуру обмена знаниями между разработчиками. Удержание информации сотрудниками не является правильным путем по карьерной лестнице и не сделает никого ключевой персоной в долгосрочной перспективе. Ряд активностей, объединенных общим названием, напоминает win-win игру, в которой выигрывают обе стороны. За счет увеличения эффективности каждого отдельного разработчика, компании достигает более высоких целей наиболее эффективным образом. Основной трудностью, которая мешает продвижению этих активностей в компаниях, является отсутствие прямой связи между инвестициями в них и отдачи. Я не встречал четкой системы оценки прогресса этих мероприятий. Поэтому для себя расписал, как цели обмена знаниями связаны с реальными процессами в компании.
Читать дальше →
Total votes 15: ↑10 and ↓5 +5
Comments 7

Настройка Swashbuckle (Swagger) для WebAPI

Reading time 9 min
Views 56K
Кто хоть раз тестировал свой WebAPI знает такие инструемнты, как Postman или Advanced REST (экстеншены для Chrome). Эти инструемнты всем удобны, кроме того, что не умеют сами узнавать какие модели принимает API, какие отдает и не предоставляет информацию обо всех возможных эндпоинтах. Это неудобство решает пакет Swashbuckle, который встраивает в проект генерацию Swagger спецификации и UI. Под катом коротко о том, как его прикрутить к проекту и некоторые детали относительно авторизации и работы с «перегруженными» эндпоинтами.
Читать дальше →
Total votes 12: ↑10 and ↓2 +8
Comments 11

Заменяем тестирование алгоритмов тестированием вносимых эффектов

Reading time 3 min
Views 9.5K
Как и ожидал, правило 8 о том, что не тестируем алгоритм методов в статье "Правила внедрения TDD в старом проекте" вызвало больше всего вопросов «как» и «зачем». В момент составления прошлой статьи мне показалось это очевидным, поэтому не остановился детальнее на этом моменте. Но т.к. вопросов возникло много, хочу описать своё видение. Поэтому под катом будет небольшой пример кода и два примера того, как его можно было бы протестировать.
Читать дальше →
Total votes 23: ↑21 and ↓2 +19
Comments 29

Правила внедрения TDD в старом проекте

Reading time 12 min
Views 20K
Статья «Скользящая ответственность паттерна Репозиторий» подняла несколько вопросов, на которые очень сложно дать ответ. Нужен ли репозиторий, если абстрагироваться от технических деталей полностью невозможно? На сколько сложным репозиторий может быть, чтобы его написание оставалось целесообразным? Ответ на эти вопросы различается в зависимости от акцента, который делается при разработке систем. Наверно, самый сложный вопрос: нужен ли, вообще, репозиторий? Проблема «текучей абстракции» и рост сложности кодирования с увеличением уровня абстракции не позволяют найти решение, которое удовлетворяло бы оба лагеря. Например, в репортинге intention design приводит к созданию большого числа методов для каждого фильтра и сортировки, а generic решение создает большой оверхед по кодированию. Продолжать можно бесконечно…

Для более полного представления я взглянул на проблему абстракций со стороны применения их в уже готовом коде, в legacy code. Репозиторий, в таком случае, нас интересует только, как инструмент для достижения качественного и безбажного кода. Конечно, этот паттерн — не единственное, что необходимо для применения TDD практик. Наевшись «невкусной еды» в нескольких больших проектах и наблюдая за тем, что работает, а что нет, я вывел для себя несколько правил, которые мне помогают следовать TDD практикам. С удовольствием выслушаю конструтктивную критику и иные приёмы внедрения TDD.
Читать дальше →
Total votes 29: ↑27 and ↓2 +25
Comments 86

Скользящая ответственность паттерна Репозиторий

Reading time 2 min
Views 13K
В ходе многих дискуссий о применимости паттерна Repository я заметил, что люди разделены на два лагеря. В рамках этого текста я, условно, их назову абстракционистами и конкретистами. Разница между ними заключается в том, как они относятся к значению паттерна. Первые считают, что репозиторй стоит иметь, т.к. он позволяет абстрагироваться от деталей хранения данных. Вторые считают, что мы не можем полностью абстрагироваться от этих деталей, поэтому сама идея репозитория бессмыслена, а его использование пустая трата времени. Спор между ними обычно превращается в холивар.

Что не так с репозиторием? Очевидно, что с самим паттерном все нормально, но разница в его понимании разработчиками. Я попробовал исследовать это и наткнулся на два основных момента, которые, на мой взгляд, являются причиной разного к нему отношения. Одним из них является «скользящая» ответственность репозитория, а другой связан с недооценкой unit testing. Под катом я объясню первый.
Читать дальше →
Total votes 12: ↑9 and ↓3 +6
Comments 161

Сравнение конфигураций Dependency Injection фреймворков

Reading time 13 min
Views 38K

Много раз я спрашивал себя, что какой IoC контейнер подойдет для того или иного проекта. Их производительность — это только одна сторона медали. Полное сравнение производительности можно найти здесь. Другая сторона медали — простота и скорость обучения. Так что я решил сравнить несколько контейнеров с этой точки зрения и взял Autofac, Simple Injector, StructureMap, Ninject, Unity, Castle Windsor. На мой взгляд, это наиболее популярные IoC контейнеры. Вы можете найти некоторые из них в списке 20 лучших пакетов NuGet и также я добавил другие по своим предпочтениям. Лично мне очень нравится Autofac и во время работы над этой статьей я еще больше утвердился, что это лучший выбор в большинстве случаев.


Здесь описываются основы IoC контейнеров, таких как конфигурация и регистрации компонентов. Есть мысль так же провести сравнение управления lifetime scope и продвинутых фитч. Примеры кода можно найти в репозитории LifetimeScopesExamples GitHub.

Читать дальше →
Total votes 23: ↑20 and ↓3 +17
Comments 15

Введение в написание тестов и знакомство с xUnit

Reading time 3 min
Views 45K
Идея статьи возникла после нескольких лекций о том, как писать тесты и как использовать xUnit. Обо всём можно по отдельности почитать подробно. Здесь же я собрал общую информацию о том, как удачно на практике всё это применяется и сопроводил ссылками, для дальнейшего ознакомления. Обзор делался по версии 2.0.
Читать дальше →
Total votes 9: ↑7 and ↓2 +5
Comments 5

Создание тестового DB-контекста в тестах с использованием xUnit

Reading time 5 min
Views 9.8K
В случаях, когда ваше приложение имеет нетривиальную схему данных (люди, продукты, заказы, цены, объемы, состояния, зависящие от кучи параметров и т.д.) бывает проще иметь некоторый дамп данных, воссозданный на тестовом окружении, или взятый с продакшна, и использовать его для тестов. В этом случае, может понадобиться несколько дампов данных, для каждого из случаев, которые автоматические тесты должны уметь накатывать и откатывать на тестовое окружение. В этой статье я попытаюсь показать, как это можно сделать, используя fixtures и collections фреймворка xUnit. Все решение построена на базе xUnit версии 2.0 от 16 марта 2015 года.
Читать дальше →
Total votes 8: ↑8 and ↓0 +8
Comments 0

Information

Rating
Does not participate
Location
Lozenets, Sofiya, Болгария
Date of birth
Registered
Activity