• Хорош ли такой шаблон работы с AJAX?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Это уже архаизм, к тому дикий велосипед. Зачем 100500 раз опять пытаться писать сырую обертку над XMLHttpRequest? Берите fetch или какую то стороннюю библиотеку, если там надо что то, чего у fetch нету (типа прогресса upload) и вперед.
    Ответ написан
    Комментировать
  • Как протестировать функцию, которая генерирует функцию?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Как называют функции которые возвращает функцию

    Как раз если функция принимает или возвращает другую функцию, асинхронную или нет, это и есть функция высшего порядка. Возвращаемые функции названия не имеют, просто функции.
    Должна вернуть асинхронную функцию

    Технически можно проверить является ли функция асинхронной, проверив имя ее конструктора, но делать так не надо, ибо разработчик может заменить в будущем реализацию функции на использование промисов без объявления асинхронной функции, и тест будет падать. Соответственно проверять нужно не тип функции, а то, что ее результат это Promise или Thenable.
    return Promise.reject(`${model.name} with ${field} = ${value} does not exists`);

    Тут легаси код - внутри async обычно используют
    throw Error(`${model.name} with ${field} = ${value} does not exists`);
    Ответ написан
  • Отмена выполнения цепочки обещаний (promises). Можно проще?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Использовать внешнюю библиотеку, с которой можно закрывать цепочки обещаний в любом месте.
    Простой пример
    Усложненный мониторингом прогресса
    import CPromise from "c-promise2";
    
    // прерываемый fetch с таймаутом
    function fetchWithTimeout(url, options) {
        const {timeout, ...fetchOptions}= options;
        return new CPromise((resolve, reject, {signal}) => {
            fetch(url, {...fetchOptions, signal}).then(resolve, reject)
        }, timeout)
    }
            
    const chain = fetchWithTimeout("https://run.mocky.io/v3/753aa609-65ae-4109-8f83-9cfe365290f0?mocky-delay=10s", {timeout: 5000})
    .then(response => response.json())
    .then(response => console.log('Done:', response ));
        
    // chain.cancel(); - прервать цепочку промисов и отменить запрос в любое время
    // вернет false, если прервать не удалось (в случае, если цепочка была уже выполнена)
    Ответ написан
    Комментировать
  • Как обойти блокировку при парсинге (puppeteer)?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Сначала скрыть сигнатуры безголового (https://www.npmjs.com/package/puppeteer-extra-plug... если вдруг не поможет, сравнить заголовки с браузером, посмотреть скрипты.
    Ответ написан
  • Как закрыть браузер puppeteer?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    puppeteer.launch(
        {
            args: [
                '--proxy-server=ip:port', // Or whatever the address is
            ]
        }
    )
        .then(function (browser) {
            return browser.newPage().then(function (page) {
                page.authenticate({
                    username: 'log',
                    password: 'pass',
                });
                return page.goto(desktopUrl).then(function () {
                    return page.content();
                });
            })
                .then(function (html) {
                    const productList = [];
                    $('div.product-card', html).each(function () {
                        let link = $("a.card-link", $(this)).attr("href");
                        let pic = $("img.image-component", $(this)).attr("src");
                        productList.push({ProductLink: link, picture: pic});
                    });
                    console.log(productList);
                    //----------Где-то тут нужно закрыть браузер
                    return browser.close().then(function () {
                        callback(null, productList); // :( лучше с промисами и продолжать, а не переходить на коллбеки
                    });
                })
        })
        .catch(function (err) {
            return callback(err, null);
        });
    Ответ написан
    1 комментарий
  • Msp430 внутренний операционный усилитель?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    на 11стр www.ti.com/lit/ml/slap118/slap118.pdf случаем не то что Вам нужно?
    Ну и схема с аппноута Atmel на всякий
    1455749052_screenshot_1.png
    Ответ написан
    Комментировать
  • Как заставить работать RTSP поток с IP камеры через проброс портов?

    DIITHiTech
    @DIITHiTech Автор вопроса
    Fullstack javascript developer
    После курения гугла и танцев с бубнами все таки решил проблему, с небольшой оговоркой.
    Как известно, в RTSP существует 2 режима:
    • Non-Interleaved Mode (2хUDP + 1TCP);
    • Interleaved Mode (TCP). Non-Interleaved Mode

    В Non-Interleaved Mode клиент и камера использует по 2 UDP порта с каждой стороны. Клиент сообщает случайных 2 соседних UDP порта, куда камера сможет отправлять поток.
    Порты камеры статичны, и мы их можем легко пробросить (и их нужно пробрасывать, на них клиент шлет несколько пакетов в 32 байта перед посылкой потока камерой), однако если и клиент находится за своим NAT, то пробросить со своей стороны заранее неизвестные порты невозможно для простых роутеров- нужно иметь возможность как в Mikrotik делать выборку по порту источнику Src. Port (а не Dst. Port), так как мы его знаем, в данном случае в моей камеры это 40000-40001 UDP порты.
    Проснифил весь трафик от камеры через оба NAT до процесса VCL Player и все завелось, хоть почему то нестабильно, иногда включаешь play, но картинки нет, хотя трафик стабильно идет, однако если запустилось уже то все ок. Почему так не знаю. Вообщем, хорошо небольшая нагрузка на сеть, малые задержки, но сложно, особенно, если удаленных камер больше одной.

    В Interleaved Mode используется только одно tcp соединение на 554 порту, и для потока и для управления. Выбор режима лежит на клиенте (конечно если сервер/камера поддерживает).
    VCL Player успешно играет поток с камеры в этом режиме, если:
    On the VLC media player Tools menu, click Preferences.
    In the Simple Preferences dialog box, click Input / Codecs in the contents panel.
    In Input & Codecs Settings, in the Network area, change the Live555 stream transport option from HTTP (default) to RTP over RTSP (TCP).
    Click Save.

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

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    let obj={};
    
      [{name: 'one', q: 5}, {name: 'one', q: 3}, {name: 'two', q: 1},{name: 'two', q: 6},{name: 'three', q: 10}].forEach(entry=>{
         if(obj[entry.name]){
            obj[entry.name].q+= entry.q;
         }else{
            obj[entry.name]= entry;
         }
      });
    
      console.log(Object.values(obj));
      //Or ES5 way
      console.log(Object.keys(obj).map(name=>obj[name]));
    Ответ написан
    Комментировать
  • В чем ошибка использования arguments функции?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Хоть и мелочь, но для кроссплатформенности не рекомендуется передача arguments в другие функции (типа Array.prototype.slice.call(arguments) ), ибо в V8 это убивает оптимизацию функции, и это, как я знаю, все еще актуально.
    Кроме того, нет никакой причины использовать slice перед вызовом reduce- все методы массива умеют переваривать массивоподобные объекты:
    let sum= Array.prototype.reduce.call(arguments, (acc, value)=>acc+value, 0))

    Но для оптимизации кода под V8 нужно руками формировать массив с arguments через обход циклом for, либо написать helper, вроде
    function toArray() {
        let len = arguments.length;
        if (len === 0)return [];
        return len > 1 ? Array.apply(null, arguments) : [arguments[0]];
    }

    И вызывать его исключительно через .apply
    let sum= toArray.apply(null, arguments).reduce( (acc, value)=>acc+value, 0))
    Ответ написан
    Комментировать
  • Почему говорят что jquery не нужен?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Потому что основная цель JQ была обход серьезной несовместимости разных браузеров и предоставление унифицированного api, теперь это уже не актуально в 99%, а актуальных плюшек в ней не осталось. Единственное оправдание ее использования в наши дни- обильное использование уже написанного кода, который требует ее.
    Ну а насчет $.ajax это я читаю исправно каждые пару месяцев как аргумент, хоть коллекционируй, так вот для программиста одна-две "лишних" строчки погоду не делают, за то гибкость, быстрота и функциональность и не тащишь всякий шлак в проект. Кроме того, есть куча микробиблиотек для этого весом до 1кб, хотя в большинстве случаев fetch хватает
    Ответ написан
    Комментировать
  • Чем заменить Array.from в JS?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    исторически для преобразования любого массивоподобного объекта, т.е коллекций юзается Array.prototype.slice.call(likeArrayObject), хотя могут использоваться и другие методы массива, возвращающие новый массив. Исключение- объект arguments, с которым так делать нельзя из-за V8 perfomace bug, по этому с ним там другой подход.
    Ответ написан
    Комментировать
  • Как получить this как для класса, так и для области видимости, вызывающей функцию?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Или так руками, или Fn.bind(this) или стрелочные функции
    Чтобы дотянутся с анонимной функции к внешнему this (не теряя ее собственный контекст) нужно таки его сохранить в переменную снаружи этой функции, другого пути нет, это не костыль.
    Ответ написан
    6 комментариев
  • Canvas: синхронное движение по окружности, возможно?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Тригонометрию не изучали что ли, что может быть проще?
    Sin + Cos + обязательно отрисовку сцены в requestAnimationFrame, а в setInterval инкрементировать угол.
    Ответ написан
  • Переделывать JS или нет?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    сначала подумал, что крутая вещь, сейчас понял - хрень для аутистов.

    :)) может более вероятный расклад, что нынче такой программист пошел, что уже и погуглить нечто вроде "browserify circular dependencies" не может? Многие сборщики умеют разруливать круговые ссылки (которых по возможности нужно всячески избегать), как там дело сейчас в browserify гугл ответит, если что куча других сборщиков типа rollup.js где с этим все в порядке.
    Ответ написан
  • Как вернуть значение из функции, где есть промисы?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    function getKmzFileAsText() {
    
        return new Promise(function(resolve, reject){
            var text = '';
            var xhr = new XMLHttpRequest(),
                fileReader = new FileReader();
    
            xhr.open("GET", "kmz/1.kmz", true);
            xhr.responseType = "blob";
    
            xhr.addEventListener("load", function () {
                if (xhr.status === 200) {
                    // Load blob as Data URL
                    fileReader.readAsDataURL(xhr.response);
                    JSZip.loadAsync(xhr.response)
                        .then(function (content) {
                            // if you return a promise in a "then", you will chain the two promises
                            resolve(content.files["doc.kml"].async('text'));
                        }).then(resolve, reject);
                }else{
                    reject(Error(xhr.status))
                }
            }, false);
    
            xhr.ontimeout= xhr.onerror= reject;
    
            xhr.send();
        });
    }
    
    getKmzFileAsText().then(function(result){
        console.log(result);
    });
    Ответ написан
    Комментировать
  • Появятся ли вакансии, требующие знания экосистемы vue.js в 2017?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Ну как бы они и сейчас есть, только vue этот там упомянут просто в смысле "любой фреймворк такого рода"...
    А как выделенная технология, кто знает, в фронтенде нынче как в мире моды, сегодня одно в тренде, завтра какой то бородатый хипстер что то скажет и в тренде будет уже иное. Но лично я надеюсь что этот мутант не займет заметной доли рынка... благо хоть React в топе без всяких там директив :)
    Ответ написан
    Комментировать
  • Что вы можете сказать про СТМ микроконтроллеры?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    STM8 намного богаче по оснащению, заметно дешевле, более гибкий. Минус для самоделок- шаг ножек, отсутствие симуляции в Proteus. STM32 вообще жесть при такой демократичной цене. Вообщем, про них уже все давно везде расписано...
    Ответ написан
    Комментировать
  • Как запретить chrome делать screenshot рабочих столов?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Ну так там же checkbox есть "Включить этот снимок экрана"... что не так?
    А так любая программа может делать практически все что угодно, доступ к рабочему столу, к камере, микрофону и т.д вообще не имеют никаких механизмов контроля доступа, это не смартфон для игрушек. Виртуальная машина единственный выход.
    Ответ написан
    Комментировать
  • Как: JAVASCRIPT DOM: Добавленный елемент динамически не отрисовывается во время выполнении скрипта (IE)?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Святая корова.... какая боль... это, как минимум, негуманно...
    Это Вам не пхп, и блокирующий синхронный быдлокод тут не прокатит...

    script вставить в head/body и вместо вызова sleep

    setTimeout(function(){
      	modal.parentNode.removeChild(modal);
      },5000);


    https://jsfiddle.net/DigitalBrain/9myzhuvp/
    Ответ написан
  • Что делать, если воруют контент?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Перед публикацией юзерам дожидаться сначала индексации материала.
    Еще можно, на сервере для юзеров рендерить контент в изображения и отдавать их клиенту. Тогда им придется ручками перепечатывать материал ну или google ботом прикидываться :)
    Ответ написан