Задать вопрос
  • Какие материалы или информацию можно изучить, чтобы решить эту задачу?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    В задаче указаны ссылки на учебные материалы.
    Ответ написан
    Комментировать
  • Как вернуть новый массив объектов только с уникальным id вложенного объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Какие тут есть варианты:

    Object.values(Object.fromEntries(arr.map(n => [ n.user.id, n ])))
    
    // или, если в результирующий массив должны попадать те из "одинаковых" элементов,
    // что расположены в исходном массиве первыми
    
    Object.values(arr.reduce((acc, n) => (acc[n.user.id] ??= n, acc), {}))
    
    // или, если также надо сохранять взаимное расположение элементов
    
    arr.filter(function({ user: { id: n } }) {
      return !(this[n] = this.hasOwnProperty(n));
    }, {})

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

    function* unique(data, key = n => n) {
      const getKey = key instanceof Function ? key : n => n[key];
      const keys = new Set;
    
      for (const n of data) {
        const k = getKey(n);
        if (!keys.has(k)) {
          keys.add(k);
          yield n;
        }
      }
    }

    Теперь можно делать так (ваш случай): const result = [...unique(arr, n => n.user.id)];.

    Или так:

    Array.from(unique([{id: 1}, {id: 2}, {id: 1}, {id: 1} ], 'id')) // [{id: 1}, {id: 2}]

    Или так: ''.concat(...unique('ABBA')) // 'AB'.

    Или так:

    for (const n of unique(Array(20).keys(), n => Math.sqrt(n) | 0)) {
      console.log(n); // 0 1 4 9 16
    }
    Ответ написан
    Комментировать
  • Как сделать рекурсию в js await функции?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    При чём тут рекурсия? Обычный цикл:
    let result = false;
    while(result === false) {
      result = await this.download();
    }
    Ответ написан
    3 комментария
  • Терминология: почему контейнеры называют микросервисами?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Нет, контейнер может содержать и монолит и группу сервисов, но это «не принято в приличном обществе».

    Задача контейнеризации - повторяемость и изоляция среды исполнения

    Задача микросервисов - изоляция доступа по контракту и независимый цикл разработки/деплоймента
    Ответ написан
    Комментировать
  • Как защититься от двойного списания в многопоточном приложении?

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

    Добавь к аккаунту пользователя поле lockedBalance, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

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

    Tash1moto
    @Tash1moto Автор вопроса
    Написал работающий вариант
    const timeline = {start: 100, end: 300 }
    const offsets = []
    const items = [
        { start: 235, end: 270 },
        { start: 135, end: 170 },
    ]
    .sort((a,b) => {
        if(a.end > b.end) {
            return 1
        }
        if(a.end < b.end) {
            return -1
        }
        return 0
    })
    items.forEach((cur, index, arr) => {
        // Start
        if(index === 0) {
            offsets.push({
                start: timeline.start,
                end: timeline.start + cur.start - timeline.start
            })
        }
        // Middle
        if(arr[index+1]) {
            offsets.push({
                start: cur.end,
                end: cur.end + arr[index+1].start - cur.end
            })
        }
        // End
        if(index === arr.length - 1) {
            offsets.push({
                start: cur.end,
                end: timeline.end
            })
        }
    })
    
    console.log(offsets)
    /*
    Result:
    [ { start: 100, end: 135 },
      { start: 170, end: 235 },
      { start: 270, end: 300 } ]
    */
    Ответ написан
    1 комментарий
  • Как отключить выполнение функции Javascript на других страницах?

    @andand44
    Нужно проверять на существование элемент и потом уже обращаться к нему
    if ( document.querySelectorAll(".info-header-tab").length ) {
        alert("Элемент найден!");
    }
    Ответ написан
    2 комментария
  • Как получить текст выбранного option'а?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Поскольку в показанном select'е у option'ов отсутствуют атрибуты value, то их значениями будет их текстовое содержимое. Так что в данном конкретном случае текст можно получить с помощью метода val.

    Ну а вообще:

    $('select').change(function() {
      const text = $(':checked', this).text();
      console.log(text);
    });

    Или, к чёрту jquery:

    document.querySelector('select').addEventListener('change', function(e) {
      const select = this;
      // или
      // const select = e.target;
      // const select = e.currentTarget;
    
      const [ option ] = select.selectedOptions;
      // или
      // const option = select[select.selectedIndex];
      // const option = select.querySelector(':checked');
      // const option = [...select.options].find(n => n.selected);
    
      const text = option.text;
      // или
      // const text = option.textContent;
      // const text = option.innerText;
    
      console.log(text);
    });
    Ответ написан
    Комментировать
  • Как нарисовать плавные струйки дыма?

    DarkWood
    @DarkWood
    Я опишу вам алгоритм, который позволит создать в Illustrator нечто похожее. Подойдет ли оно вам - смотрите сами. Автоматизировать этап создания кривых - крайне сложно. Думаю, из описания сами поймете почему.

    Начинается, собственно, всё с этим самых кривых. Вам нужно две. Чем больше они между собой переплетаются, тем интереснее потом будет узор. Я специально оставил справа ровную часть, чтобы было видно, что она не дает ничего. Если спросите как я сейчас их нарисовал - просто карандашом.

    61802664abff2460020473.png

    Создаете между ними бленд (Ctrl+Alt+B) с дистанцией в 1 пиксель. Можно поставить меньше - тогда переходных кривых будет больше. При толщине контура в 1 пиксель меньше 0.4 пикселя ставить уже особого смысла не будет.

    618026a380abc845121510.png

    Не переживайте, что всё слилось в одноцветье. Кстати, желаемый цвет вы можете задать как сейчас, так и на следующем этапе. Рекомендую делать это как раз там.

    На всякий случай скопируйте бленд (Ctrl+C > Ctrl+F), чтобы была возможность что-то исправить, если последующий результат не понравится.

    Выполните команду Object> Blend> Expand.

    Далее Shift+Ctrl+G

    Задаете малую непрозрачность (около 10%). Как раз сейчас лучше всего менять цвет. Можете также поменять режим смешивания.

    618026b345bc8360746368.png

    Ctrl+G.

    Большее свечение на "петлях" можно сделать дубликатом этой группы (Ctrl+C > Ctrl+F). Эту копию тоже надо будет потом разгруппировать (Shift+Ctrl+G) изменить цвет на более светлый, непрозрачность и режим смешивания по вкусу.

    618026de13dcb347638107.png

    Собственно, узор готов.

    При создании бленда вы можете нарисовать еще одну кривую и расположить ее в панели слоев между двух других. Дальше весь фокус в том, что ей нужно задать цвет фона. И в данном случае цвет других кривых нужно задавать сейчас. Потом тоже можно через команду Recolor Artwork, но это лишние действия.

    618026e910192073261890.png

    Продолжение такое же: Shift+Ctrl+G, меняете прозрачность, режим смешивания и т.п.

    618027083db5a504901276.png

    Можно добавить еще одну кривую цвета фона и переплести ее с остальными. Можно переплетать два бленда от основного цвета к цвету фона и т.д. и т.п.

    Все команды, кроме рисования кривых, прекрасно записываются в экшен.
    Ответ написан
    2 комментария
  • Как получить счастливое число?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тут всё плохо:
    function isHappy(array){
      // записываем пустой массив в array
      // (не важно что там мы получили, теперь этого нет)
      array = [] 
      // получаем 6 переменных с значением "ничего"(undefined)
      let[x,y,z,b,n,v] = array
      // сравниваем x+y+z == b+n и выкидываем, никак не используя
      // с помощью оператора запятая(,) в if попадает только v
      // как мы знаем во всех переменных undefined - if(undefined) - ложь
      if(x+y+z == b+n,v){
        console.log(`Число ${array} - счастливое!`);
      }
      else{
        console.log(`Число ${array} - несчастливое`);
      }
    }
    // вызываем isHappy с аргументом 000000, который является числом 0, 
    // просто записанным длинно, а не массивом
    isHappy(000000)
    Ответ написан
    8 комментариев
  • Как классифицировать/сгруппировать элементы числового ряда так, чтобы сумма элементов в каждой группе была примерно одинаковой?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Это задача об оптимальном разбиении на подмножества, она NP-сложная. Тут нет какого-то простого и быстрого алгоритма.

    Полный перебор, метод ветвей и границ, всякие методы отжига и генетические алгоритмы вам в помощь.

    В отдельных случаях (сумма не очень большая и множеств всего 2; числа очень маленькие) возможны быстрые алгоритмы на основе динамического программирования
    Ответ написан
  • Вывести все числа у которых 5 делителей до 300?

    YuriyVorobyov1333
    @YuriyVorobyov1333
    Software Developer
    Вы не обнуляете nums, счетчик постоянно наращивается
    Ответ написан
    2 комментария
  • Как совместить elasticsearch и php 7.0?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    > хочется понять насколько сложно сделать апдейт на 3 версии.

    Несложно. Отличия минимальны. В рамках одной мажорной версии вообще никаких проблем. Тут вопрос даже не в трудностях, а в том, что оставаться на 7.0 это вообще не вариант.
    Только переезжать надо на 7.4, потому что поддержка 7.3 прекращается через месяц.

    И вообще, версию надо подтягивать не когда жареный петух в зад клюнет, а планово.
    Ответ написан
    1 комментарий
  • Как проверить, что значение является итерируемым?

    0xD34F
    @0xD34F Куратор тега JavaScript
    x?.[Symbol.iterator] instanceof Function
    Ответ написан
    Комментировать
  • Как в докер установить ubuntu?

    saboteur_kiev
    @saboteur_kiev Куратор тега Ubuntu
    software engineer
    докер это контейнер для запуска конкретного приложения в определенной среде, а не для запуска операционной системы. Что система будет делать в контейнере? Какой конкретно процесс от системы вы хотите запустить в докере?

    Для запуска операционной системы есть виртуальные машины, а докер - в принципе суть заключается в том, что запускается конкретный процесс, в изолированной среде, в текущей ОС.
    Ответ написан
    Комментировать
  • Как узнать кол-во всех квадратов в числе?

    VlasenkoFedor
    @VlasenkoFedor
    Программист: php, js, go
    Это все нечётные числа из цифр 1,4,9
    Функция называется mutations
    думаю за 5 мин вы найдете массу реализаций
    Ответ написан
    2 комментария
  • Как получить значение из массива, которое используется n раз?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Коротко:

    const getRepetition = (arr, repeated) => Array
      .from(arr.reduce((acc, n) => acc.set(n, -~acc.get(n)), new Map))
      .reduce((acc, n) => (n[1] === repeated && acc.push(n[0]), acc), []);

    Длинно:

    function getRepetition(arr, repeated) {
      const result = [];
      const count = {};
    
      for (const n of arr) {
        if (!count.hasOwnProperty(n)) {
          count[n] = 0;
        }
    
        count[n]++;
      }
    
      for (const n in count) {
        if (count[n] === repeated) {
          result.push(+n);
        }
      }
    
      return result;
    }
    Ответ написан
    1 комментарий