4 сент. 2013 г.

Максимальная длина массива в Function.prototype.apply

MDN предупреждает, что максимальная длина массива, передаваемая в Function.prototype.apply, ограничена (порядка 10^4). Меня заинтересовали точные значения, которые я определяю вот таким скриптом.

30 июл. 2013 г.

Глубина стека JavaScript в разных браузерах

Скрипт для измерения глубины стека и результаты (получены на одном компьютере, Windows 7 SP1, 64-bit):

Chrome 28:      20966 - 21000, не зависит от количества открытых вкладок
Firefox 20:     26000 - 50000, сильно изменяется от измерения к измерению
Firefox 22:     38000 - 53000, сильно изменяется от измерения к измерению
Opera 12.16:    32629, не зависит от количества открытых вкладок
Opera 15:       20968, не зависит от количества открытых вкладок
IE10:            2946 - 2947, не зависит от количества открытых вкладок, включения/выключения отладки JavaScript, выбора Browser Mode/Document Mode
IE9 (IETester): 20670, не зависит от количества открытых вкладок
IE8 (IETester):  1472 - 1475, не зависит от количества открытых вкладок
IE7 (IETester):  2546 - 2548, не зависит от количества открытых вкладок
IE6 (IETester):  2546 - 2548, не зависит от количества открытых вкладок

Результаты для IE на разных компьютерах различаются на два порядка, на одной из машин в IE9 была получена глубина стека 42329, на другой для IE8 (IE9 downgraded to IE8) было всего 276 (!).

8 июл. 2013 г.

UnderGet - Download Blocked Files

UnderGet - Download Blocked Files
UnderGet allows you to download files that are otherwise blocked by a firewall or other tool at your work, school or country.
UnderGet can bypass blocks that prevent you from downloading files based on their file type, extension or content by renaming the file or encoding its content so the blocking software can not detect it.

5 июл. 2013 г.

Hardware acceleration flags in Firefox

  1. Open about:config tab
  2. Search for azure
    gfx.canvas.azure.backends direct2d,skia,cairo
    gfx.content.azure.backends direct2d
    gfx.content.azure.enabled true
  3. Search for direct2d (Windows)
    gfx.direct2d.disabled false
  4. Search for directwrite
    gfx.font_rendering.directwrite.enabled true
  5. Search for layers
    layers.acceleration.disabled false
    layers.acceleration.draw-fps false
    layers.acceleration.force-enabled false
    layers.async-video.enabled false
    layers.composer2d.enabled false
    layers.offmainthreadcomposition.animate-opacity false
    layers.offmainthreadcomposition.animate-transform false
    layers.offmainthreadcomposition.log-animations false
    layers.prefer-d3d9 false
    layers.prefer-opengl false
  6. Also check for gfx.content
Acceleration test
CSS 3D demo

18 июн. 2013 г.

Find jQuery events on specific element

$._data($element[0], 'events');
will return all event handlers

$._data($element[0]);
will return all jQuery data (set by $(element).data(key, value)) and event handlers (set by $(element).on(eventName, handler)) for this element

Example in Chrome's console:

