Задать вопрос
  • Где взять старую версию Node.js?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Попробуй nvm
    Ответ написан
    Комментировать
  • Понимает ли js, что функция вернет promise?

    @paroletatel
    Отвечу так, как сам понимаю, без претензий на экспертство.

    Сама функция в вашем примере — синхронная. Внутри данной функции вызывается fetch — он асинхронный.

    Вызов функции и её выполнение — это блокирующий код, он выполняется синхронно, и останавливает поток, пока не отработает функция.

    Но суть в том, что идея отрабатывания данной синхронной функции в том, чтобы поместить в event loop асинхронный запрос (который возвращает promise), обработчик которого запускается и не блокирует основной поток, — и только. Сама функция же, как синхронная, возвращает то, что вы ей даете вернуть, — в данном случае undefined.

    Если бы вы записали функцию, как асинхронную, и перед fetch использовали await, то данная функция как раз и возвращала promise, который предполагал бы полное исполнение fetch до выполнения самой функции, то есть resolve'а promise функции.

    const getData = async () => {
      await fetch('адресДаты').then((resp) => {
        resp.json()
      })
      .then((data) => {
        return data.data
      })
    }
    Ответ написан
    5 комментариев
  • Как правильно использовать тип unknown?

    Варианта четыре:
    1. Кастануть в any
    2. Кастануть в конкретный тип
    3. Использовать narrowing: Сделать проверки, что typeof item === "object" и что у него есть нужные свойства.
    4. Если заранее знаешь, что у тебя item - это какой-то тип из нескольких, то вместо unknown можно сделать union

    Вот ещё пример:
    https://www.typescriptlang.org/play?target=9#code/...
    Ответ написан
    Комментировать
  • Как не обновлять локальный файл docker-compose при git pull?

    @Kostik_1993
    Web Developer
    Я так понимаю вам нужна правка для локальной разработки которая не нужна на проде. Для этого вам нужно создать еще один docker-compose.dev.yml файл только с теми конфигами которые хотите поправить. Сам же файл не нужно индексировать, а поместить его в .gitignore

    https://docs.docker.com/compose/multiple-compose-f...
    https://docs.docker.com/compose/multiple-compose-f...

    UPD. Так же если вам нужно делать отличными какие-то опции вроде порт, имя или пароль бд можно вынести это в переменные окружения или .env файл. Его также стоит поместить под .gitignore
    Ответ написан
    Комментировать
  • Как в WebStorm 2023.2.4 убрать полосу в редакторе?

    xez
    @xez
    TL Junior Roo
    Эта полоса подсказывает вам, что слишком длинные строки кода делать не стоит...
    Включается она так:
    Settings -> Editor -> Appearance -> Show hard wrap and visual guides...
    Ответ написан
    1 комментарий
  • Как перемещать элемент по клику на кнопки?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вместо выдёргивания координат из стилей лучше будет сделать массив с координатами, обновлять этот массив, и уже на его основе задавать translate элементу. А чтобы не делать отдельные обработчики клика всем кнопкам, можно записать им в data-атрибут информацию о том, на сколько какие координаты должна изменить данная кнопка.

    <button data-steps="1,0">right</button>
    <button data-steps="-1,0">left</button>
    <button data-steps="0,1">down</button>
    <button data-steps="0,-1">up</button>
    <button data-steps="1,1">right down</button>
    <button data-steps="0,-2">double up</button>

    const coord = [ 0, 0 ];
    const stepSize = 30;
    
    const box = document.querySelector('#box');
    const buttons = document.querySelectorAll('[data-steps]');
    
    buttons.forEach(n => n.addEventListener('click', onClick));
    
    function onClick() {
      this.dataset.steps.split(',').forEach((n, i) => coord[i] += n * stepSize);
      box.style.transform = `translate(${coord.map(n => `${n}px`).join(',')})`;
    }
    Ответ написан
    Комментировать
  • Почему скорость интернета в 20 раз ниже, чем та, которая должна быть?

    @itshnick88 Автор вопроса
    Помогло заклинание "netsh int tcp set global autotuninglevel=normal"

    Спасибо за наводку ---> Артём Артём
    Ответ написан
    1 комментарий
  • Почему не получается передать ключ для json?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    myArrayJson.push({[arkey]: arval});
    Ответ написан
    Комментировать
  • Как сделать автозапуск python программы с виртуальным окружением в фоновом режиме на линукс?

    drygdryg
    @drygdryg
    Python-разработчик
    Можно использовать систему инициализации Systemd. Напишите unit-файл такого вида:
    [Unit]
    Description=My Script Service
    After=multi-user.target
    
    [Service]
    User=user  # Имя пользователя, от имени которого будет запускаться команда, указанная в ExecStart
    WorkingDirectory=/home/user/program  # Директория, в которую будет осуществлён переход перед запуском
    ExecStart=/home/user/program/venv/bin/python /home/user/program/webui.py
    Restart=always  # Всегда перезапускать скрипт при его падениях
    
    [Install]
    WantedBy=multi-user.target

    и сохраните его в директории /etc/systemd/system с расширением .service, например, /etc/systemd/system/my_program.service.

    Здесь не используется скрипт activate для активации виртуального окружения, но вместо этого указывается полный путь к интерпретатору Python внутри этого виртуального окружения.
    Также важно указывать абсолютные пути к файлам и директориям, даже несмотря на то, что задана рабочая директория WorkingDirectory.
    Если ваш скрипт опирается на сетевые соединение, в секции Unit в качестве After задайте network-online.target вместо multi-user.target:
    After=network-online.target

    После этого перезагрузите конфигурацию Systemd:
    sudo systemctl daemon-reload
    И запустите сервис с добавлением в автозагрузку:
    sudo systemctl enable --now my_program.service
    Ответ написан
    2 комментария
  • Как залить проект на гитхаб с сохранением папок?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега GitHub
    Автоматизатор
    Эти папки у вас существуют только в рабочем каталоге и их нет в репозитории, потому что гит отслеживает только файлы. Невозможно закоммитить пустой каталог. Каталоги фигурируют лишь как часть полного пути к файлам.

    Если вам нужно непременно сохранить структуру каталогов, то поместите в них любой файл. Стандартная практика — создавать пустой файл с именем .gitkeep
    Ответ написан
    Комментировать
  • Как использовать один компонент с разными типами данных?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Наверное ты хочешь этого:
    type Props = { data?: ITemplate } | {}
    const CreateTemplateForm: FC<Props> = (props) => {
      if ('data' in props && props.data) {
        
        return ...;
      }
    
      return ...;
    }
    Ответ написан
    5 комментариев
  • Как сделать деплой Vite-проекта на gh-pages?

    Seasle
    @Seasle Куратор тега JavaScript
    Комментировать
  • Как типизировать обмен данными между микросервисами?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Можно спецификацию в формате OpenAPI хранить для всей системы централизовано или в каждом микросервисе хранить спецификацию его API отдельно, а при сборке вытаскивать спецификации зависимостей и из них собирать DTO'шки.
    Ответ написан
    2 комментария
  • Почему не записываются данные в файл?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как все новички, вы оперируете понятием "может быть".
    "может быть сервер не принимает". "по крайне мере должно отправлять". "насчет РНР не уверен"
    Так делать никогда не надо.
    У вас есть все возможности узнать то, что происходит на самом деле. Факты.
    Вот фактами-то и надо всегда оперировать.
    Какая вам разница, "может ли быть такое, что backend не принимает"? Может. И чем вам это знание поможет?
    Вам не нужно знать абстрактно, вам нужно знать, принял ли ваш конкретный сервер ваши конкретные данные.
    А узнать это очень просто. Если "backend не принимает", то но выдаст ошибку. Все что вам нужно - это посмотреть, что он возвращает. Глазами.
    Плюс на всякий случай проверить, настроен ли backend на вывод ошибок.

    При работе с аякс запросами надо всегда держать открытой вкладку Сеть в инструментах разработчика в браузере.
    И смотреть, во-первых, что ваш фронт отправляет, а во-вторых - что сервер отвечает. Там вообще может быть 404. Поскольку никакого конкретного адреса вы на сервере не указали.
    Плюс если ответ сервера есть, то надо смотреть его содержимое на предмет ошибок.
    Ответ написан
    Комментировать
  • Что означает выражение. {x:1} в f.строках python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Это "f-строки"/"форматированные строковые литералы", простой пример:
    x = 5
    y = 555
    print(f"{x:1}")  # "5", минимальная ширина поля вывода переменной x = 1 (вывести значение x, удостоверившись, что оно занимает по меньшей мере один символ)
    print(f"{x:3}")  # "  5"
    print(f"{y:3}")  # "555"
    
    # Округление Pi до десятичного значения
    pi = 3.141592653589793
    print(f"Pi: {pi:.1f}")  # Pi: 3.1
    Ответ написан
    Комментировать
  • Как верно настроить вероятность в мини - игре?

    Vindicar
    @Vindicar
    RTFM!
    0. Главное: вопрос у тебя звучит "Как верно настроить вероятность". В коде ровно одна строчка с random, и ты не объясняешь что она делает. Собственно, и правила игры (т.е. желаемое поведение кода) ты не озвучил. Что такое "подкрутка"? Что тут посоветуешь...
    1. Если ты ловишь себя на том, что создаёшь переменные вида mine_3, mine_4, mine_5, а дальше делаешь x = eval(f"mine_{mines_kolv}[{now_state}]") тебе нужна индексируемая коллекция! Список или кортеж. Тем более что списки ты уже используешь, значит, знаешь, что это такое. Неужели "список из списков" - это такая сложная концепция?
    2. У тебя в самом первом SQL-запросе подстановка параметров выполняется корректно, а дальше идёт ересь с использованием %-форматирования. Не надо так.
    3. У тебя куча таблиц, из которых ты вытаскиваешь по одному значению. Если эти значения всегда требуются вместе, почему не объединить их в одну таблицу?

    Короче, лучшее, что тут можно посоветовать - выкинуть этот код полностью (он исправлению не поддаётся), отложить бота, подучить язык и его средства, в частности, структуры данных и приёмы работы с ними. А потом уже вернуться к боту. Так хотя бы не будешь спотыкаться на простых операциях.
    Ответ написан
    Комментировать
  • Деплой Vue.js на GitHub выдает ошибку?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Неплохо бы, чтоб в следующих своих вопросах ты прикладывал собственно КОД и тест ошибки.
    Я смог выковырять причину из собранного бандла, но тебе просто повезло, куда чаще мне(и 99% людей) так делать лень.

    Теперь, собственно, проблема:
    у тебя в коде есть несколько мест где используется подобная обработка событий:
    @side-emit="(side, id) => { 
        this.players[id].side = side; 
        ...
    }"

    Причина ошибки в том, что ты тут явно используешь this, а внутри шаблона он не нужен, т.к. либо раскрывается неявно автоматически, либо, в случае со <script setup>, не используется вовсе. Следует запомнить: никакого this в шаблонах.
    Вот так будет работать:
    @side-emit="(side, id) => { 
        players[id].side = side; 
        ...
    }"

    Почему работает в режиме разработки? Потому что во время разработки используется упрощённый режим сборки, который совершенно случайно делает доступным правильный this в данном конкретном случае. Просто так совпало.

    Ну и касательно кода: в данном случае использовано аж два антипаттерна, которые лучше вообще не употреблять:
    1. События компонента должны эмитить ровно одно значение. Да, vue позволяет эмитить и принимать сколько угодно значений, однако чаще чем следовало бы это приводит к плохому коду. Желательно придерживаться правила: одно событие - один payload, как в обычных событиях js.
    2. Не следует декларировать функции внутри шаблона. Шаблон сам по себе должен содержать минимальное количество кода. Да, vue позволяет использовать любой js в шаблоне, однако чаще чем следовало бы это приводит к плохому коду. В шаблонах следует использовать маленькие кусочки кода, условно: @side-emit="someValue = $event ? 1 : 2", а что-то сложнее просто выносить в метод компонента\composition функцию: @side-emit="onSlideEmit".
    Ответ написан
    1 комментарий
  • Как убрать папку idea из репозитория?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вы удивитесь, но чтобы убрать папку из репозитория, вам нужно удалить её из репозитория. Только так.

    Например вы можете удалить папку в рабочем каталоге и затем не забыть закоммитить это изменение.

    Если эти файлы нужны в рабочем каталоге, то можно удалить только из репозитория.
    git rm —cached ".idea"
    git commit -m "Delete .idea"
    Файл .gitignore поможет не добавить в репо случайно что-то лишнее. Поэтому мы его создаем в первую очередь, ещё до создания коммитов. Более того, даже если файлы подпадают под правила игнора, это всё равно не запрещает нам их закоммитить при сильном желании.

    Запомните! Простое редактирование файла .gitignore не удаляет никакие файлы из репозитория. Вам надо удалить файлы самостоятельно, создав коммит удаления.
    Ответ написан
    Комментировать
  • Как можно указать доменное имя для контейнера в докере?

    @dronmaxman
    VoIP Administrator
    Создаешь сеть docker, подключаешь контейнера в одну сеть, при подключении указываешь alias (mysite.local) для контейнера который как раз и будет доменным именем.

    docker docker network create <имя сети>
    docker network connect --alias nginx.local <имя сети> container-nginx
    docker network connect --alias apache.local <имя сети> container-apache
    docker network connect --alias mysite.local <имя сети> container-mysql


    Пора уже использовать docker-compose.
    Ответ написан
    Комментировать