Архив метки: development

Немного баловства с JS/HTML5

У js-библиотеки Prototype есть вспомогательная библиотечка Window, позволяющая создавать на странице сайта модальные окна (со всеми плюшками в виде сворачивания, закрывания, ресайза и перетаскивания).

Легким движением, а именно переопределением методов minimize и restore можно сделать, чтобы окошки не просто сворачивались, а убирались в какой-то угол страниц в виде небольших кнопок (панель задач в Windows помните?).

И вот задача, чтобы эти свернутые кнопки не исчезали при переходе между страницами сайта.

Для этого воспользуемся идеей: при сворачивании окон мы делаем еще одну дополнительную операцию, а именно считываем свойства окна и записываем их в локальное хранилище с помощью технологии Web Storage (localStorage). Для работы с этим хранилищем я воспользовался библиотекой http://www.jstorage.info

Кусочек из метода минимизации:

minimize: function(id, event) {
var win = this.getWindow(id);
...
var winProps = jQuery.jStorage.get('winProps');
var newWinProps = {
'id': id,
'className': win.options.className,
'title': win.options.title,
'minWidth': win.options.minWidth,
'width': win.options.width,
'height': win.options.height,
'url': win.options.url,
'recenterAuto': win.options.recenterAuto,
'destroyOnClose': win.options.destroyOnClose,
'showEffectOptions': win.options.showEffectOptions,
'top': jQueryElement.css('top'),
'left': jQueryElement.css('left')
};
winProps[id] = newWinProps;
jQuery.jStorage.set('winProps',winProps);
...

(есть возможность хранить несколько окон)

При открытии любой страницы запускаем код ниже, который считывает данные из хранилища (по сути это просто параметры окна, которые передаются в конструктор нового окна), инициализирует для каждого окна объект Window (который так же добавляет нужные элементы в DOM) и отображает соответствующую «свернутую» кнопочку в углу страницы.

var winProps = jQuery.jStorage.get('winProps');
if (!jQuery.isEmptyObject(winProps)) {
// get from localStorage
for (var winId in winProps) {
var win = new Window(winProps[winId]);

// Create a dock element
var element = document.createElement('span');
element.className = 'dock_icon';
element.style.display = 'none';
element.win = win;
$('dock').appendChild(element);
Event.observe(element, 'mouseup', Windows.restore);
$(element).update(win.getTitle());
new Effect.Appear(element)
}
}

Ну и в методе restore не забываем добавить кусочек, отвечающий за удаление данного окна из списка в localStorage, т.к. оно уже не требуется к «перетаскиванию» между страницами, когда открыто, а не свернуто.

restore: function(event) {
...
// remove from localStorage
var winProps = jQuery.jStorage.get('winProps');
delete winProps[element.win.getId()];
jQuery.jStorage.set('winProps',winProps);
...

Оптимизация MySQL по индексам

Для оптимизации скорости работы SQL-запросов в MySQL лучше:

  • Создавать комбинированный индекс по колонкам, которые вы выбираете при помощи AND. Не забывайте при этом про «левую сторону». Выборка по (col2) или (col2, col3) не будет использовать комбинированный индекс (col1, col2, col3), т.к. он начинается с col1.
  • Создавать одиночные индексы на каждую колонку, выбираемую через OR (в этом случае будет задействован поиск по пересечению индексов, что медленней комбинированного индекса, который тут использоваться не может, но быстрее, чем без индексов вообще)
  • Если с помощью индексов не удается отсеить порядка 80% записей, то MySQL считает лучшим полное сканирование таблицы.
  • При JOIN очень важная последовательность выборки. Если вы джоините таблицу со значительно меньшим кол-вом записей, то (хотя, вероятно,это поймет и сам планировщик MySQL) логичней было бы выбрать записи в ней, а уже потом по выбранным записям подключить основную, более огромную таблицу. Если иначе, то сначала выбирается огромное кол-во данных из большой таблицы, а уже потом к ним подключается маленькая выборка по второй.
  • Всегда стоит использовать наиболее уникальные индексы (характеризумые мощностью данных, т.е. их уникальностью). Командой SHOW KEYS FROM table можно увидеть индексы, уникальность характеризуется колонкой Cardinality.
  • Почти всегда используется B-tree индекс, который очень хорош тогда, когда мощность данных большая. Можно также использовать пространственный индекс R-tree (для определенного типа данных) и хэш-индекс для таблиц типа Memory (хэш индекс хорош, когда используется точное сравнение и несколько хуже, когда используется больше меньше, потому что данные хранятся в виде значения хэш-функции и в этом же виде сравниваются).
  • B-tree индекс не будет использоваться в операторе LIKE, если его значение начинается со спецсимвола % или содержит другое поле.