• Устарел ли getElementsBy* и чем лучше querrySelector?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вот народ ушел в спор о производительности, но никто даже не попытался разобраться, а что под капотом... Производительность ведь искусственными бенчмарками меряют, ага...
    Что ж, времена сейчас такие
    многие на работу кодеров берут, которые даже интереса не имеют в глубь копать. Инженеров брать... - это устаревший подход, как выразился автор "популярного сайта", который прочел автор вопроса. Инженеры они дорогие, и найти их сложно, лучше кодер, пусть и не желающий на работе мозг включать, не говоря уж о желании в устройстве инструментов разбираться.

    Говорить о том, что некие фичи устарели - крайне глупо, если знать, что они ведут себя иначе, чем более модные альтернативы. Предлагаю немного разобраться и начать с того что на поверхности:
    - getElementById и querySelector возвращают конкретную ноду в единственном экземпляре
    - querySelectorAll и getElementsByName возвращает статичную коллекцию NodeList
    - getElementsByClassName, getElementsByTagName и getElementsByTagNameNS возвращают динамическую коллекцию HTMLCollection
    Как видим результат у разного апи различен, а значит и говорить, что некоторые из них устарели - глупо.
    Правда тут есть забавный момент
    в спеке HTMLCollection отмечен как "исторический артефакт", который не стоит использовать при проектировании нового апи. Но заметка эта не для веб-разработчиков, а для тех кто проектирует новое DOM апи.

    С устареванием вроде разобрались, но в вопросе еще есть часть "чем лучше". И тут есть теория, что getElementsBy* быстрее querySelector*. Чисто теоретически звучит логично, querySelector* должен делать полный поиск по дереву со сложностью O(n), а getElementsBy* могут использовать индексы на базе HashMap и получать данные со сложностью O(1), тут и особенности HTMLCollection будут кстати, так как можно не копировать коллекцию, а отдавать одну и ту же (и браузеры действительно так делают). Но без пруфов теория так и останется теорией.
    И бенчмарки - так себе пруф
    Хотя направлять инвесторов в нужную сторону - самое то. Проблема бенчмарков, что можно написать их так, что любая из сравниваемых сторон заметно обгонит другую. Дело техники. Например BubbleSort с O(n2) при определенных условиях в чистую уделывает MergeSort и QuickSort с их O(n×log2n), а именно при n=20 или меньше, 400 простых memswap в наглую рвут 87 рекурсивных операций с memcpy внутри
    Гораздо лучше тут выглядят исходники. И я выбрал исходники chromium, как самого распространенного:
    - getElementsBy* методы все как один обращаются к некой шаблонной функции EnsureCachedCollection, которая в свою очередь обращается к некоему NodeLists кэшу, устроенному внутри действительно как HashMap или что-то наподобие. Никакого поиска тут нет, просто берутся готовые значения, сложность у всего этого действительно константная O(1).
    - querySelector* используют абстракцию SelectorQuery, которая и в самом деле делает поиск по DOM. Но данный поиск неплохо оптимизирован и обвешан кэшами. Притом CSSOM использует абсолютно тот же алгоритм поиска DOM нод для каждого селектора в css.
    Для примера
    в подключенных на странице этого вопроса стилях более 1600 правил (некоторые из которых потенциально могут содержать несколько селекторов), полная обработка стилей из этого файла заняла на моей машине (Ryzen 3600 в стоке) чуть больше 9 мс. Если все это немного округлить, то понадобится 15000 querySelectorAll подряд, притом с разными селекторами, чтоб был промах кэша, дабы я ощутил заметную глазу задержку в ~100мс


    На этом спор думаю можно закрыть. querySelector* методы действительно могут быть медленнее, но чтоб убить ими производительность, нужно очень постараться. На фоне того, что пишут кривые ручки среднестатистического дешевого js-кодера это будет незначительной потерей измеряемой в наносекундах. Используйте то что удобнее в каждой конкретной ситуации.
    Ответ написан
    1 комментарий
  • В чем по вашему DuckDuckGo не побеждает Яндекс/Google?

    @rPman
    И что, это ведь не поисковик, они перенаправляют запросы на те же гугл и яндекс, обещая анонимизировать их для гугла и яндекс (глупости, ведь на сайтах стоят их модули аналитики, они все прекрасно видят и так, а хром и без этого палит все о пользователе).
    Ответ написан
    1 комментарий
  • Как заставить WebStorm автоматически заворачивать длинные строки?

    miminari13
    @miminari13
    view - active editor - use soft wraps
    это для вебшторма, но думаю в phpstorm тоже самое
    Ответ написан
    3 комментария
  • Можно ли сделать кастомный плеер без JS?

    YuriyVorobyov1333
    @YuriyVorobyov1333
    Software Developer
    Можете использовать Plyr, простая вещь, без JS спокойно поднимается и кастомизируется, подробнее тут.
    Ответ написан
    6 комментариев
  • Что возвращает fscanf, когда значение не соответствует спецификатору формата?

    @pfemidi
    Тут могло бы быть краткое описание меня
    Dred Wolf, fscanf возвращает количество корректно обработанных идентификаторов. Таким образом если идентификатор был "%f", "%e", "%g", "%E" или "%a", то fscanf вернёт 1 при корректном вводе и любое другое число (как правило 0 или EOF) если не смог спарсить ввод как вещественное число.
    Ответ написан
    Комментировать
  • Как узнать количество чисел в файле txt?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Взял размер файла (man readdir)
    Запросил памяти под чтение файла по размеру файла (man calloc)
    Открыл файл (man open)
    Прочитал его (man read)
    Закрыл файл (man close)
    Посчитал число пробелов в буфере, проверил, что после последнего идет цифра (исключить ситуацию когда пробел после последнего числа), если это так, прибавил единицу
    Вывел
    Освободил память (man free)

    ПРОФИТ!
    Ответ написан
    Комментировать
  • Как в WebStorm перенести все классы из HTML в CSS?

    • Попробуйте плагин Markup to SCSS.
    • Проголосуйте за добавление функционала прямо в WebStorm без сторонних плагинов.
    Ответ написан
    Комментировать
  • Возможно ли снизить потребление ОЗУ на чистой Windows 10?

    Zoominger
    @Zoominger Куратор тега Windows
    System Integrator
    WIN 10 поедает 2.1 гб при старте.

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

    Fragster
    @Fragster
    помогло? отметь решением!
    Ответ написан
    Комментировать
  • Как проверить установлен ли JDK?

    @red_line_nes
    Если JRE, то java -version
    Если JDK, то должен быть компилятор как минимум javac -version, но может не отработать если переменные среды не настроены
    Ответ написан
    Комментировать
  • Как разрешить ошибку "A JNI error has occurred, please check your installation and try again" при компиляции java программы?

    MrLinder
    @MrLinder
    Programmer C++
    В переменных средах у вас по списку первее стоит:

    C:\Program Files (x86)\Common Files\Oracle\Java\javapath


    а в конце путь до jdk:

    C:\Program Files\jdk\bin

    Поэтому операционная система когда ищет java.exe сперва находит тот что в ...\javapath и останавливается, а вам нужен тот что в ...jdk\bin. Поэтому вам надо в переменных средах ...\jdk\bin поставить раньше чем ...\javapath Примерно так:

    PATH=C:\Program Files\jdk\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\QuickTime\QTSystem\
    Ответ написан
    8 комментариев
  • Почему не запускается код на Java?

    OLDJman
    @OLDJman
    Добрый день. Специально зарегестрировался, чтобы описать решение этой проблемы.
    Сам недели две назад тоже мучился и думал что я м.д.к, потому ничего не работает.

    Это не совсем так, поэтому читайте ниже.

    Суть проблемы:
    При повторение видео урока, а точнее действий в нем, желаемый результат не выводился. Конкретнее была написана программа вывода сообщения Hellow World в консоли WIndows
    А именно, компилированный ява файл, вызывался командой java ИМЯ.class, и выходила соответствующая ошибка: "could not find or load main class ИМЯ_класса"
    т
    Как решил:
    Вызывать надо уже ОТКОМПИЛИРОВАННЫЙ файл командой[b][i] java ИМЯ [/i][/b]И все!!! Тогда консоль нормально воспроизводит программу, если, разумеется, в ней нет ошибок.
    Возможно для гуру программирования, это очевидный ответ, и кажется что это норма, но я как 3-ью неделю изучающий яву, на второй день реально не понимал в чем суть проблемы. И так как несмотря на то что обучение идет трудно, мне было обидно и непонятно почему это не работает.

    Ниже распишу полный алгоритм работы с ява машиной на базовом уровне, может быть кому-то это поможет.

    1) Скачать JDK c оф сайта (ссылку давать не буду, это точно найти сможете)
    2) Установить скачанный пакет
    3) Подключить установленную ява машину к нашей системе ( у меня это Windows 7)
    а) зайти в папку с установленным пакетом и найти файл java.exe (у меня на Windows это было: C:\Program Files\Java\jdk1.8.0_05\bin\java.exe)
    _______обращаю внимание, что находить именно файл java.exe не обязательно, просто я сделал так=)
    б) Нажать на java.exe правой кнопкой мыши, выбрать "Свойства". В выскочевшем окошке, во вкладке "Общие", ищите строку "Расположение". Выделяйте и копируйте путь (у меня это C:\Program Files\Java\jdk1.8.0_05\bin)
    в) Открываем пуск, наводим мышку на "Мой компьютер", жмем правую кнопку мыши, жмем "Свойства".
    г) В открывшемся окне, слева, жмем кнопку "Дополнительный параметры системы"
    д) В отрывшемся окне "Свойства системы", во вкладке "Дополнительно" (она по умолчанию выделена/открыта), внизу ищем кнопку "Переменные среды". Жмем на нее
    е) В открывшемся окне "Переменные среды", в верхней его части, а именно "Переменная среды пользователя..." нажимаем кнопку создать
    ж) В открывшемся окне вводим имя переменной, у меня это Path (можно ли другую, я не знаю), а в поле "Значение" вводим наш скопированный путь (C:\Program Files\Java\jdk1.8.0_05\bin)
    д) Жмем "ОК", сохраняем все.
    4) Проверяем нашу ява машину
    а) Запускаем консоль (либо WIN + r => затем cmd и Enter либо Пуск => вводим в поиск над пуском cmd и жмем Enter)
    б) В открывшейся консоли, вводим java
    в) После этого должно появиться куча команд ява, служебная информция и прочее, если все нормально подключилось, если нет, то выдаст ошибку, вроде "Нет такой команды", или что-то похожее. Если что-то не так, делай действия выше по новой.
    5)Если все ок, идем дальше. Создаем нашу простую программу на java.
    6)Открываем блокнот, и пишем там код ниже:
    [code=java]public class Hellow
    {
    public static void main(String[] args)
    {
    System.out.println("Hellow World!");

    }
    }
    [/code]
    Обращаю внимание, что тут частые ошибки, это не написан метод "main", и "println" ошибочно написано. Внимательно проверьте что напечатали сами. Если вы абсолютный новичек, то прежде чем будете понимать что происходит, должно пройти время, поэтому не умничайте, и проверяйте вплоть до каждой запятой.
    7) Сохраняем наш файл. Вот тут обратите внимание на деталь: "В строке public class Hellow, слово Hellow, это имя класса, оно по сути, может быть почти любым, но очень важно, чтобы это имя совпадало с именем вашего файла, что вы сохраняете, причем если у вас он с большой буквы, значит и имя файла должно быть с большой. Сегодня я выяснил что в java вообще принято давать имена классов с большой буквы, так что не ленитесь, пишите с большой, но с маленькой, тоже не будет ошибкой, главное сохранить правило, какое имя класса, такое и имя файла.
    Сохранять надо с расширением .java
    В итоге, в нашем примере нужно сохранить файл в таком виде Hellow.java (вроде бы есть исключения, типо можно обозвать файл как хочу, но я не уверен, увы, но пока этого не знаю, так что делайте как выше написано, потом если узанете правду, напишите мне, благодарен буду)
    8) На данном этапе, мы просто создали файл, который может откомпилировать программа, вторая ошибка, это желать сразу открыть этот файл и исполнить его. Деталей я не знаю, но суть в том, что современные Операционки и процессоры, не умеют это делать, не знаю почему, вроде что то там с процессом производства компьютеров, они вроде 4-битные, или наоброт не 4 битные, короче этот код просто так не запустить, его нужно откомпилировать, перевести в машинный язык, который можно запускать, для этого идем к след шагу
    9)Запускаем консоль, в ней переходим в папку с нашим файлом Hellow.java
    Обращаю внимание, так как я полный новичек, то как переходить в консоли, тоже понятия не имел, на всякий случай распишу минимум, который нужно знать
    Чтобы зайти в каталог, нужно ввести команду cd ИМЯ_каталога. Например, нам нужно зайти в каталог/папку Desktop , вводим cd desktop. Разумеется, зайти мы туда сможем, только если эта папка находимся в том месте, где мы есть. Текущее местоположение отображается слева от вводимой команды в виде C:\Program Files\
    Чтобы вернуться в корневую папку диска C нужно ввести cd \
    Как-то можно подыматься на каталог выше, и прочие действия, но тут уже гуглите, у меня задача другая.
    Команда dir показывает список всех папок в данном каталоге/папке
    Если вы знаете точный путь к каталогу, можно из любого месте прописать полный путь в виде C:\Program Files\Java\... и вы туда попадете. В конце обязательно ставте \, а в начале диск C например. Иначе не сможете зайти.
    Команад help выводит вроде базовый список возможных команд

    Итого, алгоритм действий для попадания в нашу папку, где лежит файл Hellow.java
    ввести cd \
    потом dir
    прочитать что там есть, зайти в нужную папку командой cd ...
    снова dir
    и так далее
    Разумеется нужно понимать самому, где находиться твой файл, например, путь для файла, сохраненного на рабочем столе будет таким c:\users\ИМЯПОЛЬЗОВАТЕЛЯ\desktop\
    10) Теперь нам нужно откомпилировать файл Hellow.java. Для этого в консоли пишем javac Hellow.java
    Если все ок, через пару секунд снова загорится поле ввода команды.
    Если выскочила ошибка, как правило это какой либо косяк на этапе компиляции, читайте что там написано, там всегда пишут в чем была ошибка. Чаще всего это косяк в коде. Заходите в ваш файл и проверяйте внимательно строки. Чем чаще будете читать ошибки, тем быстрее научитесь их распозновать, Знание английского в 100500 раз облегчит работу.
    11) Когда файл откомпилировался, он сохраняется в той же папке, что и основной (Hellow.java), принимая имя, вроде бы класса, это детали, я их увы, не знаю, но расширение станет уже .class В нашем случае это будет файл Hellow.class
    12) Вот только теперь можно запускать этот файл, для проверки, что он у нас есть в папке, где мы находимся, в консоли вводим команду dir
    видим наш файл, и вводим команду java Hellow
    Причем обращаю внимание, не java Hellow.class , а именно java Hellow. Так как первый вариант выдаст ошибку, уж почему, извините, я не знаю.

    13) в консоли, на новой строке, выскочит сообщение Hellow World!
    Все.

    Вот собственно алгоритм запуска ява программ из консоил виндоус.
    Я не претендую на полноту изложения, убер крутой и новый материал, просто я две недели сам мучился с этой проблемой, и писал код в среде разработчика IDEA. И мучался тем, что имея уже какое-то представление о Java, не мог запустить ее через консоль. Меня это мучило, поэтому когда я смотря очередную лекцию, увидел в чем была моя ошибка, меня осенило, и я решил свою проблемы, сняв камень с души, и как следствие, успокоившись. На радостях, я решил, что если в мире есть хотя бы еще один человек, которому эта информация может помочь, то пусть будет так.

    Спасибо за внимание и заранее извините за ошибки. Если когда-нибудь надо будет, может быть я исправлю все недочеты своей короткой статьи, а пока держите, как есть.
    Удачи в программировании!
    Ответ написан
    10 комментариев
  • Классы из html в css vs code?

    wapster92
    @wapster92
    All-Autocomplete По идее должен помочь если html и css в одном рабочем окне.
    Ответ написан
    1 комментарий
  • Windows 10 кавычки вводятся только парами?

    phactor
    @phactor
    Это раскладка клавиатуры. Наверняка стоит США - Международная. Нужна просто США.
    Ответ написан
    5 комментариев
  • Как отключить автоисправление в Visual Studio 2019?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Что-то у меня такого нет, но ESC должно помочь.
    Ответ написан
    Комментировать
  • Как передать значение переменной из одной функции в другую?

    @abcd0x00
    Функция что-то принимает и что-то возвращает. Только так функции должны обмениваться данными между собой. То, что возвращает одна функция, должно передаваться в виде аргумента в другую функцию.

    Пример
    #include <stdio.h>
    
    int func1()
    {
        return 5;
    }
    
    int func2(int x)
    {
        return x * 2;
    }
    
    int func3(int x)
    {
        return x * 3 + 1;
    }
    
    int main(void)
    {
        printf("%d\n", func3(func2(func1())));
        return 0;
    }


    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    31
    [guest@localhost c]$

    Ответ написан
    Комментировать
  • Вопрос к разработчикам игр?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Хороший вопрос.
    Развиваться в направлении инди и заработка ТОЛЬКО на продажах проекта БЕЗ привлечения издателя? Нет. Не стоит. Не сможете банально составить конкуренцию.
    Нормальный заработок возможен ТОЛЬКО при привлечении издателя ЛИБО при привлечении команды, которой еще платить надо. Потому что вряд ли вы сможете и накодить, и нарисовать, и в маркетинг, и рекламу в ФБ настроить.

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

    Подытоживая. Ваш вывод в общих чертах - правильный. В деталях - не очень. Но я бы сейчас без команды (читай - бюджета) ИЛИ издателя даже не совался в сторы.
    Ответ написан
    1 комментарий
  • Нужен ли программисту C++ Linux?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Довольно странный вопрос. Стоит ли мне учиться водить автомобиль, если у меня его нет и покупать не планирую? Если не собираетесь писать под него (или кроссплатформу) - нет конечно.
    Ответ написан
    Комментировать
  • Есть ли разница в сложности освоения разных дистрибутивов, основанных на debian/ubuntu?

    Vamp
    @Vamp
    Как правило, трудностей не возникает. Но всё зависит от того, насколько сильно дистрибутив отличается от своей базы. Ubuntu, например, хоть и основан на Debian, но так сильно от него отличается, что искать решение проблем убунту в дебиановских доках практически бесполезно. Но Mint, основанный на Ubuntu, отличается незначительно, поэтому проблемы минта в доках убунты решаются без проблем.

    Хорошо работает подход при гуглении - добавлять название дистрибутива к поисковому запросу и если нет успеха, то добавить название базового дистрибутива.

    1. "[описание проблемы] kali"
    2. "[описание проблемы] debian"
    3. "[описание проблемы]" (если предыдущие два варианта облажались, гугление безотносительно дистрибутива - единственный оставшийся вариант)
    Ответ написан
    Комментировать