Заметки за 2011 год (страница 4)

Самопроизвольное увеличение ширины кнопки в IE

В старых версиях IE кнопки обладали очень не приятным эффектом. У них появлялись отступы слева и справа, когда длина кнопки становилась значительной. Это могло проявляться как при наличии padding-left и padding-right , так и при достаточно длинной надписи. Особенно это становится актуально для кнопок, которые специально декорируются и, как правило, имеют шрифт большого кегля.

В любом случае избавиться от этих отступов можно, добавив к тегу не совсем очевидный (кто бы сомневался) стиль

overflow: visible;

Пример «до» и «после» для IE6 и IE7.

overflow: visible убирает отступы у кнопки в IE6 и IE7

В новых версиях такого эффекта не наблюдается. Это правило может свободно применяться в основном стиле страниц.

Комментарии к заметке: 3

Рецепт приготовления YUI 3 приложения

В блоге «Yahoo! User Interface» появилась большая статься о создании приложений под YUI3.

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

Оставте свой комментарий

Проверка типа данных в JavaScript


function is(type, obj) {
    var cls = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && cls === type;
}

Функция возвращает результат сравнения ожидаемого типа данных с реальным значением класса.

Аргумент type может принимать одно из значений String, Number, Boolean, Array, Object, Function, RegExp, Date, Error.

На основе этой базовой функции можно сделать целый набор специальных функций для проверки конкретного типа данных.


var TypeCheck = (function () {

    function is(type, obj) {
        var cls = Object.prototype.toString.call(obj).slice(8, -1);
        return obj !== undefined && obj !== null && cls === type;
    }

    var i, checkers = {},
        types = "String|Number|Boolean|Array|Object|Function|RegExp|Date|Error".split("|");

    for (i = types.length; i--;) {
        checkers["is" + types[i]] = (function (type) {
            return function (obj) {
                return is(type, obj);
            }
        })(types[i]);
    }

    return checkers;

})();

Оставте свой комментарий

Позиционируем всё

Конференция уральских веб-разработчиков 2011

В феврале 2011 года прошла уже вторая по счёту Конференция уральских веб-разработчиков, на которой я выступил с докладом «Позиционируем всё»

Презентация доклада (PDF, 2Мб)

  • Закладываем надежный фундамент для будущих страниц. Краткий обзор популярных «обнуляторов» стилей.
  • Техники позиционирования элементов (CSS-свойство position, плавающие блоки, отрицательный отступ и многое другое).
  • Планируем разметку. Не забываем включать голову, и думать на шаг вперед.
  • Как угодить и дизайнеру и оптимизатору.
Комментарии к заметке: 1

Блокируем brute force атаки по SSH

Для решения этой задачи я использую скрипт denyhosts . Он периодически проверят указанный лог-файл на предмет записей о неудавшихся подключениях, и заносит IP-адреса в файл hosts.deny. Дальше ssh-демон при очередном подключении ищет IP-адрес в «черном» списке и разрывает связь, если он там есть.

Установка denyhosts

Начальная установка denyhosts очень проста. Распаковываем исходники и запускаем скрипт установки под root.

sudo python setup.py install

По умолчанию установка будет осуществлена в папку /usr/share/denyhosts. Там же будут пример конфигурационного файла. Копируем его.

cp denyhosts.cfg-dist denyhosts.cfg

Отредактируем denyhosts.cfg


SECURE_LOG = /private/var/log/secure.log
HOSTS_DENY = /etc/hosts.deny
LOCK_FILE = /var/run/denyhosts.pid
DAEMON_LOG = /var/log/denyhosts

Остальные параметры можете задать по своему усмотрению.

Теперь нужно скопировать и отредактировать управляющий скрипт


cp daemon-control-dist daemon-control

Переменные должны быть установлены следующие значения


DENYHOSTS_BIN = "/usr/local/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg"

Удостоверимся, что этот управляющий скрипт запускается.

chown root daemon-control
chmod 700 daemon-control

До запуска denyhosts нужно создать /etc/hosts.deny

touch /etc/hosts.deny

В целом все готово для запуска denyhosts.

daemon-control start

Если до этого вас уже недавно атаковали, то адреса злоумышленников будут тут же собраны и добавлены в hosts.deny.

Остановить denyhosts можно командой

daemon-control stop

В статье denyhosts on Mac OS X я нашел еще несколько полезных трюков.

Запуск при старте системы

В Mac OS X запуском различных программ и скриптов при старте системы занимается launchd . Проблема в том, что он не очень хорошо работает со скриптами, запускающими демонов. Launchd отслеживает момент, когда скрипт завершает свою работу и запускает его снова.

Модифицируем метод start управляющего скрипта daemon-control


def start(*args):
    cmd = "%s --daemon " % DENYHOSTS_BIN
    if args: cmd += ' '.join(args)

    print "starting DenyHosts:   ", cmd

    while True:
        os.system(cmd)
        time.sleep(5)

        while True:
            pid = getpid()
            if pid >= 0:
                time.sleep(300)
            else:
                break

Теперь его можно использовать в launchd. Создадим файл /Library/LaunchDaemons/net.hosts.deny.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>net.denyhosts</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/share/denyhosts/daemon-control2</string>
      <string>start</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>ServiceDescription</key>
    <string>Lauch denyhosts</string>
  </dict>
</plist>

Выполним следующую команду, чтобы запустить его

launchctl load /Library/LaunchDaemons/net.hosts.deny.plist

Ротация лог-файлов

Все, что нужно для ротации лог-файлов – это создать файл со следующим содержимым


# logfilename [owner:group]   mode count size when  flags [/pid_file] [sig_num]
/var/log/denyhosts            640   5     *  $D0     BJ  /var/run/denyhosts.pid 15
#
Комментарии к заметке: 7