пятница, 31 августа 2007 г.

Как я ловлю спам

На моём сервере, на котором работает сайт и почта, стоит конечно и Spamassassin, который помечает весь спам. Работает этот спам-фильтр довольно хорошо. Неудобно только то, что пропущенный спам нужно отсылать обратно ему на ящик типа spam@host. Пользователи этого конечно же не делают, как я их не заставлял. Тогда я опубликавал адрес этого ящика на внешнем сайте. Через некоторое время спаммерские роботы его нашли. И десятки писем со спамом приходят ежедневно. Спам-фильтр по ним учится. Недостаток - лишний траффик, но у меня неограниченный.

четверг, 30 августа 2007 г.

Komodo Edit

Искал я себе редактор для HTML+Python. Нашёл несколько, выбрал ActiveState Komodo Edit. Подсвечивает кучу синтаксисов, исходники Питона постоянно интерпретирует и показывает ошибки, приличное автозавершение кода, файловый браузер хороший, сниппеты. Загружается долго, но работает в общем шустро. Бесплатный. Есть платный старший брат - Komodo IDE.
Пользуюсь уже больше месяца. И мне нравится.

среда, 29 августа 2007 г.

Скрябин и MacBook

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

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

Отладка в Питоне

ScribeFire

Firefox силён своими расширениями. Одно из замечательных среди них - ScribeFire. Я давно искал нечто такое простое и удобное для поста в блог из браузера. DeepSender вроде начал пробовать, но он вдруг отказался постить выпадая с какой-то ошибкой. И вот пробую Скрайбфайр - всё работает, мне нравится.

пятница, 17 августа 2007 г.

Регулярные выражения для HTTP-запросов

Имеем стандартный HTTP-запрос вида:
GET /anypath HTTP/1.1
Host: localhost:80
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Connection: Keep-Alive

request body
Нужно выудить хост, порт, ури, заголовки и тело. Получаем такой код для питона:
RE_REQ_METHOD  = "^(.*)\s/.*\sHTTP/\d.\d$"
RE_REQ_HOST = "^Host:\s*([^:]+)(?::(\d+))?$"
RE_REQ_URI = "^(?:GET|POST)\s(.*)\sHTTP/\d.\d$"
RE_REQ_HEADERS = "^([^#].*):\s(.*)$"
RE_REQ_BODY = "^$^(.*)"
Предполагается, что все строки в запросе не заканчиваются пробелами.
req_method = re.search( RE_REQ_METHOD, request, re.I | re.M ).group(1)
req_uri = re.search( RE_REQ_URI, request, re.I | re.M ).group(1)

req_port = ""
req_host = ""
_redata = re.search( RE_REQ_HOST, request, re.I | re.M )
if _redata:
req_host = _redata.group(1)
req_port = _redata.group(2)


# get header list
req_headers = re.findall( RE_REQ_HEADERS, request, re.I | re.M )

#get body
req_body = ""
_redata = re.search ( RE_REQ_BODY, request, re.I | re.M | re.S)
if req_body_res:
req_body = _redata.group(1)

четверг, 16 августа 2007 г.

Об угле и слепой вере

В своё время я делал программное обеспечение для системы, которая определяет зольность угля в потоке. Система и сейчас успешно эксплуатируется на 7 шахтах и 2 тепловых станциях. Основная проблема, с которой мы сталкивались при внедрении и дальнейшем обслуживании, - сходимость наших показаний и показаний пробоотбора. Пробоотбор - это стандартизированный ГОСТом метод определения зольности угля. В чём его суть? Через определённый интервал времени (1, 2, 5 минут) с работающего конвейера с углём специальным ковшиком-веником отбирают уголь в бункерок. Скажем, проходит за сутки 2000 тонн угля по конвейеру. Из них отбирают 200 кг. Потом из этих 200 кг после перемешивания специальным образом делают пробу в несколько килограмм. Её отправляют в химлабораторию. Там из этой пробы берут 7 грамм (!) и сжигают в спецпечке. По тому, сколько пепла останется, определяют зольность (содержание золы) угля. Это упрощённое описание без нюансов. Здесь нужно заметить, что как бы не отбирали уголь и не перемешивали его, а зольность с заданной погрешностью определяется для этих семи грамм, но не как для 200 кг пробы и уж тем более не для 2000 т суточных.
В нашей системе метод определения зольности - радиоизотопный. На уголь непрерывно светит гамма-источник и по рассеянному от угля излучению определяется его зольность. Точность у такого метода такая же как и у стандартного пробоотбора - 2%. Но такой метод меряет зольность непрерывно - меряет все 2000 т угля в сутки.
Но. О великая сила ГОСТа! Если результаты системы и пробоотбора различаются, вначале всегда грешат на систему. И только потому, что сжигание семи грамм подтверждено ГОСТом, а непрерывный радиометрический контроль 2000 т - нет.

вторник, 7 августа 2007 г.

Flashblock

Не люблю я флэш. Совершенно попсово-тинейджерская технология для красочной рекламы. И помогает мне не любить его замечательное расширение для Огнелиса flashblock. Спасибо авторам для мегабайты сэкономленного траффика и психики.

HTTP Headers

Для просмотра HTTP-заголовков, которые отправляет и получает Firefox, советую замечательное расширение Live HTTP Headers. При отладке моих тестов rewrite`а - просто необходимая вещь.

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

Немного об rewrite

Движок для тестирования Rewrite готов. Написан на Питоне. Теперь занимаются самими тестами. Первый большой набор - это примеры из RewriteGuide. Впечатление от них такое, будто писали их много лет назад, для какой-то очень ранней версии rewrite. Для изучения эти примеры вполне годятся. Но заставить их все работать на последнем rewrite без мелких правок не получится никак.
Ещё приколола такая тема из доки mod_rewrite.
Note that mod_rewrite tries to guess whether you have specified a file-system path or a URL-path by checking to see if the first segement of the path exists at the root of the file-system. For example, if you specify a Substitution string of /www/file.html, then this will be treated as a URL-path unless a directory named www exists at the root or your file-system, in which case it will be treated as a file-system path.

Т. е. mod_rewrite пытается угадать (!), что я имел ввиду в Substitution из RewriteRule. Не очень внятно для доки такого серьёзного и важного модуля.
Если немного обобщить, то можно сказать, что плохая документация (или её полное отсутствие) - беда многих (наверно даже большинства) opensource-проектов. Мол, нужно детальнее в чём-то разобраться - смотри исходники.

пятница, 3 августа 2007 г.

xekc о решении проблем

Сооветую очень всем, для кого жизнь - это процесс решения проблем.
Proactive anything от Xekc.
.
Правду говорит. Беда в том, что не у всех хватает духу и терпения чуть-чуть себя изменить.

четверг, 2 августа 2007 г.

localhost,localhost

Вчера вторую половину дня офигевал от такой штуки. Из Питона с помощью его httplib посылаю запрос локальному iis. Тестирую ISAPI_Rewrite. Ответ приходит ожидаемый - 302. Но!
Location: http://localhost,localhost/...
Я был в шоке. Начал даже было копаться в исходниках httplib.
А оказалось, что я в запросе два раза посылаю заголовок
Host: localhost
Host: localhost
А iis - порядочная сволочь. Дали ему два раза хост - он аккуратно через запятую их оба и вернул.