?

Log in

No account? Create an account
torbasow

В коде нашего сотрудника узрел следующее:

var dateString = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + '.' + (date.getMonth() < 9 ? '0' + (date.getMonth() + 1) : date.getMonth()+1) + '.' + date.getFullYear();

Задумался. Ну, то, что в нашей библиотеке давно реализована функция lpad, и то, что такое выражение тоже надо выносить в библиотеку, рядышком с formatNumber, это всё само собой. Но неужто нет лаконичного способа?

На самом деле, есть даже два (очевидная дата.toLocaleDateString() возвращает нечто неприемлемое, типа «9 Март 2013 г.»): дата.toLocaleFormat("%d.%m.%Y") и дата.toISOString().substring(0, 10).

Метод toLocaleFormat внедрён в Javascript 1.6 (Fx1.5), но он нестандартный и есть предложение его выпилить.

С другой стороны, есть метод toISOString, внедрённый в Javascript 1.8 (Fx3) и включённый в стандарт ECMA-262 5-й редакции. Он, однако же, выдаст нам фиксированный формат даты (ISO 8601), хорошо подходящий для сортировки, но отличающийся от привычного русского.

Оба варианта не очень хороши, но на будущее есть стандарт по интернационализации, хотя пока и не реализованный [в «Файерфокс»]. Ну, что, надо полифилл писать…

 
 
Настроение: tiredtired
 
 
torbasow

Да, я считаю, правильная типографика — это важно. Предыдущая фраза набрана через неразрывный пробел и настоящее длинное тире, а не заморское короткое или какой-нибудь дефисоминус. Для таких вещей у меня расширение Character Palette от благородного кантонца Райана Ли. Судя по статистике использования, таких, кроме меня, на всём свете шестьсот восемьдесят человек. Так что для Маоизм.ру я решил делать интегрированное решение.

И отчасти обломался. WYSIWYG-редактор CKEditor, позиционирующийся как один из лучших бесплатных, оказался тяжёл в отладке и забагован. Для начала я обнаружил, что он по умолчанию конвертит всё, что может, в HTML-сущности, то есть мнемонические записи вида &nbsp;. По стандарту XML так следует поступать только с угловыми скобками (точнее, тем, что в обиходе ошибочно называется угловыми скобками), амперсандом и машинописными кавычками. Остальное — зачем? У нас же Юникод. …Отключение конвертации оказалось задачей нетривиальной, просто выставление нужных настроек приводит к тому, что конвертиться, причём неправильно, начинают самые безобидные буквы:

CKEDITOR.config.basicEntities=false;
CKEDITOR.config.entities_additional='gt,lt,amp,apos,quot';

Полез исправлять, так ведь рабочий код этого редактора пожат, неудобно. Ладно, нашёл нужное место, исправил (описание бага и патчи уже потом нашёл).

И вот тут я столкнулся с невозможностью вставить неразрывный пробел в «Файерфоксе» (уже написав для этого плагин кнопки). Это баг, известный уже четыре года. Его уже обходили в FCKEditor, предшественнике CKEditor, но в новом продукте эта проблема вновь всплыла. Я попытался приспособить старый патч, но безрезультатно. В общем, пришлось пока отложить этот вопрос.

 
 
Настроение: nervousnervous
 
 
 
torbasow

Изучив принятые способы организации на HTML-странице прибитого к низу футера, остался ими недоволен, ибо они все требуют лишней разметки и обострённой осторожности. Разработал восхитительно лаконичное решение на CSS 3, которое, вроде бы, правильно заработало в Google Chrome. В IE, думал я, пофикшу всё скриптом в htc-файле. Но решающий удар нанёс мне родной Firefox.

Читать дальше…Свернуть )
 
 
Настроение: frustratedfrustrated
Музыка: Maire Brennan - Hard To Break The Seal
 
 
torbasow

Прочитал, что цикл вида for(var j=testedArr.length; j--;){…} выполняется быстрее цикла вида for(var j=0; j<testedArr.length; j++){…} «для большинства реализаций Javascript». Собственно, это хорошо известно. Сейчас я просто решил проверить.

Так вот, это действительно верно для всех браузеров, а в особенности — IE 8 (оный, между прочим, в своей обычной хамской манере вынудил меня править реестр), кроме Google Chrome. Последний выполняет обратный цикл даже чуть медленнее, нежели прямой. Дюже странно сие, а на порядок большее общее время выполнения тестовых скриптов, нежели у остальных браузеров (кроме, конечно, IE), и тем паче.

Погружён в раздумья: грешит ли обратный цикл против семантики?

P. S. Привожу результаты испытаний. На входе кода имелся массив testedArr, заполненный 10 млн случайных чисел. В цикле производилось одно и то же действие: testedArr[j]+=1;; различался только способ организации цикла. После цикла выводилось прошедшее время в миллисекундах. Данные пяти последовательных испытаний усреднялись и округлялись.

Средняя продолжительность выполнения тестового цикла, мс
Firefox 2.0Internet Explorer 8Opera 9.64Google Chrome 5.0.375Firefox 3.6.3Opera 10.53Safari 4.0.5
for(var j=testedArr.length; j--;){…}20 03110 55072404881620420362
var j=testedArr.length; while(j--){…}20 04410 703720049636184729368
for(var j=testedArr.length; j; j--){…}22 02811 62584414961633414339
for(var j=0, len=testedArr.length; j<len; j++){…}24 37513 16694814864664420358
for(var j=0; j<testedArr.length; j++){…}25 81215 22510 6504959670519372

Выводы:

  1. Принимая во внимание более чем тридцатикратное превосходство современного «Файерфокса» над вторым, отставание в клонировании и сертификации КГОД для архитектуры «толстого клиента» — это просто ужас какой-то! Ведь актуальная версия КГОД 2 — это вообще Firefox 1.5.

  2. Новая «Опера» почему-то дико не любит while. Для остальных браузеров первые два вариант практически эквивалентны. С точки зрения семантики у обоих есть свои плюсы: while обозначает в явном виде терминальное условие, а for вбирает в себя определение нужной только в цикле переменной-счётчика. С этой точки зрения идеально было бы писать что-то вроде: for(var j=testedArr.length) while(j--){…}.

  3. Разделение декремента и терминального условия приводит к некоторому замедлению во всех браузерах, кроме новой «Оперы» и «Сафари».

  4. Прямой цикл во всех браузерах оптимизируется выносом длины массива в переменную. Очевидный минус: лишняя переменная.

  5. Однако, если мы всё же вынесем длину массива в переменную, обратный цикл окажется быстрее прямого только в IE и Firefox (да ещё в старой «Опере»). В остальных браузерах выгода разве что в отсутствии лишней переменной.

Я не стал испытывать напрашивающийся и изящный с виду for(var j in testedArr){…}, ибо его производительность падает с увеличением размера массива экспоненциально, а при десяти миллионах элементов многократно проигрывает всем другим вариантам.

 
 
Настроение: boredbored
Музыка: Perfume - edge (Triangle-mix) (Triangle)