• Как сделать реализацию чата как в мессенджерах?

    @alexalexes
    что должно происходить при отправке первого сообщения пользователем А пользователю B?

    До отправки сообщения на клиенте держится в памяти заготовка комнаты.
    После отправки сообщения сервер оповещает все экземпляры клиента пользователей A и B, что создал комнату между A и В (A и B могут открыть несколько экземпляров программ под своими логинами).
    Если экземпляры клиентов открывали заготовку комнаты у себя, которая по врЕменным параметрам участников соответствует реальной комнате A и В, то эти экземпляры клиентов синхронизируют свое состояние с тем, что прислал сервер, то есть делают отображение комнат реальным.
    Ответ написан
    Комментировать
  • Как узнать процент похожести текста?

    @alexalexes
    Самое простое - натравить поисковик на собственный ресурс запросом:
    "site:yousite.ru фрагмент фразы".

    PS: Сайт на момент запроса должен быть проиндексирован поисковиком.
    Ответ написан
    Комментировать
  • Можно ли написать SQL запрос с выражением в WHERE и в SELECT, но без повторения этого выражения и без вложенного SELECT?

    @alexalexes
    Но будет 2 вычисления MD5

    Выражения в select вычисляются после того, как отобраны строки по условиям в where.
    Если выходная выборка совсем небольшая, то оптимизировать работу функции в колонках не нужно - это экономия на спичках.
    Другое дело, если вы используете вычисляемую функцию в where. Чтобы она быстро работала есть 3 пути:
    1. Если функция вычисляется из данных, которые не зависят от контекста запроса, то нужно отказаться от этой функции, которая вычисляется при каждом запросе. Нужно хранить ее результат в отдельном атрибуте.
    2. Сделать индекс с использованием этой функции на атрибуте, тогда при использовании этой же функции в where сработает индекс.
    3. Если есть возможность, то нужно так преобразовать выражение where, чтобы все аргументы вычисляемой функции или выражения (складываем, вычитаем, умножаем делим, case-им) оказались входными параметрами или константами. Чтобы такое произошло, нужна обратная функция для md5 - reverse_md5. Но такой функции по математическим соображениям не существует.
    Иначе выражение бы выглядело так:
    where value = reverse_md5(:hache)
    Ответ написан
    1 комментарий
  • Как получить имя файла из zip архива, который содержит кириллицу?

    @alexalexes Автор вопроса
    Имя файла, получаемое при работе с модулем ZipArchive, из-за бага в этом модуле требует некоторого преобразования через промежуточные однобайтовые кодировки.
    Нужно провести такую цепочку преобразований:
    UTF-8 -> encode1 -> encode2 (encode3) -> UTF-8
    В php это будет так:
    $out_str = iconv('UTF-8', $encode1.'//IGNORE', $in_str);
    $out_str = iconv($encode1, $encode2.'//IGNORE', $out_str);
    $out_str = iconv($encode3, 'UTF-8//IGNORE', $out_str);

    Но проблема в том, что для каждой конфигурации сервера эти кодировки могут отличаться.
    Чтобы их найти нужно воспользоваться методом перебора.
    Для начала найдем все кодировки, которые поддерживает функция iconv.
    Для этого в консоли сервера вызовем:
    $ iconv -l
    Из набора кодировок нужно взять только те, которые содержат наименование "CPxxx", где xxx - число.
    С помощью скрипта провести полный перебор:
    $all_encoding = []; // сюда вставляем список всех кодировок iconv
    $out_encoding = array_filter($all_encodings, function($item){return strpos(strtolower($item), 'cp') !== false;});
      foreach($out_encoding as $encode1)
      {
        foreach($out_encoding as $encode2)
        {
          foreach($out_encoding as $encode3)
          {
              $str = iconv('UTF-8', $encode1.'//IGNORE', $out);
              $str = iconv($encode1, $encode2.'//IGNORE', $str);
              $str = iconv($encode3, 'UTF-8//IGNORE', $str);
              if($str !== false && $str !== '')
                echo $encode1.'::'.$encode2.'::'.$encode3.'::'.$str.'<br>';
          }
        }
      }

    Визуально ищем тот вариант, где имя файла восстановилось.
    В моем случае это:
    UTF-8 -> cp437 -> cp437 (cp866) -> UTF-8
    В коде это выглядит так:
    $out_str = iconv('UTF8', 'CP437//IGNORE', $in_str);
    $out_str = iconv('CP437', 'CP437//IGNORE', $out_str);
    $out_str = iconv('CP866', 'UTF8//IGNORE', $out_str);
    Ответ написан
    Комментировать
  • Какой отрезок содержит в себе больше целочисленных значений?

    @alexalexes
    Будьте внимательны, почему вы левую часть считаете в меньшую сторону, если там интервальная скобка ( ?
    (11;20] - с 12 по 20 - итого 9.
    (21;31) - с 22 по 30 - итого 9.
    И в итоге вариант [32;41] - он больше всех.
    Ответ написан
    6 комментариев
  • Браузер блокирует скачиваение с сайта нескольких файлов подряд. Как предупредить пользователей?

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

    @alexalexes
    USB хаб - самый неустойчивый узел.
    Как по производительности - он будет бутылочным горлышком, если к нему подключать высокоскоростные устройства. Так может подвести по питанию. Даже если по характеристикам потребляемого тока подключенных устройств хаб укладывается в лимиты, может оказаться сюрпризом то, что не хватает сечения жил основного провода для поддержания нужного уровня тока, либо идут большие потери на нагрев внутренней схемы хаба, или банально плохой контакт в соединении. Для стабилизации работы хаба в некоторых случаях требуется отдельное внешнее питание.
    Опасности нет, просто если хаб не вывозит, он просто будет работать нестабильно, а подключенные устройства будут либо на дежурном режиме работать, либо пытаться в бесконечном цикле запрашивать разрешение кушать тока по больше, но не получать его.
    Ответ написан
    Комментировать
  • Менял для программы значение кнопки "." на кнопку "Num 2" тк у меня нету нампада на клаве. Как вернуть значение клавиши?

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

    @alexalexes
    1. Сначала занулите свойство анимации. Потом вызовите setTimeout с нулевым временем, чтобы JS применил изменения анимации в DOM и внутри setTimeout добавьте свойство анимации. Тогда анимация перезапустится.
    nickinput.style.animation = "none";
      setTimeout(function() {
        if (validmail === false) {
            mailinput.style.animation = "blinker 0.6s linear 3";
        }
        }, 0);

    2. Задайте какой-нибудь color в ключевом кадре:
    @keyframes blinker {
      50% {
        background-color: #b11515;
        color: #aaa;
      }
    }
    Ответ написан
    3 комментария
  • Как сделать кастомные пагинации?

    @alexalexes
    Никогда не копался во внутренностях вордпресса.
    Но в вашем примере есть фрагменты, которые помогут собрать то, что вы хотите.
    1. Вам нужна некая функция, которая будет получать href относительно текущего раздела, чтобы перейти на другую страницу этого же раздела. В которую мы будем передавать номер страницы, а получать на выходе url.
    Вероятно, это оно:
    esc_url( get_pagenum_link( 999999999 ))
    2. Нам нужно получить текущий номер, страницы.
    Наверное, это оно:
    max( 1, get_query_var( 'paged' ) )
    3. Нам нужно получить общее число страниц, наверное так:
    $query->max_num_pages
    4. Кроме чисел, нам нужно адаптивно выключать ссылки, когда следующей страницы нет (ссылка Next), и когда предыдущей страницы нет (ссылка Prev, вы как раз показали этот случай 1/3Next). Эти ситуации обрабатываются путем сравнения текущего номера страницы с единицей или макс. номером страницы.
    Резюмируя эти предположения, можно получить вот такой код для генерации блока pagination:
    $curent_page = max(1, get_query_var( 'paged' )); // текущий номер страницы
    $max_page_num = $query->max_num_pages; // общее количество страниц
    $prev_page_num =  $curent_page - 1 > 0 ? $curent_page  - 1 : null; // номер следующей страницы, если ее нет, то null
    $next_page_num = $curent_page + 1 < $max_page_num ? $curent_page + 1 : null;  //номер предыдущей страницы, если ее нет, то null
    $prev_page_link = is_null($prev_page_num) ? null : esc_url( get_pagenum_link($prev_page_num));  //ссылка на следующую страницу, если ее нет, то null
    $next_page_link = is_null($next_page_num) ? null : esc_url( get_pagenum_link($next_page_num)); //ссылка на предыдущую страницу, если ее нет, то null
    echo '<div class="pagination">'
    .(is_null($prev_page_num) ? '' : '<a href="'.$prev_page_link .'">Prev</a> ')
    .$curent_page.'/'.$max_page_num
    .(is_null($next_page_num) ? '' : '<a href="'.$next_page_link .'">Next</a> ')
    .'</div>';
    Ответ написан
  • Зачем вложенные "namespace"?

    @alexalexes
    Потому, что класс user (с достаточно неуникальным именем) может реализован еще в каком-нибудь стороннем компоненте.
    Чтобы при подключении этого компонента, вы могли использовать одноименный класс user как из своего компонента, так и из стороннего.
    Ответ написан
  • Почему не вносятся изменения в БД?

    @alexalexes
    1. Нужно использовать подготовленные запросы, а не делать по старинке через mysqli_real_escape_string.
    2. Если вы текстом написали запрос update, он еще не начнет выполнятся, где-то нужно запустить execute.
    if(isset($_POST['ref_button']) )
    {
        $send_ref = $_POST["send_ref"];    
        $stmt = msqli_prepare($con, "SELECT * FROM usertable WHERE referral= ?");
        mysqli_stmt_bind_param($stmt, 's', $send_ref);  // s - тип данных строка, i - число, если не тот тип данных - нужно исправить
        $result = mysqli_stmt_execute($stmt);
        if(mysqli_num_rows($result) > 0)
        {
            $stmt = msqli_prepare($con, "UPDATE usertable SET owner = ? WHERE email = ?");
            mysqli_stmt_bind_param($stmt, 'ss', $send_ref, $email); // s - тип данных строка, i - число, если не тот тип данных - нужно исправить
            $result = mysqli_stmt_execute($stmt);
        }
    }
    Ответ написан
    Комментировать
  • При каких знаниях первого яп можно начинать изучение второго?

    @alexalexes
    Пока не начнете делать проект, решающий какую-то насущную потребность (вашу - без денежного вознаграждения, или чужую - за денежное вознаграждение), можете всю жизнь просто интересоваться хоть одним языком программирования, хоть несколькими.
    Запомните, пока вы вне таких проектов что-то делаете, вы просто интересуетесь инструментарием, вы ничего не учите.
    Ответ написан
    Комментировать
  • Почему sql запрос не определяет имя таблицы, если записывать имя через prepare?

    @alexalexes
    1. В качестве входных параметров никогда не использовались имена таблиц в подготовленных запросах - это попытка забивать микроскопом гвозди.
    2. Метки для входных параметров - это не тип данных, это просто название места куда будет подставлено значение этой метки по ключу из массива значений.
    Причем, именованные метки нужно связывать со значением с помощью специальной функции:
    $stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = :metka_parametra_identifikatora");
    $stmt->bindParam(':metka_parametra_identifikatora', 123);
    $stmt->execute();

    Но можно не использовать именованные метки (если их несколько в запросе, то нужно вставлять значения по порядку)
    $stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = ?");
    $stmt->execute([123]);

    Можно использовать связывающую функцию, указав порядок метки.
    $stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = ?");
    $stmt->bindParam(1, 123); // 1 - это номер метки, 123 - значение параметра
    $stmt->execute();
    Ответ написан
    Комментировать
  • Внешний винт LaCie сломан USB-C разъем, поможет ли донор?

    @alexalexes
    1. Старый Usb-3 адаптер может не мочь перекодировать команды Sata больше 1Tb емкости. Будет либо видеть первые 700 с лишним Гб, если диск не форматировался раньше, либо считать поврежденным раздел, так как не может транслировать всю емкость диска.
    2. Если диск подключить напрямую по Sata и не в древнюю мать, и использовать либо Linux систему, либо дисковую утилиту, например, Paragon Disk Manager, то все прекрасно прочитается.
    3. Если у Type-C разъема отошла только пайка, а он сам целый, то его починит любой умелец с маломощным паяльником или паяльным феном.
    Ответ написан
    1 комментарий
  • Есть ли бесплатное API для получения всех улиц и домов конкретного города?

    @alexalexes
    https://fias.nalog.ru/Updates
    Тут есть полный архив адресов и разностные файлы на определенную дату.
    Ответ написан
    Комментировать
  • Как определить объем поддерживаемых браузеров в компании при разработке сайтов?

    @alexalexes
    Берете статистику использования браузеров в проектах, которые охватывают основную аудиторию.
    Смотрите наиболее старые версии браузеров, которые используют более 1% пользователей - это будет нижняя планка поддерживаемых браузеров. Узнаете названия движков этих браузеров и их версии - эти данные вписываем в тех. задание.
    Через год снова смотрим статистику, и примечаем, как изменились версии, какие версии ушли ниже 1%.
    Если ваш начальник или какой-то ключевой пользователь, находящийся в этом 1%, упорно сидит на старом браузере, то этот момент прописываем отдельным пунктом в ТЗ - также регулярно интересуемся, не изменились ли у него предпочтения, чтобы занести эти изменения.
    Ответ написан
    Комментировать
  • Подсчёт кол-ва детей у сотрудников access?

    @alexalexes
    Подскажите пожалуйста - в каком направлении думать.

    Подтянуть знания:
    1. Псевдонимы таблиц и полей в SQL.
    2. Соединения таблиц (join, left/right/cross join).
    3. Использование группировок в выборке.
    4. Агрегирующие функции (count, max, min и т.д.).
    В перспективе:
    5. Оконные функции.
    6. Подзапросы для получения скалярного значения (используется в секции select или в where)
    7. Подзапросы в секции from
    Select w.`Код`, w.`Фамилия`, w.`Имя`, w.`Отчество`, 
               count(ch.*) as Child_Count -- кол-во детей
               -- count(distinct ch.`Фамилия`, ch.`Имя`, ch.`Отчество`, ch.`Дата рождения`) as Child_Count -- кол-во детей по группе уникальных полей по таблице Дети, без использования идентификатора
    from `Список` w
    join `Дети` ch on ch.`КодСотрудника`  = w.`Код`
    group by w.`Код`, w.`Фамилия`, w.`Имя`, w.`Отчество`
    Ответ написан
  • CSS как сверстать вертикальное расположение? либо JS как правильно находить элемент в DOOM?

    @alexalexes
    Можно указывать нужный элемент с помощью псевдоселекторов:
    let life = lifesBlock.querySelector("span:first-child");

    или
    let life = lifesBlock.querySelector("span:last-child");
    Ответ написан
    Комментировать
  • Сколько Google платит за устранение ошибок в его продуктах?

    @alexalexes
    Ошибки вы нашли, а что вам помешало нагуглить их сайт, где как раз и решают этот вопрос?
    https://bughunters.google.com
    Ответ написан
    Комментировать