Задать вопрос
  • Можно ли давать людям сервера на docker?

    @Akela_wolf
    Extreme Programmer
    Docker != VPS

    Главное отличие: VPS - это сервер к которому пользователь имеет полный доступ и может устанавливать и запускать любые программы. Docker - это инструмент для запуска единственного процесса в определенном окружении.

    Чтобы раздавать другим людям серверы нужен гипервизор. Чтобы установить гипервизор нужен полноценный сервер, а не VDS.
    Ответ написан
    Комментировать
  • Как убрать дождь и туман с фото?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Частично можно это сделать фильтрами, но в общем виде задача нерешаемая.
    Люди вручную в фотошопе это делают, подстраиваясь под конкретную фотографию, а ты даже пример фото не привёл
    Ответ написан
    Комментировать
  • Как записать рекурсию (функц. глубокого копирования) в виде цикла?

    0xD34F
    @0xD34F
    Используйте стек.

    Если, обрабатывая данные, натыкаетесь на объект, надо сохранить в стек текущее состояние - ссылку на копируемые данные, индекс текущего элемента, ссылку на объект, куда копируете; затем установить новое состояние - копируемыми данными будет массив пар ключ-значение встреченного объекта, индекс обнуляется (на самом деле надо выставить -1, нулевое значение будет получено при переходе к следующей итерации; конечно, можно и буквально 0 выставлять, но тогда придётся усложнить работу с индексом - тут увеличиваем, а тут нет), пустой объект в качестве копии.

    Если данные закончились, надо восстановить состояние из стека.

    Условий, при которых возможно продолжение цикла, будет два - кроме наличия необработанных данных ещё и непустой стек.

    function clone(value) {
      const clone = {};
      const stack = [];
    
      for (
        let i = 0, source = [ [ '', value ] ], target = clone;
        i < source.length || stack.length;
        i++
      ) {
        if (i === source.length) {
          [ i, source, target ] = stack.pop();
        } else {
          const [ k, v ] = source[i];
          const isObject = v instanceof Object;
    
          target[k] = isObject ? v.constructor() : v;
    
          if (isObject) {
            stack.push([ i, source, target ]);
            [ i, source, target ] = [ -1, Object.entries(v), target[k] ];
          }
        }
      }
    
      return clone[''];
    }

    Или, если в копируемом объекте могут быть циклические ссылки или какой-то из вложенных объектов встречается несколько раз и так же должно быть и в копии, то надо запоминать встреченные объекты, чтобы не обрабатывать их повторно - воспользуемся Map'ом, где ключами будут оригинальные объекты, а значениями их копии.

    Как выглядит получение копии объекта: проверяем, встречался ли указанный объект ранее, если нет - создаём новый объект, сохраняем его в Map, а также кладём его вместе с оригиналом в стек, для последующей обработки; достаём из Map'а копию.

    Крутим цикл, пока стек не пуст, на каждой итерации достаём из стека объект и его копию, перебираем свойства оригинала, записываем в копию копии значений.

    function clone(value) {
      const stack = [];
      const clones = new Map;
      const getClone = val => val instanceof Object
        ? (clones.has(val) || stack.push([ val, clones.set(val, val.constructor()).get(val) ]),
           clones.get(val))
        : val;
    
      for (getClone(value); stack.length;) {
        const [ source, target ] = stack.pop();
        Object.entries(source).forEach(n => target[n[0]] = getClone(n[1]));
      }
    
      return getClone(value);
    }

    как правильнее всего будет это сделать?

    Перестать заниматься ерундой и начать использовать готовые решения - structuredClone или cloneDeep, например.
    Ответ написан
    Комментировать
  • Как написать этот код легче?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const newData = data.reduce((acc, n) => {
      const k = Object.keys(n)[0];
      (acc.result[acc.keys[k] = (acc.keys[k] ?? -1) + 1] ??= []).push(n);
      return acc;
    }, { result: [], keys: {} }).result.flat();

    или

    const numKeys = new Set(data.flatMap(Object.keys)).size;
    const numObjs = data.length / numKeys;
    const newData = data.map((n, i, a) => a[(i % numKeys) * numObjs + (i / numKeys | 0)]);
    Ответ написан
    2 комментария
  • Почему в миксин нельзя передать экземпляр класса?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Метод say лежит в прототипе экземпляра Sounds, а не в самом экземпляре.
    Object.assign копирует только содержимое непосредственно объекта, не заглядывая в его прототип. Так мир устроен.
    Ответ написан
    1 комментарий
  • Что нужно знать для junior frontend developer?

    @goshaLoonny
    Frontend Developer Roadmap карта составленная профессионалами отрасли. Последнее обновление информации было 19 дней назад.
    И 191К звезд на гитхабе подтверждают надежность информации
    github: kamranahmedse/developer-roadmap
    Ответ написан
    2 комментария
  • Как почистить Git-репозиторий?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вот несколько фактов, которые помогут понять как работает Git.
    • Файл .gitignore действует только на ещё не отслеживаемые файлы.
    • Файл .gitignore предназначен для описания того, что мы не хотим СЛУЧАЙНО добавить в репозиторий. Либо не хотим случайно удалить переключив ветку.
    • Мы можем ПРИНУДИТЕЛЬНО добавить в репозиторий ЛЮБОЙ файл, даже если он описан в .gitignore.
    • Добавление файла в .gitignore не удалит сам файл из репозитория. Если файл УЖЕ в репозитории, то он продолжит отслеживаться, независимо от наличия .gitignore.
    • Если больше не хотим отслеживать какой-то файл, то просто удаляем его из репозитория. Ключ --cached позволит оставить файл в рабочем каталоге текущего репозитория если он нужен.
    git rm --cached -- '.DS_Store'
    git commit

    Но последний рецепт сработает только на одном компьютере. Если коллеги переключатся на этот коммит, то файл удалится у них из рабочего каталога.
    Ответ написан
    4 комментария
  • Docker как использовать?

    xez
    @xez
    TL Junior Roo
    Если в вас не винда, то можно NVM использовать.
    И докер не нужен.
    Ответ написан
    8 комментариев
  • Почему setTimeout не работает в then?

    Seasle
    @Seasle Куратор тега JavaScript
    let p = new Promise((res, rej) => {
        // Ждем 7сек; вызываем функцию res с аргументом 2
        setTimeout(res, 7000, 2);
    })
        // Возвращаем новый промис; ждем 5сек; вызываем функцию res с аргументом 6 (2 + 4)
        .then((data) => new Promise((res) => setTimeout(res, 5000, data + 4)))
        .then((data) => console.log('data', data)); // 'data' 6
    
    setTimeout(() => console.log(p), 10000); // Просто выведем промис
    Ответ написан
    2 комментария
  • Выражение внутри switch?

    @wonderingpeanut
    Приветствую. Можно, если изменить код:
    switch (true) {
      case var < 5:
        ...
      case var > 5:
        ...
      default: 
        ...
    }
    Ответ написан
    Комментировать
  • Как найти последний индекс в массиве в диапозоне с помощью findIndex()?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const findLastInRangeIdx = (arr, from, to) => 
      arr.reduce(
        (acc, item, idx) => (item > from && item < to ? idx : acc),
        -1,
      );
    Ответ написан
    4 комментария
  • Каким образом создание новых экземпляров класса тормозит работу браузера на примере слайдера?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    С чем это связано?
    С тем, что рендеринг элементов не бесплатный.

    Как с этим бороться?
    Инициализировать 5, а не 50. Остальные - по явному запросу пользователя, выгружая при этом из памяти старые ненужные.
    Ответ написан
    Комментировать
  • Как распространять сообщение в сети независимых агентов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это называется Delay Tolerant Networking.

    Есть куча статей и конференций на тему. Это активная область исследования и каких-то окончательных ответов тут человечество пока не придумало, но есть куча очень умных алгоримов.
    Ответ написан
    Комментировать
  • Как разбить строку на определенное количество строк?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function chunked(str, numChunks) {
      const chunkSize = Math.ceil(str.length / numChunks);
      return Array.from(
        { length: numChunks },
        (n, i) => str.slice(i * chunkSize, (i + 1) * chunkSize)
      );
    }

    или

    function chunked(str, numChunks) {
      return str.match(RegExp(`.{1,${Math.ceil(str.length / numChunks)}}`, 'g'));
    }

    или

    function chunked(str, numChunks) {
      return str.split(RegExp(`(.{${Math.ceil(str.length / numChunks)}})`)).filter(Boolean);
    }


    UPD. В комментариях докладывают:

    неаккуратненько как-то:
    chunked('test', 3) // [ "te", "st", "" ]

    Это поправимо. Наверное.
    const chunked = (str, numChunks) =>
      numChunks <= str.length
        ? Array.from(
            { length: numChunks },
            function(n, i) {
              return str.slice(i * this, i === numChunks - 1 ? str.length : (i + 1) * this);
            },
            str.length / numChunks | 0
          )
        : 'извини, столько непустых кусков нарезать нельзя';

    или

    function chunked(str, numChunks) {
      const chunkSize = str.length / numChunks | 0;
      const numLooseItems = str.length % numChunks;
    
      return Array.from(
        { length: numChunks },
        function(_, i) {
          return str.slice(this(i), this(i + 1));
        },
        i => i * chunkSize + Math.min(i, numLooseItems)
      );
    }

    Ответ написан
    4 комментария
  • Как лучше сохранять дату и время?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Есть встроенный тип времени и даты и даже не один. Используйте его, а не костыли.

    INT -231 (-2,147,483,648) to 231-1 (2,147,483,647) 4 Bytes
    DATETIME 8 bytes
    7 * 4 = 28 это одна ваша запись оверхед в 20 байтов.
    Плюс по вашим данным нельзя искать используя встроенные функции и операторы, в общем реальная дичь.

    Кстати что натолкнуло на такую конструкцию?
    Ответ написан
    9 комментариев
  • Почему при пайке, отрывая жало от точки припоя, за жалом тянется хвост?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это случается потому что припой на плате с компонентами остывает быстрее, чем та часть, что тянется за жалом.

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

    Альтернатива - использовать жало, к которому припой не пристает вообще. Такие есть. Разумеется подача припоя и флюса становится сложнее, тут и пригодится паяльная паста. Ну а там где паяльная паста, то уже недалеко и до паяльного фена.

    Еще можно купить вот такую хрень https://www.aliexpress.com/item/1005003523148728.html и паять все компоненты разом. Стоит не так дорого. Если у вас плата сделана правильно, то компоненты в перевернутом состоянии будут удерживаться за счет сил поверхностного натяжения.
    Ответ написан
    Комментировать
  • Как зная число, высчитывать от него значение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Формула: y = 4 - x/2
    (находится с помощью простой школьной математики)
    Это линейная функция. Значит, формула нужна примерно такая:
    y = k * x + b
    Нужно найти k и b по известным x и y. Подставим. Получим систему уравнений:
    2 = k * 4 + b
    2.5 = k * 3 + b
    Вычтем второе из первого:
    -0.5 = k
    Далее находим, что:
    b = 4
    Итоговая формула:
    y = - 0.5 * x + 4

    Соответственно, классическая функция будет выглядеть как-то так:
    function Fn(x) {
      return 4 - x/2;
    }
    Ответ написан
    Комментировать
  • Есть ли подобная структура в js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Нет. Тип значения которое уже было возвращено всегда конкретен. Либо это строка, либо это объект.
    Можно возвращать объект с методом toString который будет возвращать нужной строку при приведении к строке, но это не равносильно возвращению самой строки.
    const ROUTES = {
      blog: {
        art: 'page-art',
        toString() {
          return 'section-blog'
        }
      }
    }
    ROUTES.blog.art // page-art
    ROUTES.blog // object
    'text: ' + ROUTES.blog // text: section-blog

    Также можно попытаться накостылять магию с прототипом String, но это только в качестве развлечения, на проде за такое руки оторвут.)
    Ответ написан
    Комментировать