• Как работает оператор ^ в reduce?

    Seasle
    @Seasle Куратор тега JavaScript
    ^ - это операция XOR. XOR вернёт единицу в том случае, если один из операндов (битов) 1 а другой 0. Таким образом, к примеру, 3 ^ 5 вернет 6 потому, что 0b011 ^ 0b101 (для простоты, биты будем считать слева направо):
    Первый бит: 0 ^ 1 = 1.
    Второй бит: 1 ^ 0 = 1.
    Третий бит: 1 ^ 1 = 0.
    Вместе: 0b110 = 6.
    Ну а функция будет на каждом шаге использовать значение из предыдущей операции. Также, первая итерация будет следующая: undefined ^ N или 0 ^ N, что вернёт нам само число.
    Ответ написан
    2 комментария
  • Как можно оптимизировать этот код поиска совпадений в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    "Оптимизировать" - в смысле сократить? Вот так можно:

    const duplicates = Object.fromEntries(Object
      .entries(arr.reduce((acc, n, i) => (
        (acc[n] ??= []).push(i),
        acc
      ), {}))
      .filter(n => n[1].length > 1)
    );

    Если среди значений массива могут быть такие, которые, будучи различными, имеют одинаковый строковый эквивалент, то обычный объект следует заменить на Map:

    const duplicates = new Map(Array
      .from(arr.reduce((acc, n, i) => (
        acc.set(n, acc.get(n) ?? []).get(n).push(i),
        acc
      ), new Map))
      .filter(n => n[1].length > 1)
    );
    Ответ написан
    Комментировать
  • Как запустить команду в Linux в фоновом режиме сохраняя консольный вывод в файл с помощью tee?

    Lynn
    @Lynn
    nginx, js, css
    Программа dd выводит отчёт не в stdout, а в stderr. Так что нужно сначала перенаправить stderr в stdout, а потом передавать его в tee:

    # башизм
    dd if=/dev/zero of=/tmp/zerofile  bs=100M count=5 |& tee ku.log &
    # должно работать везде
    dd if=/dev/zero of=/tmp/zerofile  bs=100M count=5 2>&1 | tee ku.log &
    Ответ написан
    Комментировать
  • Как сложить - 1/3 и 1/5 на с?

    vabka
    @vabka
    Токсичный шарпист
    Ты делишь целые числа.
    Попробуй так
    #include <iostream>
    
    int main()
    {
        double a, b, ab;
        a = 1.00 / 3.00;
        b = 1.00 / 5.00;
        ab = a + b;
    
        printf("%f", ab); // 0.53
    }

    И вместо long double - просто double, тк %f - это для double
    Ответ написан
    Комментировать
  • Как проверить, что значение является итерируемым?

    0xD34F
    @0xD34F Куратор тега JavaScript
    x?.[Symbol.iterator] instanceof Function
    Ответ написан
    Комментировать
  • Поясните пожалуйста bash скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    кода done < <(ls -1 "./my_temp_dir/")

    ls -1 выводит содержание каталога в одну строку по одному наименованию
    <(blabla) создает из команды поток, который передается как файловый десктриптор
    < перенаправление данных из файлового дескриптора в предыдущую команду
    done является частью цикла, поэтому перенаправление идет не в done а в весь блок цикла.
    Ответ написан
    Комментировать
  • Реально ли работать в одном IT-проекте (продуктовом) больше 5-ти лет и не деградировать профессионально?

    В одном проекте можно, в другом нельзя; одному программисту можно, другому нельзя. Если человек хочет развиваться, вы его не остановите. Если не хочет - не заставите. Проект может помогать или мешать, но сам по себе определяющим фактором почти не является. Собственно, вы сами это подтверждаете своим bio:
    Несмотря на долгий срок работы в проекте, нахожу новые интересные задачи, которые не позволяют заскучать.


    В целом - скорее реально, чем нет, если есть хоть какое-то желание это делать.
    Конкретных аргументов тут никаких дать невозможно, потому что проекты все разные, люди все разные. Но это не помешает сейчас тут пяти-десяти людям написать абсолютно противоположные по смыслу ответы, которые будут сводиться к тому, что я написал выше.
    Ответ написан
    2 комментария
  • По какому принципу работает reduce с массивом, как значением по умолчанию?

    Stalker_RED
    @Stalker_RED
    function test() {
      const a = [1];
      return a[0] += 3; // что вы вернет?
    }

    По вашей логике массив a?
    На самом деле вернется результат операции сложения, то есть 4.
    А если добавить оператор запятую, то вернет то, что после запятой, что и требуется для reduce.

    Распишем подробно что происходит внутри reduce c запятой и без.
    // с запятой
    array.reduce((a,b,i)=>function(){
      const sum = a[i%2] + b; // вычисление
      a[i%2] = sum; // присваивание
      return a; // возврат массива
    }, [0,0]);
    
    // без запятой
    array.reduce((a,b,i)=>function(){
      const sum = a[i%2] + b; // вычисление
      a[i%2] = sum; // присваивание
      return sum; // возврат результат суммирования
       // и на следующей итерации будет ошибка из-за попытки обратиться к числу как к массиву.
    }, [0,0]);
    Ответ написан
    2 комментария
  • Как удалить себя из интернета?

    New_Horizons
    @New_Horizons
    Бред:
    Все, что попало в интернет – остается там навсегда!

    Забудь, нет таких сервисов.
    Ответ написан
    Комментировать
  • Как правильно обработать события в React+Typescript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Ну да.
    React.KeyboardEvent - это синтетическое событие, которое генерируется в React.
    KeyboardEvent - это оригинальное событие, которое генерируется в браузере.
    KeyboardEvent лежит в event.nativeEvent у React.KeyboardEvent.

    Если вам в принципе пофиг откуда событие в функцию будет прилетать, и вас интересуют только общие свойства - сделайте так:
    const closeByESC = (event: KeyboardEvent | React.KeyboardEvent) => {

    P.S. Ну и лишних обёрток не надо: document.addEventListener('keydown', closeByESC);
    Ответ написан
    Комментировать
  • Я так никогда не выучу React. Что это за ошибка?

    tsepen
    @tsepen
    Frontend developer
    Нельзя выучить Реакт не выучив Джаваскрипт, рекомендую начать с JS, иначе дальше тебя ждет еще очень много сюрпризов
    Ответ написан
    Комментировать
  • Работать в выходные или нет?

    @levsha9413
    Необходимо обязательно отдыхать в выходные, иначе выгорание неизбежно.
    Рабочие задачи - это непрерывный поток, неважно, черпаете вы из него пять дней в неделю или все семь, этот поток не закончится.
    А вы - да.
    Ответ написан
    Комментировать
  • Как передать аргумент функции, для сложного объекта?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    function changeField<T extends DataType, K extends keyof T>(data:T, fieldName:K, val: T[K]) {
      data[fieldName] = val
    }
    Ответ написан
    Комментировать
  • Как обезопаситься от кражи игры?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Строго говоря, никак. Если украдут, то судиться. У тебя же есть свидетели того, как ты разрабатываешь свою игру. Возможно, ещё какие-то концепты, которые ты не расшарил. Это всё косвенно поможет.

    Однако вряд ли кому нужна сомнительная недоделанная игра без команды разработки, то есть без тебя. Так что основную ценность представляешь как раз ты, а тебя у тебя украсть не могут. И не будь уверен, что игра обязательно сразу принесёт миллионы. Шанс есть, но это далеко не факт.

    К слову, идеи вообще никак защитить нельзя, даже авторским правом. Так что если компания посмотрит на твою игру и сделает (с нуля) примерно такую же (типа клон), то это абсолютно законно.
    Ответ написан
    4 комментария
  • Как найти "счастливые" билетики (числа) с помощью JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно для «половины» числа пробежаться и составить словарь { сумма: счётчик }, сколько раз каждая сумма встретилась на всём диапазоне 000..999 (для n = 6, т.е. половина = 3)
    Сумма квадратов счётчиков даст общее число счастливых билетов.
    Почему квадратов
    Например, сумму 1 даёт 3 варианта (001, 010, 100). И для каждого из них в правой части билета может быть каждая из 3 комбинаций. Итого 3 * 3 = 9 вариантов билета с суммами 1 = 1.
    function getLuckyTicketsCount(n) {
      const sums = {};
      for (let i = 0; i < Math.pow(10, n >> 1); i++) {
        // посчитать сумму цифр
        let sum = 0, d = i;
        while (d > 0) {
          sum += d % 10; // прибавили младшую цифру
          d = Math.floor(d / 10); // сдвинули число вправо на 1 цифру
        }
    
        // и в словарь прибавить 1 для этой суммы
        sums[sum] = (sums[sum] || 0) + 1;
      }
    
      return Object.values(sums) // счетчики суммм
        .map((n) => n * n) // квадраты
        .reduce((acc, c) => acc + c); // сложить все
    }
    Ответ написан
  • Где и как предложить идею нового свойства CSS?

    @Flying
    Спецификаций CSS занимается рабочая группа в составе W3C. Там же есть и информация о том, как принять участие / предложить свою идею.

    К примеру вы можете создать issue в репозитории рабочей группы.

    Однако вам стоит понимать, что работа над спецификацией уровня CSS Grid - это многолетний труд сотен людей для того, чтобы довести её до реального использования. Если вы предполагаете что за всё это время никто из них не додумался до этой идеи - то вам стоит подумать ещё раз.

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

    За примерами далеко ходить не нужно: parent selector - мечта уже нескольких поколений разработчиков и тема постоянных вопросов. Однако его нет в спецификации (хотя он был в первых драфтах CSS 3 насколько я помню) и скорее всего не будет. Причину, если интересно, попробуйте поискать сами.

    Или, к примеру, такое очевидное, казалось бы, опущение как отсутствие аналога :hover для "stuck" состояния элемента с position: sticky. Ведь его явно не хватает почти любому кто использовал этот стиль. Однако его не будет, о причинах (логичных, но далеко неочевидных) можно почитать в соответствующем issue.

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

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Добавляем в цикл console.log(i) и видим, что в i имя ключа, а не значение свойства.
    Ответ написан
    Комментировать
  • Зачем в состав JWT входит открытый payload?

    vabka
    @vabka
    Токсичный шарпист
    Отерытый payload нужен для двух вещей:
    1. Чтобы клиент мог получить всякую информацию о токене не делая запросы к серверу.
    2. Чтобы сервер мог работать не делая лишние запросы к серверу авторизации или к БД.

    Для проверки подлинности есть подпись
    Ответ написан
    3 комментария
  • Почему на одних сервисах просят сначала email, а потом пароль, а на других сразу оба?

    @Flying
    По-моему всё началось c Google, который действительно применяет разную логику в зависимости от того, какой email введён и поэтому ему важно разделять ввод email и пароля.

    Другие сервисы в основном просто тупо копируют без реальной необходимости, потому что "ну вот Google (или кто-то ещё большой) же так делает, значит так надо". Вплоть до того, что форма по факту одна, просто на JavaScript скрывают поле и показывают после первого submit'а.

    Другими словами в большинстве случаев - карго-культ и "следование моде" без реальной потребности. Конечно, есть сценарии при которых это действительно нужно, но их меньшинство.

    Кстати, дополнительно, подобный подход ещё и ломает ввод логина / пароля из менеджеров паролей.
    Ответ написан
    3 комментария