Задать вопрос
  • Как в NestJS сформировать вывод ошибок валидации?

    @dimuska139 Автор вопроса
    Backend developer
    Разобрался, в общем. Нужно просто сделать свой ValidationPipe:
    @Injectable()
    export class ValidationPipe implements PipeTransform<any> {
      async transform(value, metadata: ArgumentMetadata) {
    
        if (!value) {
          throw new BadRequestException('No data submitted');
        }
    
        const { metatype } = metadata;
        if (!metatype || !this.toValidate(metatype)) {
          return value;
        }
        const object = plainToClass(metatype, value);
        console.dir(object);
        const errors = await validate(object);
        if (errors.length > 0) {
          throw new HttpException({message: 'Input data validation failed', errors:  this.buildError(errors)}, HttpStatus.BAD_REQUEST);
        }
        return value;
      }
    
      private buildError(errors) {
        const result = {};
        errors.forEach(el => {
          const prop = el.property;
          Object.entries(el.constraints).forEach(constraint => {
            result[prop] = constraint[0];
          });
        });
        return result;
      }
    
      private toValidate(metatype): boolean {
        const types = [String, Boolean, Number, Array, Object];
        return !types.find((type) => metatype === type);
      }
    }


    И использовать его в контроллере вот так:
    @UsePipes(new ValidationPipe())
    @Post()
    async create(@Body() createPostDto: CreatePostDto) {
      console.dir(createPostDto)
    }


    В строке result[prop] = constraint[0]; 0 не просто так. В constraint[0] находится "ключ" ошибки. Например, "isNotEmpty". То есть по этому ключу можно сделать свой текст ошибки, в том числе и перевод. prop - это название поля, в котором возникла ошибка. А в constraint[1] находится стандартный текст валидатора, в котором фигурирует название поля (мне он не нужен).

    P.s. подсмотрел вот тут.
    Ответ написан
    Комментировать
  • Как закрасить дробные части такого индикатора?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Градиентом нарисовать:

    const { filledColor: F, emptyColor: E, ...props } = defineProps({
      value: Number,
      maxValue: Number,
      segments: {
        type: Number,
        default: 5,
      },
      filledColor: {
        type: String,
        default: 'red',
      },
      emptyColor: {
        type: String,
        default: 'black',
      },
    });
    
    const background = val =>
      val >= 1 ? F :
      val <= 0 ? E :
                 `linear-gradient(to right, ${F}, ${F}, ${val * 100}%, ${E} ${val * 100}%)`;

    <div class="rating">
      <div
        v-for="i in segments"
        :style="{ background: background(value / maxValue * segments - i + 1) }"
        class="rating-segment"
      ></div>
    </div>
    Ответ написан
    Комментировать
  • Как раздать git hook для всей команды?

    Например есть husky - очень удобно, если с фронтом работаете.

    Если без сторонних инструментов, то можно хуки сложить в папку, которая будет трекаться в репозитории и поправить git config:
    git config core.hooksPath .githooks
    - это нужно выполнять для каждого репозитория у каждого разработчика. Можно упростить жизнь, вставив это в какой-нибудь скриптовый файл, который все обязательно запускают.
    Ответ написан
    4 комментария
  • Можно ли разукрасить вывод логов docker?

    karabanov
    @karabanov Куратор тега Ubuntu
    Системный администратор
    Можно перенаправить вывод в какой нибудь разукрашиватель
    Ответ написан
    Комментировать
  • Как получить дату первого дня недели, зная номер недели?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const dateByWeekNumber = (year, week) => {
      // Cоздаём дату, гарантированно входящую в первую неделю.
      const date = new Date(year, 0, 7);
      // Откатываемся до первого четверга года
      // По ГОСТ ИСО 8601-2001 первая неделя года должна содержать четверг
      date.setDate(date.getDate() - (date.getDay() + 10) % 7);
      // Переходим в нужную неделю
      date.setDate(date.getDate() + (week - 1) * 7);
      // Откатываемся до понедельника
      date.setDate(date.getDate() - 3);
      return date;
    };
    dateByWeekNumber(2023, 10);
    //  Date Mon Mar 06 2023 00:00:00 GMT+0300 (Москва, стандартное время)
    dateByWeekNumber(2020, 1);
    // Date Mon Dec 30 2019 00:00:00 GMT+0300 (Москва, стандартное время)
    Ответ написан
    1 комментарий
  • Как в javascript перехватывать вызов методов объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Хук get не позволяет получить параметры вызова метода

    Позволяет. Возвращайте функцию, которая будет содержать вызов метода плюс нужные вам действия с параметрами:

    function sequence(functions) {
      return new Proxy(functions, {
        get(target, key) {
          const val = target[key];
          return val instanceof Function
            ? (...args) => {
                console.log(`${key} called with arguments: `, args);
                return val.apply(target, args);
              }
            : val;
        },
      });
    }
    Ответ написан
    Комментировать
  • Js canvas.Как растяуть изображение так, чтобы оно не деформировалось, и всегда было по всей ширине canvas?

    Dr_Elvis
    @Dr_Elvis
    В гугле забанен
    Простая логика. Если у тебя канвас 400 на 600 пикселей, а картинка 30 на 40, то чтобы увеличить её по ширине тебе нужно её ширину увеличить в 400/30=13,3 раза, значит и высоту увеличиваешь в 13,3 раза, то есть 80*13.3=532 пикселя. и вот у тебя картинка по все ширине и равномерно по высоте.
    Ответ написан
    Комментировать
  • Запросы на сервер put, post,get, delete отправляются с помощью fetch. Как менять файл JSON на сервере с помощью Php?

    Stalker_RED
    @Stalker_RED
    Ставишь себе php.
    Ставишь какой-нибудь веб-сервер: nginx, apache или набирающий популярность caddy.
    (можно не ставить вебсервер, а использовать встроенный в PHP но у него с настройками пичалька).

    Настраиваешь веб сервер чтобы при побращении на mysite.localhost/чототам дергал твои php-скрипты.
    Тут у тебя есть развилка - можешь в настройках веб-сервера направить PUT и DELETE в разные скрипты или, в лучших традициях сделать единую точку входа, и уже в PHP-коде проверять
    if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
     // ...
    }

    Вся документация легко гуглится, по запросу "php json" или "php write file" в первых результатах будет или официальная документация на php.net, где есть примеры, или stackoverflow, тоже с примерами.
    Через пару недель как наиграешься, выкидываешь весь код, и идешь читать phptherightway и учить фреймворки.
    Ответ написан
    Комментировать
  • Как запустить команду при отсутствии пинга?

    hint000
    @hint000
    у админа три руки
    Для удобства написал функцию.
    is_host_acessible() {
      ping $1 -c 10 >/dev/null && echo 1
    }
    
    if [ ! $(is_host_acessible 192.168.123.45) ]; then
        echo "запускаем резервный сервак"
    fi

    а если кратко, то так
    ping 192.168.123.45 -c 10 || echo "запускаем резервный сервак"
    Ответ написан
    22 комментария
  • Всем привет. Я зарегистрировала свое приложение на hh.api, получила client id и client secret. Не разобралась, что делать дальше?

    @rPman
    а дальше идешь на сайт с документацией
    https://github.com/hhru/api
    там будет все красиво описано со ссылками на другую документацию, с примерами, по русски (так не привычно), оформлено очень качественно
    https://api.hh.ru/openapi/redoc
    Ответ написан
    6 комментариев
  • Как преобразовать список ul в json?

    Seasle
    @Seasle Куратор тега JavaScript
    const collectTree = (itemSelector, elementSelector, root = document) =>
      [...root.querySelectorAll(itemSelector)].map((element) => ({
        name: element.querySelector(elementSelector)?.textContent.trim(),
        child: collectTree(itemSelector, elementSelector, element),
      }));

    collectTree('ul > li', 'a');
    // или
    collectTree(':scope > ul > li', 'a');

    Результат

    [
        {
            "name": "Вегетотропные средства",
            "child": [
                {
                    "name": "Адренолитические средства",
                    "child": [
                        {
                            "name": "Альфа- и бета-адреноблокаторы",
                            "child": []
                        },
                        {
                            "name": "Альфа-адреноблокаторы",
                            "child": [
                                {
                                    "name": "Альфа-адреноблокаторы в комбинациях",
                                    "child": []
                                }
                            ]
                        },
                        {
                            "name": "Бета-адреноблокаторы",
                            "child": [
                                {
                                    "name": "Бета-адреноблокаторы в комбинациях",
                                    "child": []
                                }
                            ]
                        },
                        {
                            "name": "Симпатолитики",
                            "child": [
                                {
                                    "name": "Симпатолитики в комбинациях",
                                    "child": []
                                }
                            ]
                        }
                    ]
                },
                {
                    "name": "Противоопухолевые средства",
                    "child": [
                        {
                            "name": "Алкилирующие средства",
                            "child": []
                        },
                        {
                            "name": "Антиметаболиты",
                            "child": []
                        },
                        {
                            "name": "Другие противоопухолевые средства",
                            "child": []
                        },
                        {
                            "name": "Противоопухолевые антибиотики",
                            "child": []
                        },
                        {
                            "name": "Противоопухолевые гормональные средства и антагонисты гормонов",
                            "child": []
                        },
                        {
                            "name": "Противоопухолевые средства — ингибиторы протеинкиназ",
                            "child": []
                        },
                        {
                            "name": "Противоопухолевые средства — моноклональные антитела",
                            "child": [
                                {
                                    "name": "Противоопухолевые средства — моноклональные антитела в\n                                        комбинациях",
                                    "child": []
                                }
                            ]
                        },
                        {
                            "name": "Противоопухолевые средства растительного происхождения",
                            "child": [
                                {
                                    "name": "Противоопухолевые средства растительного происхождения в\n                                        комбинациях",
                                    "child": []
                                }
                            ]
                        }
                    ]
                },
                {
                    "name": "Разные средства",
                    "child": [
                        {
                            "name": "Вспомогательные вещества, реактивы и полупродукты",
                            "child": []
                        },
                        {
                            "name": "Детское питание (включая смеси)",
                            "child": []
                        },
                        {
                            "name": "Другие разные средства",
                            "child": []
                        },
                        {
                            "name": "Радиопрофилактические и радиотерапевтические средства",
                            "child": []
                        },
                        {
                            "name": "Склерозирующие средства",
                            "child": []
                        },
                        {
                            "name": "Средства для коррекции нарушений при алкоголизме, токсико- и\n                                наркомании",
                            "child": [
                                {
                                    "name": "Средства для коррекции нарушений при алкоголизме, токсико-\n                                        и наркомании в комбинациях",
                                    "child": []
                                }
                            ]
                        }
                    ]
                },
                {
                    "name": "Регенеранты и репаранты",
                    "child": [
                        {
                            "name": "Регенеранты и репаранты в комбинациях",
                            "child": []
                        }
                    ]
                }
            ]
        }
    ]

    Ответ написан
    4 комментария
  • Масштабирование Nodejs?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    С темой нейросетей не знаком, но полагаю, что работают все те же правила, что и в обычном вебе:
    1) Балансировщики нагрузок. Ставите свои сетки на нескольких серверах и между ними балансируете, чтобы распределять нагрузку. Возможно, имеет смысл присмотреться к Docker Serverless или Kubernetes.
    2) Очередь сообщений, чтобы удержать все запросы в уме и ничего не потерять. Стандартные или FIFO, это уже решать вам как архитектору.
    3) Используете serverless api gateway для самого бота, чтобы динамически скалировать нагрузку в зависимости от количества запросов.
    4) Результаты можете сохранять себе в S3, а можете пытаться сразу выплёвывать сразу в телеграм как-нибудь, чтобы не захламлять свой хостинг.

    Разворачивать всё это можно где хотите: Google Cloud, AWS, Яндекс Облако. Главное, чтобы присутствовали сервисы, о которых я говорю выше. Ну и цены/локацию подбирайте под себя.
    Ответ написан
    1 комментарий
  • Как сделать анимацию кардиограммы?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Вообще рисование линий обычно делается через изменение свойств stroke-dasharray и stroke-dashoffset у кривых в SVG. Это самый простой способ в рамках фронтенда, хотя и изначально эти вещи были для другого придуманы. Но в случае с ЭКГ нужна постоянная скорость рисования по горизонтали. Поэтому можно взять прямоугольную маску в рамках той же SVG, и двигать ее в сторону:

    Ответ написан
    6 комментариев
  • Как в Docker запустить процессы из под текущего пользователя?

    в демо проекте пришлось явно задать агрумeнты в docker-compose.yml:

    version: "3.7"
    
    services:
      app:
        image: sample-java17-app
        user: "${UID:-1000}:${GID:-1000}"
        command: "java -jar /app/target/demo-2.7.5.jar"
        volumes:
          - .:/app
        ports:
          - "8585:8080"
        environment:
          UID: ${UID:-1000}
          GID: ${GID:-1000}


    замените 1000 на то что дает $(id -u) $(id -g) в вашей машине

    эта же тема обсуждается например

    https://blog.giovannidemizio.eu/2021/05/24/how-to-...
    https://nickjanetakis.com/blog/running-docker-cont...
    Ответ написан
    Комментировать
  • Как реализовать очистку директории раз в сутки, не повреждая нужные файлы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Из крона периодически запускать удаление файлов с возрастом больше определённого (например, старше суток).
    find /путь/к/файлам/* -type f -mtime +1 -delete
    Ответ написан
    3 комментария
  • HTML тэг чтобы открыть папку в линуксе?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Это называется не тэг, а URI scheme. На странице описания есть и примеры использования этой scheme, в том числе и в UNIX-like.
    Ответ написан
    1 комментарий
  • Как разрешить не root пользователям перезапускать сервисы?

    deepblack
    @deepblack
    Как насчет варианта с sudoers?

    sudo nano /etc/sudoers.d/username

    %username ALL= NOPASSWD: /bin/systemctl reload nginx


    Запускать через sudo, но пароль просить не будет:
    sudo systemctl reload nginx
    Ответ написан
    1 комментарий
  • Как реализовать фильтрацию на vue.js по нескольким параметрам одновременно?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделаем описания столбцов, по которым допускается фильтрация, и способов фильтрации - имя, русифицированный вариант имени (чтобы показывать его в select'ах), и, у столбцов, тип данных:

    data: () => ({
      filterColumns: [
        [     'name',        'имя', 'string' ],
        [    'count', 'количество', 'number' ],
        [ 'distance', 'расстояние', 'number' ],
      ],
      operations: [
        [    'equal',    'равно' ],
        [ 'contains', 'содержит' ],
        [  'greater',   'больше' ],
        [     'less',   'меньше' ],
      ],
      ...

    Тип данных указываем потому, что значения различных типов сравниваются по-разному. Кстати, определим, как именно:

    data: () => ({
      types: {
        string: {
          equal: (a, b) => a.toLowerCase() === b,
          contains: (a, b) => a.toLowerCase().includes(b),
          greater: (a, b) => a.toLowerCase() > b,
          less: (a, b) => a.toLowerCase() < b,
        },
        number: {
          equal: (a, b) => a === +b,
          contains: (a, b) => `${a}`.includes(b),
          greater: (a, b) => a > +b,
          less: (a, b) => a < +b,
        },
      },
      ...

    На основе описаний столбцов и способов фильтрации создадим select'ы:

    <select v-model="column">
      <option v-for="n in filterColumns" :value="n[0]">{{ n[1] }}</option>
    </select>
    <select v-model="operation">
      <option v-for="n in operations" :value="n[0]">{{ n[1] }}</option>
    </select>

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

    computed: {
      filteredItems() {
        const { items, column } = this;
        const type = this.filterColumns.find(n => n[0] === column)?.[2];
        const filterFn = this.types[type]?.[this.operation];
        const filterVal = this.filterVal.toLowerCase();
    
        return filterFn && filterVal
          ? items.filter(n => filterFn(n[column], filterVal))
          : items;
      },
      ...

    https://jsfiddle.net/8df3z1un/1/
    Ответ написан
    Комментировать
  • Как следить, что происходит в bash-скрипте?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Есть. И она называется... bash :)

    bash -x ./myscript - покажет все команды перед их выполнением с уже сделанными подстановками
    Ответ написан
    Комментировать