<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.8.5">Jekyll</generator><link href="http://www.dec5e.ru/feed.xml" rel="self" type="application/atom+xml" /><link href="http://www.dec5e.ru/" rel="alternate" type="text/html" /><updated>2019-12-03T11:42:04+00:00</updated><id>http://www.dec5e.ru/feed.xml</id><title type="html">dec5e</title><subtitle>Блог веб-разработчика</subtitle><entry><title type="html">Относительные пути в svn:externals</title><link href="http://www.dec5e.ru/2011/08/svn-externals-relative/" rel="alternate" type="text/html" title="Относительные пути в svn:externals" /><published>2011-08-09T10:38:31+00:00</published><updated>2011-08-09T10:38:31+00:00</updated><id>http://www.dec5e.ru/2011/08/svn-externals-relative</id><content type="html" xml:base="http://www.dec5e.ru/2011/08/svn-externals-relative/">&lt;p&gt;При переезде рабочего Subversion-репозитория на другой сервер «посыпались» экстерналы. Старый svn-репозиторий был не доступен, а правила для svn:externals были указаны в виде:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;foo_ext http://old-server.com/repo/foo 
bar_ext http://old-server.com/repo/bar&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;И естественно выпадали в ошибки.&lt;/p&gt;

&lt;p&gt;Здесь и далее рассматривается условный репозиторий с такой структурой: корень находится в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;repo&lt;/code&gt;, а мы хотим подключить внешние папки &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;foo&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bar&lt;/code&gt; в папку &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lib&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;repo\
   |-- bar\
   |-- foo\
   +-- lib\
       |-- bar_ext
       +-- foo_ext
&lt;/pre&gt;

&lt;p&gt;Захотелось во избежание подобных проблем в будущем указать пути относительно. Оказалось, такая возможность в Subversion доступна, &lt;a href=&quot;http://subversion.apache.org/docs/release-notes/1.5.html#externals&quot;&gt;начиная с версии 1.5&lt;/a&gt;. При этом был изменен формат описания подключения внешних папок. Старый формат также допустим, но только при указании абсолютных путей. Предыдущий пример в новом формате должен выглядеть так:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;http://new-server.com/repo/foo foo_ext 
http://new-server.com/repo/bar bar_ext&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Т.е. сначала путь, потом папка.&lt;/p&gt;

&lt;p&gt;Допустимы несколько способов указания относительных путей:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;strong&amp;gt;../&amp;lt;/strong&amp;gt;&lt;/code&gt; — относительно текущей папки:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;../../foo foo_ext 
../../bar bar_ext&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;strong&amp;gt;^/&amp;lt;/strong&amp;gt;&lt;/code&gt; — относительно корня репозитория:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;^/foo foo_ext 
^/bar bar_ext&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;strong&amp;gt;//&amp;lt;/strong&amp;gt;&lt;/code&gt; — независимо от схемы сети (http/https):&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;//new-server.com/repo/foo foo_ext 
//new-server.com/repo/bar bar_ext&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;strong&amp;gt;/&amp;lt;/strong&amp;gt;&lt;/code&gt; —относительно корня сервера:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;/repo/foo foo_ext 
/repo/bar bar_ext&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Что интересно, версии 1.5, описавшей новый формат указания svn:externals, уже три года. Но при этом практически все примеры и статьи в интернете используют старый формат.&lt;/p&gt;</content><author><name>dec5e</name></author><category term="svn" /><summary type="html">При переезде рабочего Subversion-репозитория на другой сервер «посыпались» экстерналы. Старый svn-репозиторий был не доступен, а правила для svn:externals были указаны в виде:</summary></entry><entry><title type="html">Объявление полей классов в PHP</title><link href="http://www.dec5e.ru/2011/06/php-property-definition/" rel="alternate" type="text/html" title="Объявление полей классов в PHP" /><published>2011-06-23T12:34:45+00:00</published><updated>2011-06-23T12:34:45+00:00</updated><id>http://www.dec5e.ru/2011/06/php-property-definition</id><content type="html" xml:base="http://www.dec5e.ru/2011/06/php-property-definition/">&lt;p&gt;&lt;em&gt;Давно хотел разобраться, что будет если поле не объявлено явно в классе, но используется для чтения/записи. Периодически натыкался на такие конструкции в чужом коде, считал неверным, а потому сам никогда  не использовал и ответа на вопрос «Что же все-таки будет?» не знал. Кстати, в официальном мануале ничего об этом не нашел. Буду рад, если подскажете, где просмотрел.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Итак. Поля классов могут задаваться явно с помощью ключевых слов &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;private&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;protected&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;public&lt;/code&gt;, определяющих видимость поля:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
class A {

