Задать вопрос
  • Почему typescript не проверяет типы при использовании spread-оператора?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Потому что необходимое свойство value уже существует, а остальной мусор пофиг, т.к. в ts структурная типизация, т.е. под сигнатуру
    interface Props {
        readonly value: string;
    }
    подходит любой объект у которого есть value: string:
    const foo = {
        value: 'string',
        id: 'string'
    }
    const bar: Props = foo; // ok

    Как указал Alexandroppolus - проверка есть только при явном задании литерала:
    const bar: Props = {
        value: 'string',
        id: 'string' // err
    };
    Но это специальный случай - предполагается, что задавая литерал вы хотите задать именно объект указанного типа и никакой другого. Однако к парадигме структурной типизации используемой в ts это отношения не имеет, чисто quality of life фича.

    P.S. И да, это значит что в потенциале ты можешь сделать так:
    interface Props {
        readonly value: string;
    }
    interface Props2 {
        readonly value: string;
        readonly id?: number;
    }
    
    const foo = {
        value: 'string',
        id: 'string'
    }
    
    const bar: Props = foo; 
    const buz: Props2 = bar; 
    
    buz.id?.toFixed(2) // ts ok, runtime error :(
    Ответ написан
    Комментировать
  • Почему на сайтах в js коде используются непонятные однобуквенные переменные и что они значат?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что для рабочей версии сайта чаще всего используют минифицированные версии файлов.
    Ответ написан
    1 комментарий
  • Скажите пожалуйста, как сделать одинаковое расстояние между блоками?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Это называется Masonry и обычно делается через JS библиотеку какую

    Если делать через flex, то надо будет высоту считать для контейнера:



    Или самый простой вариант через свойство columns в css:
    Ответ написан
    Комментировать
  • Как настроить отдачу метрик с nginx?

    rqdkmndh
    @rqdkmndh
    Web-разработчик
    Такой вариант в nginx.conf:
    server {
            listen       80;
            server_name  localhost;
    
            location / {
                root   /var/www/html;
                index  index.php;
            }
    
            location /metrics {
                stub_status;
                allow 127.0.0.1;
                deny all;
            }
    
            location ~ \.php$ {
                root           /var/www/html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
                include        fastcgi_params;
            }
        }

    Описание метрик Nginx /metrics:
    Active connections — текущее количество активных соединений.
    accepts — общее количество соединений, принятых сервером.
    handled — количество соединений, обработанных сервером (совпадает с accepts, если нет ошибок).
    requests — общее количество обработанных запросов.
    Reading — количество соединений, которые Nginx читает от клиента.
    Writing — количество соединений, в которые Nginx пишет ответ клиенту.
    Waiting — количество keep-alive соединений, которые открыты и ожидают нового запроса.

    stub_status — это директива, которая включает модуль ngx_http_stub_status_module. Этот модуль выводит минимальную статистику о текущем состоянии Nginx
    Ответ написан
    Комментировать
  • Вычитаю одно округленное число из другого, в ответе выдается число с кучей знаков после запятой, как это исправить?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Добро пожаловать в реальный мир вычислений чисел с плавающей запятой с погрешностью! Если вам нужны точные вычисления - используйте тип decimal или аналогичный для вашего ЯП.
    https://habr.com/ru/articles/266023/
    https://learn.microsoft.com/ru-ru/office/troublesh...
    https://0.30000000000000004.com/
    Ответ написан
    2 комментария
  • Как правильно выпаивать детали с электрических плат, чтобы их не повредить?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    При выпайке есть основные риски повреждения:
    - перегрев;
    - повреждение ног;
    - пробой статикой
    Соответственно это всё нужно учитывать.
    Для выпайки лучше использовать инфракрасный подогреватель платы (для равномерного прогрева и подогрева припоя). Далее, в зависимости от детали и количества припоя можно использовать:
    - оловоотсос (сбор большого количества припоя)
    - медная оплётка (сбор припоя где не справляется оловоотсос или сбор малого количества припоя)
    - выпайка паяльником (если ног немного)
    - выпайка феном (если ног много)
    Ответ написан
    Комментировать
  • Сколькими способами можно расставить на шахматной доске 8 ладей таким образом, чтобы они не били друг друга?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Правильный ответ 8!. Ваше второе рассуждение упускает то, что вы одну и ту же позицию получите 8! раз. Ибо вы там считаете все фигуры уникальными. Допустим это все ладьи по диагонали. Вы первую можете поставить в 8 мест - одно из 64. Вторую в 7, когда выбираете из 49... И т.д. Вот и получится, что одну позицию - все на диагонали - вы подсчитали 8! раз.
    Ответ написан
    6 комментариев
  • React Graphql в чем ошибка?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    react-apollo@3.1.5 требует @types/react ^16.8.0, но Ваш проект использует @types/react@18.3.3.

    react-apollo project is deprecated
    Попробуйте @apollo/clien вместо react-apollo.
    Ответ написан
    Комментировать
  • Как работают миграции в SQLAlchemy 2.0?

    @Everything_is_bad
    В SQLAlchemy нет миграций, create_all это создание таблиц с нуля, обычно это требуется очень редко. Да и вообще, DDL запросы сами по себе очень редко вызываются внутри рабочего сервиса, это обычно делается извне. А для миграций используют отдельную библиотеку Alembic.
    Ответ написан
    4 комментария
  • Как запаролить сайт?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Пароль найдите самостоятельно (хранение пароля на клиенте не самая безопасная идея):
    Ответ написан
    4 комментария
  • Почему не происходит запись значений в файл?

    Maksim_64
    @Maksim_64
    Data Analyst
    Не закрыл файл на гарантировал, очистку буфера и как следствие не гарантировал, что его содержимое целиком окажется в файле. Как по мне это абсурд, что это вообще, работает без исключений или хотя бы предупреждений.
    Ответ написан
    4 комментария
  • Можно ли анализировать логи job самим gitlab-runner'ом?

    Можно логи положить в артефакты, а потом их проверить на следующем шаге пайплайна и отправить нужное уведомление.
    Ответ написан
    6 комментариев
  • Как сделать также?

    Vlatqa
    @Vlatqa Куратор тега CSS
    это называется chips, например так https://codepen.io/buglessir/pen/MWwOaKd
    Ответ написан
    1 комментарий
  • Как перезапустить функцию в случае ошибки?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Какого-то стандартного универсального retry у промисов, вроде, нет.
    Поэтому можно использовать что-то подобное:
    let runWithRetry = async (func, tries = 5) => {
        let attempt = 1;
        while (attempt <= tries) {
            try {
                return await func();
            } catch (error) {
                console.log(`Attempt #${attempt} failed: ${error}`);
                attempt++;
            }
        }
    
        throw new Error(`Failed after ${tries} tries`);
    };
    
    try {
        let busyWork = () => new Promise((resolve, reject) => {
            setTimeout(() => (Math.random() > 0.75 ? resolve(Math.random()) : reject()), 1000);
        });
    
        let result = await runWithRetry(busyWork, 5);
    
        console.log(result);
    } catch (error) {
        console.error(error);
    }
    Ответ написан
    Комментировать
  • Как правильно позиционировать тултип?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    Примерно вот так:
    Парковка элементов относительно друг друга через точки
    
        Point: 1|2|3|4
           topLeft     topRight
                  1___2
                  |   |
                  |___|
                  4   3
        bottomLeft     bottomRight
    
        Edges        1
                   _____
                  |     |
               4  |     |  2
                  |_____|
    
                     3
    
        Point format:
          [targetPoint, itemPoint]
    
        Docking variants:
                    [1,3]      [2,4]
                      __        __
        item   ->    |_3|______|4_|
        target ->       |1    2|
                      __|4____3|__
                     |_2|      |1_|
    
                    [4,2]      [3,1]
    
            __
           |4_|___ __
         __|1    2|1_|
        |_3|4____3|
               |_2|
    
                __
         __ ___|_3|
        |_2|1    2|__
           |4____3|4_|
           |1_|
    
           1_________2
           |1_|   |_2|
           |__     __|
           |4_|___|_3|
           4         3


    Я уже реализовывал кучу лет назад данный алгоритм для парковки элементов относительно друг друга с учетом всех важных факторов. И реализация на шарпе получилась объемом в 800 сотен строчек кода с комментариями, при этом сам алгоритм выбора точки - монстр в более чем 300 строчек кода и сплошной набор из пачки ифов глубиной до 6 и до 12 штук подряд, а так же набором свитчей тоже в количестве шести штук и глубиной до двух (местами внутри ифов). И это еще с учетом сокращений за счет некоторых дополнительных математических и логических вычислений. (Откопал еще и JS версию).
    Если кому интересно - пишите, могу поделиться кодом.
    Ответ написан
    1 комментарий
  • Как правильно позиционировать тултип?

    rqdkmndh
    @rqdkmndh
    Web-разработчик
    Ключ к эффективному алгоритму здесь – определить, достаточно ли места по каждой из четырех сторон (сверху, снизу, слева, справа) от активатора, чтобы тултип вместился без выхода за пределы экрана.

    Вот базовая идея алгоритма:

    1. Определить размеры и положение элемента-активатора, используя getBoundingClientRect.
    2. Определить размер окна браузера.
    3. Рассчитать доступное пространство в каждом из направлений: сверху, снизу, слева, и справа от элемента.
    4. Используя размеры тултипа, определить может ли он поместиться в каждом из этих направлений.
    5. Если тултип не помещается в первоначальном направлении:
    - Испытать альтернативные позиции на основе доступного пространства и размеров тултипа.
    - Выбрать позицию, которая наилучшим образом подходит и не заходит за пределы экрана.
    В реальной реализации вам нужно будет также учесть размеры самого тултипа, чтобы точно определить, поместится ли он в доступном пространстве, и возможно, предусмотреть отступы от краев экрана.

    Также важно обеспечить динамическую перепроверку позиции тултипа при событиях, которые могут изменить положение или размер активатора, например, при изменении размера окна браузера (event resize) или прокрутке страницы (event scroll).

    И наконец, поскольку это может быть ресурсоемкий процесс, обдумайте использование debounce функции для событий, вызываемых слишком часто.
    Ответ написан
    1 комментарий
  • Что такое культура программирования?

    rqdkmndh
    @rqdkmndh
    Web-разработчик
    А что тут непонятного?
    -Поклонение богу программирования
    -Умение чистить программистскую карму
    -Умение проводить обряды (вроде танцев с бубном)
    -...
    Ответ написан
    Комментировать
  • Pip не работает, что делать?

    smorman
    @smorman
    When In Rome do as The Romans do...
    Выполнить:
    python -m venv venv
    (если ранее уже было сделано, то не обязательно)

    Узнать версию python:
    (ниже в коде пригодится версия Питона...)
    python -V

    Подправляем в коде ниже версию Питона из вывода выше и выполняем:
    sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED

    Уже не раз сталкивался с тем, что после обнов python, опять не работал pip.
    Просто повторяем тоже самое командой выше и всё заработает.

    Та же трабла проскакивала в Ubuntu 23.04...
    Ответ написан
    Комментировать
  • Как заставить gulp.watch реагировать только на сохранение, а не любое изменение файлов?

    rqdkmndh
    @rqdkmndh
    Web-разработчик
    Никак он не может отслеживать изменения в файле, пока его не сохранят. В каком редакторе вы пишите? Отключите опцию автосохранение редактора. В самом ватчере, можно использовать параметр задержки
    function watcher() {
      gulp.watch('./src/style.css', { delay: 500 }, styles);
    }
    // в данном случае будет задержка в полсекунды после сохранения файла.
    Ответ написан
    1 комментарий
  • Почему пропали репозитории из bitbucket?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Недавно с битбакетом были проблемы. Я так и не понял, то ли это битбакет нас глушил, то ли мы его и что теперь дальше.
    Но тот факт, что битбакет принадлежит атлассиану, который:
    - придерживается выраженно антироссийской позиции
    - может заблокировать, удалить и вообще сделать все что угодно с тем, что лежит на битбакете
    учитывать стоит.
    Ответ написан
    2 комментария