• Есть ли плагин для автоматизации выгрузки проекта на github?

    Maksclub
    @Maksclub
    maksfedorov.ru
    у гитхаба есть АПИ, можете через него создавать репо, выгружать файлы и все это
    Ответ написан
    Комментировать
  • Я что-то не так понимаю в декларации типа Event для DOM?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Интерфейс не содержит нужных полей, нужно указать тип примерно так
    (event.target as EventTarget). tagName
    Ответ написан
    Комментировать
  • Как добавить body к http request'u в java?

    Maksclub
    @Maksclub
    maksfedorov.ru
    HttpRequest request = HttpRequest.newBuilder()
      .uri(new URI("https://postman-echo.com/post"))
      .headers("Content-Type", "text/plain;charset=UTF-8")
      .POST(HttpRequest.BodyPublishers.ofString("Sample request body"))
      .build();
    Ответ написан
    Комментировать
  • Какие есть хорошие курсы по веб-дизайну?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Яндекс.Практикум, есть друзья там, кто обучается — очень крутой подход с преподами, курсовыми, экзаменами и всем этим...
    Учат работать с юзкейсами, тестирвоание гипотез, интервью заказчиков и, конечно, техника и навыки...

    Школа Дизайнеров от Бюро Горбунова — очень крутые ребята, их хантят на выпуске топовые компании
    вот дипломы https://bureau.ru/school/projects/
    Тут не только техника дизайна, но и глубокая работа редакторов по работе со смыслом для пользователя. Работа с текстом (под патронажем Максима Ильяхова (автор "Пиши сокращай")
    Ответ написан
    Комментировать
  • CQRS/ES (или это EventDriven вообще) - Кто поможет разобраться с терминами?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    CQRS — разделяем чтение и запись, в идеале и стораджи (в одно пишем результат команд на write сценарии), с др читаем проекции, готовые данные

    Между этими сценариями работают какие-то воркеры, которые готовят чтение...

    Зачем это делают: разделение ответственности, о котором в названии паттерна указано, оптимизация чтения
    Очевидно, что для чтения можно оптимизировать хранилище — например NoSQL с готовыми данными

    Тк чтение и запись разделены — нет смысла на записи делать изменение стейта по классике, когда мутируем состояние в сторадже и можно просто хранить поток событий, проматывая которые мы получим стейт бизнес-сущностей (они на чтении уже не участвуют и нет потребности в "готовом" измененном стейте)... Это очень удобно,

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

    На эти события вешаем те самые воркеры, которые инициируют подготовку данных для чтения (или нет)
    Ответ написан
  • Почему данные доходят до nginx, но не доходят до Laravel?

    Maksclub
    @Maksclub
    maksfedorov.ru
    я не знаток нюансов, но вижу, что все запросы у вас уходят на $scheme://car.mydomain.ru/gprs
    пути .php не имеют смысла, тк никто /foo.php не запрашивает, на всех сайтах запросы вида /foo/bar без расширения

    лучше опишите изначальную функциональную задачу, а не уточнения по выбранному вами решению :)
    Ответ написан
  • Есть ли программа "Гимнастика для глаз и шеи на рабочем месте"?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Можно поставить помидоро или что-то такое на компьютере, чтобы уведомлял "пора встать из-за компьютера и сделать гимнастику"

    Делая гимнастику сидя не очень хорошо, все равно вы будете ее делать, значит не будете работать: полезно сделать отжимания, присяды и планку, чтобы размять спину... странно это делать сидя там же :)
    Базовые упражнения и разминка стоя/лежа лучше вашей задумки и не смогут быть перебиты вашими аргументами.
    Еще для человека базовое движение ходьба — тк в тазу много сосудов крупных
    Ответ написан
  • Обработка всех url nginx?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Как сделать так что бы nginx перенаправлял все запросы на angular приложение, и ангуляр сам решал что показывать?

    Так и сделать — все запросы кроме файлов направить на index.html
    location / {
            try_files $uri $uri/ /index.html =404;
        }


    Но надо честь, что это и бекендовые запросы отправит на index.html
    ЧТобы исключить часть путей, например /api/... то сделайте так:
    location ~ ^/(api|metrics) {
            proxy_set_header X-Real-IP $remote_addr;
            # http://backend — это докерный хост бекенда, у вас может быть что-то другое, например проксирвоание на php-fpm или ip
            proxy_pass http://backend:8001;
        }
    
        location / {
            try_files $uri $uri/ /index.html =404;
        }
    Ответ написан
    Комментировать
  • Реализации протоколов интернет - где, как, кем?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Реализации хранятся в стандартных библиотеках языков и в системных утилитах, типа curl

    Когда вы на каком-нибудь языке используете системную библиотеку, которая реалзует например http, то каждая умеет делать запрос согласно протоколу — указывать метод, адрес, keep-aliveб тело и прочие штуки; умеет делать сам запрос (отправяет пакеты) и умеет получать ответ

    Иногда программисты пишут свои протоколы, для этого тоже есть все в языках во всех
    Ответ написан
    Комментировать
  • Как реализовать заказ такси на сайте как у Yandex?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Сложность задания в вычислении нужного маршрута...

    Саму карту с адресами "откуда" и "куда" (+ промежуточные точки) + карты готовые — сделать не сложно
    Форму с услугами тоже не сложно — пару мес разработки

    Если достаточно откуда/куда + промежуточные точки, а маршрут считать как-то (не знаю, есть ли в АПИ карт построение маршрута для большегрузов/просто авто)

    UPD: маршруты в АПИ карт
    https://yandex.ru/dev/maps/jsbox/2.1/route_panel_c...

    UPD2: есть такие возможности Матрица расстояний
    https://yandex.ru/dev/maps/mapsapi/#logistic
    Так что за 2-3 мес можно написать вменяемый сервис
    Ответ написан
  • Spring Security. Как дать возможность юзеру изменять только свои объекты?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Вы можете сделать свой Voter для определения, может ли юзер изменять конкуретную сущность

    @Override
    public int vote(Authentication authentication, MethodInvocation methodInvocation, Collection<ConfigAttribute> attributes) {
      for (ConfigAttribute configAttribute : attributes) {
        if (supports(configAttribute)) {
          User principal = (User) authentication.getPrincipal();
          Spreadsheet domainObjectInstance = (Spreadsheet) getDomainObjectInstance(methodInvocation);
          return hasSpreadsheetAccess(principal, domainObjectInstance) ? ACCESS_GRANTED : ACCESS_DENIED;
        }
      }
      return ACCESS_ABSTAIN;

    Тут в voter логика доступа к объекту Spreadsheet у объекта User
    Метод hasSpreadsheetAccess видимо определяет, может ли конкретный юзер доступ к конкретному Spreadsheet, например проверка spreadsheet.GetUser().GetID() == user.GetID()

    остается только данный voter повесить на метод контроллера или сервиса через аннотацию @Secured и зарегать этот voter в конфиге

    Источник: https://blog.jdriven.com/2019/10/spring-security-c...
    Ответ написан
    1 комментарий
  • Как сделать редирект на другой сайт методом post?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Нажимаете кнопку "Сделать заказ" — идет запрос на ваш сервер с созданием заказа (пользователь, номер заказа, сумма, товары заказа, статус "ждет оплаты" и вот это все). На сервере создаете заказ и редиректите на кассу...

    Пользователь оплачивает, и вам либо редирект, либо вебхук прилетит, что заказ оплачен (меняете статус заказа, уведомляете юзера по почте), при входе в кабинет юзер увидит новый статус заказа, если полачен, если перейдет раньше, чем оплатил — статус будет "ждет оплаты")

    Обычно страница ссозданием заказа и оплатить делают не в одном флоу, а раздельном... типа "Создать заказ", там доофрмляет именем/способом оплаты, если не заполнял еще — заполняет свои данные и кнопка "Купить/Оплатить". отдельное флоу, тк спосообов оплаты на вашем сайте может больше, чем одна ЮКасса
    Ответ написан
    Комментировать
  • Как прокинуть данные через ng-content?

    Maksclub
    @Maksclub
    maksfedorov.ru
    <first>
       текст 1
    </first>
    
    <last>
       текст 2
    </last >
    Ответ написан
    Комментировать
  • Зачем задавать приватный модификатор доступа для свойств класса?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    У вас очень логичный вопрос на счет сеттера: сеттер полностью уничтожает задумку с инкапсуляцией. Правильно это называется "семантическое нарушение инкапсуляции" — то есть как-бы мы инкапсулировали, но по факту назад открыли прямую запись в свойство напрямую. Все доводы "ну мы можем в сеттере валидировать" не корректны

    Правильным способом будет не использовать сеттеры. Вот моя статья на эту тему:
    https://habr.com/ru/post/469323/

    Более подробно: каждый класс нужно проектирвовать так, чтобы данные внутри были максимально связаны. Например каждый метод работать должен в хорошем случае с максимальным числом полей класса, тогда у него высокий cohesion... В тоже время снаружи наужно работать с максимальн омалым числом метода, тогда будет низкая связанность (coupling). Это пара принципов из GRASP.
    Когда вы делаете сеттеры и геттеры, то у вас данные внутри между собой почти никак не взаимодействут: с геттером работают снаружи, с сеттером работаю снаружи — весь класс нараспашку, а в нем в 100% случаев появляются данные, которые вместе не должны находиться и никак не связаны — анрушена и абстракция и инвариант и много чего еще...

    Про инвариант отдельно: например есть платеж, у него есть значение, с которым платеж инициирвоан (initValue), есть значение холда (holdAmount) и есть значение чарджа на списание (chargeAmount)
    Когда вы работаете с платежом, контролируя ивнариант в самом классе, то ваш каждый метод првоеряет др значения и позволяет перейти к др состоянию... методов будет 2-3, все инкапсулировано и безопасно.

    Например:
    class Payment {
         pub func charge(amount int) void {
              if (this.holdAmount < amount && this.initAmount < amount) {
                   throw new PaymentException('Unavailable charge amount')
              }
    
               if (this.status === PaymentStatus:finish) {
                   throw new PaymentException('Payment already fisnished')
              }
    
              this.chargeAmount = amount
              this.holdAmount -= amount
              this.status = PaymentStatus:finish
         }
    }


    Тут в одном методе полные проверки и класс сам контролирует все состояние внутри, также соблюдается закон Деметры. У даннго кода высокий cohesion (из GRASP), тк внутри идет плотная работа с внутр данными (значит они корректно тут закроекны) и низкий coupling ( с теми данными для данного кейса только один метод работы, все внутри)

    Когда вы раскроете сеттерами и геттерами, то ваше состояние становится непредсказуемо и полагается только на то, что снаружи точно подумали об инварианте (нет)
    Ответ написан
    23 комментария
  • Как сделать простейший чат на go?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Есть gorilla websocket
    у них в репе готовый пример чата есть

    https://github.com/gorilla/websocket/tree/master/e...

    вот пример с комнатами:
    https://github.com/gorilla/websocket/issues/46#iss...
    Ответ написан
    2 комментария
  • Как снизить нагрузку на API?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Вы можете использовать TUS протокол для загрузки файла чанками

    Сервер фиксирует текущее состояние загрузки файла и всегда известно ему сколько уже загрузилось

    С каждым чанком возвращается инфа о размере загруженном и не надо отдельно делать какой-то запрос… то есть вы просто грузите ваш файл, а прогресс всегда известен

    Кроме того вы получаете возможность возобновить загрузку с того места, где остановились… это мощное и гибкое решение

    Сделал такое на go, для Java тоже есть решения и для сервера и для клиента…
    Ответ написан
    Комментировать
  • Как ограничить количество запросов от одного IP юзера?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Смотрите в сторону Rate Limiter

    Визуальное объяснение разных алгоритмов: https://habr.com/ru/post/448438/

    Имплеменатции на PHP на гитхабе:
    https://github.com/search?l=PHP&q=rate+limiter&typ...
    Ответ написан
    Комментировать
  • Как правильно сделать рекурсию?

    Maksclub
    @Maksclub
    maksfedorov.ru
    const input = [["red", "energy"],["yellow", "creativity"],["brown" , "friendly"],["green", "growth"]]
    
    const res = input.reduce((acc, [key, value]) => {
        acc.push({[key]: value})
        return acc
    }, []);
    
    console.log(res);
    Ответ написан