• Как с помощью регулярки php выбрать первые N строк из текста?

    0xD34F
    @0xD34F
    Регулярные выражения не нужны:

    implode("\n", array_slice(explode("\n", $text), 0, количество_строк))

    Но если очень надо, то:

    preg_match('~([^\n]+(\n|$)){0,количество_строк}~', $text, $match)
    Ответ написан
    Комментировать
  • Как выделить блоки с диапазоном id?

    zb_venom
    @zb_venom
    Жизнерадостный чебурек
    var divs = document.querySelectorAll('.catalog-flex.catalog-block');
      divs.forEach(function(item) {
        if (parseInt(item.id) < pagmin || parseInt(item.id) > pagmax) item.style.display = "none";
      });

    Ответ написан
    1 комментарий
  • Как выделить блоки с диапазоном id?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Замените id на data-атрибут. Чтобы было не id="666", а data-val="666", например.
    Раз сравнивать значения собираетесь как числа - сделайте минимальное/максимальное значения числами изначально.

    document.querySelectorAll('селектор ваших блоков').forEach(n => {
      const val = +n.dataset.val;
      n.classList.toggle('disable', min > val || val > max);
    });
    Ответ написан
    Комментировать
  • Что из себя представляет поиск по диалогам в мессенджере?

    @0x131315
    Быстрый поиск всегда осуществляется по индексу - специально подготовленному набору данных, содержащему только ключевые для задачи поиска данные, в сжатом формате, и размеченные определенным образом для быстрого доступа к записи.
    Индексы сегодня полностью обслуживают специальные поисковые движки, коих на рынке много. Велосипеды тут не нужны.
    Индексов может быть много - так можно изолировать непересекающиеся наборы данных, и избежать больших "общих" индексов.
    Если производительности одного сервера не хватает, применяют кластеры - поиск по индексам хорошо поддается кластеризации.
    Чтобы обновлять индексы нужно периодически выполнять переиндексацию - вычитывать полный набор данных и заполнять ими индекс. Это очень тяжелый процесс, поэтому обычно его делают редко и в малонагруженное для сервиса время.
    Чтобы можно было искать с учетом всяких прав и статусов сообщений, эти права и статусы сохраняются в тот же индекс как атрибуты, и участвуют в поисковом запросе. Так можно персонифицировать поиск.
    Чтобы индексы работали как в реальном времени и соответствовали данным приложения, на приложение навешивают хуки: пользователь скрыл сообщение - сработал хук и переиндексировал только одно это сообщение, что практически не дает нагрузки.
    Ответ написан
    2 комментария
  • Если ли виртуальный кошелек всех nfc устройств?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    есть дедовский метод
    https://nfcwiki.ru/o-tehnologii/kak-dobavit-propus...

    рекомендую сразу под кожу или там на лоб,
    кланяться и говрить при сработке "смотри, прививка работает"
    Ответ написан
    2 комментария
  • Как удалить элемент массива по значению?

    0xD34F
    @0xD34F
    array_diff($arrays, [ "none"]); - этот способ Не работает

    Массивы вложенные. Так что каждый надо обработать отдельно:

    $newArrays = array_map(fn($arr) => array_diff($arr, [ 'none' ]), $arrays);
    Ответ написан
    2 комментария
  • Как реализовать распознавание кривых на canvas?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Готовых решений я не знаю, но есть следующие идеи.

    Во-первых, научимся аппроксимировать одной кривой. Первая и четвертая точки нам известны - это первый и последний пиксель. координаты двух других опорных точек кривой Безье - это четыре неизвестных.

    Составим функцию ошибки f(x1, y1, x2, y2) = (X(i/n)-x_i)^2+(Y(i/n)-y_i)^2. Тут x_i, y_i - координаты i-ого пикселя в нарисованной кривой, пронумерованные от 0 до n, X(t), Y(t) - координаты точки на кривой Безье - линейные комбинации x1, x2 и y1, y2 с известными вычисляемыми от t коэффициентами. Это фактически сумма квадратов расстояний от каждого пикселя до неизвестной кривой. Ее можно минимизировать подобно методу наименьших квадратов - считайте производную по всем переменным, приравнивайте к 0. Получите 4 неизвестные и 4 линейных уравнения. Можно вообще на бумажке руками методом Краммера решить, а можно алгоритмом Гаусса подсчитать.

    Тут есть допущение, что i-ый пиксель будет аппроксимироваться t=i/n точкой на кривой. Вообще говоря, это не гарантированно, но в качестве некой грубой меры оптимальности подойдет. Может вообще отлично работать будет и так, я не знаю. Поэксперементируйте. Но еще можно потом честно искать ближайшую точку на кривой к заданному пикселю как оптимум полинома 6-ей степени от t, когда все опорные точки кривой фиксированы. Тут надо брать производную, находить ее нули и среди них брать лучшее t. Чтобы найти нули полинома 5-ой степени можно рекурсивно брать производную, находить нули полинома меньшей степени, и потом на каждом монотонном отрезке искать пересечение с OX бинарным поиском. Или использовать метод Ньютона. Это давно решенная задача - должно быть куча готовых решений.

    Когда вы так научились считать расстояние от кучки пикселей до кривой Безье, можно локально градиентным спуском по 4-м координатам x1, x2, y1, y2 улучшать эту правильную метрику с оптимума полученного грубой метрикой.

    Вот мы и умеем аппроксимировать кучку пикселей одной кривой. Заодно мы получаем метрику близости кривой к пикселям. Но надо сделать ее не зависящей от длины - поэтому складывайте квадраты расстояний и делите на количество пикселей.

    А дальше алгоритм прост - жадно откусывайте от вашего массива пикселей самые длинные куски, которые хорошо аппроксимируются кривой (дают маленькую метрику). Для этого можно тупо перебирать сколько пикселей отдаем первой кривой, считать метрику и, если она слишком плохая, то останавливаться. Можно чем-то вроде бинарного поиска тут делать - увеличиваете длину куска в 2 раза, пока метрика не станет плохой, а потом гоните бинарный поиск, ища самое большое значение количество пикселей, которое еще дает хорошую метрику. (тут используется предположение, что чем короче пиксельная кривая, тем легче ее аппроксимировать).

    Это эмпирический алгоритм и он много где жадный. Нет никакой гарантии, что он даст математически оптимальный результат, но есть много шансов, что он даст достаточно хороший результат.
    Ответ написан
    2 комментария
  • Есть ли у Postman адекватные альтернативы написанные НЕ на electron?

    @Flying
    Не полноценно, конечно, но в какой-то степени в качестве замены можно рассматривать HTTP Client в IDE от JetBrains, к примеру в PHPStorm.
    Ответ написан
    3 комментария
  • Как передать в json данные из цикла?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Всё. Вместо структуры массивов вы зачем-то формируете JSON-строку, причём неправильную, а затем снова пытаетесь преобразовать её в JSON.
    $kbd = [];
    foreach($ds->children() as $dt) {
        $kbd[] = [
            'text' => $dt->title,
            'callback_data' => $dt->id
        ];
    }
    $keyboard = [
        'inline_keyboard' => [$kbd]
    ];
    $buttons = json_encode($keyboard, true);
    Ответ написан
    2 комментария
  • Как объединить значения массивов?

    0xD34F
    @0xD34F
    $arr = array_map(fn(...$a) => implode(', ', $a), $arr1, $arr2, $arr3, $arr4);
    Ответ написан
    Комментировать
  • Как разбить массив из чисел на группы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function split(arr, numParts) {
      const partSize = arr.length / numParts | 0;
    
      return Array
        .from({ length: numParts }, (n, i) => i * partSize)
        .map((n, i, a) => arr.slice(n, a[i + 1]));
    }
    Ответ написан
    3 комментария
  • Антивирус Касперского встраивает в код сайта свой JS-скрипт и нарушает работу сайта?

    @cheeroque
    как можно решить эту проблему?

    Не пользоваться антивирусом Касперского, например. Тем более бесплатным. Вообще не вижу никакого смысла в дополнительных антивирусах, когда есть Windows Defender.
    Ответ написан
    7 комментариев
  • Как исправить баги с фильтрации?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Всё настолько плохо, что исправлять нечего. Можно переписать с нуля:

    const checkedTexts = (el, selector) =>
      Array.from(el.querySelectorAll(`${selector}:checked`), n => n.parentNode.innerText);
    
    const propertyText = (el, selector) =>
      el.querySelector(selector).innerText.split(': ')[1];
    
    document.querySelector('.container-filter').addEventListener('input', function() {
      const maxPrice = parseInt(this.querySelector('.range').value);
      const brands = checkedTexts(this, '.input');
      const years = checkedTexts(this, '.input-date');
    
      document.querySelectorAll('.device .laptop').forEach(n => {
        const price = parseInt(propertyText(n, '.laptop-price'));
        const brand = propertyText(n, '.laptop-name');
        const year = propertyText(n, '.laptop-year');
    
        n.style.display = (
          (maxPrice >= price) &&
          (!brands.length || brands.includes(brand)) &&
          (!years.length || years.includes(year))
        )
          ? 'block'
          : 'none';
      });
    });

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

    Вам стоит рассмотреть вариант с хранением информации о товарах в массиве, чтобы не приходилось выдирать её из разметки. Как оно могло бы быть.
    Ответ написан
    1 комментарий
  • Как запатентовать дизайн или идею продукта?

    Jump
    @Jump
    Системный администратор со стажем.
    Ни дизайн, ни идеи не патентуются.
    Дизайн защищен законом об авторских правах.
    Идея ничем не защищена - любой совершенно законно может использовать ваши идеи в любое время.
    Единственный способ защитить идею - молчать!
    Ответ написан
    5 комментариев
  • Какие недостатки у такой авторизации?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Есть такая русская пословица, "дурная голова ногам покоя не даёт".
    Вот она про это "изобретение".
    Ответ написан
    Комментировать
  • Какие недостатки у такой авторизации?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    - Что будет если пользователя взломали, и взломщик залогинен. Дальше пользователь бежит меняет пароль, но взломщик продолжит сидеть под пользователем, ибо файл.
    - Что будет если пользователя вдруг забанят? А вы не сделали запрос к БД и не узнали этого.
    - Вообще любая ситуация когда вам нужно получить актуальные данные о текущем авторизованном пользователе из базы, но вы этого не делаете, так как экономите на этом запросе. Например решили добавить роли пользователям на сайте, меняете role для юзера. Как без запроса к БД текущему пользователю это узнать, что у него поменялась роль и теперь доступны доп. функции?

    Чтобы убрать этот долбозапрос

    Поймите и примите простую истину - база данных создана для того чтобы РАБОТАТЬ, так пусть же работает и исполняет ваши долбозапросы. Не нужно тут ничего придумывать.

    «Преждевременная оптимизация — корень всех зол». Дональд Кнут.
    Ответ написан
    3 комментария
  • Как сгенерировать последовательность из пяти случайных чисел в заданном диапазоне на php или python?

    rpsv
    @rpsv
    делай либо хорошо, либо никак
    Если на SQL, то запрос будет выглядеть так:
    SELECT * FROM post ORDER RAND() LIMIT 5;
    Ответ написан
    2 комментария
  • Как сложить значения массивов по ключам?

    0xD34F
    @0xD34F
    function merge(...$arrays) {
      $result = [];
    
      foreach ($arrays as $arr) {
        foreach ($arr as $key => $values) {
          if (!isset($result[$key])) {
            $result[$key] = [];
          }
    
          for ($i = 0; $i < count($values); $i++) {
            $result[$key][$i] = ($result[$key][$i] ?? 0) + $values[$i];
          }
        }
      }
    
      return $result;
    }
    
    
    $arr = merge($arr1, $arr2);
    Ответ написан
    1 комментарий
  • Как объединить GROUP BY и JOIN?

    @alexalexes
    Чтобы найти читателей с последними взятыми книгами, нужно при помощи оконной функции row_number пронумеровать строки в пределах каждого читателя (задав партицию по айди читателя) в порядке убывания по дате taken_at. Из полученного результата взять строки, которые получили номера 1.
    select * from
    (select r.id as reader_id, r.first_name, r.last_name, b.id book_id, b.name, b.pub_date, row_number() over (partition by r.id order by l.taken_at desc) as rownum
    from readers r
    left join log_taking l on r.id = l.reader_id
    left join books b on b.id = l.book_id
    ) a
    where a.rownum = 1

    PS: Связка left join выведет всех читателей, в независимости, брали они книги или нет. Просто join даст список читателей, которые брали книги хоть один раз.
    PPS: Оконные функции доступны с MySQL версии 8.
    Если версия 5, то придется городить велосипед с пользовательскими переменными.
    Ответ написан
    4 комментария