    private $foo;

    protected $bar;

    public $baz;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Есть еще конструкция &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var&lt;/code&gt;, но это просто устаревший аналог &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;public&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;А могут задаваться неявно, просто обращением к этому полю:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
class A {

    public function getFoo() {
        return $this-&amp;gt;foo;
    }

    public function setFoo($value) {
        $this-&amp;gt;foo = $value;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Второй способ никуда не годится:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Неявно определенное поле получает уровень доступ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;public&lt;/code&gt;. При явном определении — мы сразу указываем уровень доступа.&lt;/li&gt;
  &lt;li&gt;Если вызвать метод, читающий значение поля до его инициализации, то PHP сгенерирует &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Notice&lt;/code&gt; (при первом способе его нет). А поле будет инициализировано значением &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;То, что это поле есть в объекте, не получится узнать через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Reflection&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;property_exists&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_class_vars&lt;/code&gt;. Только через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;isset&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_object_vars&lt;/code&gt;, и то только, если полю было присвоено значение.&lt;/li&gt;
  &lt;li&gt;С такими полями неудобно работать в редакторе — IDE их не подсказывает и вообще подсвечивает, как ошибочные. Можно описать эти поля с помощью PHPDoc тегами &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;property&lt;/code&gt;, но непонятно, почему бы тогда не описать их явно как поля класса :).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В общем, &lt;strong&gt;не пользуйтесь никогда вторым способом&lt;/strong&gt;. Он усложняет и запутывает код и является источником ошибок. Единственно, когда он имеет право на существование — это динамическое создание полей объекта. И даже тогда можно справиться геттерами и сеттерами (правда с потерями в производительности, при малом количестве вызовов потери незначительны).&lt;/p&gt;</content><author><name>dec5e</name></author><category term="php" /><summary type="html">Давно хотел разобраться, что будет если поле не объявлено явно в классе, но используется для чтения/записи. Периодически натыкался на такие конструкции в чужом коде, считал неверным, а потому сам никогда  не использовал и ответа на вопрос «Что же все-таки будет?» не знал. Кстати, в официальном мануале ничего об этом не нашел. Буду рад, если подскажете, где просмотрел.</summary></entry><entry><title type="html">Сокращенный тернарный оператор в PHP</title><link href="http://www.dec5e.ru/2011/04/php-ternary/" rel="alternate" type="text/html" title="Сокращенный тернарный оператор в PHP" /><published>2011-04-08T14:30:56+00:00</published><updated>2011-04-08T14:30:56+00:00</updated><id>http://www.dec5e.ru/2011/04/php-ternary</id><content type="html" xml:base="http://www.dec5e.ru/2011/04/php-ternary/">&lt;p&gt;Тернарный оператор — вещь известная и скучная:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
$a = $expr1 ? $expr2 : $expr3;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Если &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$expr1&lt;/code&gt; истинно, результатом &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$a&lt;/code&gt; станет &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$expr2&lt;/code&gt;, иначе &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$expr3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;А теперь об интересном! Начиная с версии PHP 5.3 можно опустить &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$expr2&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
$a = $expr1 ?: $expr3;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Это равносильно записи:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
$a = $expr1 ? $expr1 : $expr3;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Примеры:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
$a = true ?: false; // true

$a = false ?: true; // true

$a = 1 ?: 2; // 1

$a = 0 ?: 2; // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;В &lt;a href=&quot;http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary&quot;&gt;мануале&lt;/a&gt; об этом упоминается очень сухо и коротко. Ну а что еще добавить?&lt;/p&gt;</content><author><name>dec5e</name></author><category term="php" /><summary type="html">Тернарный оператор — вещь известная и скучная:</summary></entry><entry><title type="html">Яндекс.Субботник в Санкт-Петербурге</title><link href="http://www.dec5e.ru/2011/02/subbotnik-spb/" rel="alternate" type="text/html" title="Яндекс.Субботник в Санкт-Петербурге" /><published>2011-02-13T11:45:15+00:00</published><updated>2011-02-13T11:45:15+00:00</updated><id>http://www.dec5e.ru/2011/02/subbotnik-spb</id><content type="html" xml:base="http://www.dec5e.ru/2011/02/subbotnik-spb/">&lt;p&gt;26 февраля в &lt;a href=&quot;http://company.yandex.ru/contacts/spb/&quot;&gt;офисе Яндекса&lt;/a&gt; состоится первый Я.Субботник в Санкт-Петербурге. Количество мест — ограничено, поэтому спешите &lt;a href=&quot;http://company.yandex.ru/public/subbotnik/reg.xml&quot;&gt;зарегистрироваться&lt;/a&gt;. Либо смотрите &lt;a href=&quot;http://company.yandex.ru/public/subbotnik/online.xml&quot;&gt;онлайн-трансляцию&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Я заявку отправил, жду приглашения. Хочу сходить и вам советую. Не все из программы мне понятно, но, как минимум, впечатлиться масштабом решаемых в Яндексе проблем планирую.&lt;/p&gt;

&lt;p&gt;Список докладов и другие подробности о мероприятии смотрите &lt;a href=&quot;http://company.yandex.ru/public/subbotnik/&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Обновление:&lt;/em&gt; Регистрацию подтвердили, иду.&lt;/p&gt;</content><author><name>dec5e</name></author><category term="мероприятия" /><category term="яндекс" /><summary type="html">26 февраля в офисе Яндекса состоится первый Я.Субботник в Санкт-Петербурге. Количество мест — ограничено, поэтому спешите зарегистрироваться. Либо смотрите онлайн-трансляцию.</summary></entry><entry><title type="html">X-Forwarded-For и Opera</title><link href="http://www.dec5e.ru/2010/11/x-forwarded-for/" rel="alternate" type="text/html" title="X-Forwarded-For и Opera" /><published>2010-11-25T00:00:43+00:00</published><updated>2010-11-25T00:00:43+00:00</updated><id>http://www.dec5e.ru/2010/11/x-forwarded-for</id><content type="html" xml:base="http://www.dec5e.ru/2010/11/x-forwarded-for/">&lt;p&gt;Браузеры фирмы Opera (десктопный в режиме Turbo, мобильные Mini и Mobile) используют прокси-сервера компании в Норвегии и других странах мира для сжатия трафика. Это очень удобно при плохой связи с Интернетом, особенно на мобильных телефонах. Но создает проблемы при попытке узнать IP-адрес подключившегося пользователя, например, для геолокации. Благо создатели браузера спешат нам на помощь. Специально для таких случаев они посылают нестандартизированный HTTP-загловок &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Forwarded-For&lt;/code&gt;, впервые внедренный для прокси-сервера Squid и впоследствии ставший стандартом де-факто для прокси. Формат заголовка:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;X-Forwarded-For: {IP-адрес} [ , {IP-адрес} ]*&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;То есть X-Forwarded-For представляет собой строку IP-адресов, разделенных запятой, где адреса идут в порядке прокси-серверов от пользователя к серверам компании Opera (ну или любого прокси, поддерживающего этот заголовок).&lt;/p&gt;

&lt;p&gt;Для определения географического положения пользователя нужно брать последний адрес из перечисленных в заголовке X-Forwarded-For — адрес, с которого пользователь пришел на сервера Opera. Первый может вполне быть внутренним прокси-сервером домашней сети и пользы от него нам никакой. Последний адрес может быть адресом другого прокси, но тут уж ничего не поделаешь.&lt;/p&gt;

&lt;p&gt;Т.е. чтобы определить IP пользователя:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;смотрим заголовок X-Forwarded-For,&lt;/li&gt;
  &lt;li&gt;если есть берем последний адрес в списке,&lt;/li&gt;
  &lt;li&gt;если нет, то берем IP-адрес подключения.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Или как-то так на PHP:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
function getUserIp() {
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $forwarded = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        return trim(array_pop($forwarded));
    }
    return $_SERVER['REMOTE_ADDR'];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;И да, полностью полагаться на геолокацию на основе IP неправильно и всегда нужно давать пользователю возможность свое местоположение уточнить.&lt;/p&gt;

&lt;p&gt;Кстати, X-Forwarded-For не единственный заголовок, выставляемый прокси. Интернеты сообщают еще о существовании заголовков X-REAL-IP, VIA и других. Но Opera их не использует :)&lt;/p&gt;</content><author><name>dec5e</name></author><category term="http" /><category term="mini" /><category term="mobile" /><category term="opera" /><category term="php" /><category term="сервер" /><summary type="html">Браузеры фирмы Opera (десктопный в режиме Turbo, мобильные Mini и Mobile) используют прокси-сервера компании в Норвегии и других странах мира для сжатия трафика. Это очень удобно при плохой связи с Интернетом, особенно на мобильных телефонах. Но создает проблемы при попытке узнать IP-адрес подключившегося пользователя, например, для геолокации. Благо создатели браузера спешат нам на помощь. Специально для таких случаев они посылают нестандартизированный HTTP-загловок X-Forwarded-For, впервые внедренный для прокси-сервера Squid и впоследствии ставший стандартом де-факто для прокси. Формат заголовка:</summary></entry><entry><title type="html">Кодировки при работе с DOMDocument</title><link href="http://www.dec5e.ru/2010/11/domdocument-charset/" rel="alternate" type="text/html" title="Кодировки при работе с DOMDocument" /><published>2010-11-24T00:20:46+00:00</published><updated>2010-11-24T00:20:46+00:00</updated><id>http://www.dec5e.ru/2010/11/domdocument-charset</id><content type="html" xml:base="http://www.dec5e.ru/2010/11/domdocument-charset/">&lt;p&gt;&lt;a href=&quot;http://www.php.net/manual/en/class.domdocument.php&quot;&gt;DomDocument&lt;/a&gt; — мощный инструмент работы с XML и HTML с использованием методов &lt;acronym title=&quot;Document Object Model&quot;&gt;DOM&lt;/acronym&gt;. Главное при его использовании не запутаться в кодировках.&lt;/p&gt;

&lt;p&gt;Конструктор DOMDocument принимает два параметра — версию и кодировку документа&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;$dom = new DOMDocument([ string $version [, string $encoding ]]);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;А чтобы начать работать с существующим HTML-документом его надо загрузить в объект DOMDocument:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;$dom-&amp;gt;loadHTML( string $source );&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Проблема в том, что документ загружается совсем не в той кодировке, что указана в конструкторе. Вообще, &lt;strong&gt;параметры конструктора никак не влияют на загруженный документ&lt;/strong&gt;. А используются только при методах &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;save()&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;$htmlString = $dom-&amp;gt;saveHTML ();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Так что параметры конструктора можно совсем опустить, если вы собираетесь только работать с существующим деревом и не планируете его изменять и выгружать.&lt;/p&gt;

&lt;p&gt;При загрузке же кодировка определяется только исходя из содержимого, загружаемого документа. При этом достаточно часто объект не может определить кодировку верно. Поэтому желательно указывать ее вручную. Возможны &lt;a href=&quot;http://hinikato.blogspot.com/2008/10/php-xml.html&quot;&gt;два способа&lt;/a&gt;. Добавить к импортируемому документу строку кодировки&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
$dom-&amp;gt;loadHTML('&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&amp;gt;' . $source);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Либо сконвертировать все символы документа в HTML-entities перед импортом&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
$source = mb_convert_encoding($source, 'HTML-ENTITIES', 'utf-8');
$dom-&amp;gt;loadHTML($source);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Первый вариант кажется предпочтительнее в плане производительности. В плане результатов работы различий замечено не было.&lt;/p&gt;

&lt;p&gt;Если работать с DOM планируется много, то удобно оформить эти конструкции в отдельный класс наследника DOMDocument, добавить в методе загрузки дерева второй параметр кодировки и определить метод, например, так:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;
class MyDOMDocument extends DOMDocument {
    public function loadHTML($source, $encoding) {
        $source = '&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset='.
            $encoding.'&quot;&amp;gt;' . $source
        $dom-&amp;gt;loadHTML('' . $source);
    }
}
&lt;/code&gt;&lt;/pre&gt;</content><author><name>dec5e</name></author><category term="charset" /><category term="dom" /><category term="php" /><category term="xml" /><summary type="html">DomDocument — мощный инструмент работы с XML и HTML с использованием методов DOM. Главное при его использовании не запутаться в кодировках.</summary></entry><entry><title type="html">Показываем картинки в статистике AWStats</title><link href="http://www.dec5e.ru/2010/10/awstats-icons/" rel="alternate" type="text/html" title="Показываем картинки в статистике AWStats" /><published>2010-10-27T10:11:41+00:00</published><updated>2010-10-27T10:11:41+00:00</updated><id>http://www.dec5e.ru/2010/10/awstats-icons</id><content type="html" xml:base="http://www.dec5e.ru/2010/10/awstats-icons/">&lt;p&gt;AWStats — одна их популярных серверных систем учета статистики, работающая по принципу анализа логов доступа (access-log) Apache. Система хорошая, но часто попадалась мне недонастроенной: не показываются картинки. Картинки для AWStats, чтобы не копировать их для каждого домена, прописываются алиасами в файле конфигурации, который подключается к апачу. А не показываются потому что пути к реальным картинкам указаны неверные. Задача простая — найти иконки, найти конфиг, указать в нем правильный путь, перезапустить апач. У меня на Debian пути были такие:&lt;/p&gt;

&lt;p&gt;Путь к иконкам:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;/usr/share/awstats/icon&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Конфиг апача:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;/etc/apache2/httpd.conf&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Соответственно новая строка в конфиге выглядит так:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;Alias /icon /usr/share/awstats/icon&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ну и не забываем сделать рестарт апача. Готово!&lt;/p&gt;</content><author><name>dec5e</name></author><category term="apache" /><category term="сервер" /><summary type="html">AWStats — одна их популярных серверных систем учета статистики, работающая по принципу анализа логов доступа (access-log) Apache. Система хорошая, но часто попадалась мне недонастроенной: не показываются картинки. Картинки для AWStats, чтобы не копировать их для каждого домена, прописываются алиасами в файле конфигурации, который подключается к апачу. А не показываются потому что пути к реальным картинкам указаны неверные. Задача простая — найти иконки, найти конфиг, указать в нем правильный путь, перезапустить апач. У меня на Debian пути были такие:</summary></entry><entry><title type="html">Правим размеры элементов средствами для разработчика</title><link href="http://www.dec5e.ru/2010/09/dev-tools-metrics/" rel="alternate" type="text/html" title="Правим размеры элементов средствами для разработчика" /><published>2010-09-16T11:06:52+00:00</published><updated>2010-09-16T11:06:52+00:00</updated><id>http://www.dec5e.ru/2010/09/dev-tools-metrics</id><content type="html" xml:base="http://www.dec5e.ru/2010/09/dev-tools-metrics/">&lt;p&gt;В процессе дебага верстки наткнулся на классную фичу в браузерных средствах для разработчика. В них всех есть вкладка, показывающая выбранный элемент и его размеры и отступы. В Firebug и IE Developer Tools это вкладка Layout, в Safari и Chrome Web Inspector’е — вкладка Metrics, в Opera Dragonfly — Разметка (в русской версии).&lt;/p&gt;

&lt;p&gt;Так вот оказывается Firebug, IE Developer Tools и Web Inspector не только показывают метрики выбранного элемента, но и позволяют править! А Firebug-умничка еще и умеет это делать стрелочками вверх-вниз. В IE и FF достаточно просто кликнуть на размер, в Web Inspector кликнуть дважды. Ну а в Dragonfly можно кликать бесконечно :) Не поможет — править метрики там нельзя. Или я просто не разобрался как. Буду рад, если подскажете.&lt;/p&gt;

