DOMXpath->query() и относительные пути в запросах

воскресенье, 29 января 2012 г.

0 коммент.
DOMXpath очень удобно использовать для парсинга страниц. Это раньше все регулярками делалось, жутко неудобно. А xpath значительно упрощает эту процедуру. Конечно же, удобней когда работаешь с валидным html или xml документом. Простую html страницу к полной валидности вам поможет привести такой инструмент как tidy. Список его опций довольно богат, да и информацию о нем найти можно. Или я как-нибудь напишу. Но сейчас не об этом.

У DOMXpath есть метод query(), который и делает выборку по нашему запросу. Сам запрос передается первым параметром. Но иногда возникает необходимость сделать еще один запрос внутрь предыдущего результата. Как раз вторым параметром в метод query() идет $contextnode.

И если кто знает и помнит, то в xpath с // начинаются, так называемые, абсолютные пути. Я просто приведу пример из одного комментария со страницы описания метода и вы сразу все поймете:


<?php
    $xml = "<?xml version='1.0' encoding='UTF-8'?>
        <test>
            <tag1>
                <uselesstag>
                    <tag2>test</tag2>
                </uselesstag>
            </tag1>
            <tag2>test2</tag2>
        </test>";
   
    $dom = new DomDocument();
    $dom->loadXML($xml);
    $xpath = new DomXPath($dom);
   
    $tag1 = $dom->getElementsByTagName("tag1")->item(0);
   
    echo $xpath->query("//tag2")->length; //выведет 2 -> верно
    
    echo $xpath->query("//tag2", $tag1)->length; 
    //выведет 2 -> неверно, запрос не "относительный"
    
    echo $xpath->query(".//tag2", $tag1)->length; 
    //выведет 1 -> верно (заметьте точку перед //)
?>

То есть, если хочешь выбрать все нужные тебе элементы при помощи абсолютного пути (запроса) внутри какого-то объекта DOMNode, то перед // необходимо ставить точку.
Это не баг и не "фича". Это не до конца описанный функционал, так скажем.

Важные и полезные команды EXIM

среда, 30 ноября 2011 г.

0 коммент.
Проблема началась с того, что сервер через раз стал отправлять письма с помощью стандартной php функции mail().  Стал смотреть что не так с почтовиком exim4. И оказалось что у него очередь скопилась в 450 сообщений, среди которых были и нормальные. Все сообщения были помечены как frozen. Немного полезных команд для exim:
Узнать кол-во сообщений в очереди:
exim -bpc

Вывести список очереди:
exim -bp

"Передернуть" очередь принудительно, чтобы не ждать когда exim по какому-то своему таймеру это сделает:
exim -qff

Посмотреть содержимое конкретного письма по его id (id увидите, когда выведите список exim -bp):
exim -Mvb 1RVlKG-0001sS-pA

Собственно с помощью последней команды как раз сможете узнать что такого там произошло и почему это сообщение зависло в очереди.
У меня очередь забилась из-за того,что cron выполнялся с ошибками и были отправить попытки сообщений на ящики пользователей, которых физически нигде не заведено. Например, тот же www-data, который создается, если сервер управляется панелью ISPManager.

Самое интересное - удалить все frozen сообщения для конкретного пользователя:
exiqgrep -r user@domain -zi | xargs exim -Mrm

Помогает нам тут утилита exiqgrep.
Я крайне рекомендую ознакомиться детально с информацией, перейдя по ссылкам:
http://www.opennet.ru/base/net/exim_options.txt.html
http://vds-admin.ru/mail/poleznye-komandy-pochtovogo-servera-exim-shpargalka
http://admin-dm.livejournal.com/78066.html

PHP, округление до десятков и сотен в большую сторону

среда, 9 ноября 2011 г.

0 коммент.
Чтобы цена товара в интернет-магазине не была отпугивающей для посетителя, иногда нужно округлить её до целых десятков. Например, 113 руб до 120 руб, 458 руб до 460 руб.
В PHP есть готовые функции округления ceil и round, но в исходном виде для текущей задачи они не совсем подходят.
Так что кусочек простого и понятного кода вам в помощь:

$p = 112.12; // 112 рублей 12 копеек
echo ceil($p/10) * 10; // 120 рублей ровно

если 10 сменить на 100, то получим округление до сотен и цена 112.12 превратится в 200 рублей.

CSS3PIE, opacity

четверг, 22 сентября 2011 г.

0 коммент.
Чтобы пользователи Internet Explorer могли видеть все красоты CSS3, был написан скрипт CSS3PIE, который как раз и позволяет использовать свойства border-radius, box-shadow и другие.
Так вот если у блока есть свойство opacity и к нему применить CSS3PIE - свойство opacity может не срабатывать. Выход есть довольно простой - для блока добавить еще свойство -pie-background в rgba формате
Пример:


