pk

Коротакая запись attachEvent и addEventListener

Было:

node[/*@cc_on !@*/0 ? 'attachEvent' : 'addEventListener'](/*@cc_on 'on'+@*/'click', myfunction, false)

Стало:

node[/*@cc_on'attachEvent'||@*/'addEventListener'](/*@cc_on'on'+@*/'click', myfunction, false)
node[/*@cc_on'detachEvent'||@*/'removeEventListener'](/*@cc_on'on'+@*/'click', myfunction, false)

Пробелы по краям условной компиляции оказались не нужными.

pk

[Mac OS X] Управление диалоговыми окнами с клавиатуры

Нашел в комментариях у Ильи Бирмана:

Чтобы табом по кнопкам скакать:

EN: System Prefs — Keyboard & Mouse — Keyboard Shortcuts — выбрать All Controls в «Full keyboard access» (внизу)

RU: Системные настройки — Клавиатура и мышь — Сочетания клавиш — выбрать Всеми объектами управления в «Полный клавиатурный доступ» (внизу)

И тогда нужно учитывать, что пробел нажимает кнопку, которая обведена синим, ввод — кнопку, которая синим закрашена, ну а эскейп отменяет диалог.

Как же мне это не хватало в iTunes:

iTunes dialog

pk

[Mac OS X] ImageOptim 1.0.9

Как-то с pepelsbey на Клиентсайде мы говорили о том, что было бы круто, если написать программу, которая массово оптимизирует картинки. Без консоли, без лишних настроек. Сама бы выбирала оптимальный алгоритм.

Если учесть количество доступных консольный программ таких как PNGOUT и Jpegtran, сделать это было вполне логичным.

И в сентября 2008 года незаметно вышла опенсорсная программа ImageOptim которая имеет внешний интерфейс для тех самых консольных программ: AdvPNG, OptiPNG, PngCrush, JpegOptim, Jpegtran, PNGOUT. Их алгоритмы пережимают изображения и удаляют копирайты с комментариями, не изменяя само изображение.

ImageOptim

Работает простым киданием файлов/папок в программу.

Для примера я взял файлы с головной страницы www.livejournal.com. Вес до – 164 КБ, после – 144 КБ.

После недели тестирования, на пяти сайтах ни одна картинка у меня не сломалась.

Выбросил Ping за ненадобностью.

pk

CodeIgniter + Zend Framework + Doctrine

Последний раз вплотную на php я что-то делал два года назад. За это время технологии прилично продвинулись вперед. Тогда вообщем-то было все тоже самое, но валилось из-за сырости, требовало постоянное ковырения в php.ini, конфиге апача и phpMyAdmin. А самое плохое – были завязаны сами на себе.

Сейчас же можно смотреть вебдванольненькие документации, с хорошим поиском и хоть каким-то количеством готовых решений.

А еще, не нужно лезть в phpMyAdmin, с помощью Doctrine можно запросто написать всю структуру в YAML файлах. А она сама запишет в БД со всеми зависимостями и индексами, да еще модели сгенерирует в специальную папочку.

CodeIgniter задаст легкую структуру приложения, не нужно выдумывать расположение файлов, шаблонные движки, писать тыщуодну MVC. А модели будут из Доктрины, он не против.

А если нужна авторизация, OpenId и еще что-нибуть такое стандартное, но хочется отлаженное и без копания в чужом коде – берем Zend Framework с его коллекцией классов. Он вообще изначально проектировался так, чтобы все компоненты не зависели друг от друга, а интегрировались.

На самом деле, самым без проблемным оказался CodeIgniter. Убрал везде index.html, перенес все в директорию cgi-bin и наслаждаюсь.

Потом добавил Doctrine. И час искал тот метод, который генерит таблички без использования консоли.

Doctrine::createTablesFromModels(APPPATH . 'models');

И тут как раз оказалось, что ей нужен PDO. Он был установлен у хостера. Установлен сам по себе, без драйверов :) Пришлось лезть в консоль. Собрал. Т.е. собрал все модули которые нужны. Переписал php.ini. Заработало. Очень понравилось. Единственное, в типах столбцов всегда нужно указывать что они NOT NULL.

---
Articles:
  columns:
    id:
      primary: true
      autoincrement: true
      type: integer(4)
      notnull: true
    url: { type: string(255), notnull: true }
    text: { type: string, notnull: true }

А вот Zend'а, моя сборочка встретила холодно.

Zend_Loader::registerAutoload('Zend_Loader');

Тут php бросался варнингами. Оказалось где-то в самом конце CodeIgniter проверял if (class_exists('CI_DB') AND isset($CI->db)), что вызывало у зенда стойкое желание подгрузить класс CI_DB. В сообществе об этом знают, но не используют. Убрал автолоад и стал подгружать вручную, на четыре строчки оказалось больше.

И нужно мне подсоединить OpenId. Там проблемы возникли у всех. CodeIgniter ругался на роутинг (у него инеграция с PHP4, но специфичная форма роутинга, которую удалось запустить только созданием хука), Zend отказывается принимать жж. А Доктрину не понятно как сюда вообще вписывать.

Вывод: эти технологии рассчитаны на будущее. Когда у каждого будет свой выделенный сервер с PHP7. И YAML будут проходить в школе.

pk

ClientSide'2008 по другому никак

12seconds.tv – сервис видео микроблогинга:


ClientSide 2008

Вот вечно они приглашают кого-нибудь, но ведь кого надо либо подает сам заявки, либо овсянкой не заманишь.

Сейчас, соберутся клиентские разработчики (сразу представляем четыре браузера), а у нас экспертный совет состоящий из дизайнера и юзабилиста (фотошоп + бумажка). Это у них на сайте, большими буквами так и написано.

pk

Sizzle в клочья

Вечером во время общения по аське, JSman обнаружил, что sizzle кэширует результаты запросов. А сам движок не шибко чем отличается от текущей реализации в jQuery.

Так как тестирование css селекторов происходит в 5 итераций с последующим вычислением среднего, то у этого движка была значительная фора относительно не таких хитрых движков. Результаты и правда, не особо отличаются:

Еще добавил после выборки цикл, чтобы уравновесить по скорости массивы и коллекции.