<?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>Блог vredin-а</title>
	<atom:link href="http://vredin.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://vredin.ru</link>
	<description>Блог о жизни и работе</description>
	<lastBuildDate>Mon, 19 Dec 2011 09:59:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Эффективность автоматизации тестирования</title>
		<link>http://vredin.ru/qa/effektivnost-avtomatizacii-testirovaniya</link>
		<comments>http://vredin.ru/qa/effektivnost-avtomatizacii-testirovaniya#comments</comments>
		<pubDate>Mon, 19 Dec 2011 09:59:24 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Тестирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=225</guid>
		<description><![CDATA[Сегодня я буду рассуждать на тему эффективности автоматизации продукта причем в отрыве от инструментов и процессов и лишь немного затронув области, в которых она действительно необходима. Исторически сложилось, что автоматизацию часто рассматривают в сравнении с ручным тестированием, и потому, если &#8230; <a href="http://vredin.ru/qa/effektivnost-avtomatizacii-testirovaniya">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Сегодня я буду рассуждать на тему эффективности автоматизации продукта причем в отрыве от инструментов и процессов и лишь немного затронув области, в которых она действительно необходима. </p>
<p>Исторически сложилось, что автоматизацию часто рассматривают в сравнении с ручным тестированием, и потому, если у вас нет специфических задач, которые могут быть решены только с помощью автоматизации &#8211; сравнение имеет смысл.</p>
<p>Итак, автоматизацию в общей случае имеет смысл реализовывать если соблюдается условие:</p>
<p><strong>TAcr/N + TAerrval + TAupd < TMval* N</strong>,<br />
где<br />
N &#8211; количество выполнений в течении одной итерации;<br />
TAcr &#8211; время на создание автоматического теста;<br />
TAerrval &#8211; среднее время на понимание причины &#8220;падения&#8221; авто-теста;<br />
TAupd &#8211; среднее время на апдейт авто-теста;<br />
TMval &#8211; среднее время ручной проверки.</p>
<p>Таким образом, мы получаем следующий вывод: чем чаще авто-тесты выполняются и чем меньше время на создание, апдейт и анализ результатов выполнения тем более эффективна автоматизация.<br />
Более того, если добавить коэффициент приоритета области продукта и убрать сравнение с ручным тестированием, можно получить формулу вычисления эффективности автоматизации разных областей одного и того же продукта.</p>
<p>Теперь становиться гораздо наглядней следующие моменты:
<ul>
<li>почему не выгодно автоматизировать функционал, который нужно проверить всего несколько раз;</li>
<li>почему выгодно автоматизировать регрессию;</li>
<li>почему тестирование API всегда более выгодно автоматизировать; </li>
<li>почему очень важно иметь высокий уровень абстракции в инструменте автоматизации;</li>
<li>почему так важно иметь иметь качественное логгирование результатов выполнения авто-тестов</li>
</ul>
<p>Уменьшить время проверки можно эффективной схемой анализа результатов и дизайна авто-скриптов.<br />
Ответы на следующие вопрос должны быть получены как можно ранее:
<ul>
<li>К какому функционалу каждая из ошибок принадлежит?</li>
<li>Какие действия выполнял скрипт в момент появления ошибки?</li>
<li>В каком состоянии было приложение и какими были динамические данные в момент выполнения авто-теста?</li>
</ul>
<p>Время на создание и апдейт авто-скриптов может быть уменьшено использованием DRY принципов и техниками уменьшения зависимостей от приложения, т.е. увеличением уровня абстракции и вынесением общего функционала в компоненты.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/qa/effektivnost-avtomatizacii-testirovaniya/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как не нужно делать блоговые клиенты</title>
		<link>http://vredin.ru/general/kak-ne-nuzhno-delat-blogovye-klienty</link>
		<comments>http://vredin.ru/general/kak-ne-nuzhno-delat-blogovye-klienty#comments</comments>
		<pubDate>Mon, 19 Dec 2011 08:22:07 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[вебмастеринг]]></category>
		<category><![CDATA[кросспостинг]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=221</guid>
		<description><![CDATA[Под блоговым клиентом я рассматриваю программу/скрипт, позволяющий делать постинг в определенный блог. Так получилось, что стандартные интерфейс Вордпрес-а мне не подходит в основном из-за скорости работы и большого количества движений мышью. Хотелось нечто, что оперирует в основном с конфигами и &#8230; <a href="http://vredin.ru/general/kak-ne-nuzhno-delat-blogovye-klienty">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Под блоговым клиентом я рассматриваю программу/скрипт, позволяющий делать постинг в определенный блог.<br />
Так получилось, что стандартные интерфейс Вордпрес-а мне не подходит в основном из-за скорости работы и большого количества движений мышью. Хотелось нечто, что оперирует в основном с конфигами и клавиатурой в связи с чем и был заказан постер со следующим функционалом: в папку ложатся изображения и текстовой файл в определенной разметке, скрипт заливает изображения в папку сайта, делает операции с ними, формирует код поста а из текстового файла берется информация для тайтла, категория и т.д. </p>
<p>Все бы хорошо, но я одобрил добавление записей напрямую в базу и это, как оказалось, не самая удачная идея. Все дело в том, что Вордпресс имеет много функционала, завязанного на событие &#8220;Опубликовать пост&#8221; &#8211; это и пинги и генерация sitemap и работа плагинов и т.д. А когда новые записи ложатся напрямую в базу &#8211; триггеры просто не срабатывают. </p>
<p>По этой же причине невозможно работать с плагинами кросспостинга в другие сервисы &#8211; движок просто не знает, что новые записи появляются. Как выход &#8211; необходимо переписать скрипт для публикации через электронную почту, либо через XML-RPC..</p>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/general/kak-ne-nuzhno-delat-blogovye-klienty/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Настройки IpTv через Wi-Fi. Odessa.tv</title>
		<link>http://vredin.ru/general/nastrojki-iptv-cherez-wi-fi-odessa-tv</link>
		<comments>http://vredin.ru/general/nastrojki-iptv-cherez-wi-fi-odessa-tv#comments</comments>
		<pubDate>Thu, 15 Dec 2011 19:28:06 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Администрирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=218</guid>
		<description><![CDATA[Рассказываю себе на будущее настройки для просмотра IpTv через WiFi для Asus WL-500P. Как известно, Iptv передается по протоколу UDP, который валит вай-фай намертво. У меня прошивка &#8220;от Олега&#8221; &#8211; в нем встроен прокси UDP-&#62;TCP. Ip в локальную сеть маршрутизатора &#8230; <a href="http://vredin.ru/general/nastrojki-iptv-cherez-wi-fi-odessa-tv">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Рассказываю себе на будущее настройки для просмотра IpTv через WiFi для Asus WL-500P.<br />
Как известно, Iptv передается по протоколу UDP, который валит вай-фай намертво. У меня прошивка &#8220;от Олега&#8221; &#8211; в нем встроен прокси UDP-&gt;TCP. Ip в локальную сеть маршрутизатора &#8211; 192.168.1.1</p>
<p>1. Зайти в админку рутера и настроить порт UDP 2 TCP (IP Config &#8211; Miscellaneous). Я поставил 7781.<br />
2. В файле IpTvPlayer.m3u (плейлист со списком каналов, которые скачал у провайдера) поменял ссылки так:<br />
было &#8211; <strong>udp://@</strong>225.1.2.16:1234<br />
стало &#8211; http://192.168.1.1:7781/udp/225.1.2.16:1234<br />
3. Заново загрузил список каналов в плеер &#8211; наслаждаюсь.</p>
<p>К сожалению, в HD качестве каналы до сих не отображаются <img src='http://vredin.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  не помогает ни увеличение кеширования ни прочие ухищрения. Буду думать дальше чо делать</p>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/general/nastrojki-iptv-cherez-wi-fi-odessa-tv/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание и восстановление бекапа mysql бд</title>
		<link>http://vredin.ru/general/sozdanie-i-vosstanovlenie-bekapa-mysql-bd</link>
		<comments>http://vredin.ru/general/sozdanie-i-vosstanovlenie-bekapa-mysql-bd#comments</comments>
		<pubDate>Fri, 02 Dec 2011 11:44:36 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Администрирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=216</guid>
		<description><![CDATA[Взял отсюда Итак, работаем с командной строкой. Экспорт базы данных в файл: mysqldump -uUSER -pPASSWORD DATABASE_NAME &#62; FILE_TO_SAVE_INTO, где USER &#8211; имя пользователя базы данных, PASSWORD &#8211; пароль, DATABASE_NAME &#8211; имя базы данных, FILE_TO_SAVE_INTO &#8211; файл на диске, в который &#8230; <a href="http://vredin.ru/general/sozdanie-i-vosstanovlenie-bekapa-mysql-bd">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Взял <a href="http://cloud-cuckoo.com.ua/content/kak-sdelat-damp-bazy-dannykh-mysql-eksportimport-sozdanie-zip-arkhivov-na-khostinge-po-ssh" rel="nofollow">отсюда</a></p>
<blockquote><p>Итак, работаем с командной строкой.</p>
<p>Экспорт базы данных в файл:<br />
<strong>mysqldump -uUSER -pPASSWORD DATABASE_NAME &gt; FILE_TO_SAVE_INTO,</strong></p>
<p>где USER &#8211; имя пользователя базы данных, PASSWORD &#8211; пароль, DATABASE_NAME &#8211; имя базы данных, FILE_TO_SAVE_INTO &#8211; файл на диске, в который сливается дамп.</p>
<p>После этого файл может быть скачан по фтп на локальный диск, либо в другое место, предназначенное для бекапа.</p>
<p>Импорт базы данных &#8211; обратная операция.<br />
<strong>mysql -uUSER -pPASSWORD DATABASE_NAME &lt; FILE_TO_RESTORE_FROM</strong></p>
<p>параметры аналогичны предыдущему примеру с экспортом.</p>
<p>Теперь что касается архивов.<br />
Нам понадобятся две операции &#8211; создание ZIP архива и его распаковка. Зачем нужны архивы? Представим, что сайт состоит из 5000 файлов. По фтп загружать его крайне неудобно и долго, один файл копируется в Х раз быстрее.</p>
<p>Создание ZIP архива:<br />
<strong> zip -r ARCHIVE_NAME *</strong></p>
<p>-r означает рекурсивно добавить все, что есть в данной папке в архив с названием ARCHIVE_NAME, где * &#8211; все что есть в текущей папке и ее подпапках.</p>
<p>Распаковка ZIP архива:<br />
<strong> unzip ARCHIVE_NAME</strong></p>
<p>все вообще крайне тривиально и просто.<br />
Мне эти четыре операции сильно упрощают работу с созданием архивных копий и восстановлением данных.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/general/sozdanie-i-vosstanovlenie-bekapa-mysql-bd/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Рекурсивная функция получения содержимого папки</title>
		<link>http://vredin.ru/programming/rekursivnaya-funkciya-polucheniya-soderzhimogo-papki</link>
		<comments>http://vredin.ru/programming/rekursivnaya-funkciya-polucheniya-soderzhimogo-papki#comments</comments>
		<pubDate>Tue, 29 Nov 2011 21:06:53 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=213</guid>
		<description><![CDATA[Удобная функция получения содержимого всего, что содержится в папке. Применил в своем движке галереи для создания новых галерей, закачанных по FTP. Функцией фильтрации не пользуюсь // ------------ lixlpixel recursive PHP functions ------------- // scan_directory_recursively( directory to scan, filter ) // &#8230; <a href="http://vredin.ru/programming/rekursivnaya-funkciya-polucheniya-soderzhimogo-papki">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Удобная функция получения содержимого всего, что содержится в папке. Применил в своем движке галереи для создания новых галерей, закачанных по FTP. Функцией фильтрации не пользуюсь</p>
<pre class="brush: php">
// ------------ lixlpixel recursive PHP functions -------------
// scan_directory_recursively( directory to scan, filter )
// expects path to directory and optional an extension to filter
// of course PHP has to have the permissions to read the directory
// you specify and all files and folders inside this directory
// ------------------------------------------------------------

// to use this function to get all files and directories in an array, write:
//  = scan_directory_recursively(&#039;path/to/directory&#039;);

// to use this function to scan a directory and filter the results, write:
// $fileselection = scan_directory_recursively(&#039;directory&#039;, &#039;extension&#039;);

function scan_directory_recursively_backup($directory, $filter=FALSE)
{
    // if the path has a slash at the end we remove it here
    if(substr($directory,-1) == &#039;/&#039;)
    {
        $directory = substr($directory,0,-1);
    }

    // if the path is not valid or is not a directory ...
    if(!file_exists($directory) || !is_dir($directory))
    {
        // ... we return false and exit the function
        return FALSE;

    // ... else if the path is readable
    }elseif(is_readable($directory))
    {
        // initialize directory tree variable
        $directory_tree = array();

        // we open the directory
        $directory_list = opendir($directory);

        // and scan through the items inside
        while (FALSE !== ($file = readdir($directory_list)))
        {
            // if the filepointer is not the current directory
            // or the parent directory
            if($file != &#039;.&#039; &amp;&amp; $file != &#039;..&#039;)
            {
                // we build the new path to scan
                $path = $directory.&#039;/&#039;.$file;

                // if the path is readable
                if(is_readable($path))
                {
                    // we split the new path by directories
                    $subdirectories = explode(&#039;/&#039;,$path);

                    // if the new path is a directory
                    if(is_dir($path))
                    {
                        // add the directory details to the file list
                        $directory_tree[] = array(
                            &#039;path&#039;    =&gt; $path,
                            &#039;name&#039;    =&gt; end($subdirectories),
                            &#039;kind&#039;    =&gt; &#039;directory&#039;,

                            // we scan the new path by calling this function
                            &#039;content&#039; =&gt; scan_directory_recursively($path, $filter));

                    // if the new path is a file
                    }elseif(is_file($path))
                    {
                        // get the file extension by taking everything after the last dot
                        $extension = end(explode(&#039;.&#039;,end($subdirectories)));

                        // if there is no filter set or the filter is set and matches
                        if($filter === FALSE || $filter == $extension)
                        {
                            // add the file details to the file list
                            $directory_tree[] = array(
                                &#039;path&#039;      =&gt; $path,
                                &#039;name&#039;      =&gt; end($subdirectories),
                                &#039;extension&#039; =&gt; $extension,
                                &#039;size&#039;      =&gt; filesize($path),
                                &#039;kind&#039;      =&gt; &#039;file&#039;);
                        }
                    }
                }
            }
        }
        // close the directory
        closedir($directory_list);

        // return file list
        return $directory_tree;

    // if the path is not readable ...
    }
    else {
        // ... we return false
        return FALSE;
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/programming/rekursivnaya-funkciya-polucheniya-soderzhimogo-papki/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP, полезные ссылки</title>
		<link>http://vredin.ru/programming/php-poleznye-ssylki</link>
		<comments>http://vredin.ru/programming/php-poleznye-ssylki#comments</comments>
		<pubDate>Thu, 24 Nov 2011 08:53:21 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=209</guid>
		<description><![CDATA[На ресурсах, представленных ниже можно найти множество реализаций тех либо иных функциональностей, DRY так сказать или &#8220;не изобретай велосипед&#8221; http://snipplr.com/all/language/PHP http://www.phpclasses.org/ http://www.codesphp.com/php-category upd: сделал валидную rss ленту и прикрутил кросспостинг в Livejournal.com по расписанию. На очереди &#8211; кросспостинг в tumblr &#8230; <a href="http://vredin.ru/programming/php-poleznye-ssylki">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>На ресурсах, представленных ниже можно найти множество реализаций тех либо иных функциональностей, DRY так сказать или &#8220;не изобретай велосипед&#8221; <img src='http://vredin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li>http://snipplr.com/all/language/PHP</li>
<li>http://www.phpclasses.org/</li>
<li>http://www.codesphp.com/php-category</li>
</ul>
<p>upd: сделал валидную rss ленту и прикрутил кросспостинг в Livejournal.com по расписанию. На очереди &#8211; кросспостинг в tumblr и массовый аплоад галерей с локальной машины.</p>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/programming/php-poleznye-ssylki/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функция генерации валидного RSS</title>
		<link>http://vredin.ru/programming/funkciya-generacii-validnogo-rss</link>
		<comments>http://vredin.ru/programming/funkciya-generacii-validnogo-rss#comments</comments>
		<pubDate>Tue, 22 Nov 2011 19:26:51 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=207</guid>
		<description><![CDATA[Написал функцию, генерирующую полностью валидный rss.xml Константы берутся из конфига сайта. В rss ленту вставляется превью, помимо текста. function rssToFile() { $rssOutput = &#039;&#60; ?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62; &#60;rss version=&#34;2.0&#34; xmlns:content=&#34;http://purl.org/rss/1.0/modules/content/&#34; xmlns:wfw=&#34;http://wellformedweb.org/CommentAPI/&#34; xmlns:dc=&#34;http://purl.org/dc/elements/1.1/&#34; xmlns:atom=&#34;http://www.w3.org/2005/Atom&#34; xmlns:sy=&#34;http://purl.org/rss/1.0/modules/syndication/&#34; xmlns:slash=&#34;http://purl.org/rss/1.0/modules/slash/&#34; &#62; &#60;channel&#62; &#60;title&#62;&#039; . _SiteNameRu_ &#8230; <a href="http://vredin.ru/programming/funkciya-generacii-validnogo-rss">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Написал функцию, генерирующую полностью валидный rss.xml<br />
Константы берутся из конфига сайта. В rss ленту вставляется превью, помимо текста.</p>
<pre class="brush: php">
function rssToFile()
{
        $rssOutput = &#039;&lt; ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
        &lt;rss version=&quot;2.0&quot;
        xmlns:content=&quot;http://purl.org/rss/1.0/modules/content/&quot;
        xmlns:wfw=&quot;http://wellformedweb.org/CommentAPI/&quot;
        xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;
        xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;
        xmlns:sy=&quot;http://purl.org/rss/1.0/modules/syndication/&quot;
        xmlns:slash=&quot;http://purl.org/rss/1.0/modules/slash/&quot;
        &gt;
        &lt;channel&gt;
        &lt;title&gt;&#039; . _SiteNameRu_ . &#039;&lt;/title&gt;
        &lt;atom:link href=&quot;&#039; . _BaseUrl_ . &#039;rss.xml&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot; /&gt;
        &lt;link&gt;&#039;. _BaseUrl_ .&#039;&lt;/link&gt;
        &lt;description&gt;&#039;. _SiteDescription_ .&#039;&lt;/description&gt;
        &lt;copyright&gt;Copyright 2011, &#039;. _SiteName_ .&#039;&lt;/copyright&gt;
        &lt;sy:updateperiod&gt;hourly&lt;/sy:updateperiod&gt;
        &lt;sy:updatefrequency&gt;10&lt;/sy:updatefrequency&gt;&#039;;

        startup();
        $sQuery = &quot;SELECT * FROM `Gallery` WHERE `gallery_status` = &#039;approved&#039; ORDER BY `add_date` DESC LIMIT 10&quot;;
        $ResultSelect = mysql_query($sQuery) or die(mysql_error());

        while ($row = mysql_fetch_array($ResultSelect))
        {
            $id=$row[&#039;gallery_id&#039;];
            $title=$row[&#039;gallery_seo_title&#039;];
            $text=$row[&#039;gallery_seo_description&#039;];
            $description = $text . &quot;&lt;br /&gt;&lt;img src=\&quot;&quot;. _BaseUrl_ . &quot;gallery/thumbs150/&quot; . $id . &quot;/0.jpg\&quot; width=\&quot;150\&quot;/&gt;&lt;br /&gt;&quot;;

            $date=$row[&#039;add_date&#039;];
            date_default_timezone_set(&#039;Europe/Berlin&#039;);
            $date=date(&quot;r&quot;, strtotime($date)); //. &quot; GMT&quot;;

        $rssOutput .= &quot;&lt;item&gt;&lt;title&gt;$title&lt;/title&gt;&quot;;
        $rssOutput .= &quot;&lt;description&gt;&lt; ![CDATA[&quot;. $description. &quot;]]&gt;&lt;/description&gt;
                &lt;guid&gt;&quot; . _BaseUrl_ . &quot;gallery/&quot; . $id . &quot;&lt;/guid&gt;
                &lt;pubdate&gt;$date&lt;/pubdate&gt;
                &lt;/item&gt;&quot;;
        }
    $rssOutput .= &#039;&lt;/channel&gt;&lt;/rss&gt;&#039;;
    mysql_close();

    $fp=fopen(&#039;rss.xml&#039;, &#039;w+&#039;);

    if (!$fp) { echo &quot;unable to open rss.xml&quot;; }
    else
    {
        fwrite($fp, $rssOutput);
        fclose($fp);
    }

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/programming/funkciya-generacii-validnogo-rss/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа в PHP с phpthumbs</title>
		<link>http://vredin.ru/programming/rabota-v-php-s-phpthumbs</link>
		<comments>http://vredin.ru/programming/rabota-v-php-s-phpthumbs#comments</comments>
		<pubDate>Tue, 22 Nov 2011 10:12:37 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=205</guid>
		<description><![CDATA[Библиотека phpthumbs предлагает работать с ресайзом изображений на лету, при этом кешируя созданные превью. Но это не мой случай &#8211; я хотел хранить все превью статически в файловой системе. Ниже &#8211; функция работы с данной библиотекой. Нужно не забыть распаковать &#8230; <a href="http://vredin.ru/programming/rabota-v-php-s-phpthumbs">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Библиотека phpthumbs предлагает работать с ресайзом изображений на лету, при этом кешируя созданные превью. Но это не мой случай &#8211; я хотел хранить все превью статически в файловой системе.<br />
Ниже &#8211; функция работы с данной библиотекой. Нужно не забыть распаковать и подключить библиотеку.<br />
На вход функции приходит тип ресайза, полный путь к изображению, и путь куда будет сохранена превьюшка.</p>
<pre class="brush: php">
function ImageResize2($type, $sFullSizeFile, $FileOutput)
{
    require_once(&#039;phpThumbs/phpthumb.class.php&#039;);
    $phpThumb = new phpThumb();

    $file = $sFullSizeFile;
    $phpThumb-&gt;setSourceFilename($file); 

    if($type == 0)
    {
        $phpThumb-&gt;setParameter(&#039;w&#039;, 150); // по ширине 150 пикселей
        $phpThumb-&gt;setParameter(&#039;zc&#039;, 1);  // делаем кроп по центру
    }

    if($type == 1)
    {
        $phpThumb-&gt;setParameter(&#039;w&#039;, 300);
    }

    if($type == 2)
    {
        $phpThumb-&gt;setParameter(&#039;w&#039;, 800); // по ширине 800 пикселей
        $phpThumb-&gt;setParameter(&#039;aoe&#039;, 0); // только уменьшаем!
    }    

    $outputFilename = $FileOutput;

    if ($phpThumb-&gt;GenerateThumbnail())
    {
        if ($phpThumb-&gt;RenderToFile($outputFilename))
        {
            // echo &#039;Success&lt;br /&gt;&#039;;
        }
        else
        {
            // echo &#039;RenderToFile: failed&lt;br /&gt;&#039;;
        }
    }
    else
    {
        // echo &#039;GenerateThumbnail: failed&lt;br /&gt;&#039;;
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/programming/rabota-v-php-s-phpthumbs/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: Функция рекурсивного удаления директории</title>
		<link>http://vredin.ru/general/php-funkciya-rekursivnogo-udaleniya-direktorii</link>
		<comments>http://vredin.ru/general/php-funkciya-rekursivnogo-udaleniya-direktorii#comments</comments>
		<pubDate>Tue, 22 Nov 2011 10:02:17 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=201</guid>
		<description><![CDATA[Как аргумент передается полный путь к директории, к примеру &#8220;/var/www/site.ru/temp&#8221; function deleteDirectory($dir) { if (!file_exists($dir)) return true; if (!is_dir($dir) &#124;&#124; is_link($dir)) return unlink($dir); foreach (scandir($dir) as $item) { if ($item == &#039;.&#039; &#124;&#124; $item == &#039;..&#039;) continue; if (!deleteDirectory($dir . &#8230; <a href="http://vredin.ru/general/php-funkciya-rekursivnogo-udaleniya-direktorii">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Как аргумент передается полный путь к директории, к примеру &#8220;/var/www/site.ru/temp&#8221;</p>
<pre class="brush: php">
function deleteDirectory($dir)
{
    if (!file_exists($dir)) return true;
     if (!is_dir($dir) || is_link($dir)) return unlink($dir);
        foreach (scandir($dir) as $item) {
            if ($item == &#039;.&#039; || $item == &#039;..&#039;) continue;
            if (!deleteDirectory($dir . &quot;/&quot; . $item)) {
                chmod($dir . &quot;/&quot; . $item, 0777);
                if (!deleteDirectory($dir . &quot;/&quot; . $item)) return false;
            };
        }
    return rmdir($dir);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/general/php-funkciya-rekursivnogo-udaleniya-direktorii/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: Функция получения страницы сайта</title>
		<link>http://vredin.ru/programming/funkciya-polucheniya-stranicy-sajta</link>
		<comments>http://vredin.ru/programming/funkciya-polucheniya-stranicy-sajta#comments</comments>
		<pubDate>Tue, 22 Nov 2011 09:59:18 +0000</pubDate>
		<dc:creator>vredin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vredin.ru/?p=199</guid>
		<description><![CDATA[Функция, использующая curl, которой я постоянно пользуюсь для парсинга страниц. К ней была написано небольшое дополнение, которое передает главную страницу копируемого сайта в качестве реферрера function get_host($s) { $s = preg_replace(&#039;#^http://#Uis&#039;, &#039;&#039;, trim($s)); $s = explode(&#039;/&#039;, trim($s)); $s = trim($s[0]); &#8230; <a href="http://vredin.ru/programming/funkciya-polucheniya-stranicy-sajta">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Функция, использующая curl, которой я постоянно пользуюсь для парсинга страниц. К ней была написано небольшое дополнение, которое передает главную страницу копируемого сайта в качестве реферрера <img src='http://vredin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: php">
function get_host($s)
{
    $s = preg_replace(&#039;#^http://#Uis&#039;, &#039;&#039;, trim($s));
    $s = explode(&#039;/&#039;, trim($s));
    $s = trim($s[0]);
    $s = explode(&#039;:&#039;, $s);
    $s = trim($s[0]);
    return $s;
}

function get_web_page( $url )
{
    $uagent = &quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)&quot;;
    $sRefferal = &#039;http://&#039; . get_host($url);
    $ch = curl_init( $url );
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // возвращает веб-страницу

    curl_setopt($ch, CURLOPT_REFERER, $sRefferal);

    curl_setopt($ch, CURLOPT_HEADER, 0);           // не возвращает заголовки
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
    curl_setopt($ch, CURLOPT_ENCODING, &quot;&quot;);        // обрабатывает все кодировки
    curl_setopt($ch, CURLOPT_USERAGENT, $uagent);  // useragent
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
    curl_setopt($ch, CURLOPT_TIMEOUT, 120);        // таймаут ответа
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа

    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header[&#039;errno&#039;]   = $err;
    $header[&#039;errmsg&#039;]  = $errmsg;
    $header[&#039;content&#039;] = $content;
    return $header;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://vredin.ru/programming/funkciya-polucheniya-stranicy-sajta/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

