Задать вопрос
  • Как запустить js код на сервере?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Установить на сервере Node.js и запустить как на локальном компьютере. В чём конкретный вопрос?
    Ответ написан
    4 комментария
  • Почему выходит undefined?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. randNum содержит число.
    2. questFunc() возвращает строку с текстом вопроса.
    3. people[`${questFunc()}`] это, например, people["Это девушка?"] – будет undefined.
      Массив people не имеет строкового ключа. В нём два элемента с индексами 0 и 1.

    Я бы предложил не дублировать текст вопросов, а работать с их индексами. Так лаконичнее:
    spoiler
    const questions = [
      'Это самец?',
      'Это девушка?',
      'Носит очки?',
      'Занимается спортом?',
      'У этого человека смуглая кожа?',
    ];
    const people = [
      { name: 'Егор', profile: [1, 0, 1, 1, 1] },
      { name: 'Залина', profile: [0, 1, 1, 1, 0] },
    ];
    
    const questionElement = document.querySelector('.question');
    
    let questionIndex; // индекс текущего вопроса
    function askQustion() {
      questionIndex = Math.floor(Math.random() * questions.length);
      questionElement.innerHTML = questions[questionIndex];
      return questions[questionIndex];
    }
    
    askQustion();
    
    // TODO: принять ответ пользователя (true/false)
    const answer = true; // допустим, ответил "да"
    
    const candidates = people
      .filter(({ profile }) => !!profile[questionIndex] === answer)
      .map(({ name }) => name)
      .join(', ');
    
    console.log('Кандидаты:', candidates);
    Ответ написан
    Комментировать
  • Как задать задержку для fetch при скачивании более 4000 фото?

    RAX7
    @RAX7
    Помимо случайной задержки нужно еще ограничить количество одновременных запросов, примерно так:
    function randomDelay(min = 250, max = 750) {
      return new Promise((resolve) => {
        const ms = Math.random() * (max - min) + min;
        setTimeout(resolve, ms);
      });
    }
    
    function downloadAll(urls, limit = 4) {
      return new Promise((resolveAll, rejectAll) => {
        const result = [];
        const iter = urls.entries();
        let fulfilled = 0;
    
        const next = () => {
          const { done, value } = iter.next();
    
          if (done) {
            if (fulfilled === urls.length) {
              resolveAll(result);
              return;
            }
    
            return;
          }
    
          const [index, url] = value;
          const onFulfilled = (val) => {
            result[index] = val;
            fulfilled += 1;
            next();
          };
    
          randomDelay()
            .then(() => fetch(url))
            .then(onFulfilled, rejectAll);
        };
    
        for (let i = 0, l = Math.min(limit, urls.length); i < l; i++) {
          next();
        }
      });
    }
    
    const urls = Array.from(
      { length: 100 },
      (_, i) => `https://jsonplaceholder.typicode.com/todos/${i + 1}`
    );
    
    (async () => {
      const responses = await downloadAll(urls, 2);
      const data = await Promise.all(responses.map((r) => r.json()));
      console.log(data);
    })();
    Ответ написан
    1 комментарий
  • Как задать задержку для fetch при скачивании более 4000 фото?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно в N параллельных «потоков» скачивать. В каждом случайная пауза перед очередным URL:
    const N = 3;
    
    const delay = ms => new Promise(res => setTimeout(res, ms));
    
    const next = () => {
      if (items.length > 0) {
        return download(items.shift())
          .then(delay(500 + Math.floor(Math.random() * 500))) // случайная пауза между закачками
          .then(next);
      }
    };
    
    const works = Array.from({ length: N }, () =>
      Promise.resolve()
        .then(next)
        .catch(console.error)
    );
    
    Promise.all(works).then(() => console.log('All Done'));
    Ответ написан
    1 комментарий
  • Какое оптимальное время въехать в проект?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    От проекта зависит. На моëм проекте например новичкам даже сеньорского уровня до первой простой таски требуется недели две, а выход на 100℅ эффективность занимает 3-6 месяцев.
    Ответ написан
    9 комментариев
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    saboteur_kiev
    @saboteur_kiev Куратор тега Веб-разработка
    software engineer
    С хрена ли это работа девопса? Поднять и запустить проект программист не способен?
    Девопс на отдельную ставку - это оркестрация сотнями и тысячами виртуалок/контейнеров/пайплайнов и так далее.

    А вот то, что это ввязали вам в работу это уже совсем другой вопрос, который должен был уточняться на этапе начала работ, в каком виде вы передаете проект.
    Ответ написан
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    2ord
    @2ord

    а договора небыло. просто был прислан текстовый файл с заданием и я ответил что сделаю это.

    Договор - это юридический документ с подписями сторон, чтобы в случае нарушений можно было отстаивать свои права в суде, обычно с адвокатом. В случае работы с заказчиком надо ещё ознакомиться с международным правом и другими тонкостями.
    Так что в твоём случае - это скорее, уговор(-чик) и с ним едва можно добиться чего-то, даже с адвокатом. А хорошие адвокаты за такую мелочёвку даже не возьмутся.

    Так что проще всего максимально оградить от проблем изначально, чтобы избежать недопонимания, как описал Владимир Коротенко . Ну и финансовая сторона. И действовать поэтапно, не выполняя работы без оговоренной предоплаты
    Сроки и всё такое - должно быть описано, чтобы всегда был пункт
    б) а если "так", то будет "вот так".

    Это можно писать простым языком, не юридическим. Никому не хочется заниматься с судами и многие вопросы лучше заранее решать за их пределами.
    Так что условия доставки ПО нужно хорошо обговорить. Кому-то достаточно доступа к GitHub,а кому-то нужно развернуть прямо в продакшен сервере. И даже на Маке ))
    Ответ написан
    2 комментария
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В реальности фриланса, вы являетесь и бизнес аналитиком и проджект менеджером и тимлидом и девопсом и бухгалтером и много много других вещей.
    Клиенту же нужен "продукт". То есть в большинстве случаев клиент подразумевает что вы настроите и запустите все.

    Так что настройте и на будущее при переговорах это обсуждайте, и вопросы примерно следующие:

    * Формат поставки
    * Операционная система
    * Доступы
    * Права на исходный код
    * Порядок приемки кода
    * Прочее

    То есть чем более точно вы все опишите в ТЗ и договоре, тем меньше у вас будет проблем
    Ответ написан
    3 комментария
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Нужно поставлять свои решения с развертыванием в докере. Компоуз файл ему отдаете и говорите. что дальше не ваша забота. Может он на QNX каком-нибудь или OS/2 решил бы все завести. Это его проблемы.
    Ну а то, что вы не согласовали заранее требования к платформе и окружению, не оговорили в каком виже будет поставка и какие вы готовы обеспечить работы по развертыванию - это теперь ваши обоюдные роблемы.
    Если вы уже отдали ему исходники, то он может попытаться свалить с ними под предлогом, что вы ничего не развернули на его железе.
    То. что не оговорено в договоре, будет геморроем. Ну а там уж только меряться кому геморрой длиннее покажется.
    Ответ написан
    Комментировать
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    @vitaly_il1
    DevOps Consulting
    По-моему, ответ простой - что было записано в договоре, то и обязан.
    Т.е. если речь шла о коде - то только код. Если договаривались о "запустить на сервере" - то надо ставить на сервер. Но вот о том, что для вебсервера используют Мак, я еще не слышал :-)
    Ответ написан
    11 комментариев
  • Как сделать плавающую кнопку без срипта?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Делается элементарно.
    Фиксированно позиционированная кнопка. По клику выезжают еще кнопки, абсолютно позиционированные.
    Скриптов - пара строк.
    Функциональных стилей - с десяток строк.
    Плюс оформление.
    Ответ написан
    4 комментария
  • Как выставить шанс функции Math.random?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const phones = [
      { p: '9171857450', c: 1 },
      { p: '9880735438', c: 10 },
      { p: '9880735439', c: 100 },
      { p: '9880735779', c: 2 },
      { p: '9170997305', c: 2 },
      { p: '9170997493', c: 2 },
      { p: '9880634879', c: 5 },
      { p: '9170996154', c: 1 },
      { p: '9880728447', c: 1 },
    ];
    const chancesTotal = phones.reduce((acc, { c }) => acc + c, 0);
    const selected = Math.floor(Math.random() * chancesTotal);
    let phone;
    for (let i = 0, sum = 0; i < phones.length; i++) {
      sum += phones[i].c;
      if (selected < sum) {
        phone = phones[i].p;
        break;
      }
    }
    const randomUrl = `https://wa.me/${phone}?text=Привет!%20Пришлите%20мне%20цены%20на%20рыбку!`;
    Ответ написан
    5 комментариев
  • Какой стек использовать для разработки SPA?

    @rPman
    Для обучения нужно работать с минимумом фрейморков в идеале вообще без них, буквально
    Чтобы было понимание 'как это работает на самом деле'

    Без этого понимания любой фреймворк для тебя будет черным ящиком, и любые даже минимальные проблемы решить самостоятельно не сможешь!
    Ответ написан
    3 комментария
  • Как сгенировать массив из времени с интервалом?

    Удобно работать с объектами Date.
    const makeDate = HHMM => {
      const [H, M] = HHMM.split(':').map(Number);
      const D = new Date();
      D.setHours(H);
      D.setMinutes(M);
      D.setSeconds(0);
      return D;
    };
    
    const oo = n => n.toString().padStart(2, '0'); // 5 => '05'
    
    const fillTime = (startHHMM, finishHHMM, intervalMinutes) => {
      let startDate = makeDate(startHHMM);
      let finishDate = makeDate(finishHHMM);
      if (startDate > finishDate) { // объекты Date можно так сравнивать
        [startDate, finishDate] = [finishDate, startDate]; // поменять местами
      }
    
      const dates = [];
      const D = new Date(startDate);
      while (D <= finishDate) {
        dates.push(new Date(D));
        D.setMinutes(D.getMinutes() + intervalMinutes);
      }
    
      return dates.map(D => [D.getHours(), D.getMinutes()].map(oo).join(':'));
    };
    
    console.log(fillTime('15:56', '18:15', 17));
    // [ "15:56", "16:13", "16:30", "16:47", "17:04", "17:21", "17:38", "17:55", "18:12" ]
    Ответ написан
    1 комментарий
  • Как объединить объекты, у которых совпадает значение определённого свойства, суммируя другие свойства?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const groupSum = (arr, idKey, ...sumKeys) =>
      Object.values(arr.reduce((acc, n) => (
        acc[n[idKey]] ??= sumKeys.reduce((group, k) => (
          group[k] = 0,
          group
        ), Object.assign(new n.constructor, n)),
        sumKeys.forEach(k => acc[n[idKey]][k] += n[k]),
        acc
      ), {}));

    // ваш случай
    const result = groupSum(arr, 'product', 'price', 'selling_price', 'quantity');
    
    // элементам исходного массива не обязательно быть объектами, это могут быть и массивы
    groupSum([
      [ 'A',   1, 10 ],
      [ 'A',   2, 20 ],
      [ 'A',   3, 30 ],
      [ 'B',   1,  5 ],
      [ 'B',  10,  5 ],
      [ 'B', 100,  5 ],
    ], 0, 1, 2) // [ [ 'A', 6, 60 ], [ 'B', 111, 15 ] ]
    Ответ написан
    2 комментария
  • Почему так популярны телеграм боты?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ботов писать относительно просто, порог вхождения минимальный по сравнению с программированием под iOS и андроид, да и проще написания десктопных приложений с GUI, а в использовании боты проще, чем утилиты командной строки.
    Зато в результате может получиться довольно функцинальная штука. Легко настроить многоэтапную диалоговую коммуникацию с пользователем, получить для обработки изображения и фото, возвращать ссылки на скачивание результатов.

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

    В общем все хотят всё и сразу, и чтоб легко, бесплано и не надо было учиться.
    Ответ написан
    Комментировать
  • Как написать функцию, которая возвращает массив индексов элементов, у которые значение равно value?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    возвращает массив индексов элементов, у которые значение равно value.

    const findIndex = (arr, value) => arr
      .map((v, i) => ({ v, i }))
      .filter(({ v }) => v === value)
      .map(({ i }) => i);
    Каждый элемент массива переделать в объект, где v: элемент, а i: индекс в массиве.
    Затем отфильтровать, оставив только те, где бывш.элемент === value
    В конце вернуть вместо каждого оставшегося элемента только его индекс i
    Ответ написан
    2 комментария
  • Как заставить JS нормально работать с кодировкой?

    Seasle
    @Seasle Куратор тега JavaScript
    const textDecoder = new TextDecoder('windows-1251');
    const response = await fetch(...);
    const buffer = await response.arrayBuffer();
    const text = textDecoder.decode(buffer);
    Ответ написан
    2 комментария
  • Как PHP получить получить JSON из JAVASCRIPT?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вообще все неправильно делаешь.

    Отправляешь данные из браузера на сервер вот так:
    (async function() {
        var result = await $.post('api/index.php', { raz: 'Привет, мир!' } );
        console.log('Ответ сервера:', result);
    })();

    Открой консоль CTRL + Shift + J, чтобы посмотреть ответ выведенный через console.log

    На сервере все что ты отправил будет лежать внутри суперглобального массива $_POST

    Можешь записать его в файл и посмотреть, что было внутри:
    <?php
    
    header('Content-Type: text/plain; charset=UTF-8');
    
    $json = json_encode($_POST, JSON_UNESCAPED_UNICODE);
    
    file_put_contents('POST.json', $json);
    
    echo 'Данные получены и записаны в файл POST.json -> смотри его.';
    Ответ написан
    Комментировать
  • Как определить положение текста с помощью JS?

    Seasle
    @Seasle Куратор тега CSS
    Можно посчитать насколько блок Б (.hint) пересекается с блоком А (основным текстом), и после, с использованием полученного и порогового (задаёте сами), можно решить, что делать с блоком.
    const clamp = (min, max, value) => Math.max(min, Math.min(max, value));
    
    const calculateIntersection = (a, b) => {
        const aRect = a.getBoundingClientRect();
        const bRect = b.getBoundingClientRect();
        const top = clamp(aRect.top, aRect.bottom, bRect.top);
        const right = clamp(aRect.left, aRect.right, bRect.right);
        const bottom = clamp(aRect.top, aRect.bottom, bRect.bottom);
        const left = clamp(aRect.left, aRect.right, bRect.left);
        const width = right - left;
        const height = bottom - top;
    
        const totalArea = bRect.width * bRect.height;
        const intersectionArea = width * height;
        const intersectionRatio = intersectionArea / totalArea;
    
        return intersectionRatio;
    };


    Ответ написан
    Комментировать