&lt;p&gt;В IE новые размеры нужно обязательно вводить с размерами, иначе они сбрасываются в ноль. В остальных средствах для разработчика, если вводить цифры без размера, то по умолчанию считается, что размер указан в пикселах. Если же указывать с размерами, то все ведут себя по разному. Firebug не позволяет указывать единицы измерения. Web Inspector всё переводит в пикселы. IE Dev Tools, как уже было указано выше, вообще без единиц размеры не принимает, показывает в тех единицах, которые были указаны, пересчитывает в пиксели только ширину и высоту элемента.&lt;/p&gt;

&lt;p&gt;Точно также все ведут себя и с размерами, указаными через стили. То есть все (в том числе Opera Dragonfly) показывают размеры в пикселах, а IE — в указанных единицах (кроме ширины и высоты).&lt;/p&gt;</content><author><name>dec5e</name></author><category term="debug" /><category term="firebug" /><category term="браузеры" /><category term="верстка" /><category term="инструменты" /><summary type="html">В процессе дебага верстки наткнулся на классную фичу в браузерных средствах для разработчика. В них всех есть вкладка, показывающая выбранный элемент и его размеры и отступы. В Firebug и IE Developer Tools это вкладка Layout, в Safari и Chrome Web Inspector’е — вкладка Metrics, в Opera Dragonfly — Разметка (в русской версии).</summary></entry><entry><title type="html">Первый коммит в yiiext</title><link href="http://www.dec5e.ru/2010/03/yiiext-commit-168/" rel="alternate" type="text/html" title="Первый коммит в yiiext" /><published>2010-03-25T16:25:30+00:00</published><updated>2010-03-25T16:25:30+00:00</updated><id>http://www.dec5e.ru/2010/03/yiiext-commit-168</id><content type="html" xml:base="http://www.dec5e.ru/2010/03/yiiext-commit-168/">&lt;p&gt;Сделал свой первый в жизни коммит в общественный проект — &lt;a href=&quot;http://code.google.com/p/yiiext/source/detail?r=168&quot;&gt;добавил&lt;/a&gt; функционала в библиотеку расширений &lt;a href=&quot;http://code.google.com/p/yiiext/&quot;&gt;yiiext&lt;/a&gt; отличного PHP-фреймворка &lt;a href=&quot;http://yiiframework.ru/&quot;&gt;yii&lt;/a&gt;.  Доволен как слон :)&lt;/p&gt;</content><author><name>dec5e</name></author><category term="commit" /><category term="yii" /><category term="yiiext" /><summary type="html">Сделал свой первый в жизни коммит в общественный проект — добавил функционала в библиотеку расширений yiiext отличного PHP-фреймворка yii.  Доволен как слон :)</summary></entry><entry><title type="html">User-agent в Internet Explorer 9</title><link href="http://www.dec5e.ru/2010/03/ie9-ua/" rel="alternate" type="text/html" title="User-agent в Internet Explorer 9" /><published>2010-03-24T17:33:50+00:00</published><updated>2010-03-24T17:33:50+00:00</updated><id>http://www.dec5e.ru/2010/03/ie9-ua</id><content type="html" xml:base="http://www.dec5e.ru/2010/03/ie9-ua/">&lt;p&gt;Майкрософт &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx&quot;&gt;рассказал&lt;/a&gt; о строке агента в девятом Эксплорере. Вот так она будет выглядеть:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;no-highlight&quot;&gt;Mozilla/&amp;lt;strong&amp;gt;5.0&amp;lt;/strong&amp;gt; (compatible; MSIE &amp;lt;strong&amp;gt;9.0&amp;lt;/strong&amp;gt;; Windows NT 6.1; Trident/5.0)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Как видно, версию движка Trident подняли до 5. Именно в таком коротком виде user-agent будет уходить на сервер. Строка агента с дополнительными данными, добавляемыми сторонними программами, будет отдаваться только через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navigator.userAgent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;В режиме совместимости строка будет выглядеть так:&lt;/p&gt;

&lt;pre&gt;&amp;lt;code class=&quot;no-highlight&quot;Mozilla/&lt;strong&gt;4.0&lt;/strong&gt; (compatible; MSIE &lt;strong&gt;7.0&lt;/strong&gt;; Windows NT 6.0; Trident/5.0)&amp;lt;/code&amp;gt;&lt;/pre&gt;

&lt;p&gt;Для сравнения &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspx&quot;&gt;описание&lt;/a&gt; строки агента в 8-ой версии браузера.&lt;/p&gt;</content><author><name>dec5e</name></author><category term="ie9" /><category term="user-agent" /><category term="браузеры" /><summary type="html">Майкрософт рассказал о строке агента в девятом Эксплорере. Вот так она будет выглядеть:</summary></entry></feed>