.some_class{
background-color: #000000;
opacity: 0.4;
-pie-background:rgba(0,0,0,0.4); /*четвертый параметр отвечает за opacity*/
}
 
Эта проблема характерна для IE7.

Adobe Photoshop, Error 16 (Ошибка 16)

вторник, 13 сентября 2011 г.

5 коммент.
При установке Adobe Photoshop у некоторых пользователей возникает неприятная ошибка (Error 16).

Я лично сам с ней не сталкивался, но некоторые способы решения могу всё же предложить:
Вариант 1. Вероятно, на компьютере были до этого установлены другие продукты Adobe. Надо посмотреть файл \Program Files\Common Files\Adobe\Adobe PCD\cache\cache.db  и в свойствах файла снять галочку "Только чтение", в случае если она установлена.

Вариант 2. Если была установлена другая версия Photoshop - надо хорошенько после неё всё вычистить из системы. После того как сделали Uninstall в системе остаются разного рода файлы от Фотошопа - их надо найти и удалить. В частности в \Program Files\Common Files\Adobe\.  Наверняка есть какие-то автоматизированные программы для вычистки мусора - можно пользоваться ими. После того как вычистите все - перезагрузитесь. После можно смело устанавливать другую версию Adobe Photoshop. [Важно: за аккуратность и корректность удаления файлов вы несете ответственность! Не забывайте - надо быть крайне внимательным и аккуратным!]

Вариант 3. Судя по отзывам пользователей имеется рабочий способ для Windows Vista/Windows 7 и Adobe Photoshop CS5 - http://forums.adobe.com/message/2778397#2778397  Информация на английском.

Желаю удачи.
Будьте крайне внимательны и аккуратны при выполнении перечисленных действий.
И как обычно - жду комментариев с результатами.

Встроеный редактор Midnight Commander: копирование, вставка

понедельник, 12 сентября 2011 г.

2 коммент.
В mc (Midnight Commander) есть внутренний просмотрщик, которым довольно удобно пользоваться.

Но лично я всегда забываю как в нем копировать текст.
Порядок простой:
1. Зажимаем Shift и курсором выделяем нужный участок текста.
2. Дальше стандартным сочетанием Ctrl+Ins мы копируем этот кусок.
3. Shift+Ins вставит нужный нам текст из буфера.


Вроде всё.

Установка mod_rpaf2 для Apache2+nginx в Debian 6

воскресенье, 11 сентября 2011 г.

0 коммент.
Если на сервере под управлением Debian установить nginx на фронтэнд, то Apache, выполняя роль бэкэнда, будет получать в переменной $_SERVER['REMOTE_ADDR'] неверный IP адрес. Для апача эта переменная будет 127.0.0.1. И во всех log-файлах будет соответственно неправильная информация про IP.

Решается это с помощью установки модуля mod_rpaf2 (для Apache2, для Apache первой версии нужен mod_rpaf). Суть в том, что пробрасывается в заголовке X-Forwarded-For от nginx правильный IP и Apache видит реальный IP адрес.
Итак по порядку.

Версия mod_rpaf нам нужна только 0.6, потому как в предыдущих версиях не поддерживается директива RPAFheader. Для этого нам надо эту версию скачать и скомпилировать. Для этого понадобится apxs2 (APache eXtenSion tool). Ставится она в комплекте с другими средствами разработки под Apache:



apt-get update #обновим данные из репозитариев
apt-get install apache2-prefork-dev

Установка данного набора никак не влияет на текущую работу сервера Apache! Можно устанавливать смело.
Рестартим Apache


/etc/init.d/apache2 restart 

Надо скачать и установить mod_rpaf


cd /usr/local/src
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xzf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
apxs2 -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
Последняя в списке команда как раз компилирует модуль и устанавливает его.
В директории где находятся модули Апача (/etc/apache2/mods-available/), надо создать два файла:
rpaf-2.0.conf с содержимым:

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 123.456.789.111 222.33.444.77
#127.0.0.1 остается неизменно, а все нужные сервера IP вписываете через пробел
RPAFheader X-Forwarded-For #как раз тот самый заголовок
rpaf-2.0.load с содержимым:


LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf-2.0.so
Дальше надо модуль включить:

a2enmod rpaf-2.0

И снова перезапускаем Apache

/etc/init.d/apache2 restart 
В конфиге nginx для нужных доменов внутри server {...}надо вписать:


proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

Лично у меня после именно таких действий в логах апача IP стал прописываться как надо. Лог посмотреть можно, по умолчанию, /var/www/http-logs/название.домена.access.log. Но путь может быть и другим!

Copyright © 2010 WEB IT blog