• Как заблокировать работу с окном браузера при перезагрузке страницы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно начать перехватывать вообще все события клика по html>body на начальной стадии "capture", и дальше не пропускать. Что-то типа
    document.body.addEventListener('click', e => {
        e.stopPropagaion();
        e.stopImmediatePropagation();
        e.preventDefault();
      }, { capture: true });
    Аналогично можно и для клавиатурных событий попробовать.
    Ответ написан
    Комментировать
  • Как числа из строки поместить в массив?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $str = ' 86, 92, 98, 104, 110';
    $arr = json_decode("[ $str ]");
    Ответ написан
    Комментировать
  • Как вывести оставшееся время до определенного часа?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно прибавлять 24 часа там, где что-то меньше чего-то..

    Примерно так, наскоро. Подробно не проверял:
    function workHours(on, off, testNow = null) {
      // TODO: validate input
      const now = testNow ?? new Date().getHours();
      const a = Number(on);
      let b = Number(off);
    
      const format = (status, nextTime) => ({ status, next_time: nextTime });
    
      if (a === b) {
        return format(true, 0);
      }
    
      if (a > b) {
        b += 24;
      }
    
      if (now >= a && now < b) {
        return format(true, 0);
      }
    
      if (now < a) {
        return format(false, a - now);
      }
    
      return format(false, a + 24 - now);
    }

    Тесты

    // Тесты тесты
    const tests = [
      [9, 17, 10, { status: true, next_time: 0 }],
      [9, 17, 8, { status: false, next_time: 1 }],
      [9, 17, 17, { status: false, next_time: 16 }],
      [19, 17, 17, { status: false, next_time: 2 }],
      [19, 19, 17, { status: true, next_time: 0 }],
    ];
    
    const eq = (a, b) => Object.entries(a).every(([k, v]) => b[k] === v);
    
    tests.forEach(test => {
      const [on, off, now, expected] = test;
      const result = workHours(on, off, now);
      const testResult = eq(result, expected);
      if (testResult) {
        console.log('Passed', {on, off, now, result});
      }
      console.assert(testResult, test);
    });
    Ответ написан
    Комментировать
  • Как объединить строки в файле gedcom?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Готовый модуль: https://www.npmjs.com/package/gedcom
    Ответ написан
    Комментировать
  • Как поменять местами максимальное и минимально число в массиве?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    попробуйте представить, как оно будет работать, в замедленном режиме.
    Что, если массив не 5 чисел, а несколько миллионов, длиннющий?
    Хорошо бы его проходить только 1 раз. И по пути находить минимум и максимум, и их индексы.
    Как?
    Сначала и min и max это первое значение, а оба индекса 0.
    Далее с очередным элементом массива смотрим, больше ли он нашего "максимума"? Если да, то он становится максимумом, а текущий индекс — индексом максимума. То же с минимумом. Если меньше текущего минимума, то ...
    Прошли весь массив — ок, имеем минимум, максимум, их индексы.
    Меняем местами элементы по индексам.
    Ответ написан
    Комментировать
  • Как сказать «ничего не делаем» используя условные операторы?

    несколько проверок с indexOf() можно заменить на одну imgName.matches(/s-[1-4]\./),

    условие isBlank() лучше ставить первым

    пустой блок если нужен для брейкпоинта, можно там поставить строчку assert true;
    Ответ написан
    Комментировать
  • Как хранить функцию в массиве?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Всё в документации: Обращение к функциям через переменные ("Variable functions" на англ.)
    Ответ написан
    Комментировать
  • Как сделать алгоритм фокусировки?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    В фотокамерах автофокус обращает внимание на несколько контрольных точек кадра: центр, по третям и т.д. Алгоритмы видимо пробуют разные варианты фокусировки и останавливаются на том, что даёт максимум контрольных точек в фокусе.

    Само определение в фокусе / размыто: наличие высокочастотных деталей в исследуемой области. В размытом изображении мелких контрастных переходов нет, все детали крупнее какого-то порога.

    Алгоритм – применить High-pass фильтр к картинке, и смотреть, есть ли что, отличное от серого, и как его много.
    пример

    Выбрал две области на картинке (маленькие зеленые квадраты) – к которым применен high-pass фильтр с радиусом 2px в Photoshop. Результаты рядом и увеличены, в желтых квадратах:
    65b132a196b6c677954361.jpeg
    Ответ написан
    Комментировать
  • Как получить таблицу Google sheets как массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    вроде бы так должно получиться:

    - console.log(data.data.values)
    + console.log(data.values)

    Метод spreadsheets.values/get возвращает объект ValueRange со свойствами range, majorDimension и values. Последнее и интересует.
    Ответ написан
    Комментировать
  • Какой ставить CENTRIFUGO_URL, если запустил под докером?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Наскоро посмотрел — они там пишут, по умолчанию URL http://localhost:8000/api

    Из вопроса не понятно, у вас только центрифуга в контейнере, а приложение на хосте, или всё в докере.
    Если приложение на хосте, надо не забыть высунуть наружу порт docker run -p 8000:8000
    Если всё в docker-compose, то да, по имени контейнера стучаться, и тоже не забыть порт указать http://centrifugo:8000/api
    Ответ написан
  • Можно ли присвоить массив ключам объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Завезли нечитаемые макароны!
    (arr => Object.fromEntries(['a', 'b', 'c'].map((p, i) => [p, arr[i]])))([1, 2, 3])
    // Object { a: 1, b: 2, c: 3 }
    
    // или так, что чуть короче, но такой же фарс
    (arr => Object.fromEntries(Array.from('abc', (p, i) => [p, arr[i]])))([1, 2, 3])
    Ответ написан
    1 комментарий
  • MacBook Pro 15 2012 Retina нужно ли обмениваться?

    Со старым маком скорее наступит момент, что Mac OS уже не обновить на новую версию. И соответственно не весь софт пойдёт.
    Поэтому лучше обновляться на более новые.

    Как вариант, вместо макбука рассмотрите Mac Mini может какой-нибудь на M1 б/у?
    Ответ написан
    Комментировать
  • Удалил launchpad (каталог приложений на мак )из док, как вернуть?

    В Finder нажать Cmd + Shift + A (латинская) — откроет папку приложений Applications. Оттуда перетащить иконку Launchpad на док. Это здорово проиллюстрировал Valentin Barbolin

    Но может, оно и не нужно? Т.к. Launchpad можно открыть в любой момент:
    - жестом: большой палец + 3 пальца – «ущипнуть» (свести вместе) на трекпаде - откроет Launchpad;
    - клавишами можно задать сочетание для открытия Launchpad: обычно это F4, но можно задать и другое в (яблоко слева сверху) - System Preferences - Keyboard - Shortcuts - Launchpad
    Ответ написан
    Комментировать
  • Как в массиве обозначить нескольким параметрам одно значение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как один из вариантов, пишите свойства как диапазоны.

    Подзадача: из массива, где могут быть и строки "20-80" найти строку, удовлетворяющую искомому значению
    const findRangeKey = (keysArray, keyString) => {
      const num = Number(keyString);
      if (keysArray.includes(keyString)) {
        // exact match
        return keyString;
      }
    
      return keysArray.find(key => {
        const [min, max] = key.split('-').map(Number);
        if (max !== undefined) {
          return num >= min && num <= max;
        }
    
        return num === min;
      });
    };
    
    findRangeKey(['10', '20-40'], 30); // "20-40"
    findRangeKey(['10', '20-40'], 20); // "20-40"
    findRangeKey(['10', '20-40'], 10); // "10"


    И теперь можно искать в словаре с диапазонами:
    const data = {
      '10': {
        '5-15': {
          title: '10-5-15',
        }
      },
      '20-60': {
        '5': { title: '20-60-5' },
        '10': { title: '20-60-10' },
        '20-40': { title: '20-60-20-40' },
      },
    };
    
    const getTitle = (data, a, b) => {
      const aKey = findRangeKey(Object.keys(data), a);
      if (!aKey) {
        return null;
      }
    
      const bKey = findRangeKey(Object.keys(data[aKey]), b);
      if (!bKey) {
        return null;
      }
    
      return data[aKey][bKey].title;
    };
    
    console.log(getTitle(data, '10', '5')); // "10-5-15"
    console.log(getTitle(data, 40, 30)); // "20-60-20-40"
    Ответ написан
  • Dockerfile как задать ограничение памяти?

    В Dockerfile — никак.

    Либо в параметрах запуска контейнера Runtime options with Memory, CPUs, and GPUs

    Либо в docker-compose файле см. секцию deploy Например:
    services:
      frontend:
        image: example/webapp
        deploy:
          resources:
            limits:
              cpus: '0.50'
              memory: 50M
              pids: 1
            reservations:
              cpus: '0.25'
              memory: 20M
    Ответ написан
    Комментировать
  • Как узнать все установленные флаги на файл/папку в MacOS?

    1. для всех файлов в папке: ls -l@ «Собака» – для расширенных атрибутов.
    пример вывода

    Под старой High Sierra 10.13.6. Хотя примерно так же и под Sonoma 14.2.1
    $ ls -l@
    drwx------@   5 username  staff   160 Sep 22 20:22 Applications
      com.apple.quarantine       21 
    drwx------+  57 username  staff  1824 Jun 15 16:17 Desktop
    drwx------+ 179 username  staff  5728 Jan 17 12:03 Documents
    drwx------+ 266 username  staff  8512 Jan 15 18:25 Downloads
    drwx------@ 125 username  staff  4000 Dec  1 19:16 Dropbox
      com.apple.FinderInfo       32 
      com.apple.quarantine       34 
    drwx------@  74 username  staff  2368 Oct  2 17:40 Library
      com.apple.FinderInfo       32

    2. Для конкретного одного файла: xattr filename
    пример
    $ xattr Dropbox/
    com.apple.FinderInfo
    com.apple.quarantine
    Или подробнее, со значением атрибута в 16-ричном виде или текстовом: с ключом -l
    $ xattr -l Dropbox/
    com.apple.FinderInfo:
    00000000  00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  |................|
    00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
    00000020
    com.apple.quarantine: 0082;00000000;DropboxFolderTagger;
    Подробнее: man xattr
    Ответ написан
  • Назвать и построить кривую. Как решить?

    Две пересекающиеся прямые.

    подробнее

    659eed02b0a19189814669.png

    659eed1d0e32d959181946.png
    Ответ написан
    Комментировать
  • Как создать объект из массивов разной длинны. keys = [key1, key2, key3] values = [value1, value2, value3, value4, valu5, value6]. На выходе: {}?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const keys = ['key1', 'key2', 'key3'];
    const values = ['value1', 'value2', 'value3', 'value4', 'valu5', 'value6'];
    
    const makeGen = function*(arr) {
      let index = 0;
      const { length } = arr;
      
      while (true) {
        yield arr[index++ % length];
      }
    }
    
    const keyGen = makeGen(keys);
    const valGen = makeGen(values);
    const length = Math.max(keys.length, values.length);
    
    const result = Array.from({ length }, () => [keyGen.next().value, valGen.next().value]);
    
    console.log(JSON.stringify(result, null, 2));
    
    /*
    [
      [
        "key1",
        "value1"
      ],
      [
        "key2",
        "value2"
      ],
      [
        "key3",
        "value3"
      ],
      [
        "key1",
        "value4"
      ],
      [
        "key2",
        "valu5"
      ],
      [
        "key3",
        "value6"
      ]
    ]
    */
    Ответ написан
    Комментировать
  • Как сделать подобную анимацию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Анимацию линий от положения курсора можно сделать гораздо «легче» без библиотек.

    Поверх картинки абсолютно позиционируется SVG с этими всеми линиями. Координаты линий динамически меняются.

    Сделал примитивный пример, линия летает поверх фотки:

    Разберитесь, как анимируется одна линия. В вашей задаче линий чуть больше, у них общие вершины.
    И анимируются они не по таймеру, а от курсора.

    Pro tip: сделайте минимальную инерционность: чтобы к курсору постоянно стремилась невидимая точка с небольшой задержкой, как на резинке, а уже от координат этой невидимой точки анимируйте линии — так будет плавнее и загадочнее. Координаты невидимой точки в любой момент приближаются к текущему положению курсора на 80%, скажем.
    X_точки = предыдущий_X_точки + (X_мышки - предыдущий_X_точки) * 0.8
    В этом ответе подробнее раскрыл тему.
    Ответ написан
    1 комментарий
  • Как создать подобную функцию в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Упомянутый метод fadeOut() вероятно, из jQuery?

    Там эти новые методы добавляются самим jQuery и установленными плагинами не к элементам, а к элементам-обёрнутым-в-jQuery всё-таки:
    - elem.fadeOut();
    + $('selector').fadeOut();

    Поэтому посмотрите, может, как писать плагины к jQuery. Именно своим плагином можно добавить новые «методы через точку».
    Ответ написан
    Комментировать