заметки на полях

Блокнот разработчика

Упрощение отслеживания отработанных по крону скриптов

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

17 3    * * * www-data /usr/bin/php5-cgi /var/www/project/cron/user_rating.php 2>&1 | mail -s "Пересчет рейтинга пользователей" mail@example.com

В итоге на почту периодически будут сваливаться отчеты вида:

X-Powered-By: PHP/5.2.6-1+lenny13
Content-type: text/html

Начало: 2011-10-03 03:17.01

... сгенерированные данные о проделанной работе ...

Окончание: 2011-10-03 03:17.01

Все хорошо. Но иногда бывает что дергать такие скрипты необходимо часто (дабы избежать задержки), а вот что-то делать они будут далеко не всегда, т. е. попросту запускаться, смотреть что ничего делать не надо генерит пустой отчет и все. А вот когда этих скриптов становится много, то наступает такой момент когда только просмотреть отчеты на почте занимает неприлично много времени, потом это надоедает и отчеты просто не просматриваясь удаляются. Теряется смысл вообще всех этих отчетов.
Выход нашелся в следующем. При отсутствии действий в скрипте не генерировать пустой отчет, т. е. не выводить ничего, а по крону смотреть, что если в выхлопе только три строки:

X-Powered-By: PHP/5.2.6-1+lenny13
Content-type: text/html

то на почту ничего отправлять не надо.
Делаем скрипт /usr/bin/php_cron.sh:

#!/bin/sh

strtocut=3
# минимальная длина на всякий случай, может лишний перенос закрадется
minlen=10

line=1
while read INPUT; do
    if [ $line -gt $strtocut ]; then
        OUTPUT="${OUTPUT}\n${INPUT}"
    fi
    line=`expr $line + 1`
done

if [ `expr length "$OUTPUT"` -gt $minlen ]; then
    echo -e $OUTPUT | mail -s"$2" $1
fi

даем ему права на выполнение

$ chmod +x /usr/bin/php_cron.sh

и изменяем задание в кроне следующим образом:

17 8    * * * www-data /usr/bin/php5-cgi /var/www/project/cron/paid_notifier.php 2>&1 | /usr/bin/php-cron.sh mail@example.com "Отправка уведомлений об окончании услуг"

Теперь на почту будут приходить только сообщения о проделанной работе, а о том что делать было нефиг нас не потревожат.

P/S С удовольствием приму вариант более элегантного решения. :)

Установка и настройка Sphinx на debian

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

Выбираем версию http://sphinxsearch.com/downloads/ (здесь речь пойдет о 2.0.1-beta) Read more »

Hacking часть III

Застал опять в логах наинтереснейшую историю, длилась которая без малого 2 часа. Где искали дырку – стандартно в загрузке файлов. Здесь необходимо оговориться, что файлы можно загружать разные, не только картинки, а к примеру pdf, zip, doc, xls и т. д. Попытки пронумерую (для удобства отсылки к уже поясненному материалу) и прокомментирую. Кстати, нечто подобное уже было (см. здесь), но не совсем то. И так, приступим!
Read more »

Ограничение канала для отдельных приложений

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

8557#0: *8936853 upstream timed out (110: Connection timed out) while reading response header from upstream

а HostTracker начинал слать уведомления об ошибке доступа к ресурсу.

Решением явилось использование утилиты trickle

$ sudo apt-get install trickle

Можно использовать как демон (trickled), а можно независимо для приложений. Самые нужные в данный момент ключи, это trickle -d 512 -u 512 ... устанавливающие в данном случае скорость в 512 килобайт в секунду для входящего и исходящего трафика соответственно.

В результате вышеупомянутый скрипт резервного копирования поменялся только в одной строчке с

ftp -n $FTPHOST <<EOF

на

trickle -d 512 -u 512 ftp -n $FTPHOST <<EOF

Вот собственно первое что нагуглил по теме когда искал решение: Ограничение сетевого трафика для приложений и от этого уже пошел +

$ man trickle

Увеличение раздела жесткого диска виртуальной машины

Пошаговая инструкция с картинками как увеличить размер жесткого диска VirtualBox http://www.my-guides.net/en/content/view/122/26/

Клонирование жестого диска

Для использования нескольких виртуальных машин с одинаковыми дисками их необходимо клонировать, т.к. VirtaulBox присваивает дискам UUID и не даст работать с дисками при простом их копировании:

$ sudo VBoxManage clonehd image.vdi newimage.vdi

Установка VirtualBox Extension Pack в Debian

После обновления до версии 4.0.х для работы USB 2.0 и не только необходимо ставить VirtualBox Extension Pack. Скачиваем здесь сам пак и устанавливаем

$ sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.0.6-71344.vbox-extpack

Настройка XP

Отключить надоедливые уведомления можно редактированием реестра в ветке

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SecurityCenter

AntiVirusDisableNotify – для отключения уведомлений про антивирус
FirewallDisableNotify – для отключения уведомлений насчет Firewall`а
UpdatesDisableNotify – забыть наконец-то про обновления

MySQL различные UTF – utf8_bin и utf8_general_ci

Чем же отличаются эти два collate для таблиц?
utf8_bin – использует сравнения по двоичным значениям каждого символа
utf8_general_ci – использует сравнения на основе языковых особенностей и игнорирует регистр символов.

Для наглядности приведем небольшой эксперимент.

CREATE TABLE  peoples (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
first_name VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
last_name VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) ENGINE = INNODB CHARACTER SET utf8;

INSERT INTO  peoples (first_name, last_name) VALUES ('Петя',  'Иванов'), ('андрей',  'иванов'), ('Иван',  'Петров'), ('Андрей',  'Сидоров');
INSERT INTO  peoples (first_name, last_name) VALUES ('Петр',  'Большой'), ('Пётр',  'Большои');

Read more »

перебор options в Interner Explorer

При использовании цикла for(i in ...) для перебора элементов списка вида

<select name="city" id="city-list">
    <option value="1">Москва</option>
    <option value="2">Домодедово</option>
</select>

таким вот образом

var obj = document.getElementById("city-list");
for (i in obj.options) {
    if (obj.options[i].value == ...) {
        ...
    }
}

в ишаке получаем ошибку. Переваривается только такой вариант

var obj = document.getElementById("city-list");
for (i = 0; i < obj.options.length; i++) {
    if (obj.options[i].value == ...) {
        ...
    }
}

Неплохая статья на тему работы со списками: Javascript SELECT – динамические списки

Дэбианщики шутят )


Всякого, кто использует этот апплет, нужно отправлять на психиатрическое обследование.

YUI 2 Dom setAttribute в Interner Explorer

В YUI 2 метод YAHOO.util.Dom.setAttribute() не работает для элементов созданных посредством DOM во всех версиях Interner Explorer (от 6 до 8), например так будет ошибка:

var button = document.createElement("button");
YAHOO.util.Dom.setAttribute(button, "type", "button");

для задания необходимо пользоваться стандартными методами DOM:

var button = document.createElement("button");
button.setAttribute("type", "button");

Причем остальные методы кроме setAttribute отрабатывают нормально:

var button = document.createElement("button");
YAHOO.util.Dom.addClass(button, "ok-button");
YAHOO.util.Dom.setStyle(button, "margin", "1em");