• Расчет score записей, какая нужна формула?

    @alexalexes
    Думаю что первым делом, происходит подсчетом суммы общей заполненности данных по полям групп, потом это число делится на количество записей

    Нет, методы оценок чего-либо не всегда сводятся к вычислению математического ожидания.
    У каждого города может быть выведен регрессионный показатель:
    y = t1*x1 + t2*x2 + ... + tn*xn
    x-ы - допустим, значения рейтингов в группах.
    t-ы - допустим, веса эти гр. рейтингов (влияние на общий показатель).
    Коэф. t может оказывать и нелинейное влияние. Ничего не мешает провести его через логарифм, с близким к экспоненте показателем (чтобы чуть-чуть отличаться от линейности). Может даже на отдельных значениях срабатывать пороговый триггер (например, если входное t > 0.8, то считаем, что оно 1.0).

    X-ы могут быть нормированы к интервалу 0...1. Также могут применятся хитрости с нелинейностью и триггерами.

    Y - тоже можно нормировать по тем же правилам.
    Чтобы на первое место вылезло больше кандидатов с рейтингом больше 0.99 - подкрутите логарифм.
    Ответ написан
    Комментировать
  • Как выбрать значения из БД по JSON?

    @alexalexes
    Если СУБД поддерживает тип данных JSON, а вы хотите сравнивать JSON тело как строку, то приведите содержимое из JSON в строку.
    SELECT * FROM tavle
     WHERE JSON_EXTRACT(json, '$') = jsons; -- атрибут json относится к таблице tavle, а jsons - плейсхолдер, куда вы подставляете строку, по которой будете искать тело?
    -- JSON_EXTRACT(атрибут_типа_JSON, '$') - это выражение конвертирует JSON в строку, аналогично как в JS будет JSON.stringify(объект_с_данными).
    Ответ написан
    2 комментария
  • Нужно ли расширение html в url адресе?

    @alexalexes
    Это норма. Нет никаких требований, чтобы url обязательно повторял какие-то части пути к реальным файлам на сервере.
    Часть url, который отвечает за некий путь, - это всего лишь набор параметров. Как их интерпретировать - решается на уровне конфигурации apache/nginx, или непосредственно в скрипте CMS (роутинг).
    Ответ написан
    Комментировать
  • Как исправить кракозябры вместо кириллических символов?

    @alexalexes
    Посмотрите в отладчике браузера (вкладка Сеть), какие заголовки возвращаются с ответом сервера.
    Если там заголовок с кодировкой отличен от utf-8, то сервер по умолчанию ее не использует.
    Либо нужно php.ini исправлять, либо в скрипте отдавать нужный заголовок:
    header('Content-Type: text/html; charset=utf-8');
    То, что вы в HTML указали:
    <meta charset="utf-8">
    Не дает никаких указаний серверу, в какой кодировке отдавать ответ.
    Ответ написан
    Комментировать
  • Как разрешить прямой доступ к определенным папкам?

    @alexalexes
    Либо директиву ИЛИ применяете:
    RewriteCond %{REQUEST_URI} !^/assets/ [OR]
    RewriteCond %{REQUEST_URI} !^/css/ [OR]
    RewriteCond %{REQUEST_URI} !^/js/ [OR]
    RewriteCond %{REQUEST_URI} !^/index.php
    RewriteRule ^(.*)$ index.php?route=$1 [L, QSA]

    Либо как-то закидываете в одну регулярку, где есть что-то общее с незначительной альтернативой:
    RewriteCond %{REQUEST_URI} !^/(assets|css|js)/ [OR]
    RewriteCond %{REQUEST_URI} !^/index.php
    RewriteRule ^(.*)$ index.php?route=$1 [L, QSA]
    Ответ написан
    Комментировать
  • Хорошее ли решение разделение таблиц юзер и роли?

    @alexalexes
    Вы выделили в системе два класса сущностей. Одна - Пользователь, вторая - Роль.
    Под каждый класс нужна отдельная таблица.
    Как определить какие взаимоотношения между этими классами?
    Нужно примерить следующие коммутативные гипотезы:
    Первая пара гипотез:
    "Один пользователь должен (может) иметь только одну роль."
    "Одна роль должна (может) быть назначена многим пользователям."
    Вторая пара гипотез:
    "Один пользователь должен (может) иметь несколько ролей."
    "Одна роль должна (может) быть назначена многим пользователям."
    Если в вашей архитектуре системы справедлива первая пара гипотез, то вы строите взаимоотношение между классами Роль и Пользователь как "один ко многим". Это значит, что у таблицы Пользователь будет внешний ключ в виде идентификатора роли, тем самым вы каждому пользователю сможете назначить только одну роль. Но сами роли могут повторятся у разных пользователей.
    Если в вашей архитектуре системы справедлива вторая пара гипотез, то вы строите взаимоотношение между классами Роль и Пользователь как "многим ко многим". Для этого нужно создать промежуточную таблицу, например Пользователь_и_роль, в которой будут два внешних ключа - идентификатор пользователя и идентификатор роли пользователя (можно, но технически нужно еще создать еще идентификатор первичного ключа, чтобы можно было корректно обращаться к записям этой таблицы, не путая их). В этом случае каждому пользователю можно выделить целый набор ролей, не ограничиваясь одной ролью.
    Ответ написан
    Комментировать
  • Как понять сгорела ли звуковая карта или что с ней не так?

    @alexalexes
    Запустить AIDA64 и посмотреть, что есть в разделе устройств Мультимедиа -> Аудио PCI / PnP. Если вы аппаратно звуковую карту никак не отключали, значит она неисправна совсем, и в этом разделе вы ее не увидите. Если там есть альтернативное устройство от материнской платы, значит, что-то с драйверами в операционной системе.
    Ответ написан
  • Как правильно верстать используя bootstrap?

    @alexalexes
    При использовании bootstrap вы не можете мыслить фиксированными шириной.
    У вас есть 12 колонок - 12 долей единиц ширины экрана, и есть с полдюжины разных размеров экранов.
    Самый маленький, малый, средний, большой и очень большой.
    И логика расстановки классов такая:
    "На большом экране и больше у меня слайдер будет шириной 6 из 12 колонок,
    на среднем 8 из 12 колонок,
    от малого и меньше 12 из 12 колонок".
    С этой логикой и навешиваете нужный набор классов на контейнер слайдера.
    JS код не должен фиксировать размер контейнера в пикселях, нужно ему позволить расширяться по bootstrap сетке.
    Ответ написан
    Комментировать
  • Как перезагрузить удаленно Windows 11?

    @alexalexes
    На каждом компе держать CD/DVD дисковод подключенным, даже если он давно не читает диски.
    Один дисковод одного системника нужно расположить так, чтобы его лоток мог воздействовать на кнопку перезагрузки другого системника. Если одна система зависает, то нужно подключиться к другой системе и вызвать 2 команды извлечения диска из дисковода (одна на открытие лотка, другая - на закрытие) и подождать, когда вторая система перезагрузится.
    Ответ написан
    2 комментария
  • Как отследить когда программа делает и пересылает скриншот экрана?

    @alexalexes
    Сменить работу. Если откроется факт противодействия существующим инструментам контроля, то наказание будет намного суровее, вплоть до того, что заставят делать селфи, когда отлучитесь в туалет.
    Ответ написан
    2 комментария
  • Нормально ли предоставлять скан паспорта при трудоустройстве?

    @alexalexes
    Если вы к скану не приложили заполненную форму согласия на обработку персональных данных, где четко обозначен перечень реквизитов документа (серия номер документа, ФИО, дата и место рождения...), кому вы передаете их, какой перечень допустимых действий (обработка в информационной системе компании, хранение, передача другим системам за пределы информационной системы компании), с какой целью (трудоустройство).
    То это нарушение с юридической точки зрения.
    Ответ написан
    Комментировать
  • Как работать напрямую с базами данных из клиента?

    @alexalexes
    Возможно, если сама СУБД будет давать необходимый API для веб клиентов (который не будет работать из коробки, нужны определенные действия по настройке со стороны администратора СУБД).
    Яркий пример - Oracle REST Data Services.
    Но не каждый производитель СУБД заморачивается над разработкой подобных сервисов. Главное, чтобы самые популярные среды разработки серверных приложений имели необходимое расширение или драйвер, чтобы подключаться к СУБД на стороне сервера. Остальное - головная боль прикладных разработчиков.
    Ответ написан
    Комментировать
  • Почему куллер не охлаждает ЦП мгновенно?

    @alexalexes
    Вы ничего не сказали, что из себя представляет ваша система охлаждения.
    Если это классический радиатор с теплотрубками, то существуют более эффективные альтернативы в виде системы жидкостного охлаждения, или системы с использованием испарительной камеры. Жидкость за счет ее постоянного движения и теплоемкости или испаряющийся теплоноситель будут более эффективнее работать по отводу тепла. Вероятно, пики тепловыделения они будут гасить тоже более эффективнее.
    Ответ написан
    Комментировать
  • Как сделать что бы при нваедении иконки не прыгали?

    @alexalexes
    .header-dropdown-item {
    ...
      height: 4rem;
    ...

    .header-dropdown-item:hover {
    ...
      height: fit-content;
    ...

    Эти значения высот в вычисленном состоянии имеют разный результат в пиксельном выражении?
    Как вы думаете?
    Ответ написан
    Комментировать
  • Можно ли подключить 2 bluetooth аудиоколонки (в устройствах Bluetooth 4.0) к одному проигрывателю?

    @alexalexes
    1. Тогда и конечные устройства должны быть на 5 версии. Иначе адаптер будет работать в режиме совместимости 4 версии со всеми ограничениями.
    2. Рассинхрон гарантирован. Что прилетело в буфер конечного устройства, то и воспроизводится.
    3. Рано или поздно вы столкнетесь, что при включении или после пробуждения одного из устройств оно не встает в сопряжение и нужно передергивать настройки на компьютере. Софт bluetooth очень инертный, когда вкл./выкл. конечные устройства, и не, дай бог, передергивают адаптер - тогда он вообще склонен к зависанию. И да, при сопряжении, софт склонен подключать самый простой голосовой кодек для гарнитур, а не ваши новомодные aptX - это тоже точка зависания и отказа.
    Ответ написан
    Комментировать
  • Какой силы должен быть магнит?

    @alexalexes
    Ключевым показателем будет расстояние от магнита до магнитящей поверхности.
    Сила магнита будет убывать с квадратом расстояния.
    На 40 мм может не хватить никакого неодимового магнита, чтобы удерживать даже свой вес.
    Ответ написан
    Комментировать
  • Как заменить большое кол-во символов на другое?

    @alexalexes
    Перехешировать правильно те пароли, которые по значениям не похожи на хеш пароля.
    Например, так можно перехешировать пароли в MySQL базе с помощью md5 функции.
    UPDATE myTable
    SET password = md5(password)
    WHERE not (password REGEXP '^[0-9a-fA-F]{32}$' )

    PS:
    1) Для других алгоритмов (не md5) нужно подобрать другую регулярку, учитывающую длину хеша и алфавит хеша.
    2) Перехеширование не учитывает использование соли. Нужно точно повторить шаги хеширования в SET, если применяется не только сама функция хеша в оригинальном алгоритме генерации пароля.
    Ответ написан
    Комментировать
  • Как сделать регулярное выражение?

    @alexalexes
    // шаблон в формуле
    $pattern = '[string] * [string] * 0.2';
    // определяем число плейсхолдеров - подстановочных мест для параметров
    $placeholder_count = substr_count($pattern, '[string]');
    $input_params = []; // массив входных параметров
    // заполняем массив входных параметров по кол-ву подстановочных мест
    for($i = 0; $i < $placeholder_count; $i++)
    {
      // имитация процесса получения входных параметров из другого источника
      $input_params[] = floatval('1.32453' + $i);
      // если параметры получают в виде строковых значений,
      // то их нужно обязательно пропускать через функции floatval или intval,
      // чтобы экранировать значения и недопустить попадания в шаблон чего-то,
      // кроме целых или вещественных чисел
    }
    // создаем выходной шаблон для подстановки параметров
    $out_pattern = $pattern;
    // производим подстановку параметров из массива
    for($i = 0; $i < $placeholder_count; $i++)
    {
      $out_pattern = str_replace('[string]', $input_params[$i], $out_pattern);  
    }
    // выполняем выходной шаблон как строку кода PHP.
    // Результат выполнения спроецируется в переменную $exec_result
    eval('$exec_result = '.$out_pattern.';');
    // смотрим пошагово, что происходит
    echo 'pattern: '.$pattern."\n";
    echo 'placeholder_count: '.$placeholder_count."\n";
    echo 'input_params: '.print_r($input_params, true)."\n";
    echo 'out_pattern: '.$out_pattern."\n";
    echo 'exec_result: '.$exec_result."\n";
    Ответ написан
    Комментировать
  • Почему отключается клавиатура на ноутбуке, при том что работает кнопка питания?

    @alexalexes
    Версия 1. У вас в кармане одежды магнит (или на одежде есть намагниченный элемент). Вы воздействуете им на датчик закрытия крышки. Ноутбук ведет себя так, как будто вы закрыли крышку. Возможно, неисправен этот датчик, и локальный магнетизм тут не причем.
    Версия 2. В ноутбуке есть механические повреждения. Отошел шлейф клавиатуры и т.п. после того, как его когда-то уронили.
    Ответ написан
    Комментировать
  • Как сделать логи изменения отдельной таблицы в MariaDB?

    @alexalexes
    Стандартная практика ведения истории изменения данных таблицы.
    Вешаете триггер по операциям UPDATE, INSERT, DELETE перед их выполнением (опция before) на интересуемую таблицу и вставляете данные из атрибутов old.* триггера в таблицу истории.
    Таблица истории:
    history_id - идент. записи истории
    next_history_id - идент. следующей записи истории в пределах одной записи отслеживаемой таблицы (у последней он null)
    oper_type - тип операции (UPDATE, INSERT, DELETE - можно числами записать)
    old.* - все атрибуты таблицы, значения до выполнения операции.
    new.* - все атрибуты таблицы, которые пытались внести операциями UPDATE или INSERT. Этот набор нужен, если вы следите за историей на транзакциях, которые были откатаны назад (неудачные попытки). В этом случае, в триггере нужно указать специальную опцию, чтобы он работал в режиме автономной транзакции.
    При внесении новой записи истории, в предыдущей записи по такому же первичному ключу отслеживаемой таблицы нужно добавлять next_history_id от history_id новой записи.
    Таким образом в отслеживаемой таблице будет актуальное состояние записи, а в таблице истории - цепочка изменений записей.
    По каждому первичному ключу записи отслеживаемой таблицы можно построить цепочку изменений по history_id и next_history_id.
    А по next_history_id is null можно быстро получить последнее изменение из этой цепочки.
    Естественно, к этим полям нужно добавить индексы.
    Ответ написан
    Комментировать