• Как выполнить javascript-код в песочнице на сервере?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Есть такой неймспейс "vm", см. nodejs.org/api/vm.html В нем методы: vm.createContext(sandbox), vm.createScript(code, scriptName). Так же в нем класс Script и у него методы: script.runInThisContext(), script.runInNewContext(sandbox). В общем, можно создать песочницу, у которой даже не будет доступа к require, и пробросить в нее только те функции, что нужны для безопасного выполнения скрипта. Потом обернуть выполнение скрипта в Domain, см. nodejs.org/api/domain.html И тогда уж все будет точно безопасно, и доступ ко внешнему миру будет у скрипта закрыт и если он свалится, то через domain можно поймать, и global он своими данными не засрет, т.е. песочницу можно убить и создать новую, даже не перезапуская процесс ноды. Пример использования можно подсмотреть тут: https://github.com/tshemsedinov/impress/blob/maste... Там есть некоторые хитрости, например, как сделать примесь своих функций к базовым классам в песочнице и подобное.
    Ответ написан
    Комментировать
  • Почему JS не выводит содержимое HTML блока по document.getElementById?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    var twoPoints = document.getElementById("twoPoints").textContent;


    Но вообще, у вас всё очень плохо: вы сразу же перезаписываете содержимое блока #time (и больше никакого #twoPoints вы в документе не найдёте), а что происходит в setTimeout я вообще не понимаю.
    Должно быть хотя бы так: https://jsfiddle.net/ryohL5bv/1/
    Ответ написан
    9 комментариев
  • Правильность написания кода?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Ошибаетесь. всё корректно.
    Ответ написан
    2 комментария
  • Как можно замостить изображение цветом?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Рисуете SVG-шку.
    И... и всё. Дальше как обычно
    path:hover { fill: orange; }
    Ответ написан
    Комментировать
  • Как получить «термины» для каждого документа, после полнотекстового поиска в MongoDB?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    db.getCollection('example').find({
        $text: {
            $search: "розовые булочки",
            $language: 'russian'
        }
    }).explain()
    Ответ написан
    3 комментария
  • Какая суть команды .replaceOne в MongoDB?

    @lega
    replaceOne по сути тоже самое что и updateOne, только на updateOne стоит защита, чтоб не перетереть весь документ, т.е. обязательно должен быть $set или $addToSet или т.п. на replaceOne нет таких ограничений
    Ответ написан
    Комментировать
  • Как сделать правильно ajax запрос в React Redux?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Сделал подобный туториал, где разбираются и асинхронные запросы тоже. Буду рад если помогу - https://www.gitbook.com/book/maxfarseer/redux-cour...
    Ответ написан
    1 комментарий
  • Как бороться с DDOS атаками на node?

    @netW0rm
    1. Проксировать трафик через nginx (инструкции в гугле)
    2. Настраивать защиту от DDOS (и еще много всего полезного) в nginx (инструкции в гугле)
    3. Профит)
    Ответ написан
    Комментировать
  • Как бороться с DDOS атаками на node?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Примерно так:
    var http = require('http');
    var ipTables = {};
    
    var server = http.createServer((req, res) => {
        //Ваш обработчик запроса или express/connect вместо него
    });
    
    server.on('connection', socket => {
        var ip = socket.address().address;
        var time = Date.now();
        if(ip in ipTables) {
            if(time - ipTables[ip].time > 3000) {
                ipTables[ip] = {
                    count : 1,
                    time
                };
                return;
            }
            ipTables[ip].count++;
            ipTables[ip].time = time;
            if(ipTables[ip].count > 100) {
                socket.end('HTTP/1.1 429 Too Many Requests\n\n');
                socket.destroy(); //Обрываем соеденение, так как ip ломится слишком часто
            }
            return;
        }
        ipTables[ip] = {
            count : 1,
            time
        };
    });
    
    server.listen(80);
    Ответ написан
    Комментировать
  • Где вы берете полезные наработки для сайтов?

    mrusklon
    @mrusklon Автор вопроса
    Не получается? Яростно гугли!
    вот нашел хороший сайт еще . Сразу с превьюшками даже
    www.jqueryscript.net
    Ответ написан
    Комментировать
  • Почему триггер на AFTER UPDATE срабатывает, когда UPDATE не запрашивался?

    @pihel
    Sql, Oracle, pl/sql, BI, ETL, php, olap
    Триггер дергается без реального изменения данных? Тогда можно проверить различие значений в :OLD.COL и :NEW.COL
    Ответ написан
    1 комментарий
  • $$$ что значит в php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Это называется переменная с переменным именем (variable variable).

    class Foo {
      public $deepest = 'Limbo';
      
      public function __toString()
      {
        return 'deep';
      }
    }
    
    $deeper = 'deepest';
    $deep = 'deeper';
    $b = new Foo();
    
    echo $b->$$$b;


    Выражение выполняется справа налево:
    1. $b->$$($b) превращается в $b->$$($b->__toString()), поскольку именно так ведут себя объекты, когда на них пытаются натравить echo;
    2. $b->$$($b->__toString()) превращается в $b->$(${'deep'}), именно это значение возвращает метод __toString класса Foo, инстансом которого является $b;
    3. $b->$(${'deep'}) превращается в $b->$($deep), это как раз вызов переменной при помощи значения из другой переменной;
    4. $b->$($deep) превращается в $b->${'deeper'}, поскольку именно такое значение находится в переменной $deep;
    5. $b->${'deeper'} превращается в $b->($deeper);
    6. $b->($deeper) превращается в $b->deepest;
    7. наконец, получается значение свойства 'deepest' из $b, а там как раз хранится 'Limbo', оно и выводится в echo.

    dd178a12658f41679b71884846669132.jpg
    Ответ написан
    8 комментариев
  • Почему приложение x64 в два раза медленнее x86?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Отвечать на этот вопрос без какой-либо дополнительной информации - это как гадать на кофейной гуще. Какой CPU - если это древний Pentium D с допотопным конвейером и глупыми регистрами - одно дело, а если это новейший Core i7 на Haswell - другое. Что до настроек - вот честно, "стандартные" вообще ни о чём не говорит. Я уже не говорю, что было бы не плохо указать количество опытов с максимальным и минимальным - вполне возможно глупые ОС с планировщиком как-то неудачно распределяют время. Любой ответ, который можно тут указать может быть техническим грамотным, но совершенно не соответствующий истине.

    Рискну предположить такой расклад - об оптимизациях мы почти ничего не знаем и делаем "стандартную" дебаговую сборку. В этих случаях транслятор вставляет в код специальные метки, по которым можно будет сопоставить инструкции с файлом и номером строки. Понятное дело, что в объектные файлы попадут и холостые циклы и бесполезные разыменования. Ни о каких кэшированиях или перестановках не может быть и речи - что попросили, то получили.

    Теперь давайте вместе подумаем о том, какие различия между x86-64 и x86. На самом деле, вопрос поставлен не очень корректно - x86-64 почти полностью включает в себя x86. Из изменённого - размер указателя (адреса), да немного переделана логика регистров (хотя все они на месте, просто добавилось ещё лишние несколько десятков) - теперь часть аргументов в функцию передаётся через дополнительные регистры, тогда как в x86 все идут через стек. Однако получить здесь преимущество не так уж и просто - процессор тоже не дурак, в случае линейной обработки информации (или любая длительная работа с небольшими участками памяти) он прекрасно всё кэширует и работа со стеком в общем случае не сильно медленнее работы с регистрами.

    Теперь смотрим на код. Что там? Куча адресной арифметики, немного функций, да и аргументов почти нет. 8 миллионов слов? Не думаю что рекурсия вынудит вылезти стеку за пределы кэша, так что есть подозрение о паритете архитектур в данном случае. Однако большое количество адресной арифметики и увеличенный размер адреса в битах... во сколько раз? В два раза?

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

    Попробуйте gcc (меня разве только интересует откуда на Windows взялся gcc) с флагом -O3. И посмотрите машинный код для 64 бита и 32 бита (можно пользоваться objdump из binutils или посмотреть машинный код в IDE Visual Studio - точно расположение кнопки не помню, но можно поискать в менюшках). Скорее всего причина не одна, их множество. Так, вызов функции сопровождается сохранением контекста, тогда как в x64 регистров больше, больше и контекст. Собираем такие моменты по крупицам... Вот и получаем.

    P.S. Давным давно, разговаривал с преподавателем. Простая перекомпиляция под 64 бита ускорила код на 30%. Это был колхозный кодек, немного похожий на libx264 (от туда была сдёрнута часть кода). Естественно, проект собирался со всеми оптимизациями, со всем расширениями инструкций - со всем, чем можно. И сборка под платформу x86-64 (с SSE, MMX, FMA и прочие). Жутко наукоёмкий разношёрстный код (писали все - от зелёных аспирантов, до ровесников Страуструпа и профессоров университета) - туева хуча функций, структур, объединений и очень, очень много параметров, многие из которых передают в аргументы функций. Ну и целевая платформа - жутко порезанный и переделанный Windows Embedded - там просто не чего было планировать.
    Ответ написан
    Комментировать
  • Разобрать каждую строчку в JS?

    premas
    @premas
    Full-stack web-developer
    // Инициализация переменных
    var div1 = document.querySelector('.test1'),
        div2 = document.querySelector('.test2'),
        visibility = false;
    
    // Функция, которая блоку .test2 устанавливает
    // css-свойство display:none или block
    function toggle () {
        // если visibility  true, то display: block, иначе display: none
        div2.style.display = visibility ? 'block' : 'none';
    }
    
    // При клике по .test1 выполнять следующие действия:
    div1.addEventListener('click', function (e) {
        e.stopPropagation(); // Отчищать поток существующих событий(кликов, наведений мыши и прочего)
        visibility = !visibility; // Установить булеву переменную в противоположное значение 
        toggle(); //  Вызвать функцию toggle
    }, false);
    
    // Клик по документу(нужно для эмуляции клика вне .tes1 и .test2)
    document.addEventListener('click', function () {
        visibility = false; // установить переменную в false
        toggle(); // вызвать функцию toggle
    });
    
    // клик по .test2
    div2.addEventListener('click', function (e) {
        e.stopPropagation(); // Очищать поток всех событий(нужно для предотвращение клика по document)
    }, false);
    Ответ написан
    2 комментария
  • Какова роль интерфейсов в ООП?

    Приведу пример на коленке. Хотим, например, написать абстрактную файловую систему. Для начала, определим интерфейс, для ФС:

    interface FileSystemInterface {
      public function write($file, $data);
      public function read($file);
    }


    Затем, хочу реализацию интерфейса ФС для работы с файликами:

    class OSFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем файлик, пишем данные
      }
    
      public function read($file) {
        // открываем файлик, возвращаем данные
      }
    }


    Вдруг, кому-то захотелось файловую систему в облаке. Окей, не проблема, реализуем это:
    class CloudFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем соединение с облаком, пишем данные
      }
    
      public function read($file) {
        // открываем соединение с облаком, возвращаем данные
      }
    }

    Пусть у нас есть кой-то код, работающий с файловой системой, назовем его "Хранилище файлов". Пусть он выглядит примерно так:

    class FileStorage {
      protected $Fs;
      
      public function __construct(FileSystemInterface $Fs) {
        $this->Fs = $Fs;
      }  
    
      public function saveFile() {
        $this->Fs->write('file.txt', 'file data');
      }
    
      public function getFile() {
        return $this->Fs->read('file.txt', 'file data');
      }
    }


    Отлично! Теперь мы можем хранилищу файлов отдать любой объект с реализованным интерфейсом FileSystemInterface. Пример:

    // Хранилище файлов работает с файловой системой ОС:
    $FS = new OSFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();
    
    // Хранилище файлов работает с файловой системой в облаке:
    $FS = new CloudFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();


    Использование интерфейса, в данном случае. позволяет нам писать только реализацию работы файловой системы, а бизнес-логика, работающая с файловой системой никак не меняется, она знает, что в любом случае файловая система реализует интерфейс FileSystemInterface и может без опаски использовать методы этого интерфейса.
    Ответ написан
    14 комментариев
  • Как не скрывать address bar в мобильных браузерах?

    agmegadeth
    @agmegadeth
    Веб-разработчик в дизайн студии
    Я не уверен, но скорее всего, повлиять на это нельзя со стороны сайта.
    И как совет - отключай эффекты появления, параллакса и прочие визуальные эффекты для мобильных и планшетов. Не те это устройства, в которых можно безболезненно показывать это все. Оставляй красивости для десктопов, а в мобильных делай упор на быстроту загрузки и работы сайта. И надо проверить еще 100vh на айдевайсах! В последний раз там была проблема у меня с этим.
    Ответ написан
    3 комментария
  • Как правильно преобразовать JSON в HTML?

    Для этого используют шаблонизаторы, например Handlebars, так же есть простой шаблонизатор в библиотеке underscore.
    Ответ написан
    Комментировать
  • Где Кинопоиск берет расписание сеансов кинотеатров по всей Россия?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Делали такой проект 4 года назад.

    Есть сервисы Киноход, Рамблер.касса, теперь вот и Яндекс подтянулся.
    У них есть физическая интеграция с билетным ПО кинотеатра.
    Все данные по актуальным сеансам оттуда + парочка контент менеджеров что бы все слегка причесать и помержить.
    Данные по релизам и контент легко собираются с прокатчиков, график известен на полгода вперед минимум.
    Ответ написан
    5 комментариев