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

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const createPausableTimer = (cb, timeout, ...args) => {
      let lastStart = Date.now();
      let paused = false;
      let timerID = setTimeout(cb, timeout, ...args);
      let remainingTime = timeout;
      return {
        pause() {
          if(paused) { return; }
          clearTimeout(timerID);
          paused = true;
          remainingTime -= Date.now() - lastStart;
        },
        resume() {
          if(!paused || remainingTime < 0) { return; }
          lastStart = Date.now();
          paused = false;
          timerID = setTimeout(cb, remainingTime, ...args);
        }
      };
    };
    
    element.addEventListener("animationend", () => {
      const timer = createPausableTimer(() => {
        console.log("timeout!");
        element.removeEventListener("mouseover", timer.resume);
        element.removeEventListener("mouseout", timer.pause);
      }, 1000);
      element.addEventListener("mouseover", timer.resume);
      element.addEventListener("mouseout", timer.pause);
    });
    Ответ написан
    Комментировать
  • А вы правда умеете программировать?

    bingo347
    @bingo347
    Crazy on performance...
    В вопросе наглядный пример моего утверждения, что "учить" - это плохое слово. В нашем мозгу оно ассоциируется с зазубриванием чего-либо. Вот только зазубривая что-либо освоить это не получится. Но тем не менее слово "учить" встречается крайне часто: люди пытаются учить программирование, учить языки (неважно C# или английский), а учить таблицу умножения нас подсаживают еще с младших классов. Не надо учить. Это бесполезно. Стихи еще можно учить, понимание мыслей автора это не даст, но память натренирует. А вот программирование, языки и таблицу умножения учить не нужно, нужно понять. Правда вот учителя начальных классов многие сами таблицу умножения не понимают, а тупо заучили наизусть, и так и продолжают передавать ученикам, с XIX века ничего не поменялось.
    Вы можете выучить синтаксис языка, но это лишь шелуха, абстракция, набор правил как преобразовывать этот язык в другой. Без понимания знание абсолютно бесполезное. Ну знаете Вы, что существуют в некотором условном языке if, for, while. Но сможете ли Вы из этого составить некоторую программу без понимания что это и зачем. А заучивание Вам этого понимания не даст.
    Вы можете выучить функции стандартной библиотеки, но это опять шелуха. Эти функции кто-то написал, часто на том же самом языке, на котором Вы их используете. Но без понимания, что они делают Вы и с ними программы не составите.
    А как Вы собираетесь учить составление алгоритмов? Да у многих сейчас есть мнение, что этот навык не нужен, что все алгоритмы уже составлены, но это иллюзия.
    А навык решения проблем, как заучить его?

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

    То есть все, что Вы собрались учить - это лишь инструменты. Скажите, сделает ли Вас плотником, то что Вы зазубрили как выглядит молоток, а как рубанок? Зато плотник может не знать, как работать с каким-то конкретным станком, но достаточно быстро начнет с ним работать, если дать ему документацию к этому станку. С программистами все так же.
    Ответ написан
    Комментировать
  • Как вывести переменную из js в html class?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вас не смутило, что getElementById в единственном числе, а getElementsByClassName - во множественном?
    getElementsByClassName возвращает коллекцию элементов, а не один элемент.
    Ответ написан
    4 комментария
  • Почему изображение не отправляется на сервер?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Объект File при сериализации в JSON не выдаст Вам содержимое файла. Более того, бинарные данные в чистом виде в JSON вообще сериализовать не получится.
    Используйте FormData и отправляйте данные в multipart/form-data формате, на php их можно будет получить из $_POST и $_FILES
    Ну и насколько помню, file_put_contents работает со строками в качестве данных, но никак не с объектами.
    Ответ написан
    Комментировать
  • Как заменить n++ с помощью reduce?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    как переписать код, чтобы не использовать let, а всегда увеличивать на единицу внутри функции?
    В примере как раз Ваш случай:
    https://www.npmjs.com/package/@lambda-fn/cell#example
    Ответ написан
    Комментировать
  • Как переписать for на map для асинхронного кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Именно с map никак не сделать, что бы следующий вызов функции ждал предыдущего, как это происходит в цикле с await, а вот с reduce уже можно:
    const list = [
      'main',
      'main-footer',
      'main-header',
      'main-content',
    ];
    
    list.reduce((p, item) => p.then(() => funcOne(item)), Promise.resolve());
    Ответ написан
    Комментировать
  • Как сложить значения (числа) внутри объекта в JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const sum = Object.values(appData.optionalExpenses).reduce((s, v) => s + v, 0);
    console.log(sum);
    Ответ написан
    2 комментария
  • Как найти первый уникальный символ в строке?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const firstNonRepeatingLetter = str => Object.entries(
      Array.prototype.reduce.call(str, (acc, char) => ({
        ...acc,
        [char]: (acc[char] || 0) + 1
      }), {})
    ).filter(([,count]) => count === 1)[0]?.[0] || '';
    Ответ написан
    Комментировать
  • Почему TypeScript не правильно определяет тип?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Потому что по сути под капотом такой тип:
    type Array<T> = {
      length: number;
      [i: number]: T;
    } & ArrayMethods<T>;
    где ArrayMethods - описание методов из прототипа
    Ответ написан
    2 комментария
  • Как так обрезается svg?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Добавьтеoverflow: visible;в &__svg
    Ответ написан
    1 комментарий
  • Как можно реализовать данную структуру?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    console.log(
      Object.values(inventory).map(
        ({title, amount}) => `${title}, находится в инвентаре, в количестве ${amount} штук${
          amount % 10 === 1 && amount % 100 !== 11 ? 'и' : ''
        }`
      ).join('\n')
    );
    Ответ написан
    Комментировать
  • Как передать событие клика из компонента №1 передать в компонент №2?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вообще, если компонент завязан на родительский компонент, то это говорит о проблемах с архитектурой.
    Но если очень надо, то можно:
    1. подписаться на события родительского компонента, обратившись к нему через this.$parent
    https://ru.vuejs.org/v2/guide/components-edge-case...
    2. родительский компонент может вызвать методы любого потомка, на который он навешал ref
    https://ru.vuejs.org/v2/guide/components-edge-case...
    Ответ написан
    2 комментария
  • Зачем сервису (memcached) два файла /etc/init.d/memcached и /lib/systemd/system/memcached.service?

    bingo347
    @bingo347
    Crazy on performance...
    Первый для init.d второй для system.d, в разных дистрибутивах будет только один из них
    Ответ написан
    3 комментария
  • Нужно ли обнулять переменные после использования?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    https://habr.com/ru/company/badoo/blog/454930/
    вот не плохая статья на тему современного GC в v8
    Ответ написан
    1 комментарий
  • Как назначить классу/объекту два разных интерфейса с некоторыми общими типами?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    у меня есть два больших интерфейса
    Ваша главная ошибка в этом, интерфейсы должны быть минимальны и описывать тот минимум, который требуется в конкретном месте.

    https://www.typescriptlang.org/docs/handbook/union...
    Почитайте про юнионы, они работают совершенно не так как Вы планируете.

    Ну и наконец, в typescript структурная типизация и он много где вполне неплохо выводит типы. В Вашем примере ts вполне может вычислить возвращаемый тип, и он подойдет везде, где требуется {select: string} и/или {items: number[]}
    Ответ написан
    Комментировать
  • Pure script это тот же typescript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    TypeScript - это надмножество JavaScript призванное привнести статическую типизацию сохраняя обратную совместимость (любой JS есть валидный TS)
    PureScript - это диалект Haskell созданный специально, как язык компилируемый в JavaScript.
    Общее лишь в том, что оба компилируются в JS. В остальном - абсолютно разные языки.
    Ну и TS - main-stream, знать его сегодня норма для любого frontend или node.js разработчика, а PureScript нишевое решение с небольшим количеством сторонников (в англоязычном телеграм канале 12 участников и 100+ в русскоязычном, это говорит за себя)
    Ответ написан
    Комментировать
  • Как подключить/использовать самописный babel-плагин?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых. нужно оформить именно как плагин:
    https://github.com/jamiebuilds/babel-handbook/blob...
    export default function({ types: t }) {
      return {
        visitor: {
          Identifier(path) {
            if(path.isIdentifier({ name: 'test' })) {
              path.parentPath.get('init').node.value = 777
            }
          }
        }
      };
    };

    Во-вторых, делаем кофиг бабеля в js формате, и прописываем абсолютный путь к нашему плагину в секции plugins, path.join и __dirname в помощь
    Ответ написан
    Комментировать
  • Какую альтернативу MacBook Pro 16 можно найти на Windows?

    bingo347
    @bingo347
    Crazy on performance...
    Недавно на работе выдали вот такого зверя:
    https://www.e-katalog.ru/HUAWEI-MACHC-WAE9LP.htm
    пока доволен им как слон, проблем не замечено.
    Правда тачпад чуток недотягивает до макбука, хотя очень похож по ощущениям.
    Ну и пару раз ловил себя на том, что когда не гляжу на клаву, руки машинально ищут Command (которого естественно тут нет), но находят Alt
    Ну и наличие из коробки 16 гигов оперативы и pci-e ssd на терабайт делают его вообще топом в этом ценовом сегменте.

    UPD: Еще вспомнил, на клаве напрочь отсутствуют клавиши home, end, pgUp, pgDown. На маке это вполне компенсируется cmd+стрелки (хотя tmux так не поскроллишь, что печаль), здесь пока не нашел как выкрутится. Зато одновременно есть и delete и backspace, на которых многие современные ноуты экономят место.
    Ответ написан
    2 комментария
  • Когда использовать malloc() или calloc()?

    bingo347
    @bingo347
    Crazy on performance...
    Простая переменная выделяет память на стеке. Память на стеке должна быть фиксированного размера и известна в момент компиляции программы, иначе программа просто работать не будет.

    malloc() и calloc() выделяют память на куче, она вполне себе может быть любого размера (не больше чем в системе есть свободной памяти конечно) и не обязательно знать ее размер в момент компиляции. На стеке будет только указатель, у которого фиксированный размер.
    Ответ написан
    Комментировать
  • Как передать несколько значений в IntersectionObserver threshold?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    let observer = new IntersectionObserver(
      (entries) => {
        entries.forEach((entry) => {
          if (entry.isIntersecting) {
            entry.target.lastElementChild.classList.add(classes.image + "_active");
            entry.target.lastElementChild.style.opacity = entry.intersectionRatio;
          } else {
            entry.target.lastElementChild.classList.remove(classes.image + "_active");
          }
        });
      },
      {
        threshold: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
      }
    );
    
    block.forEach((value) => observer.observe(value));
    Ответ написан
    3 комментария