• Как подписать значение по ГОСТ Р 34.10-2012 256?

    @ksnk
    Ответ написан
    Комментировать
  • Знакомство нового пользователя через подсказки?

    @ksnk
    А в чем проблема посмотреть кто что смотрел?
    Таблица подсказок - {ID подсказки, страница (маска страниц, список страниц), селектор, событие, текст подсказки}.
    Таблица просмотров {ID юзера, ID подсказки, время демонстрации}
    Информация о подсказках с просмотрами left join собирается и выгружается на нужную страницу. Специальный виджет расставляет все непросмотренные подсказки по hover или клику мышки. Он же будет заботится о том, чтобы хранить информацию о показах, либо в localStore, для незарегистрированного, либо в профиле пользователя сайта. Если подсказка демонстрировалась недавно - можно не показывать...
    Удобно то, что система получится "независима" от остального сайта, в том смысле, что ее можно убрать и сайт продолжать работать. Можно поставить ее на любой существующий сайт, отдельно настраивать шаблоны сайта не придется, разве что обеспечить вменяемые селекторы для поясняемых элементов.
    Если вносится новая фича с подсказкой на сайт - никто ее пока не просмотрел - всем насильно показать.
    Придется сделать на каждой странице заметную кнопку "Расскажи мне опять все-все все про ту страницу", это для особо забывчивых. Сделать в профиле пользователя или на странице кнопку-галку "не показывать мне больше ваши всплывающие подсказки", ну чисто для полноты картины мира и ощущения справедливости...
    Ответ написан
    Комментировать
  • Как разделить строку в массив на текст и числа в JS?

    @ksnk
    Если адрес совсем в свободной форме, то лучше доверить разбор адреса профессионалам Яндексу. У него есть Map api с функцией геокодирования https://yandex.ru/dev/maps/jsapi/doc/2.1/dg/concep...
    В песочнице можно поиграться с тем, как расшифровываются кусочки адреса, введенного пользователем https://yandex.ru/dev/maps/jsbox/2.1/direct_geocode/
    Например про адрес из первого сообщения была вот такая информация
    Тип геообъекта: house
    VM75:65 Название объекта: 1-й Волконский переулок, 10
    VM75:66 Описание объекта: Россия, Москва
    VM75:67 Полное описание объекта: Россия, Москва, 1-й Волконский переулок, 10
    VM75:72 
    Государство: Россия
    VM75:73 Населенный пункт: Москва
    VM75:74 Адрес объекта: Россия, Москва, 1-й Волконский переулок, 10
    VM75:75 Наименование здания: -
    VM75:76 Номер здания: 10
    Правда работа с api ограниченно бесплатная, но для небольшого сайта с умеренным трафиком очень даже.
    Ответ написан
  • Как вывести ответы на анкету каждого пользователя на отдельной странице (ответы читаются из файла)?

    @ksnk
    Сохраняй результаты не в txt файл, а в php. Что нибудь такое, при сохранении
    $results_file='results.php';
    $result=include_once($results_file);
    $result[$current_user_id]=['post'=>$_POST, 'time'=>time()];
    file_put_contents($results_file, '<'."?php\nreturn ".var_export($result,true).';')

    Проверку параметров и навороты - по вкусу
    При выводе включаем то же файл и выводит заполненную нужным юзером анкету.

    Ну и начальный results.php
    <?php
    return [];
    Ответ написан
    Комментировать
  • Как ускорить чтение большого архива gz?

    @ksnk
    Читать нужно не по строкам, а блоками, килобайт по 40. Просто проверь - чтение блоками всего файла или чтение построчное gzgets. Вот искать в таких блоках сложнее - нужно гарантировать что найденный кусок не попадет на границу буфера чтения. Для этого, можно последнюю "строку" блока сохранять и копировать в следующий блок.
    Читать загзипованые файлы удобнее, imho, обычными файловыми операциями fread, feof вот только открывать его придется gzopen. Как нибудь так...
    if (preg_match('/\.gz$/', $name)) {
                    $_handle = fopen($name, "rb");
                    fseek($_handle, filesize($name) - 4);
                    $x = unpack("L", fread($_handle, 4));
                    $this->finish = $x[1];
                    fclose($_handle);
                    $handle = gzopen(
                        $handle, 'r'
                    );
                } else {
                    $this->finish = filesize($name);
                    $handle = fopen($name, 'r');
                }
    Ответ написан
  • Как создать обственные BB коды на сайт или форум?

    @ksnk
    Простейший вариант - заменять [CODE] на < pre > и закрывающий [/CODE] на < /pre>. Это не то, что нужно в этом месте ? Чтобы не задумываться о непарных тегах - можно менять регуляркой
    $text=preg_replace('~\[CODE\](.*?)\[/CODE\]~si', '<pre>$1</pre>',$text);

    Если, внезапно, захочется что-то более навороченного - можно посмотреть ответ nokimaro
    Ответ написан
    Комментировать
  • Добавляют ли файлы сайта на CMS в git?

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

    @ksnk
    Тебе , вероятно, нужно не скрыть конец адресной строки, а выкинуть уже ненужный параметр select ?
    Что нибудь этакое, если в query_string действительно query_string, а не что-то еще
    $query=[];
    parse_str(parse_url($query_string, PHP_URL_QUERY),$query_array);
    unset($query_array['select']);
    echo (!empty($query_array)?'?':'').http_build_query($query_array);
    Ответ написан
    Комментировать
  • Как сделать хаотичное расположение слов с помощью CSS или JS?

    @ksnk
    Зависит от смысла задачи. Если поместить что-то такое на сайт, то гуглить по слову `wordart wordcloud`. Если понять, как делать самому или даже попытаться сделать - гуглить по словам "Облако тегов" или вот ссылка на доку от автора Wordle

    На js - Пример, и гитхаб
    Ответ написан
    Комментировать
  • Canvas convertion .SWF реально?

    @ksnk
    Ищи в гугле по словам `3d max javascript`.
    Это моделька из 3dmax, которую можно рендерить прямо в броузере. Обычно (и здесь тоже), это делают через TreeJs
    Ответ написан
    Комментировать
  • Как ограничить выполнение функции mousemove 1 раз в секунду?

    @ksnk
    Довольно накладно менять стиль в списке стилей, чтобы они поменяли бякграунд у единственного элемента. Не проще ли явно менять стиль у этого самого элемента? Явно будет эффективнее.

    Ну а по сути вопроса - вот так можно без дополнительных сущьностей. 10 строк и никакого мошенничества с npm ...

    function moveBg(evt){
        if(!!moveBg.timeout){ // функция недавно вызывалась  - запоминаем параметр и ждем;
            moveBg.evt=evt;
            return ;
        }
        // начинаем засечку времени 1 сек. По окончании таймаута вызываем функцию с  последним актуальным параметром, если надо
        moveBg.timeout=setTimeout(function(){moveBg.timeout=null; if(!!moveBg.evt){moveBg(moveBg.evt); moveBg.evt=null}},1000 );
        // дальше без изменений и коррекций
        var totalWidth = $('.home-shadow').width()
        var rect = evt.target.getBoundingClientRect()
        var x = evt.clientX - rect.left;
        var percent = x*100 / totalWidth
        console.log(percent)
    
        var styleElem = document.head.appendChild(document.createElement("style"));
    
        styleElem.innerHTML = `#home-shadow:before {background-position: ${percent}% 50%`;
    }
    
    $('body').mousemove(function(evt){
        if(evt.target.classList[0] == 'home-shadow'){
            moveBg(evt);
        }
    });
    Ответ написан
    Комментировать
  • Как сделать, чтобы при смене радиокнопки удалялось прибавленное значение и прибавлялось новое?

    @ksnk
    https://jsfiddle.net/7ekjafbq/1/
    А почему бы не пользоваться тем, что это почти форма ? Добавить в контролы имена, значения и пользоваться почти штатной сериализацией.
    Ответ написан
    1 комментарий
  • Как удалить строку по символам (эффект печатающей машины)?

    @ksnk
    let control = document.querySelector('.text'), 
            txt= control.textContent, 
            track=[];
        function runit(){
            let c= track.shift();
            if(!c) return ;
            if(c[0]==='pause'){
                setTimeout(runit,c[1]);
            } else if(c[0]==='substr') {
                control.textContent = txt.substr(c[1], c[2]);
                setTimeout(runit, 300);
            }
        }
        // программируем поведение
        for( let i=1;i<=txt.length;i++){
            track.push(['substr',0,i]);
        }
        track.push(['pause',3000]);
        for( let i=txt.length;i>=0;i--){
            track.push(['substr',0,i]);
        }
        runit();


    Не оно ?
    Ответ написан
    Комментировать
  • Как разместить два попапа на одной странице?

    @ksnk
    Ответ написан
    Комментировать
  • Не работает анимация jquery. В чем проблема?

    @ksnk
    Можно вместо $ везде писать jQuery. Или разобраться, почему эту переменную переопределяют все кому не лень
    Ответ написан
  • Как удалить из массива стринги в которых НЕ числа?

    @ksnk
    ["5", "0", "1jj1","1.1111111111111111" ].filter(v => v==(1*v))
    Ответ написан
    Комментировать
  • Как узнать, пересекаются ли блок с каким-либо другим с position absolute?

    @ksnk
    Для каждого элемента берем getBoundingClientRect и проверяем, что пересечение существует.
    Извиняюсь, что на jQuery, но смысл, вроде и так понятен.
    $(function(){
      var elements=$('.red,.yellow');
      for(let i=0;i<elements.length;i++){
        let ri=elements.eq(i)[0].getBoundingClientRect();
        for(let j=i+1;j<elements.length;j++){
          let rj=elements.eq(j)[0].getBoundingClientRect();
          console.log(//ri,rj, 
                      Math.max(ri.x,rj.x)<=Math.min(ri.x+ri.width,rj.x+rj.width)
                     &&
                      Math.max(ri.y,rj.y)<=Math.min(ri.y+ri.height,rj.y+rj.height)
                     )
        }
      }
    })
    Ответ написан
    Комментировать
  • Как сделать так, чтобы после открытия новой вкладки в браузере Хром старая вкладка автоматически закрывалась?

    @ksnk
    <a href="#" onclick="setTimeout(function(){window.close()},3000)" target="_blank">xxx1</a>

    Не так ?
    Ответ написан
    Комментировать
  • Как сделать алгоритм победы в больших крестиках-ноликах?

    @ksnk
    Берем 4 направления - [0,-1],[1,-1],[1,0],[1,1], к примеру - [0,-1] - это вверх. Инвертируем все цифры - получаем противоположное [0,1] - вниз.
    Поставили, к примеру крестик.
    Изменяем стартовые координаты на "направление". если там тоже крестик - идем дальше. Если нет - прекращаем.
    Переключаемся на противоположное направление, считаем крестики. Если досчитали до 4-х - победа крестиков.
    Если прошли все направления - отдаем ход. Ну и координатную сетку как-то надо вбить в разметку, например как-то так
    // Создаю клетки 49 клеток с классом "cell"
        for(let i = 1; i <= 49; i++) {
            var x=Math.floor((i-1)/7)+1,y=((i-1)%7)+1;
            area.innerHTML += `<div class='cell' id='id-`+x+`-`+y+`'></div>`
        }
    
        // Отслеживаю клик по клетке и выполняю функцию cellClick()
        const cells = document.querySelectorAll('.cell')
    
        cells.forEach(cell => {
            cell.addEventListener('click', cellClick, false)
        })
    
        // Первый игрок - X
        let player = 'x'
    
        // В функции cellClick() я проверяю занята ли клетка, и если нет, то
        // вставляю в неё текущего игрока.
        function cellClick() {
    
            /**
             * проверяем, что по координатам x,y стоит нужный знак
             *
             * @param x
             * @param y - координаты
             * @param player - крестик
             * @returns {boolean} true - стоит
             */
            function check(x,y,player){
                return document.getElementById('id-'+x+'-'+y).innerHTML==player;
            }
    
            /**
             * считаем количество крестиков(player) от координаты x,y в "направлении" dx,dy
             * @param dx
             * @param dy
             * @param x
             * @param y
             * @param player
             * @returns {number}
             */
            function countit(dx,dy,x,y, player){
                var total=0;
                x+=dx; y+=dy;
                while (x>0 && x<=7 && y>0 && y<=7 ){
                    if(check(x,y,player))
                        total++;
                    else
                        break;
                    x+=dx; y+=dy;
                }
                return total;
            }
    
            if (!this.innerHTML) {
                this.innerHTML = player;
                // so checkit
                var dirs=[[0,1],[-1,1],[-1,0],[-1,-1]],
                    // вычисляем текущие координаты клика
                    m=this.getAttribute('id').match(/id-(\d+)-(\d+)/),
                    // вот они - координаты. Умножение для преобразования строк в числа
                    x=1*m[1], y=1*m[2];
                for(var d=0;d<dirs.length;d++){
                    if(5>1+ // 1 - мы поставили крестик
                        // число крестиков в направлении
                        countit(dirs[d][0],dirs[d][1], x, y, player) +
                        // и инвертированном направлении
                        countit([-dirs[d][0],-dirs[d][1]],x ,y , player)
                    ){
                        // если меньше чем надо для победы - считаем дальше
                        continue;
                    }
                    // если нашли больше 5 крестиков в ряд - победа.
                    alert('Победа '+player);
                    break;
                }
            }
    
            // Меняю игрока, если текущий игрок сходил.
            player = player == "x" ? "o" : "x"
        }
    Ответ написан
    5 комментариев