среда, 26 августа 2009 г.

RAID - Redundant Array of Ignorant Developers

Новая методология разработки программного обеспечения:
RAID = Redundant Array of Ignorant Developers

Уровни:

RAID0 - Задачу поделили на мелкие куски и не вникая в детали, раздали ее девелоперам. Куски не сошлись.

RAID1 - Один дебил пишет, второй за ним переписывает.

RAID1+0 - Задачу поделили на куски, раздали девелоперам, каждый друг за другом переписывает.

RAID5 - Собралось несколько дебилов, пишут софт. Любого можно уволить и никто не заметит.

вторник, 18 августа 2009 г.

Эмулирование border-color:transparent в IE6

Все браузеры, как браузеры, нормально работают со свойством border-color:transparent, один Internet Explorer 6 его не понимает. Приведу кусочек кода для примера:

.mydiv
{
width: 400px;
height: 200px;
border: solid 2px transparent;
}

Браузеры Internet Explorer 7, Firefox, Opera and Safari на границах элемента отобразят пустое прозрачное место шириной в 2px. Вместо прозрачного бордера в IE 6 появится чёрная сплошная полоса.

Исправить это можно, сделав небольшой хак, который поймёт только IE6:

*html .mydiv
{
border-color: pink;
filter: chroma(color=pink);
}

И вуаля! Убогий бордер исчез и стал прозрачным.

понедельник, 17 августа 2009 г.

«Умные» вопросы

Прочитал сегодня довольно попсовую статью из RSS-агрегатора, в которой были упомянуты около двух десятков «умных» вопросов, которые, якобы, могут помочь жить, если задавать их себе каждый день или с какой-то периодичностью. Их цель – личная мотивации и заставить себя думать.

Мне кажется, некая полезность данного подхода всё-таки присутствует. В моём мозге, чаще всего, возникают вот такие вопросы:

  • Что наиболее важное из дел, которые нужно выполнить сегодня?
  • Что я могу получить от сегодняшнего дня?
  • Какой опыт я получу, сделав это?
  • Можно ли делегировать какие-то задания?
  • Что может придать значительный толчок моему бизнесу?

Не могу сказать, что они регулярно и сильно мотивируют, но иногда закрадываются голову и действительно заставляют задуматься, куда уходит время, заставляют лучше распланировать действия, расставить приоритеты, ну и понять есть ли вообще толк от этих действий.

Интересно, а какие «умные» вопросы чаще всего возникают у Вас в голове, позволяющие достичь успеха?

jQuery toggle() IE8 bug

Недавно в процессе разработки наткнулся на интересный баг в jQuery. В библиотеке jQuery ver.1.3.2 реализована некорректная работа функции toggle() под IE8. В остальных браузерах работает нормально. Заключается ошибка в следующем: последовательно применяя toggle() к элементу таблицы в браузере Internet Explorer 8 элемент будет успешно скрыт, но обратно не будет показан при повторном вызове.

Поколупавшись в логике работы функции toogle(), выяснил, что она использует два селектора для определения состояния элемента страницы (видимый/невидимый). Приведу код ниже:

Sizzle.selectors.filters.hidden = function(elem){
    return elem.offsetWidth === 0 || elem.offsetHeight === 0;
};

Sizzle.selectors.filters.visible = function(elem){
    return elem.offsetWidth > 0 || elem.offsetHeight > 0;
};


Оба из них проверяют видимость элемента на странице путём проверки его высоты и ширины. Итак, в чём же кроется проблема данного определения, и почему не работает метод toggle() под IE8? Элемент
, хоть и имеет аттрибут display:none, всё равно имеет ширину > 0. Высота скрытого tr равна 0. Логика :visible/:hidden селекторов считает элемент видимым, если элемент имеет какую-то высоту или ширину, что есть неправильно для «любимого» IE.

Эту проблему можно исправить, проверяя атрибут display у искомого элемента. Тогда селекторы должны принять такой вид:

Sizzle.selectors.filters.hidden = function(elem){
    return (elem.style.display.toLowerCase() !== 'none');
};

Sizzle.selectors.filters.visible = function(elem){
    return (elem.style.display.toLowerCase() === 'none');
};

Могу предложить и более сложное решение, которое проверяет, как и раньше, высоту и ширину элемента, но при этом берёт во внимание особенности работы с tr:

Sizzle.selectors.filters.hidden = function(elem){
    var width = elem.offsetWidth, height = elem.offsetHeight,
         force = /^tr$/i.test( elem.tagName );
    return ( width === 0 && height === 0 && !force ) ?
        true :
            ( width !== 0 && height !== 0 && !force ) ?
                false :
                    !!( jQuery.curCSS(elem, "display") === "none" );
};

Sizzle.selectors.filters.visible = function(elem){
    return !Sizzle.selectors.filters.hidden(elem);
};

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting