<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Персональный блог Валерия Леонтьева &#187; PHP</title>
	<atom:link href="http://valera.ws/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://valera.ws</link>
	<description>Маленький блог для публикации интересных личных заметок</description>
	<lastBuildDate>Tue, 20 Apr 2010 19:23:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Определение версии браузера</title>
		<link>http://valera.ws/2009.09.16~browser-version-detection/</link>
		<comments>http://valera.ws/2009.09.16~browser-version-detection/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 08:49:27 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[браузеры]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=347</guid>
		<description><![CDATA[Вчера возникла задача определения версии браузера посетителя сайта, чтобы выводить сообщение об устаревшей версии браузера. Гуглинг не дал готового кода. PHP функция get_browser вообще нормально не работает. Пришлось написать PHP-код определения весии браузера самому. Итак, задача из HTTP-заголовка UserAgent получить название и версию браузера пользователя, а затем сравнить версию с некими барьерными версиями (по каждому [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера возникла задача определения версии браузера посетителя сайта, чтобы выводить сообщение об устаревшей версии браузера. Гуглинг не дал готового кода. PHP функция <a href="http://us2.php.net/manual/en/function.get-browser.php" target="_blank">get_browser</a> вообще нормально не работает. Пришлось написать PHP-код определения весии браузера самому.<span id="more-347"></span> Итак, задача из HTTP-заголовка UserAgent получить название и версию браузера пользователя, а затем сравнить версию с некими барьерными версиями (по каждому браузеру). Если браузер старше барьерных версий, будем выводить сообщение об ошибке.</p>
<p>Детектить версии нужно только популярных в СНГ немобильных версий браузеров, поэтому в моем коде определяется только Opera, Firefox, Safari, Internet Explorer и Google Chrome. Если вам потребуется определить версии большего числа браузеров, код можно легко дополнить.</p>
<p>Чтобы не раскидывать функции по проекту, весь код я оформляю в классы. Создадим статический класс, в котором будут два метода: определение версии браузера и сравнение версии с данными барьерными версиями по каждому из браузеров. Назовем его BrowserUtils.</p>
<p><script src="http://pastie.org/618513.js"></script> Класс состоит из двух методов: определение браузера и его версии и сравнении полученной версии с пороговыми версиями по разным браузерам. Использовать класс очень просто:  <script src="http://pastie.org/618518.js"></script></p>
<p>Единственный нюанс по коду есть у Safari. Все версии этого браузера всегда посылали в UserAgent тег Safari/build, где buld — версия их движка. Это большая первая цифра, например 528.16. Так версии Safari отображаются в Google Analytics. Но более поздние версии стали писать свою версию в теге Version. Выглядит это примерно так: Version/4.0.2.</p>
<p>Так как мне требовалось выводить версию пользователю, я использовал код считывания версии из тега Version, а для старых версий не детектит номер версии.</p>
<p><a href="http://valera.ws/files/browser_detection.zip">Скачать</a> PHP-код определения версии браузера.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.09.16~browser-version-detection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Собеседование по PHP</title>
		<link>http://valera.ws/2009.04.26~php-interview/</link>
		<comments>http://valera.ws/2009.04.26~php-interview/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 17:10:42 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[сайты]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=311</guid>
		<description><![CDATA[Компания, в которой я работаю, собирается искать хорошего PHP-программера. В связи с этим мне стала задача разработать план проведения собеседования. Решил подготовиться к этому и составить план-список вопросов, по которым будет проходить беседа.

Первым длом полез в гугл. Зачем делать работу, которую уже наверняка кто-то сделал? Так и оказалось, сразу нашел довольно неплохой план собеседования (ссылки [...]]]></description>
			<content:encoded><![CDATA[<p>Компания, в которой я работаю, собирается искать хорошего PHP-программера. В связи с этим мне стала задача разработать план проведения собеседования. Решил подготовиться к этому и составить план-список вопросов, по которым будет проходить беседа.</p>
<p><span id="more-311"></span></p>
<p>Первым длом полез в гугл. Зачем делать работу, которую уже наверняка кто-то сделал? Так и оказалось, сразу нашел довольно неплохой план собеседования (ссылки внизу). Взял из него большуючасть вопросов и добавил свои.</p>
<p>Естественно, что вопросов программисту PHP можно задать море. Особенно учитвая, что знать надо связанные области (БД, сети, HTML и иже с ним, Linux). Смысла задать все вопросы, какие только можно, конечно нету. Задача — определить уровень специалиста, чтобы принять решение: подходит он нам или нет. По-этому выбрал наиболее подходящие на мой взгляд вопросы, по которым я смогу оценить уровень кандидата.</p>
<p>Кроме того, конечно не одиними вопросами можно обойтись. Следует предложить пройти небольшие тесты по практическим моментам. Об этом ниже.</p>
<h1>Вопросы</h1>
<p><strong>1. PHP и основы программирования</strong><br />
1.1. Почему PHP?<br />
1.2. Что такое ООП, основные принципы ООП.<br />
1.3. Понятие абстракции, наследования, инкапсуляции и полиморфизма.<br />
1.4. Что такое MVC?<br />
1.5. Какие паттерны проектирования вам известны?<br />
1.6. Под какую версию PHP писали? В чем различия между четвертой и пятой версиями?<br />
1.7. Какими сторонними библиотеками пользовались?<br />
1.8. Опыт работы с различными Frameworks/CMS?<br />
1.9. Типы данных в PHP? (string, int, float, object, resource, null, bool, array)<br />
1.10. Назовите по памяти функции для работы с массивами, строками и объектами в PHP (хотя бы по 5 штук).<br />
1.11. Что такое сериализация?<br />
1.12. Чем отличается абстрактный класс от интерфейса?<br />
1.13. В каких случаях лучше использовать статические методы и классы?<br />
1.14. Можно ли создать приватный конструктор? Зачем?<br />
1.15. Как сказывается большое количество объектов в коде на производительность?<br />
1.16. Что такое хэш?<br />
1.17. Что такое область видимости переменной?<br />
1.18. Что такое PDO? Что такое ORM?<br />
1.19. Что такое PEAR?<br />
1.20. Когда лучше использовать <em>mysql_pconnect</em>?<br />
1.21. Обязательно ли писать ?&gt; в конце скрипта?<br />
1.22. Как вы отлаживаете PHP-код?<br />
1.23. Проводили когда-нибудь оптимизацию сайтов?<br />
1.24. Какую IDE используете? Какие использовали ранее?<br />
1.25. Что такое unit-test? Использовали?<br />
<strong>2. Tools</strong><br />
2.1. Что такое Apache? mod_rewrite? nginx?<br />
2.2. Аббревиатуры SVN и CVS о чем-нить говорят? А Git и Mercurial?<br />
2.3. Багтрекинг системы? BugZilla? Mantis? Redmine? JIRA?<br />
2.4 .Моделирование, UML использовали?<br />
2.5. Что такое SSH? Какие есть варианты авторизации при входе по SSH?<br />
<strong>3. D</strong><strong>ata Bases</strong><br />
3.1. Что такое реляционная база данных? Какие есть типы БД?<br />
3.2. Нормализация, денормализация.<br />
3.3. SQL. Join&#8217;ы, Union. Подзапросы.<br />
3.4. Процедуры, тригеры.<br />
3.5. Вьюшки.<br />
3.6. InnoDB vs MyISAM.<br />
3.7. Какие бывают индексы в MySQL?<br />
3.8. В чем отличие MySQL от PostgreSQL?<br />
3.9. Что такое SQL-инъекция? Приведите пример.<br />
<strong>4. HTML + CSS</strong><br />
4.1. Нарисуйте простенькую форму для отправки файла.<br />
4.2. Что такое CSS? В чем разница между записью <em>#my</em> и <em>.my</em>? Для каких атрибутов можно указать :hover?<br />
4.3. Расшифруй вот такую запись в CSS <em>table#a tbody td.odd {text-decoration:inherit}</em>?<br />
4.4. Что такое стандарты W3C?<br />
<strong>5. JavaScript</strong><br />
5.1. Как работает наследование в JS?<br />
5.2. Чем отличается хэш от объекта? (провокационный)<br />
5.3. А хэш от массива?<br />
5.4. Если ли опыт работы с Jquery, ExtJS? Какие фреймворки использовались?<br />
5.5. Что такое Ajax? Есть ли опыт работы с ним?<br />
5.6. Использовали ли FireBug? Drag-on-fly?<br />
5.7. Что такое замыкания и как они работают?<br />
<strong>6. Linux</strong><br />
6.1. С *nix знаком? Какие дистрибутивы? Почему?<br />
6.2. Apache, PHP и СУБД устанавливали под *nix? Настраивали? Оптимизировали?<br />
<strong>7. Networking</strong><br />
7.1. Что такое уровни модели OSI? Сколько их?<br />
7.2. По какому протоколу осуществляется передача данных в сети Интернет?<br />
7.3. Какие вообще есть сетевые протоколы?<br />
7.4. Расскажите, что происходит, когда в строке браузера набираешь адрес и нажимаешь Enter?<br />
7.5. Что такое WSDL &amp; web-services? Есть опыт работы?<br />
7.6. Что такое SSL? Как работает HTTPS? Какой принцип работы HTTPS? Какие есть варианты авторизации HTTP?<br />
<strong>8. Что такое XSLT, XML? Есть ли опыт работы с ними?</strong></p>
<h2>Как отработает код?</h2>
<p><strong>1)</strong><br />
&lt;?php<br />
/* Что будет выведено на экран? */<br />
$a = &#8216;true&#8217;;<br />
if( 0 == $a || $a )<br />
{<br />
echo &#8216;yes&#8217;;<br />
}</p>
<p><strong>2)</strong><br />
&lt;?php<br />
/* Что будет выведено на экран? */<br />
$a = 10;<br />
echo $a&#8211; &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211;$a;</p>
<p><strong>3)</strong></p>
<p>&lt;?php<br />
class A {private function __construct(){throw new Exception(&#8221;);} public function A(){return array(&#8217;a',&#8217;b',&#8217;c');} public static function I(){return new A();}}<br />
/*<br />
Как вывести на экран именно то &#8216;b&#8217;, которое определено в массиве выше, используя одну команду (одну строку кода)?<br />
*/</p>
<p><strong>4)</strong><br />
&lt;?php</p>
<p>/*<br />
Какая строчка выведется при исполнении скрипта?<br />
Почему исполняется или не исполняется каждое из условий?<br />
*/<br />
$x = 1;<br />
if ($x == &#8216;1&#8242;) {<br />
echo &#8216;a&#8217;;<br />
}<br />
if ($x == true) {<br />
echo &#8216;b&#8217;;<br />
}<br />
if((bool)$x === true){<br />
echo &#8216;e&#8217;;<br />
}<br />
if ($x === true) {<br />
echo &#8216;c&#8217;;<br />
}<br />
if((int)$x === true){<br />
echo &#8216;d&#8217;;<br />
}</p>
<p><strong>5)</strong><br />
&lt;?php<br />
/*<br />
Что выведет скрипт? (запускается непосредственно)<br />
*/<br />
error_reporting(E_ALL);<br />
ini_set(&#8217;display_errors&#8217;,'0&#8242;);</p>
<p>print $x[0];<br />
dddxxxx();</p>
<p><strong>6)</strong><br />
&lt;?php<br />
/*<br />
Для какой версии PHP будет работать этот скрипт?<br />
Что выведет этот скрипт?<br />
*/<br />
class Test{</p>
<p>private $var;</p>
<p>function setMe($value){<br />
$this-&gt;var = $value;<br />
}<br />
}</p>
<p>class More extends Test{<br />
public $var;<br />
}</p>
<p>$oTest = new Test;<br />
$oMore = new More;</p>
<p>echo $oTest-&gt;setMe(&#8217;foo&#8217;);</p>
<p>echo $oMore-&gt;setMe(&#8217;foo&#8217;);</p>
<p>echo $oMore-&gt;var;</p>
<p>echo $oTest-&gt;var;</p>
<h2>Тест на corp.mamba.ru</h2>
<p><a href="http://www.corp.mamba.ru/test/promo.phtml" target="_blank">http://www.corp.mamba.ru/test/promo.phtml</a></p>
<h2>Ссылки</h2>
<p>А вот и те ссылки, которые помогли мне в составлении списка.</p>
<p><a href="http://habrahabr.ru/blogs/php/21681/" target="_blank">http://habrahabr.ru/blogs/php/21681/</a></p>
<p><a href="http://habrahabr.ru/blogs/webdev/19964/" target="_blank">http://habrahabr.ru/blogs/webdev/19964/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.04.26~php-interview/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Установка eAccelerator в Debian etch</title>
		<link>http://valera.ws/2009.01.26~eaccelerator-debian-etch/</link>
		<comments>http://valera.ws/2009.01.26~eaccelerator-debian-etch/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 17:52:00 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=278</guid>
		<description><![CDATA[К сожалению, пакета eAccelerator в официальных репозиториях Debian Etch нет, по этому устанавливать этот модуль приходится из исходников. О том, как это сделать, и написано ниже.
Перед установкой wAccelerator&#8217;а необходимо установить несколько требуемых для сборки пакетов:
# apt-get install build-essential php5-dev
Теперь можно скачать и установить eAccelerator по следующей схеме (убедитесь, что скачиваете последниюю версию исходников):
# cd /tmp
# [...]]]></description>
			<content:encoded><![CDATA[<p>К сожалению, пакета <a href="http://eaccelerator.net/" target="_blank">eAccelerator</a> в официальных репозиториях Debian Etch нет, по этому устанавливать этот модуль приходится из исходников. О том, как это сделать, и написано ниже.</p>
<p><span id="more-278"></span>Перед установкой wAccelerator&#8217;а необходимо установить несколько требуемых для сборки пакетов:</p>
<p># apt-get install build-essential php5-dev</p>
<p>Теперь можно скачать и установить eAccelerator по следующей схеме (<a href="http://eaccelerator.net/wiki" target="_blank">убедитесь</a>, что скачиваете последниюю версию исходников):</p>
<p># cd /tmp<br />
# wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2<br />
# tar xvfj eaccelerator-0.9.5.3.tar.bz2<br />
# cd eaccelerator-0.9.5.3<br />
# phpize<br />
# ./configure<br />
# make<br />
# make install</p>
<p>eAccelerator установлен! Теперь необходимо настроить в конфиге PHP использование eAccelerator&#8217;а. В Debian Etchконфигурационные файлы для различных расширений PHP 5 хранятся в каталоге /etc/php5/conf.d, а ссылка на этот каталог присутствует в конфигурационном файле PHP5 /etc/php5/apache2/php.ini, что означает, что все файлы из /etc/php5/conf.d считываются при запуске или перезапуске Apache. Так что все, что нам надо сделать, это создать файл /etc/php5/conf.d/eaccelerator.ini следующего содержания:</p>
<p>vi /etc/php5/conf.d/eaccelerator.ini</p>
<p>extension=&#8221;eaccelerator.so&#8221;<br />
eaccelerator.shm_size=&#8221;16&#8243;<br />
eaccelerator.cache_dir=&#8221;/var/cache/eaccelerator&#8221;<br />
eaccelerator.enable=&#8221;1&#8243;<br />
eaccelerator.optimizer=&#8221;1&#8243;<br />
eaccelerator.check_mtime=&#8221;1&#8243;<br />
eaccelerator.debug=&#8221;0&#8243;<br />
eaccelerator.filter=&#8221;"<br />
eaccelerator.shm_max=&#8221;0&#8243;<br />
eaccelerator.shm_ttl=&#8221;0&#8243;<br />
eaccelerator.shm_prune_period=&#8221;0&#8243;<br />
eaccelerator.shm_only=&#8221;0&#8243;<br />
eaccelerator.compress=&#8221;1&#8243;<br />
eaccelerator.compress_level=&#8221;9&#8243;</p>
<p>(Про разлиные настройки модуля можно почитать на странице: http://www.eaccelerator.net/wiki/Settings.)</p>
<p>Как видно из конфигурации, каталог /var/cache/eaccelerator используется для хранения кэша опкода PHP на диске. Его необходимо создать вручную и разрешить на запись:</p>
<p>mkdir -p /var/cache/eaccelerator<br />
chmod 0777 /var/cache/eaccelerator</p>
<p>Теперь перезагружаем Apache и eAccelerator начинает работать:</p>
<p>/etc/init.d/apache2 restart</p>
<p>При помощи функции phpinfo() убедитесь, что модуль успешно подключен и функционирует.</p>
<p>Исходный материал на английском: <a href="http://www.howtoforge.com/eaccelerator_php5_debian_etch" target="_blank">http://www.howtoforge.com/eaccelerator_php5_debian_etch</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.01.26~eaccelerator-debian-etch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Хабро́метр — новый сервис логирования и отображения значений кармы и хабросилы</title>
		<link>http://valera.ws/2009.01.14~habrometr/</link>
		<comments>http://valera.ws/2009.01.14~habrometr/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 14:38:59 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[habrahabr]]></category>
		<category><![CDATA[рейтинг]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=269</guid>
		<description><![CDATA[Хаброметр — сервис логирования значений кармы, хабрасилы и позиции в рейтинге хабрапользователя и отображения этой информации на информерах, которые можно вставить в профиль, блог, форум и т.д.
 


Для этих целей уже давно был написан Кармаграф от Goodrone . Но развитие его сейчас заморожено, а сам движок сломался и значения счетчиков не обновляется с прошлого года [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://habrometr.server.valera.ws/">Хаброметр</a> — сервис логирования значений кармы, хабрасилы и позиции в рейтинге хабрапользователя и отображения этой информации на информерах, которые можно вставить в профиль, блог, форум и т.д.</p>
<p><a href="http://habrometr.server.valera.ws/?action=user_page&amp;user=feedbee"><img title="Хаброметр feedbee" src="http://habrometr.server.valera.ws/habrometr_425x120.php" alt="Хаброметр feedbee" /></a> <img title="Хаброметр feedbee" src="http://habrometr.server.valera.ws/habrometr_88x120.php" alt="Хаброметр feedbee" /></p>
<p><img title="Хаброметр feedbee" src="http://habrometr.server.valera.ws/habrometr_88x15.php" alt="Хаброметр feedbee" /></p>
<p><span id="more-269"></span></p>
<p>Для этих целей уже давно был написан <a href="http://habrahabr.ru/blogs/ilhh/10994/">Кармаграф</a> от <a class="user_link" href="http://goodrone.habrahabr.ru/">Goodrone</a> . Но развитие его сейчас заморожено, а сам движок сломался и значения счетчиков не обновляется с прошлого года (на момент написания). Это и подтолкнуло написать свой кармаграф именно сейчас.</p>
<p>Считать ли само слово «кармаграф» названием конкретного сервиса от Goodrone, либо же наименованием класса сервисов (или самого графика) — не знаю. Чтобы не заморачиваться с этим вопросом, свой кармаграф решил назвать иначе — Хаброметр. Ведь не только карму он считает и показывает, но еще хабрасилу и позицию в рейтинге (все, что выдает на данный момент API Хабра). Хаброметр отличается от Кармаграфа не смотря на визуальную схожесть дизайна основного информера. Конечно, я постарался взять все лучшее у Кармаграфа. Основное отличие Хаброметра — информеров будет несколько разных видов. Уже сейчас доступны три вида — кармаграфик, табло и минитабло.</p>
<p>Итак, пару слов о том что получилось. Весь сервис состоит из подсистемы сбора информации и подсистемы ее визуализации. Каждые 2 часа бот собирает информацию о значениях кармы, хабрасилы и позиции в рейтинге (я называю эти данные Хабразначениями) через API Хабра по всем зарегистрированным на сервисе пользователям. Данные сохраняются в базу. В любое время любой желающий может зайти на страницу пользователя и посмотреть историю его Хабразначений. Сейчас показывается история из 500 последних запросов (12 запросов в сутки, получается чуть больше 40 дней). В перспективе отображение определенно изменится, появится календарь. Кроме того, существуют графические информеры, на которых отображаются текущие Хабразначения юзера, максимальные и минимальные значения за время мониторинга и график кармы (наличие определенных компонентов зависит от типа (размера) информера).</p>
<p>Все скрипты написаны на PHP, СУБД используется MySQL (пока во всяком случае). Для рисования используется ImageMagick. Для запуска по расписанию — Cron.</p>
<p>Работает сервис на моем сервере (server.valera.ws), который, к слову, не очень мощный и может не выдержать хабраэффекта. Кстати, с технической точки зрения есть одно существенное отличие работы Хаброметра от Кармаграфа — информеры рисуются не по расписанию после скачки свежих данных, а при первом запросе на отображение информера после обновления данных. Другими словами, после прорисовки информера он кэшируется. Сама прорисовка происходит очень быстро. А кэш чистится после скачки свежих данных. Это позволяет разнести пиковую нагрузку на прорисовку свежих информеров во времени. К тому же, не все зарегистрированные юзеры вообще где-то разместят информеры, а тем более не разместят информеры сразу всех типов. Так что разовая прорисовка всех информеров была бы излишней.</p>
<p>Естественно сервис предоставляется «как есть» и бесплатный для использования. Код Хаброметра я собираюсь открыть, но несколько позже. Сначала требуется отладить его работу, исправить ошибки (которые там наверняка найдутся). Код будет открыт под лицензией GPL 3.</p>
<p>Сейчас сервис работает в режиме beta-тестирования. Буду рад вашим отзывам, багрепортам на e-mail feedbee@gmail.com. В первую очередь хочется добиться стабильности работы и оптимизации ресурсозатрат сервиса. Ну а далее уже заботиться об удобстве пользования.</p>
<p>Первым делом постараюсь доделать запланированные виды информеров. Это 31х31, 88х31 и 350х20. Так же надо будет что-то придумать с расширением цветовых гамм. Когда будет время, поработаю над дизайном страниц сервиса.</p>
<p>P.S. Сайт сервиса (описание системы и бота): <a href="http://habrometr.server.valera.ws/">http://habrometr.server.valera.ws</a>.</p>
<p>P.S.S. Домен такой выбирал не специально, так случилось что server.valera.ws != valera.ws. Потому такой длинный.</p>
<p>P.S.S. Если из-за хабраэффекта накроется мой сервер, уже не кидайте много камней в огород. Пока не было возможности испытать его под нагрузкой.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.01.14~habrometr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Локальная офисная версия сайта</title>
		<link>http://valera.ws/2008.12.06~office-website/</link>
		<comments>http://valera.ws/2008.12.06~office-website/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 14:05:24 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[сайты]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=213</guid>
		<description><![CDATA[Часто в компаниях есть штатные редакторы, которые работают с некими сайтами этой, принадлежащими ей — наполняют их контентом, модерируют и т.д. Обычно редакторы вместе с обычными пользователями пользуются одной версией сайта, которая располагается на хостинге в сети. Но это не оптимально, так как лишний трафик (прежде всего HTML-код страниц, рисунки, css) гуляет с сервера на [...]]]></description>
			<content:encoded><![CDATA[<p>Часто в компаниях есть штатные редакторы, которые работают с некими сайтами этой, принадлежащими ей — наполняют их контентом, модерируют и т.д. Обычно редакторы вместе с обычными пользователями пользуются одной версией сайта, которая располагается на хостинге в сети. Но это не оптимально, так как лишний трафик (прежде всего HTML-код страниц, рисунки, css) гуляет с сервера на офис, занимая внешний канал компании и тратя трафик веб-сервера. При мдленном внешнем канале тратится так же и время редакторов.</p>
<p><span id="more-213"></span>В идеале, в данном случае передавать необходимо только добавляемые и получаемые данные, так как весь антураж может быть сохранен и доступен в пределах офиса локально.</p>
<p>Для решения этой задачи можно использовать общую базу данных, которая будет  располагаться на хостинге. На сервере в локальной сети поднять сайт, указать для  подключения к СУБД параметры доступа к база на удаленном сервере. Таким образом, у вас будут 2 одинаковых сайта, параллельно работающих с одним источником данных.</p>
<p>В принципе это обычная схема для балансировки нагрузки на фронтэнд (web-сервер). Практику много фронтэндов — один бэкэнд (база) применяют довольно часто, а следующий этап разделения нагрузки (когда уже СУБД не выдерживает напора) — кластеризация серверов баз данных. Но это лирическое отступление.</p>
<p>Следуюет учесть три нюанса. Во-первых, так как сервера у нас теперь два, время на них может быть разное. Следовательно при записи в базу временные показатели будут для серверов расходиться и может возникнуть путаница. Чтобы этого избежать, проще всего брать время из СУБД. Делать это надо естественно 1 раз за запрос (кэшировать), а не при каждой необходимости (при условии, что запрос выполняется не более 1 секунды; если больше, значит ваша система нуждается в оптимизации). Таким образом время на всех серверах будет синхронизировано по времени на сервере с СУБД.</p>
<p>Второй нюанс заключается в том, что по сети информация между сервером на офисе и базой у провайдера будет ходить в открытом виде, что потенциально опасно. Так же опасно создавать пользователя, которому будет разрешено удаленно подключаться к сети с любого хоста, так как получив ваш пароль злоумышленник легко завладеет базой и сайтом (если IP статичский, второй аспект не актуален).</p>
<p>Решить эту проблему можно через подключение к СУБД по защищенному SSL-протоколу. Популярные СУБД поддерживают SSL (MySQL, PgSQL). Подключение клиента к серверу через SSL поддерживают родные C API этих СУБД, и PHP MySQL/PgSQL API тоже. Но SSL не поддерживается PDO (во всяком случае я не нашел информацию о поддержке), который в настоящее время очень популярен и который следует использовать. По этому вариант подключения к базе через SSL отпадает.</p>
<p>Остается другой, довольно простой для использования и сложный для настройки вариант — перегон трафика между офисом и хостингом через VPN. Сам <a href="http://valera.ws/2008.11.21~traffic-security/">VPN я уже описывал</a> в своем блоге. После поднятия VPN-тоннеля необходимо прописать роут на IP вашего сервера (того сервера, где находится СУБД) через виртуальный интерфейс VPN-соединения. Таким образом весь трафик между PHP и СУБД будет ходить по безопасному зашифрованному каналу.</p>
<p>Третий нюанс заключается в кэшировании. Часто кэш некоторых элементов заводят пожизненно (или на долгое время), а сбрасывается он только при изменении данных редактором. В этом случае, при внесении изменений на одном из серверов, кэш не сбросится на втором и на неопределенный срок там останется неактуальная информация. Эта проблема решается через изменение стратегии кэширования, либо использование общего сервера кэширования и выходит за рамки данной статьи. Если именно этот вопрос для вас остается актуальным, ищите информацию в гугле, т.к. та же самая проблема существует при  балансировке нагрузки путем &#8220;размножения&#8221; фронэндов.</p>
<p>Когда все проблемы решены, все что остается делать — это следить за тем, чтобы версии скриптов на серверах в сети и на офисе были одинаковыми, чтобы не повредить базу.</p>
<p>Теперь редакторы сайта смогут пользоваться более быстрой локальной версией сайта, но все изменения будут отображаться в том числе и на сайте в сети.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.12.06~office-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Статистика Google Analytics на вашем сайте</title>
		<link>http://valera.ws/2008.11.30~googleanalytics/</link>
		<comments>http://valera.ws/2008.11.30~googleanalytics/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 14:16:45 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[статистика]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=207</guid>
		<description><![CDATA[Один добрый хабрапользователь Andex написал на Хабре статью о том, как на свой сайт экспортировать статистику с Google.Analytics. Подробности читайте в соответствующем блоге. Все замечательно работает (на момент 30 ноября 2008 года), и хорошо выглядит даже дефолтовый набор отчетов, который автор делал для себя. Но есть один недостаток для меня, который я исправил.
Но обо всем [...]]]></description>
			<content:encoded><![CDATA[<p>Один добрый хабрапользователь <a href="http://andex.habrahabr.ru/" target="_blank">Andex</a> <a href="http://habrahabr.ru/blogs/webdev/42080/" target="_blank">написал</a> на <a href="http://habrahabr.ru" target="_blank">Хабре</a> статью о том, как на свой сайт экспортировать статистику с <a href="http://www.google.com/analytics/" target="_blank">Google.Analytics</a>. Подробности читайте в <a href="http://habrahabr.ru/blogs/webdev/42080/" target="_blank">соответствующем блоге</a>. Все замечательно работает (на момент 30 ноября 2008 года), и хорошо выглядит даже дефолтовый набор отчетов, который автор делал для себя. Но есть один недостаток для меня, который я исправил.</p>
<p><span id="more-207"></span>Но обо всем по порядку. Для начала <a href="http://habrahabr.ru/blogs/webdev/42080/" target="_blank">прочитайте статью</a> Andex&#8217;а и &#8220;заведите&#8221; статистику на web-сервере.</p>
<p>Если во время установки что-то не заработало, читайте комментарии.</p>
<p>У меня возникла такая проблема: если сходу ошибиться с паролем, то система обратиться к гуглу с неправильным паролем столько раз, сколько отчетов экспортируется. В дефалтном варианте это 8 раз. После этого гугл естественно будет требовать от вас ввода каптчи, чтобы убедиться, что вы не подбираете пароли. А возвращать в этом случае он будет временный редирект (Temporary redirect). Его вы в логе и увидите, при этом stat.php будет вывалить нутисы про Undefined index&#8217;ы. В этом случае, надо подождать минут 20, а потом повторно запросить статистику, и все будет хорошо :)</p>
<p>Что меня не устроило в дефалтовых отчетах? Только то, что графики по посетителям и по посещениям были разделены. Вместо того, чтобы на одном графике сделать 3 кривых, было сделано 2 графика по 2 кривых (посетители + просмотры, посещения + просмотры).</p>
<p>Я решил это исправить. Но исправить так, чтобы ковырять готовый код по минимуму для простоты и быстроты решения, и для совместимости с потенциальными будущими апдейтами.</p>
<p>Итак, что нужно сделать? Нужно составить новый сводный отчет (*.csv), в котором будут храниться объединенные данные по посетителям, посещениям и просмотрам. И нужно сделать *settings.xml-файл, в котором будут настройки визуализации нового графика.</p>
<p>Генерацию сводного отчета я вынес в функцию. Она берет два отдельных отчета и составляет из них общий:</p>
<pre>function makeFull($postfix = '')
{
	$fvisits = fopen($GLOBALS["path"] . "visits$postfix.csv", 'r');
	$fvisitors = fopen($GLOBALS["path"] . "visitors$postfix.csv", 'r');
	$ffull = fopen($GLOBALS["path"] . "full$postfix.csv", 'w');
	while (!feof($fvisits))
	{
		$visits_line = explode(';', fgets($fvisits));
		$visitors_line = explode(';', fgets($fvisitors));
		if (count($visits_line) == 3 &amp;&amp; count($visitors_line) == 3)
		{
			// новая строка =     дата       ;        посетители       ;       посещения       ;       показы &amp; \n
			$new_line = $visitors_line[0] . ';' . $visitors_line[1] . ';' . $visits_line[1] . ';' . $visitors_line[2];
			fputs($ffull, $new_line);
		}
	}
	fclose($fvisits);
	fclose($fvisitors);
	fclose($ffull);
}</pre>
<p>Эту функцию надо поместить в stat.php (например в конец). Вызвать ее нужно 2 раза (отчет за все время и отчет за последние 3 месяца):</p>
<pre>makeFull();
makeFull('_3');</pre>
<p>Это нужно делать после генерации соответствующих отчетов, т.е. проще всего дописать в конце файла stat.php.</p>
<p>Далее из файлов visitors_3_settings.xml и visitors_settings.xml я сделал копии (full_3_settings.xml и full_settings.xml) и добавил в настройках графиков новый график-кривую (новую секцию &lt;graph gid=&#8221;3&#8243;&gt;&lt;/graph&gt;).</p>
<p>Осталось подредактировать index.php, чтобы новые графики отображались вместо старых. В index.php вместо кода первых четырех графиков появился следующий код:</p>
<pre>	&lt;div id="visitors" align="center" style="padding-bottom:80px"&gt;
&lt;strong&gt;Для просмотра сожержимого, установите последнюю версию Adobe Flash Player&lt;/strong&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	// &lt;![CDATA[
	var so = new SWFObject("amline.swf", "amline_chart", "600", "350", "8", "#FFFFFF");
	so.addVariable("path", "./amline/");
	so.addVariable("settings_file", escape("full_settings.xml?&lt;?php echo mktime();?&gt;"));
	so.addVariable("data_file", escape("full.csv?&lt;?php echo mktime();?&gt;"));
	so.addVariable("preloader_color", "#BBBBBB");
	so.write("visitors");
	// ]]&gt;
&lt;/script&gt;
&lt;div id="visitors_3" align="center" style="padding-bottom:80px"&gt;
&lt;strong&gt;Для просмотра сожержимого, установите последнюю версию Adobe Flash Player&lt;/strong&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	// &lt;![CDATA[
	var so = new SWFObject("amline.swf", "amline_chart", "600", "400", "8", "#FFFFFF");
	so.addVariable("path", "./amline/");
	so.addVariable("settings_file", escape("full_3_settings.xml?&lt;?php echo mktime();?&gt;"));
	so.addVariable("data_file", escape("full_3.csv?&lt;?php echo mktime();?&gt;"));
	so.addVariable("preloader_color", "#BBBBBB");
	so.write("visitors_3");
	// ]]&gt;
&lt;/script&gt;</pre>
<p>Вот и все. Теперь страница статистики (index.php) выглядит примерно так:</p>
<div id="attachment_208" class="wp-caption alignnone" style="width: 219px"><a href="http://valera.ws/wp-content/uploads/2008/11/charts.png"><img class="size-medium wp-image-208" title="charts" src="http://valera.ws/wp-content/uploads/2008/11/charts-209x300.png" alt="Вид сводных диаграм из Google.Analytics" width="209" height="300" /></a><p class="wp-caption-text">Вид сводных диаграм из Google.Analytics</p></div>
<p><strong>Скачка готовых файлов</strong>.</p>
<p>Мой мод вывода статистики затронул файлы из <a href="http://code.google.com/p/statga/downloads/list" target="_blank">пакета statga от Andex&#8217;а</a>. Изменения производились в версии statga 2.0.1. Не каснулись пакета только 2 новых файла: full_3_settings.xml и full_settings.xml. Их вы можете смело брать из моего пакета в любом случае. Как модернизировать файлы пакета <a href="http://code.google.com/p/statga/downloads/list" target="_blank">statga</a> для изменения визуализации написано выше. Так что, если Andex обновит версию, вы сможете внести правки вручную. Если нет, можно использовать готовые файлы версии 2.0.1:</p>
<p><a href="http://valera.ws/files/statga_2.0.1_plus_feedbee_mod.zip" target="_blank">Скачать модефицированную версию statga 2.0.1 feedbee mod</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.11.30~googleanalytics/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>О жизни современного программиста</title>
		<link>http://valera.ws/2008.10.25~o-zhizni-sovremennogo-programmista/</link>
		<comments>http://valera.ws/2008.10.25~o-zhizni-sovremennogo-programmista/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 10:52:00 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=158</guid>
		<description><![CDATA[Реакция на комментарии на Хабре.
Да, питонисты — тихие спокойные ребята, а пхп-шники — агрессивные дурачки, потому что:
1) Питонисты и Рубироиды при каждом удобном случае лезут в топики про php и кричат, что php — гавно, а руби/питон — круто!
2) На форумах и в IRC-чатах, когда кто-то задает вопрос `как это сделать в php/java/с++/c#` тут же [...]]]></description>
			<content:encoded><![CDATA[<p>Реакция на <a href="http://habrahabr.ru/blogs/webdev/43080/#comment_1066520" target="_blank">комментарии на Хабре</a>.</p>
<p>Да, питонисты — тихие спокойные ребята, а пхп-шники — агрессивные дурачки, потому что:</p>
<p>1) Питонисты и Рубироиды при каждом удобном случае лезут в топики про php и кричат, что php — гавно, а руби/питон — круто!</p>
<p>2) На форумах и в IRC-чатах, когда кто-то задает вопрос `как это сделать в php/java/с++/c#` тут же находятся рубироиды и питонщики, которые кричат, что это не надо делать на данном языке, а надо делать на руби или питоне! А автор вопроса — мудак!</p>
<p>3) Когда дается ответ на вопрос `как это сделать в php/java/с++/c#` в несколько строк кода, тут же находится довольный рубироид и пишет все в одну только ему понятную строчку и кричит `вот как все просто на руби, а вы мудаки все еще пишете на ХХХ`!</p>
<p>Как же это уже раздражает…</p>
<p>Ребята, если сидит компания из нескольких человек с пивом и обсуждает, как они хорошо съездили в Крым, не надо влазить в их беседу, объясняя, что Крым гавно, а Египет жжот. Есть большая вероятность, что вы получите в морду.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.10.25~o-zhizni-sovremennogo-programmista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Профилирование PHP под Windows</title>
		<link>http://valera.ws/2008.10.22~php-profiling-under-windows/</link>
		<comments>http://valera.ws/2008.10.22~php-profiling-under-windows/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 15:02:15 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=151</guid>
		<description><![CDATA[Рано или поздно все программисты PHP сталкиваются с необходимостью профилирования собственного кода. Она возникает на этапе оптимизации работы веб-приложения. Вообще, профилирование — это подсчет затрат времени на выполнение каждой отдельной функции (в том числе методов классов) в контексте времени генерации страницы-ответа целиком. О профилировании написано в Интернете достаточно много, поэтому на теории заострять внимание смысла [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://valera.ws/wp-content/uploads/2008/10/xdebug.png"><img class="alignleft size-full wp-image-156" title="xdebug" src="http://valera.ws/wp-content/uploads/2008/10/xdebug.png" alt="" width="119" height="70" /></a>Рано или поздно все программисты PHP сталкиваются с необходимостью профилирования собственного кода. Она возникает на этапе оптимизации работы веб-приложения. Вообще, профилирование — это подсчет затрат времени на выполнение каждой отдельной функции (в том числе методов классов) в контексте времени генерации страницы-ответа целиком. О профилировании написано в Интернете достаточно много, поэтому на теории заострять внимание смысла нет. &#8220;Под катом&#8221; описана установка и настройка софта для профилирования PHP-скриптов в ОС Windows.</p>
<p><span id="more-151"></span>Для профилирования нам понадобится компонент подсчета времени выполнения функций PHP и формирования отчета и компонент визуального представления этого отчета для анализа.</p>
<p>Существуют как минимум 3 профайлера PHP-кода: <a href="http://www.xdebug.org/" target="_blank">Xdebug</a>, <a href="http://pecl.php.net/apd" target="_blank">Advanced PHP Debuger</a> и <a href="http://dd.cron.ru/" target="_blank">DBG</a>. Скажу честно, два последних я даже не рассматривал по двум причинам: Xdebug — самый популярный, Xdebug встроен в сборку <a href="http://www.apachefriends.org/en/xampp.html" target="_blank">xampp</a>, которая стоит на моей локальной машине.</p>
<p><strong>Установка Xdebug</strong></p>
<p>Интеграция Xdebug&#8217;а в PHP очень проста. С сайта <a href="http://www.xdebug.org/" target="_blank">www.xdebug.org</a> необходимо скачать DLL-extension для вашей версии PHP. <a href="http://www.xdebug.org/link.php?url=xdebug203-52-win" target="_blank">Вот файл</a> для PHP 5.2.1-5.2.6 под Windows. Скачанный файл необходимо положить в каталог расширений PHP (extension_dir). А в php.ini добавить следующие строки:</p>
<p>extension=php_xdebug.dll</p>
<p>[XDebug]<br />
;; Only Zend OR (!) XDebug<br />
zend_extension_ts=&#8221;<em>c:\php\ext\php_xdebug.dll</em>&#8221;<br />
xdebug.remote_enable=true<br />
xdebug.remote_host=127.0.0.1<br />
xdebug.remote_port=9000<br />
xdebug.remote_handler=dbgp<br />
xdebug.profiler_enable=1<br />
xdebug.profiler_output_dir=&#8221;<em>c:\temp</em>&#8221;</p>
<p>При этом строки секции [Zend] требуется закомментировать (поставить ; в начале каждой строки):</p>
<p>[Zend]<br />
;zend_extension_ts = &#8220;c:\php\zendOptimizer\lib\ZendExtensionManager.dll&#8221;<br />
;zend_extension_manager.optimizer_ts = &#8220;c:\php\zendOptimizer\lib\Optimizer&#8221;<br />
;zend_optimizer.enable_loader = 0<br />
;zend_optimizer.optimization_level=15</p>
<p>Установите правильные пути в параметры zend_extension_ts и xdebug.profiler_output_dir секции XDebug. Путь xdebug.profiler_output_dir — это каталог, в который будет записан файл отчета.</p>
<p>На этом установка Xdebug закончена. Подробности по тонкой настройке этого расширения ищите при необходимости в гугле. Ознакомиться со всеми его возможностями можно на <a href="http://www.xdebug.org/" target="_blank">официальном сайте</a>.</p>
<p><strong>Установка KCachegrind под Windows</strong></p>
<p>Открываем любую страницу вашего сайта и в каталоге xdebug.profiler_output_dir появляется файл отчета. Открывать его в Блокноте или другом средстве просмотра текстовых файлов нет никакого смысла. Его формат невозможно воспринять в текстовом виде. Для просмотра файла отчета понадобится средство <a href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi" target="_blank">KCachegrind</a>, которое требует наличия KDE для запуска.</p>
<p>Есть, правда, еще <a href="http://sourceforge.net/projects/wincachegrind" target="_blank">WinCachegrind</a>, но эта программулина глючная, слабенькая и с 2005 года не обновляется. Мой файл отчета она прочитать не смогла (parse error).</p>
<p>Итак, приступаем к установке KCachegrind под Windows. Благо, она абсолютно простая.</p>
<ol>
<li>Зайдите на <a href="http://www.winkde.org/pub/kde/ports/win32/installer/" target="_blank">www.winkde.org/pub/kde/ports/win32/installer/</a> и скачайте самую последнюю версию установщика.</li>
<li>Запустите установщик (есть <a href="http://www.winkde.org/pub/kde/ports/win32/installer/manual/" target="_blank">картинки</a> процесса установки), выберите каталог установки (например в C:\KDE), скачайте то, что вам нужно (я выбрал все пакеты — это около 230 Мб).</li>
<li>Добавьте переменную окружения KDEDIRS (<em>Пуск &gt; Панель управления &gt; Система &gt; Дополнительно &gt; Переменные среды</em>, нажмите &#8220;Создать&#8221; в разделе Пользовательские переменные и создайте переменную с именем KDEDIRS и значением равным папке, в которую Вы установили KDE4, напр. C:\KDE).</li>
<li>Добавьте папку библиотек, %KDEDIRS%\lib, и папку исполняемых файлов, %KDEDIRS%\bin, к переменной %PATH% Windows. (<em>Пуск &gt; Панель управления &gt; Система &gt; Дополнительно &gt; Переменные среды</em>, дважды щелкните на системной переменной Path и добавьте эти строки, разделяя их точкой с запятой.)</li>
<li>Если у Вас не установлена Visual Studio 2005 (или 2008), то скачайте и установите &#8220;<a href="http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&amp;displaylang=en" target="_blank">Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)</a>&#8220;.</li>
<li>Попробуйте запустить какое-нибудь Qt приложение в папке bin, например linguist.exe.</li>
<li>Если получилось, попробуйте запустить любое приложение KDE, такое как kwrite.exe.</li>
</ol>
<p><a href="http://techbase.kde.org/Projects/KDE_on_Windows/Installation_(ru)#.D0.9D.D0.B5.D0.BE.D0.B1.D1.85.D0.BE.D0.B4.D0.B8.D0.BC.D1.8B.D0.B5_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D1.8B" target="_blank">Дополнительная информация</a> по установке.</p>
<p>На этом установка закончена. Вы можете запустить  KCachegrind (c:\KDE\bin\kcachegrind.exe) и скормить ей файл вашего отчета профайлера.</p>
<p>Дополнительную информацию по профилированию PHP-кода можете почитать на <a href="http://devzone.zend.com/article/2899-Profiling-PHP-Applications-With-xdebug" target="_blank">сайте Zend&#8217;а</a>, а я планирую написать еще статейку на эту тему, может даже завтра.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.10.22~php-profiling-under-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Любые символы в именах переменных в PHP</title>
		<link>http://valera.ws/2008.10.21~lyubye-simvoly-v-imenax-peremennyx-v-php/</link>
		<comments>http://valera.ws/2008.10.21~lyubye-simvoly-v-imenax-peremennyx-v-php/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 10:33:38 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=148</guid>
		<description><![CDATA[Хотите использовать в именах переменных PHP любые символы?
Следующий пример абсолютно работоспособен:
&#60;?php
$name = &#8216;что угодно &#8211; 1 + 44.4&#8242;;
$$name  = &#8216;ДА!&#8217;;
echo $$name;
]]></description>
			<content:encoded><![CDATA[<p>Хотите использовать в именах переменных PHP любые символы?</p>
<p><span id="more-148"></span>Следующий пример абсолютно работоспособен:</p>
<p>&lt;?php</p>
<p>$name = &#8216;что угодно &#8211; 1 + 44.4&#8242;;</p>
<p>$$name  = &#8216;ДА!&#8217;;</p>
<p>echo $$name;</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.10.21~lyubye-simvoly-v-imenax-peremennyx-v-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Smarty 3</title>
		<link>http://valera.ws/2008.10.21~smarty-3/</link>
		<comments>http://valera.ws/2008.10.21~smarty-3/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 07:17:58 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=144</guid>
		<description><![CDATA[




Оказывается, шаблонизатор для PHP-сайтов Smarty еще жив! 17 октября на сайте появилась новость о том, что доступен альфа-релиз 3-й версии со значительными изменениями, который не совместим с версией 2.
Так как самомуписать обзор изменений лень, приведу выжимку из обсуждения темы на habrahabr&#8217;e.
Интерфейс шаблонизатора особо не изменился. Это всё те же display(), fetch() и assign(), которые покрывают [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl class="wp-caption alignleft" style="width: 260px;">
<dt class="wp-caption-dt"><img style="margin-top: 5px; margin-bottom: 5px;" title="Smarty 3" src="http://smarty.net/gifs/smarty-logo-orange.gif" alt="" width="250" height="64" /></dt>
</dl>
</div>
<p>Оказывается, шаблонизатор для PHP-сайтов <a href="http://smarty.net/" target="_blank">Smarty</a> еще жив! 17 октября на сайте появилась новость о том, что доступен альфа-релиз 3-й версии со значительными изменениями, который не совместим с версией 2.</p>
<p><span id="more-144"></span>Так как самомуписать обзор изменений лень, приведу выжимку из обсуждения темы на <a href="http://habrahabr.ru/blogs/php/42810/" target="_blank">habrahabr&#8217;e</a>.</p>
<p>Интерфейс шаблонизатора особо не изменился. Это всё те же display(), fetch() и assign(), которые покрывают процентов 99 всех потребностей. Исчез метод assign_by_ref().</p>
<p>Внутренности же претерпели более существенные изменения:</p>
<ul>
<li>Отказ от поддержки PHP4 и полное использование объектно-ориентированных возможностей PHP5. То есть в шаблонах можно использовать разыменования объектов без костылей;</li>
<li>Объектно-ориентированный подход затронул и плагины: теперь каждый плагин является классом, отнаследованным от Smarty_Internal_PluginBase</li>
<li>Файл основного класса — Smarty.class.php — стал подозрительно маленьким: всего 11 кб, включая здоровенные спойлеры лицензии LGPL ;)</li>
<li>Все требуемые элементы, исключённые из ядра, подгружаются лишь по мере необходимости (lazy loading)</li>
<li>Маленькая приятность — встроенная реализация паттерна singleton.</li>
<li>Поддержка нативных PHP-шаблонов.</li>
</ul>
<p>Надо сказать, что по сравению с веткой 2.x, дистрибутив значительно потолстел: папка libs, экспортированная из SVN, заняла немногим менее 800 кб, в то время как в версии 2.6.20 её вес был был порядка 320 кб.</p>
<p>Подробности о релизе — в официальном <a href="http://smarty-php.googlecode.com/svn/branches/Smarty3Alpha/README" target="_blank">README</a>.</p>
<p>Желающие могут вытащить версию из SVN:<br />
svn checkout <a href="http://smarty-php.googlecode.com/svn/branches/Smarty3Alpha/" target="_blank">smarty-php.googlecode.com/svn/branches/Smarty3Alpha/</a></p>
<p>Вот тут <a href="http://groups.google.com/group/smarty-developers/browse_thread/thread/c29ae569842882cd" target="_blank">groups.google.com/group/smarty-developers/browse_thread/thread/c29ae569842882cd</a> немного про синтаксис:</p>
<p>PHP: &lt;?= $foo ?&gt;<br />
Smarty: {$foo} // same as Smarty 2</p>
<p>PHP: &lt;?= $foo['bar'] ?&gt;<br />
Smarty: {$foo['bar']} // no more {$foo.bar}</p>
<p>PHP: &lt;?= $foo[$bar][$foo['bar']] ?&gt;<br />
Smarty: {$foo[$bar][$foo['bar']] ?&gt; // identical to PHP</p>
<p>PHP: &lt;?php foreach($foo as $bar) {… } ?&gt;<br />
Smarty: {foreach $foo as $bar}… {/foreach} // just a delimiter<br />
adjustment</p>
<p>PHP: &lt;?php for($x = 0; $x&lt;$y; $x++) {… } ?&gt;<br />
Smarty: {for $x=0; $x&lt;$y; $x++}… {/for} // get rid of {section}</p>
<p>PHP: &lt;?php if($foo == $bar &amp;&amp; $blah !== &#8216;ziggy&#8217;) {… } ?&gt;<br />
Smarty: {if $foo == $bar &amp;&amp; $blah !== &#8216;ziggy&#8217;}… {/if}</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.10.21~smarty-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
