• Догрузка script и link которых нет в DOM после получения AJAX-ответа?

    azproduction
    @azproduction
    Это, конечно, извращение, но сделать в пару строк можно — jsfiddle.net/Cx5Wa/2/
    Для живого примера прогоните код в консоли над хабром — продатет реклама.
    Ответ написан
    Комментировать
  • Сборка проекта, AMD, LMD, использование модулей проекта

    azproduction
    @azproduction
    Использовать сборку и автоматизацию — однозначно стоит.

    require.js имеет свой собственный сборщик модулй и оптимизатор — r.js

    Достаточно много с ним работал из опыта могу сказать, что он хорош, но мне не подошел — муторно поддерживать проект на нем:
    — это AMD, а значит нужно писать обертку define, колдовать если заходится использовать модуль в node.js… (можно не писать обертку, но придется опять колдовать)
    — require() — God Object и возвращает всевозможные тип ресурсов всевозможными путями. Долго вникать что к чему если код чужой
    — плагинная система у него странная для восприятия «с нуля»
    — результат сборки сложно окинуть взглядом «все как-то само»

    В общем, я устал от AMD и RequireJS, смотрел в сторону всевозможных подобных проектов тк мне не хотелось писать еще один велосипед. В итоге, мне пришлось написать инструмент своей мечты — LMD.

    Исходил я из слудующих соображений:

    * Сегодня все собирается. Даже dev
    — зачем писать обертку и вобще писать что-то лишнее если за тебя это может сделать робот?!
    * Читаемость кода очень важна
    — Нужно исключить неявные конструкции
    — Я как архитектор моего проекта хочу знать, что в нем будет «валяться»
    * Сборок бывает много
    — dev, production, dev-ru, test-en_US
    * Нужен контроль результата сборки
    — Проверка целостности
    — Подробная информация о сборке
    — Аналитика

    Сегодня LMD умеет все то, что умеют другие сборщики, и имеет ряд преимуществ: CommonJS/Modules, честная и тотальная изоляция модулей, шикарная аналитика сборок как статическая так и динамическая, CLI с автокомплитом, GUI. LMD особенно хорош если у вас много сборок — много языков, много окружений.

    Если вы используете grunt, то у LMD есть для него плагин — grunt-lmd.

    Буквально на длях я написал целую кучу примеров к всевозможным плагинам и фичам LMD. Посмотрите их. Если будут вопросы задавайте тут или в ЛС.
    Ответ написан
    3 комментария
  • Как разобрать видео на кадры с помощью JavaScript / Canvas?

    azproduction
    @azproduction
    Можно попробовать сделать «высокочастотный» таймер используя вот это gist.github.com/2802407 а еще лучше сделать таймер в воркере на основе setInterval, который будет слать в окно postMessage без лагов таймера.

    Можно еще попробовать сделать хак с play() pause(): play(), таймаут 20мс и pause(), чтение кадра.

    Однако ни один из способов не застрахован от долгих циклов дольше 1000/FPS. Самый надежный способ — декодировать видео в воркере бинарно :(

    Количество проигранных кадров можно узнать только у FF developer.mozilla.org/en-US/docs/DOM/HTMLVideoElement
    Ответ написан
    1 комментарий
  • Парсинг даты из ISO 8601

    azproduction
    @azproduction
    Можно использовать date.js или же просто регулярку
    var rx = /[+-]\d{2}\:?(?:\d{2})?$/;
    "2005-08-09T18:31:42+03:30".match(rx); // ["+03:30"]
    "2005-08-09T18:31:42+0330".match(rx); // ["+0330"]
    "2005-08-09T18:31:42+03".match(rx); // ["+03"]
    
    // Или более правльный формат таймзоны
    var rx = /[+-]\d{2}\:?\d{2}$/; //  не включает короткую запись таймзоны 2005-08-09T18:31:42+03 - такие даты так же не парсят браузеры
    
    Ответ написан
    Комментировать
  • Как блокировать выполнение кривого плагина для Google Chrome?

    azproduction
    @azproduction
    Можно повесить контент-зависимый хук на функции прототипа String

    Плагин использует вот такую конструкцию somestring.replace(/^[^\?]+(\?)*/, ''); для каких-то своих целей

    Мы можем переписать String.prototype.replace и в зависимости от аргументов выбрасывать неожиданное для него исключение (тем самым прерывать работу плагина в самом начале).
    (function (){
        var realStringPrototypeReplace = String.prototype.replace;
        
        String.prototype.replace = function (what) {
            if (what.toString() === "/^[^\\?]+(\\?)*/") {
                throw new TypeError();
            } else {
                return realStringPrototypeReplace.apply(this, arguments);
            }
        };
    }());
    


    Тут проблема в том, чтобы аргументы были уникальными (чтобы что-то полезное не нарвалось на наш капкан) и смое главное, чтобы этот код запустился раньше кода плагина иначе придется искать какое-то подобное динамическое место.
    Ответ написан
  • Фиксация загрузки изображения до загрузки изображения

    azproduction
    @azproduction
    Думаю получится ускорить в ИЕ, используя onreadystatechange.

    Мозиловский MozAfterPaint сейчас не доступен.
    watch на свойство DOM элемента повесить нельзя.
    Эвент «loading» для изображений только в обсуждениях рабочей группы.
    Возможно есть способ подойти со стороны WebGL-ных текстур, но уверенности в этом нет.
    Ответ написан
  • Node.JS для крупных Enterprise-проектов?

    azproduction
    @azproduction
    Если Node.js будет своеобразным прокси между БС и клиентом, который будет просто перегонять без изменений данные(или с минимальными изменениями XML<->JSON) или если Клиент очень тяжелый(одностраничник) или нужно показывать какие-то гарфики в реальном времени, то стоит того.
    Ответ написан
    Комментировать
  • Плагины для Photoshop

    azproduction
    @azproduction
    Стоит в триале Nik Software Color Efex Pro 4 подумываю взять — $99.95 Хорош для рутинной работы, умеет делать «рецепты» те собирать несколько фильтров в 1-н
    Ответ написан
  • Как быстро перекинуть ссылку с ПК на iPad?

    azproduction
    @azproduction
    У меня для этих случаев в браузере стоит расширение QR Box, на iOS — Red Laser. Ссылка перекидывается и открывается в браузере мобильника в 3 клика. Быстрее и проще не встречал.
    Ответ написан
    Комментировать
  • Прототипы JavaScript [Решено, все так печально]

    azproduction
    @azproduction
    Создавайте разные прототипы или объявляйте ownProperty attr в конструкторе иначе никак. Логично, что foo.attr === bar.attr потому как оба они ссылаются на Class.prototype.attr
    Ответ написан
    Комментировать
  • Javascript browser MMORPG?

    azproduction
    @azproduction
    Более чем реально. Все технологии для этого есть:
    1. Риалтайм транспорты WebSockets, SSE (Socket.io)
    2. 2D, 3D: Canvas, WebGl (Tree.js, LibCanvas, и ещё десяток библиотек и движков игр)
    3. Звук: <audio>
    Есть проблема в кэшировании ресурсов и текстур — 5+Мб локального хранилища и кэша браузера на всех не хватит, поэтому масштаб игры может быть сильно ограничен.
    Ответ написан
    Комментировать
  • Javascript получение данных из консоли?

    azproduction
    @azproduction
    В клиентском JavaScript нет как таковой консоли. Есть неймсейс и методы которые используют вендоры браузеров для отображения данных для отладки — методы одни, но данные отображаются от браузера к браузеру разные. Фаетически есть «STDOUT», «STDERR», но нет «STDIN». Можно, конечно, сделать костыль, используя prompt(), подогнать интерфейс как javascript linux или написать расширение для конкретного браузера.

    В Node.js есть полноценные методы работы с терминалом TTY
    Ответ написан
    1 комментарий
  • Кем надо работать в IT что-бы путешествовать по долгу службы?

    azproduction
    @azproduction
    Консультант Sap BI NetWeaver с отличным английским. Путешествия в виде командировок и более чем достойная ЗП.
    Ответ написан
    Комментировать
  • JavaScript: что делает Function.call.apply(…)?

    azproduction
    @azproduction
    В примере они сделали так, чтобы не отделять первый элемент массива — сделать красиво.

    В свое время сломал мозг когда разбирал, вот примеры, которые все объясняет:
    Function.prototype.call.apply(function(a,b){console.log([this,a,b])}, [NaN,{},4], {}, 0);
    (function(a,b){console.log([this,a,b])}).apply(NaN, [{},4], {}, 0);
    // Оба выдают [NaN {}, Object {}, 4]
    // NaN будет объектом т.к. был передан в качестве первого параметра
    

    Function.prototype.call.call(function(a,b){console.log([this,a,b])}, [NaN,{},4], {}, 0);
    (function(a,b){console.log([this,a,b])}).call([NaN,{},4], {}, 0);
    // Оба выдают [[NaN, Object {}, 4], Object {}, 0]
    // Массив [NaN,{},4] уже объект поэтому не преобразуется в объект
    
    Ответ написан
    1 комментарий
  • Как сохранить статичный слепок DOM HTML-страницы?

    azproduction
    @azproduction
    Вариант без расширений:
    Весь контент страницы с заменой путей, функцию выполнить на нужной странице.
    
    (function getCurrentSource() {
    var doctype = document.body.parentNode.previousSibling,
        content = '<!DOCTYPE' + (doctype.name ? ' ' + doctype.name : doctype.name) + (doctype.publicId ? ' ' + doctype.publicId : doctype.publicId) + '>\n' + document.body.parentNode.innerHTML,
        base = window.location.href.replace(window.location.hash, '');
    
    return content.replace(/<script\b[^>]*>(.*?)<\/script>/i, '')
    .replace(new RegExp('((?:src|href)=[\"\']?)' + base, 'g'), '$1')
    }());
    


    Прочие ресурсы:
    wget -c -t0 -p -E -k www.google.com/
    Ответ написан
  • Эмуляция нажатия F11 в браузере?

    azproduction
    @azproduction
    Стандартным способом, т.е. через createEvent & initKeyEvent & dispatchEvent сделать нельзя. Этот код не действует, хотя эвент отправляется, ловится и дефалтное действие не обрывается.
    document.addEventListener("keyup", function (e) {console.log(e)}, true);
    var evt = document.createEvent("KeyboardEvent");
    evt.initKeyEvent(                                                                                      
                     "keyup",      //  in DOMString typeArg,                                                           
                      true,        //  in boolean canBubbleArg,                                                        
                      false,       //  in boolean cancelableArg,                                                       
                      null,        //  in nsIDOMAbstractView viewArg   
                      false,       //  in boolean ctrlKeyArg,                                                               
                      false,       //  in boolean altKeyArg,                                                        
                      false,       //  in boolean shiftKeyArg,                                                      
                      false,       //  in boolean metaKeyArg,                                                       
                      122,        //  in unsigned long keyCodeArg - 122 F11 key code,                                                      
                      0);         //  in unsigned long charCodeArg;  
    var canceled = !document.body.dispatchEvent(evt);
    if (canceled) {
        // A handler called preventDefault
        alert("canceled");
    } else {
        // None of the handlers called preventDefault
        alert("not canceled");
    }

    Я думаю многие программисты хотели бы фуллскрин кнопку для HTML контента. Например YoutTube в режиме HTML5 не может уходить в полный экран, я не думаю, что они глупее паровоза и не смогли сделать фулскрин (может только на 100%х100% страницы), возможно были какие-то причины.
    Если уж очень нужно, то копайте в другую сторону: поищите решения на Java, писали что возможно сделать на Silverlight.
    PS F11 работает только под windows, под mac — ctrl+cmd+f или cmd+f
    Ответ написан
    1 комментарий
  • PHP: Как отличить черно-белое изображение от цветного?

    azproduction
    @azproduction
    1. Алгоритм для грей-скейл онли.
    1.1. Имеем формулу получения вероятности, что пиксель черно-белый Sij=(Rij+Gij+Bij)/3; Pij = 1 — (|Sij-Rij| + |Sij-Gij| + |Sij-Bij|)/765;
    1.2. Устанавливаем итоговую вероятность Т = 1. Начинаем сканировать картинку по сетке с шагом в 1-50 пикселей либо случайно несколько пикселей; чем больше мы просканируем тем правдоподобнее наша вероятность. Для каждого из сканируемых пикселей находим Pij; T = T * Pij; Если итоговая вероятность упала ниже 0.9, то останавливаем сканирование и говорим, что картика не черно-белая, если доходит до конца, то говорим, что черно-белая.
    2. Алгоритм с получением палитры.
    2.1. Пробегаем по картинке собираем все цвета если цветов больше 500 картинка не черно-белая, если менее, то находим вероятность родства цветов по тону, исходя из вероятности говорим, что картинка ч/б или сепия и т.п.
    Ответ написан
    Комментировать