Задать вопрос
  • В чем отличие EventLoop в браузере от EventLoop в Node.js?

    black1277
    @black1277
    Вольный стрелок
    Вы немного запутались. Начиная с 11-й версии Node.js, разница в поведении приведенного вами кода в браузере и ноде - была устранена. Касаемо 6 этапов или фаз, они происходят внутри движка libuv(libuv - это многоплатформенная библиотека C, которая обеспечивает поддержку асинхронного ввода-вывода на основе циклов событий).
    Разница в том, что в Node.js мы можем не дожидаться окончания всех этих фаз, а вклиниться на определенных этапах для исполнения микрозадач (при помощи setImmediate и process.nextTick), а в браузере идет взаимодействие с Web API’s (браузерные или веб API), из которого могут поступать новые события (клики, движения мыши и др.), добавляющие в очередь новые макрозадачи(если установлены обработчики этих событий). Кроме того, в браузере есть рендеринг, который не может быть выполнен пока идет выполнение задачи движком(из этого следует, что необходимо разбивать тяжелые и длительные задачи на части).
    Как я не пытался изложить точнее и короче, к моим словам можно придраться буквально к каждой фразе. Поэтому, лучше самому изучить первоисточник и пару статей на русском:
    What is the Event Loop?
    Объяснение работы EventLoop в JavaScript
    Игра по правилам: Event loop Node.js
    Как устроены цикл событий и стек вызовов в JavaScript
    Ответ написан
    1 комментарий
  • Как рендерить много объектов в яндекс картах(yandex maps) next.js?

    @Jumaniyozov Автор вопроса
    Ответом оказался использование Object Manager в Yandex Maps Api
    Ответ написан
    Комментировать
  • Откуда неадекватный размер ext4.vhdx?

    @sasa2111
    Начинающий Data scientist
    Есть еще один способ уменьшить размер этого файла.
    1. зайти в Docker Desktop
    2. нажать на Troubleshoot (сверху справа жучок такой)
    3. Там выбрать Clean / Purge data
    4. и среди вариантов выбрать WSL 2

    У меня после этого действия ext4.vhdx уменьшился с 34 гигов до 1,1 гб.

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

    @luka1sv
    Web, Swift, Servers
    Вот небольшая инфа

    Создаем нового пользователя:

    useradd -m -s /sbin/nologin crazyadmin
    -m - указывает необходимость создать домашнюю директорию пользователя в каталоге /home;
    -s - задает оболочку пользователя - /sbin/nologin запрещает пользователю использовать shell.
    crazyadmin - имя пользователя

    Устанавливаем созданному пользователю пароль:

    passwd crazyadmin
    Если что-то пошло не так, то всегда можно удалить пользователя командой userdel username, например:

    userdel crazyadmin
    И создадим для нового пользователя папку chroot, о её предназначении будет рассказано ниже.

    mkdir /home/crazysadmin/chroot
    Настройка сервера SSH
    Теперь отправляемся в конфиг SSH - /etc/ssh/sshd_config

    Ищем следующую строчку:

    Subsystem sftp /usr/lib/openssh/sftp-server
    и меняем на

    Subsystem sftp internal-sftp
    Теперь отправляемся в самый конец конфига, и там дописываем:



    Match User crazyadmin
            X11Forwarding no
            AllowTcpForwarding no
            AllowAgentForwarding no
            PermitTunnel no
            ForceCommand internal-sftp
            ChrootDirectory %h/chroot

    ChrootDirectory - родительский каталог той папки, к которой мы хотим открыть доступ по SFTP. В данном примере используется директория chroot, которая лежит в папке пользователя.

    Если на вашем сервере настроен доступ по SSH только через файл ключа, а нужно сделать возможность заходить по паролю, то тогда дописываем еще следующее:

    PasswordAuthentication yes
    Если на сервере установлен метод авторизации по паролю, а есть желание сделать более надежную авторизацию через файл ключа, то можно воспользоваться данной статьей.
    После завершения всех манипуляций с SSH сервером, его нужно перезагрузить:

    service ssh restart
    Настройка директорий для пользователя SFTP
    Отправляемся в директорию /home и там ищем папку свежесозданного пользователя, а в ней папку chroot. Устанавливаем её владельцем пользователя root:

    chown root:root /home/crazyadmin/chroot
    Устанавливаем нужные права на папку:

    chmod 755 /home/crazyadmin
    Внимание! Ни в коем случае не следует выставлять ChrootDirectory какие-либо другие права, в таком случае будет выскакивать следующая ошибка: fatal: bad ownership or modes for chroot directory component.
    Теперь представим, что нам нужно предоставить доступ к нескольким папкам, и они все лежат за пределами ChrootDirectory. Выход из ситуации следующий:

    Допустим нам нужно разрешить доступ к папке /var/www/sysadmin.ru. Создаем в домашнем каталоге пользователя /home/crazyadmin папку с названием sysadmin.ru.

    mkdir /home/crazyadmin/sysadmin.ru
    Теперь смонтируем в эту папку ту директорию, доступ к которой нам нужно обеспечить:

    mount --bind /var/www/sysadmin.ru/ /home/crazyadmin/sysadmin.ru/chroot

    Выставляем необходимые для редактирования права для нашей директории /var/www/sysadmin.ru:

    chmod 777 /var/www/sysadmin.ru
    find /var/www/sysadmin.ru -type f -exec chmod 664 {} +
    find /var/www/sysadmin.ru -type d -exec chmod 777 {} +

    Если в процессе монтирования директории что-то пошло не так, то можно убрать монтирование командой unmount:

    umount /home/crazysyadmin/sysadmin.ru
    На этом настройка SFTP сервера завершена.

    Частые ошибки
    fatal: bad ownership or modes for chroot directory component
    - как писалось выше, данная ошибка появляется тогда, когда владельцем ChrootDirectory является не пользователь root, и права не равны 755.
    No supported authentication methods available (server sent public key)
    - сервер настроен на авторизацию по ключу. Если нужна авторизация по паролю, то в конфиге /etc/ssh/sshd_config нужно поменять значение у переменной PasswordAuthentication с no на yes, а после перезапустить сервер командой service ssh restart.
    Ответ написан
    2 комментария
  • Почему не срабатывает событие initialized у owl.carousel?

    @denisbookreev Автор вопроса
    Вопрос решен:
    owl = $('#owl-carousel');
    owl.owlCarousel
        ({
        ....
          	onInitialized: carouselInitialized	    	
                   .....
        });
    
    function carouselInitialized(event){....}
    Ответ написан
    Комментировать
  • JQuery.lazyload для background-image?

    Nameless08
    @Nameless08 Автор вопроса
    NaN
    Пардон, невнимательно рассмотрел инфу на сайте: jquery.eisbehr.de/lazy/example_load-background-images
    Ответ написан
    1 комментарий
  • Список сайтов машинного перевода stackoverflow (аналоги http://qaru.site)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Сделал расширение.
    Google
    Firefox
    Ответ написан
    Комментировать
  • Linux shell: как удалить файлы, старше определённой даты?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    find /path/to/files/* -mtime +1 -delete

    При этом нюанс
    -mtime +1
    модифицированные больше 1 дня назад

    -mtime 1
    модифицированные один день назад (сегодня и позавчера уже не затронет)

    вместо -delete можете для начала ничего не писать, он выдаст на экран что найдет, чтобы убедиться что все ок.
    Ответ написан
    Комментировать
  • Почему в user agent перечисляются три браузера?

    sim3x
    @sim3x
    Ответ написан
    Комментировать
  • Размещение текста по центру экрана

    kyrie
    @kyrie
    В общем случае решения нет, зато есть куча частностей.

    Если текст в одну строку и есть возможность использовать абсолют (что далеко не всегда)то —
    position:absolute;
    width:100%;
    top:50%;
    text-align:center;

    Если известна высота блока и можно использовать абсолют, то вариант предложенный выше.

    Если нельзя использовать абсолют, но известна высота блока и текст в одну стоку — то через line-height равный высоте блока.

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

    berezuev
    @berezuev
    #define TRUE FALSE
    На чистом JS только перебором (DOM не поддерживает регулярки)...
    А вот на Jquery все очень просто
    Ответ написан
    1 комментарий
  • JQuery parents().get(2) против parent().parent().parent()?

    Smileek
    @Smileek
    Спасибо, веселенькая задачка получилась.:)
    Тестим вот на этом:
    <div id="i1"><div id="i2"><div id="i3"><div id="i4"></div></div></div></div>
    <div id="info"></div>

    Вот так:
    var x, dt, dt2;
    var iter = 100000;
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
        x = $("#i4").parent().parent();
    }
    dt2 = new Date();
    $("#info").text(dt2 - dt);
    				
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
        x = $("#i4").parents().get(2);
    }
    dt2 = new Date();
    $("#info").text($("#info").text() + ":" + (dt2 - dt));
    

    На заданном примере выигрывает parents().get(2). 3398:2910
    Далее делаем 12 вложенных элементов и прогоняем пример из комментария — пять parent()-ов против parents().get(5): с огромным перевесом выигрывает get(5) — 5374:3954.
    А вот get(3) проигрывает parent().parent().parent() — 3406:3880.

    Получается, что выбрать все 12 элементов и в них найти третий, дольше, чем три раза прыгнуть вверх по дереву.

    Наконец, вернемся к первому варианту с четырьмя элементами, и попробуем воспользоваться полученным родителем.
    var x, dt, dt2;
    var iter = 10000; /* <-- В 10 раз уменьшим, а то зависнем */
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
       $("#i4").text($("#i4").parent().parent().attr("id")); /* <-- Запишем id родителя в текст потомка */
    }
    dt2 = new Date();
    $("#info").text(dt2 - dt);
    				
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
       $("#i4").text($("#i4").parents().get(2).attr("id"));  /* <-- Попробуем сделать то же самое */
    }
    dt2 = new Date();
    $("#info").text($("#info").text() + " " + (dt2 - dt));
    

    И вот тут нас ждет сюрприз: $("#i4").parents().get(2).attr is not a function
    arr.get(i), по сути, то же, что и arr[i], то есть мы получим просто Object.
    Для того, чтобы воспользоваться jQuery-функциями, придется обернуть его в денежный знак:
    $("#i4").text( $( $("#i4").parents().get(2) ).attr(«id»));
    От этого мы и потеряем в производительности: 2665:2973.

    Мораль:
    1) Всегда найдутся варианты использования, которые лучше для одного варианта и хуже для другого.
    2) Эффект от производительности или ее потери будет только на больших числах — в самом первом примере мы выиграли 0,4 секунды за 100000 (!) итераций.
    3) Поэтому поступайте, как велит эстет внутри Вас: мне, скорее всего, в реальном примере было бы удобнее получить jQuery-объект и дважды воспользоваться parent()-ом. С другой стороны, восемь раз я бы писать parent() не стал: религия не позволяет.
    Ответ написан
    2 комментария
  • Что за проблема в объединении типов Array?

    https://github.com/Microsoft/TypeScript/issues/10620

    Комментарий mhegazy о filter, с которым в общем-то такая же ситуация, что и с map:
    This is a bit subtle, but number[] | string[] !=== (number | string)[]. The first one has an assert on homogeneity, while the second does not. just as in the example noted above by @kaotik4266, [0, "1", 2] is not of type number[] | string[].

    There is not a meaningful way to describe the general case for merging unmatching signatures; while filter might be arguably safe, push is not. So merging the signatures of (number[]|string[]).push(...) th same proposed for filter would result in push(a: number | string); which means that we are treating the original type as (number | string)[], which is not type safe.

    So the general case, is there is no common signatures between the two types, and thus the resulting union type does have a filter property but it does not have a signature, and hence the error message Cannot invoke an expression whose type lacks a call signature.

    Можете написать себе свой собственный тайпгвард, который выполнит вам сужение типа:
    function isNumbers(arr: number[] | string[]): arr is number[] {
        return arr.length === 0 || // В случае нулевой длины тип элемента массива нам не важен, примем его за number
            typeof arr[0] === "number"; // Либо проверим фактический тип первого элемента. Этого должно быть
                // достаточно, т.к. в типе 'arr' декларируется однородность массивов
    }
    
    function getHandler(handlers: number[] | string[]): number[] | string[] {
        if (isNumbers(handlers)) {
            return handlers.map(handler => handler);
        } else {
            return handlers.map(handler => handler);
        }
    }
    Ответ написан
    3 комментария
  • Как вывести дату создания файла в php?

    YourDesire
    @YourDesire
    Я вообще по образованию бухгалтер...
    Возвращает время изменения индексного дескриптора файла
    Это скорее всего то, что нужно. Для Windows вернет дату создания файла. Для *nix дату изменения, так как в *.nix-ах дату создания файла, как таковую, получить нельзя. Стоит учесть то, что в некоторых описаниях на *.nix таки можно увидеть строчку "дата создания файла", но не ведитесь, для большинства файловых ситем на *nix-ах это не имеет место быть, там скорее всего выводится именно дата изменения.

    fi2.php.net/manual/ru/function.filectime.php

    Кроссплатформенный вариант - через БД
    Вариант без использования БД - хранить дату создания файла непосредственно в его имени, например в виде unixtimestamp в начале или в конце
    Ответ написан
    Комментировать
  • WebStorm или PhpStorm от JetBrains: в чем разница?

    ollazarev
    @ollazarev
    Web-программист
    PhpStorm = WebStorm + PHP + Database support
    (stackoverflow.com/questions/25647004/difference-be...
    Ответ написан
    Комментировать
  • Как очистить кеш сайта после удаления ssl?

    alsopub
    @alsopub
    У вас при SSL использовался заголовок Strict-Transport-Security? С каким max-age?
    Возможно из-за него основной браузер редиректит на https.
    Что с этим делать... В своем Хроме можно сбросить - chrome://net-internals/#hsts
    У остальных, наверное, придется подождать когда max-age кончится.
    Но я бы все же получил любой бесплатный сертификат и сделал редирект https -> http на ближайший год для поисковиков и пользователей, если уж решили от ssl отказаться.
    Ответ написан
    Комментировать
  • Как убрать копейки в сумме заказа после применения скидки - Битрикс 16 версии?

    Можно установить настройки округления тут <ваш сайт>/bitrix/admin/currency_edit.php?lang=ru&ID=RUB

    Если это не помогает, то можно добавить свой обработчик в init.php для форматирования всех цен

    <?
    // Задать свой формат вывода цены можно следующим образом
    AddEventHandler("currency", "CurrencyFormat", "myFormat");
    function myFormat($fSum, $strCurrency)
    {
       return number_format ( $fSum, 2, '.', ' ' ).' Рублей.';
    }
    // Пример вывода
    echo CurrencyFormat(1234.5678, 'RUB');
    ?>


    Так же можете повесить обработчики на данные события OnCountPriceWithDiscountResult и OnGetOptimalPriceResult модуля catalog.
    Ответ написан
    1 комментарий
  • Как реализовать регистронезависимый поиск в MySQL?

    @hurgadan
    операторы = и like сами по себе к регистру не имеют отношения. Это зависит от того, какой колейшен указан для поля. Если вы используете кодировку UTF8, то к примеру это может быть:
    xxx_bin
    xxx_unicode_ci
    xxx_genereal_ci
    Пускай речь идет о UTF8.
    При использовании uft8_general_ci буквы е, ё, Е и Ё - это одно и тоже.
    utf8_unicode_ci - буквы е и ё - это разные буквы, но нет различный в строчных и заглавных. Кроме того для некоторых языков, поддерживаются expansions, например в немецком ss тоже самое что ß.

    подробно тут: dev.mysql.com/doc/refman/5.0/en/charset-unicode-se...
    Ответ написан
    Комментировать
  • Как реализовать регистронезависимый поиск в MySQL?

    @IceJOKER
    Web/Android developer
    а кодировка какая?
    установите к примеру - utf8_general_ci - ci в конце означает CASE INSESITIVE , то есть регистронезависимый
    Ответ написан