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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1) Сначала перевести данные из таблицы в переменные JS.
    2) Саму исходную таблицу убрать.
    3) Формировать на основе данных всё, что вам нужно - пагинацию, поиск, сортировку.
    4) Любой осмысленный клик сопровождается перерисовкой 25 строк таблицы.

    Вообще странно, что вся таблица сразу подгружается. Обычно аяксом по частям. Ну хотя 1000 строк - не так уж и много.
    Ответ написан
    Комментировать
  • Как происходит создание переменных в Си?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    По классике локальные переменные создаются на стеке. То есть там же, куда кладутся параметры функции. А после выхода из функции указатель стека возвращается на прежнее место, как бы освобождая память. Но это не настоящее выделение памяти, то есть она выделяется не из кучи, а гораздо быстрее. И также быстро освобождается.

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

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Примерно так:
    let style = document.createElement('style');
    style.innerHTML = `
    div {
    	animation-name: nodeReady;
    	animation-duration: 0.001s;
    }
    
    @keyframes nodeReady {  
    	from { clip: rect(1px, auto, auto, auto); }
    	to { clip: rect(0px, auto, auto, auto); }  
    }
    `;
    document.head.appendChild(style);
    
    document.addEventListener("animationstart", function(e) {
    	if (e.animationName == "nodeReady") {
    		if (e.target.innerHTML.trim() == 'привет') e.target.innerHTML = 'Пока';
    	}
    }, false);

    По стилям там сами смотрите. Если у вас есть class, например, можно вместо div его указать:
    .mydiv {
    	animation-name: nodeReady;
    	animation-duration: 0.001s;
    }

    Если вы инжектитесь из расширения, то у вас не будет ни элемента head, ни body. Придётся использовать какой-то такой костыль:
    document.children[0].appendChild(style);
    Ответ написан
    Комментировать
  • Актуален ли IE11 в 2019м?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Это примерно 3-5% пользователей.
    Они вам критичны?

    Полная кроссплатформенность быть не может, потому что придется учесть все старые браузеры вплоть до прошлого века. Определитесь, кем вы готовы пожертвовать, то есть начиная с каких версий текущих браузеров вам нужна поддержка.

    В любом случае вы можете сделать небольшую проверку в начале (отдельным скриптом):
    try{ eval("let x"); alert("ES6+"); } catch(e) { alert("ES5-"); }

    Естественно, вместо alert'ов нужны ваши варианты действий. Например, редирект с просьбой проапгрейдиться.
    Ответ написан
  • Почему пустой $_REQUEST после отправки формы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А зачем вам значение кнопки? Какая в этом логика?
    Это же не поле ввода какое-нибудь, не чекбокс и т.д.?
    У вас же всего одна кнопка submit.

    А что есть? Другие поля есть? Попробуйте:
    var_dump($_REQUEST);
    Ответ написан
    Комментировать
  • Внешние JS библиотеки или локальные, есть ли преимущества?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Лучше локально, потому что уменьшается количество точек отказа до минимума, коим является ваш сайт.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Да, 18+ нельзя показывать детям.
    А также нельзя показывать детей кому угодно в 18+ контенте.

    Чёткой грани нет, пока что. Ютуб просто не хочет проблем разной степени сложности. Ютуб также и к авторскому праву серьезно относится, что может подкосить невинных, так что он не показатель вообще.
    Ответ написан
    Комментировать
  • Гугл таблицы - условное форматирование?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Выделяете столбец с наименованием и делаете условное форматирование.
    Нужно выбрать вариант "Ваша формула".
    А в условии прописать формулу:
    =OR(D7;F7)
    Где D7 и F7 - соответствующие ячейки, которые вы проверяете в строке 7 с орехами.
    Формула пишется только для первой ячейки в выделенном диапазоне, на остальной диапазон она как бы автоматически "растягивается" с учётом сдвигов.
    Ответ написан
    1 комментарий
  • Как сделать такую регулярку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    \/\w+\/[0-9]+

    Есть специальные сайты, где вы можете "поиграться" с регулярками.
    Например:
    https://regex101.com/r/ncxyKP/1

    Также есть документация учебник.
    Ответ написан
    3 комментария
  • Как выделить (или сразу удалить) все строки в Notepad++ находящиеся выше-ниже какой-то?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Ctrl + Shift + Home - выделить всё от текущего места до начала файла.
    Текущее место - то, где стоит курсор. Так что если удаляете строки целиком, то ставьте курсор в начало или конец строки.

    Другой способ, более гибкий:
    1. Ставите курсор в начало (или конец) текста, который нужно выделить.
    2. Скроллите туда, до куда нужно выделить - начало файла, конец файла, какое-то место в документе и т.д. Для мегадлинных документов есть скроллбар, чтобы не мучить колёсико мышки.
    3. Зажимаете Shift + делаете клик мышью. Курсор ставится на новую позицию, при этом выделяется всё от старой позиции до новой.


    Это стандартные клавиши практически для всех редакторов текста, включая специализированные IDE и т.д. Всякие Shift + стрелки и т.д. Даже вот в форме ответа на Тостере это всё работает.
    Ответ написан
    2 комментария
  • Как организовать подмену сайта?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если сайт https, то c роутера - никак.

    Либо взламывайте сервер, где yandex.ru, либо взломайте центр сертификации (удостоверяющий центр), либо получите доступ к компу юзера и пропишите свои сертификаты, дальше дело техники.

    Единственное, что можно сделать, так это выцепить имя домена (yandex.ru) из https соединения и просто дропнуть само соединение. Но это ни разу не подмена.
    Ответ написан
    Комментировать
  • Оптимизировать код или как выделить всю вычислительную мощность пк на его выполнение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Первое, что бросается в глаза - это многократное копирование массива. Представьте, что при сортировке мы бы после каждых двух-трех перестановок делали бы полный дубликат массива. Это же ужас! И это слабое место, постоянное перевыделение памяти больших размеров.

    Второе, что тоже важно - это сложность O(N*N). В вашем случае это критично, потому что много элементов в исходном массиве.

    Предлагаю немного изменить алгоритм. Делаем одно прохождение, но немного увеличиваем потребление памяти, в которой храним интервалы. Таким образом, мы избавляемся от постоянного копирования массива, а также уменьшаем сложность примерно до O(N).

    И маленькая оптимизационная хитрость - поиск интервала происходит по индексу, то есть O(1). Нужно немного поразмыслить, чтобы до этого догадаться, но в целом всё просто.
    Код
    <?php
    $arr = [100,125,75,175,25,300,275,325,375];
    $step = 50;
    
    $b = []; //-1 - deny, 0 - not set, 1 - has interval
    $int = []; //intervals if necessary 
    $step2 = intdiv($step,2);
    $arr = array_values(array_filter($arr, function($v) use ($step2,&$b,&$int) {
        $i = intdiv($v,$step2);
        $mod = $v % $step2;
        $res = true;
        if (isset($b[$i])) {
            if ($b[$i] === -1) $res = false;
            elseif ($mod < $int[$i][0] or $mod > $int[$i][1]) $res = false;
        }
        $b[$i] = -1;
        $b[$i+1] = -1;
        $b[$i-1] = -1;
        if (!isset($b[$i+2])) {
            $b[$i+2] = 1;
            $int[$i+2] = [$mod,$step2];
        } elseif ($b[$i+2] === 1) {
            if ($int[$i+2][0] < $mod) {
                $int[$i+2][0] = $mod;
                if ($int[$i+2][0] >= $int[$i+2][1]) $b[$i+2] = -1;
            }
        }
        if (!isset($b[$i-2])) {
            $b[$i-2] = 1;
            $int[$i-2] = [0,$mod];
        } elseif ($b[$i-2] === 1) {
            if ($int[$i-2][1] > $mod) {
                $int[$i-2][1] = $mod;
                if ($int[$i-2][0] >= $int[$i-2][1]) $b[$i-2] = -1;
            }
        }
        return $res;
    }));
    
    var_dump($arr); // [100, 175, 25, 300, 375]
    ?>

    Переписав алгоритм на С++, получите дополнительно 50-кратное увеличение скорости.
    Ответ написан
    3 комментария
  • Зачем/Для чего нужен данный код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Это геттеры и сеттеры. То есть функции доступа к свойству.

    Зачем? Попробую объяснить простым языком. Большие программы сложно полностью загрузить в мозг отдельного человека и представлять всю структуру целиком со всеми нюансами одновременно. Поэтому принято делить программу на части. Вынос кода в отдельную функцию - один из простых способов. В ООП к этой проблеме подходят более основательно. Класс как явление - тому пример.

    Класс делит программу как минимум на 2 части - то, что внутри класса, и то, что снаружи класса. Считается как бы, что класс пишет один человек, а пользуется им другой человек. Но это может быть и один единственный человек, всё равно так проще, потому что человек сначала пишет класс, тщательно всё там кодит и тестирует, а потом напрочь ЗАБЫВАЕТ, как он устроен внутри, потому что он уже готов и им можно пользоваться. То есть человек выгружает из своей ненадежной человеческой памяти эту инфу и переходит к следующей задаче, в которой просто использует этот класс. Всё, что ему нужно помнить, это то, как пользоваться классом, а всю подноготную можно забыть до тех пор, пока не понадобится улучшить класс. И здесь снова получается удобно. Когда будем улучшать класс (это не обязательно тот же самый человек), можно не думать о том, как его используют. Главное, чтобы способ взаимодействия с классом не изменился (не сильно изменился).

    В вашем примере - это просто заготовка. Дальше нужно наполнять эту заготовку функционалом. В самом простом виде геттер просто возвращает приватное свойство, а сеттер меняет его. Так нужно сделать сразу, чтобы потом не пришлось переписывать всю программу (и согласовывать с коллегами). Но даже здесь уже есть небольшое правило - нельзя передавать отрицательные значения. Условия могут быть сложнее. И вообще всё может быть сложнее. Например, вместо age можно хранить дату рождения. И функция GetAge будет каждый раз высчитывать разницу с текущей датой. По сути для внешнего использования ничего не меняется, но внутри происходит магия.
    Ответ написан
    3 комментария
  • Как понять где проблема в сети, и точно ли в ней?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Любая проблема, тем более в сети, ищется методом исключения.

    Для этого делаете глобальное предположение, и пытаетесь его опровергнуть. Например, дело может быть либо в клиенте, либо в сервере, либо в обоих. Проверили - исключили что-то - дальше сужаете круг поиска. И так до тех пор, пока не попадете точно в причину.

    Медитировать на графики и пытаться понять их с помощью телепатии и экстрасенсорных способностей - не надежный путь. Бывает, приходит инсайт. Но лучше не надеяться на удачу, а идти проверенным путём, добывая всё больше и больше информации, помогающей исключать сразу множество вариантов.
    Ответ написан
    4 комментария
  • Как выделить ячейки в которых значения совпадают со списком нужных значений?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Да, условное форматирование. И это не обязательно формулы. Там есть разные варианты, например, точное совпадение, так что вместо формулы вы можете сделать три правила на совпадение числу.
    spoiler
    Есть кнопка добавить правило, после чего вы сможете создать второе, а затем и третье. Если закрыть и открыть окно с правилом (при выделенном диапазоне), то появится список существующих правил, можно удалить, редактировать, всё как у людей.


    Что же касается формул, то они ничем не отличаются от тех, что вы в школе изучали. Только вместо переменных x и y нужно использовать имена ячеек, которые по сути означают координаты (B2 - второй столбец и вторая строка). Формулы начинаются со знака =
    spoiler
    Вообще эта информация легко гуглится. Вот, например, нагуглил документацию за 30 секунд.


    Чтобы раскрасить формулой, нужно выделить диапазон, выбрать вариант форматирования "формула" и написать формулу для первой ячейки выделенного диапазона.
    Как-то так
    5cb692492a460902302817.png
    Ответ написан
  • Задача на удаление эквивалентных false элементов массива.Почему не работает мой код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно немного подробнее сделать отладку, и посмотреть внимательно, что происходит.
    Пример
    function bouncer(arr) {
      // Don't show a false ID to this bouncer.
      for(let i=0;i<arr.length;i++)  {
        console.log("Индекс:",i,"Значение:",arr[i]+'',"Отрицание:",!arr[i]);
        if (!arr[i]){
          arr.splice(i,1);
          console.log("Сработало условие, новый массив:",[...arr]);
        }
      }
      console.log("Итоговый результат:",arr);
      return arr;
    }
    
    bouncer([0, false, 7, "ate", "", false, 9, NaN]);

    Сразу станет видно, что при удалении элемента смещаются индексы, но вы их продолжаете перебирать по порядку. Следовательно, нужно либо возвращать индекс на 1 назад при удалении i--, либо перебирать массив с конца к началу:
    Решение 1
    function bouncer(arr) {
      // Don't show a false ID to this bouncer.
      for(let i=0;i<arr.length;i++)  {
        console.log("Индекс:",i,"Значение:",arr[i]+'',"Отрицание:",!arr[i]);
        if (!arr[i]){
          arr.splice(i,1);
          i--;
          console.log("Сработало условие, новый массив:",[...arr]);
        }
      }
      console.log("Итоговый результат:",arr);
      return arr;
    }
    
    bouncer([0, false, 7, "ate", "", false, 9, NaN]);
    Решение 2
    function bouncer(arr) {
      // Don't show a false ID to this bouncer.
      for(let i=arr.length-1;i>=0;i--)  {
        console.log("Индекс:",i,"Значение:",arr[i]+'',"Отрицание:",!arr[i]);
        if (!arr[i]){
          arr.splice(i,1);
          console.log("Сработало условие, новый массив:",[...arr]);
        }
      }
      console.log("Итоговый результат:",arr);
      return arr;
    }
    
    bouncer([0, false, 7, "ate", "", false, 9, NaN]);

    P.S. А для вставки кода в вопрос есть специальная кнопка, чтобы разметка не съехала.
    Ответ написан
    1 комментарий
  • Как сделать, чтобы эксель сохранял числа, а не даты?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для десятичных дробей в excel используются запятая, а не точка.
    3,14
    Если использовать точку, то получаются даты. Отсюда и все беды.

    Победить можно несколькими способами разной степени кривизны.
    1) Сохранять не в csv, а в формат самого экселя, и лишь конечный вариант сохранять в csv.
    2) Добавить любой символ (например, х) перед числом. Получится х1.1, либо добавлять что-то в конец. Это сделает значение строкой без вариантов.
    3) Сохранённый csv каждый раз парсить скриптом после сохранения, чтобы заменять даты на соответствующие числа. Скрипт можно написать довольно быстро, любой программист управится максимум за полчаса.
    Ответ написан
    Комментировать
  • Почему возникает ошибка при использовании тернарного оператора, но нет ошибки при использовании if?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что переменная point не определена к тому моменту, когда вы её используете.
    Поставьте ; и проблема будет решена.
    let point = {
      // .....
    }; // <-----

    Либо уберите скобки ()
    point.properties.color == 'red'? dangerPoints.features.push(point): points.features.push(point);

    Почему так - вопрос сложный. JavaScript - довольно запутанный язык с кучей нагромождений, так что лучше не пользоваться его "всеядностью", а соблюдать правила хорошего тона. Одно из них - точка с запятой.
    Ошибка
    let x=5
    (x)?1:2; //error
    Нормально
    let x=5;
    (x)?1:2; //ok
    Тоже сработает
    let x=5
    x?1:2; //тоже ок
    Ответ написан
    Комментировать
  • Как правильно составить регулярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    class="project_line line project(\d+)" data-type="(?:newpost|[^"]+_adv)"

    Проверить
    Ответ написан
    Комментировать