> $._data($('body')[0])
Object {events: Object, handle: function, data: Object}

  • data: Object
    uiProgressIndicator: $.(anonymous function).(anonymous function)
    __proto__: Object
  • events: Object
    click: Array[3]
    remove: Array[1]
    __proto__: Object
  • handle: function ( e ) {
    arguments: null
    caller: null
    elem: body
    length: 1
    name: ""
    prototype: Object
    __proto__: function Empty() {}
    <function scope>
  • __proto__: Object

We can see data for jQuery UI widget named 'progressIndicator' and four event handlers (three for 'click', one for 'remove' event) attached to the body of the HTML document.

Also Chrome has built-in command getEventListeners to show DOM event handlers attached to element:

> getEventListeners(document.body)
Object {click: Array[1], remove: Array[1]}

  • click: Array[1]
  • remove: Array[1]
  • __proto__: Object


23 мая 2013 г.

Век живи - век учись: создание и заполнение коллекции через Double Brace Initialization


Как в Java одним выражением создать поле с коллекцией (List, Set и т.п.) или Map и заполнить коллекцию начальными значениями (не создавая в классе дополнительных методов/инициализаторов/конструкторов)?

15 апр. 2013 г.

git rerere

Если у вас в репозитории Git появляется долгоживущая ветка, и вы регулярно делаете rebase на активно развивающийся master branch, то очень скоро заметите, что при следующем rebase приходится решать те же конфликты, которые уже были решены во время предыдущего rebase.

2 апр. 2013 г.

Samsung Galaxy Tab 2: WiFi "Not in Range"

Обнаружилась (и в конце концов решилась) неприятная проблема с WiFi у Samsung Galaxy Tab 2 7.0 (GT-P3113). Он упорно не хотел обнаруживать исправную точку доступа WiFi, с которой не первый день без проблем работали другие устройства: ноутбук, планшет на Android 4.0, планшет Blackberry. Даже после добавления точки доступа вручную, будучи на расстоянии полуметра от неё, планшет отмечал её в списке как "Not in Range".

Похожие проблемы можно найти в интернет, но чёткого решения или хотя бы описания причины нигде не было. У кого-то не виделась или пропадала домашняя точка доступа, хотя оставались видны все соседские точки, у кого-то не находилась точка в аэропорту/кафе, хотя рядом с ней работали другие устройства и т.п.

Как выяснилось, Galaxy Tab 2 не видит точки доступа, если она находится выше 11 канала в диапазоне 2.4ГГц (она может быть настроена на 12 или 13 канал вручную или выбрать их самостоятельно как наименее занятые или наиболее чистые от шумов). Как только я перегнал точку доступа на 9-й канал, Galaxy Tab 2 тут же обнаружил её и подключился без проблем - не понадобились даже перезагрузки точки доступа и планшета.

27 мар. 2013 г.

DOM performance comparison: jQuery vs Prototype

http://jsperf.com/dom-attributes/3

Скорость работы с атрибутами элементов DOM (вызовов в секунду)

UserAgent          read           remove         write
                   Proto  jQuery  Proto  jQuery  Proto  jQuery

Chrome 25.0.1364  1,863K  1,046K   842K    177K   375K    499K
Firefox 19.0      1,137K    774K   452K    108K   191K    207K
IE 8.0               34K     55K    29K     27K    24K     38K
IE 9.0              528K    267K   472K    130K   268K    205K
Opera 12.14       1,159K    744K   438K    223K   295K    448K

Скорость работы с классами элементов DOM (вызовов в секунду)

UserAgent          add            has            remove
                   Proto  jQuery  Proto  jQuery  Proto  jQuery
Chrome 25.0.1364    985K  400K  611K  922K  638K  2,908K
Firefox 19.0    457K    392K   255K    419K   458K  1,167K
IE 8.0               20K     31K    15K   62K    23K    95K
IE 9.0  363K  159K  246K    365K  223K  929K
Opera 12.14     518K  410K  300K  560K  511K  1,366K

http://jsperf.com/dom-events

Скорость работы с событиями (вызовов в секунду)

UserAgent           fire             on/off
                    Proto  jQuery    Proto  jQuery
Android 4.0.4       2,565     662    1,530   1,955
Chrome 25.0.1364  128,277  28,647   69,639  94,823
Firefox 19.0       35,793  13,892   53,441  39,665
IE 8.0              5,389   4,691    5,032  10,384
IE 9.0             68,532  19,681   55,858  70,473
Opera 12.14        48,960   3,283  102,913  85,031


13 мар. 2013 г.

5 редко используемых функций underscore.js


  1. _.result(object, property) - получение значения поля/функции по имени (для поля возвращается его значение, для метода возвращается результат его выполнения)
  2. _.random([min=0], max) - целое случайное число в диапазоне [min, max] или [0, max]
  3. _.has(object, key) - безопасная проверка на hasOwnProperty (object.hasOwnProperty(key) может вернуть неверный результат в случае перекрытия hasOwnProperty, например так: var object = {hasOwnProperty: function() {return false;}})
  4. _.tap(object, interceptor) - эквивалент кода interceptor(object); return object; (для встраивания в call chain вызова функций, не поддерживающих chaining)
  5. _.compose(*functions) - композиция декораторов (иногда помогает развернуть иерархию вызовов типа a(b(c(x))))

24 янв. 2013 г.

Поддержка HTML5 draggable и contenteditable браузерами

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

22 янв. 2013 г.

Какие действия заставляют браузер вычислять layout (делать reflow)

В своей канонической статье Stoyan Stefanov подробно рассмотрел, что такое reflow, как он влияет на плавность работы интерфейса веб-приложения, какими инструментами производить анализ и как минимизировать количество reflow. Он привёл краткий список свойств и методов, вызов которых заставляет браузер вычислять layout (делать reflow):
  • offsetTop, offsetLeft, offsetWidth, offsetHeight
  • scrollTop, scrollLeft, scrollWidth, scrollHeight
  • clientTop, clientLeft, clientWidth, clientHeight
  • currentStyle (IE), getComputedStyle() (остальные браузеры)
Но это только очень краткий список. Как насчёт более обширного перечня?