<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Nopox&#039;s Weblog</title>
	<atom:link href="http://nopox.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://nopox.wordpress.com</link>
	<description>о программировании, жизни и вообще</description>
	<lastBuildDate>Tue, 11 Oct 2011 04:07:26 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='nopox.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Nopox&#039;s Weblog</title>
		<link>http://nopox.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://nopox.wordpress.com/osd.xml" title="Nopox&#039;s Weblog" />
	<atom:link rel='hub' href='http://nopox.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Опять многопоточность, но теперь в PERL (часть 3-я и последняя)</title>
		<link>http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-3-and-last/</link>
		<comments>http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-3-and-last/#comments</comments>
		<pubDate>Tue, 06 Nov 2007 23:52:15 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Обо всём]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[многопоточность]]></category>
		<category><![CDATA[потоки]]></category>
		<category><![CDATA[multithread]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-3-and-last/</guid>
		<description><![CDATA[Этой статьёй я планирую завершить тему многопоточности в Perl, ибо она меня уже порядком устала . Кстати, предыдущие статьи ни в коем случае не претендуют на полный и подробный мануал, вовсе нет. Это скорее HOWTO, дающее, однако возможность подумать и &#8230; <a href="http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-3-and-last/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=18&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Этой статьёй я планирую завершить тему многопоточности в Perl, ибо она меня уже порядком устала <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Кстати, предыдущие статьи ни в коем случае не претендуют на полный и подробный мануал, вовсе нет. Это скорее HOWTO, дающее, однако возможность подумать и понять сущность процесса (как мне кажется).</p>
<p>Итак, на повестке дня — <span id="more-18"></span><br />
Частенько смысл множества потоков состоит в работе над одной большой (или необязательно большой) базой. Возникает резонный вопрос: а как обмениваться информацией между нитями?</p>
<p>Оказывается, очень просто. Достаточно всего лишь подключить специальный модуль <code>threads::shared</code>, и для массивов и скалярных переменных, не являющихся ссылками и объектами, можно указывать модификатор <code>shared</code>, показывающи интерпретатору, что переменная доступна всем тредам. </p>
<p>Как всегда пример:</p>
<pre><code>#!/usr/bin/perl -w

use threads;
use threads::shared;

# Объявляем переменную общей для всех нитей с
# помощью модификатора shared
my $i : shared = 1;

# Альтернативный способ - использование функции share
my $j = 0;
share $j;

threads-&gt;new(\&amp;my_sub)-&gt;join();
threads-&gt;new(\&amp;my_sub)-&gt;join();
threads-&gt;new(\&amp;my_sub)-&gt;join();

sub my_sub()
{
    print "Это вызов #$i. Переменная \$j = $j\n";
    $j++;
    $i++;
}</code></pre>
<p>Результат такого скрипта в консоли выглядит примерно так:</p>
<pre><code>% perl threads.pl
Это вызов #1. Переменная $j = 0
Это вызов #2. Переменная $j = 1
Это вызов #3. Переменная $j = 2</code></pre>
<p>Вроде бы всё понятно и просто и пора уже с многопоточностью заканчивать. В качестве прощания мы с вами напишем скрипт, который будет выдирать прокси с первых пяти страниц небезызвестного ресурса <a href="http://proxylist.sakura.ne.jp/">MPR Proxylist</a> (разумеется, каждая страница отдельным потоком <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). В качестве HTTP-клиента используется библиотека LWP, которая обычно установлена (если не установлена, то пользователи FreeBSD могут устанавливать порт <a href="http://www.freebsd.org/cgi/url.cgi?ports/www/p5-libwww/pkg-descr">www/p5-libwww</a>, а линуксоидам ничем помочь не могу <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ):</p>
<pre><code>
#!/usr/bin/perl -w

use LWP::UserAgent;
use threads;
use threads::shared;

# В этом массиве будут храниться найденные прокси
my @proxies : shared;

# Массив для хранения ссылок на объекты нитей
my @threads;

# Количество страниц (и, разумеется,  нитей <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )
my $threads = 5;

# Создаём $threads нитей, каждая из которых будет
for (my $i = 0; $i &lt; $threads; $i++) {
    threads-&gt;new(\&amp;find_proxy, $i);
}

# Скрипт будет жить до завершения работы всех нитей
foreach my $thread (@threads) {
    $thread-&gt;join();
}

# Записываем найденные прокси в файл
open PROXIES, '&gt;', 'proxylist.txt';

foreach my $proxy (@proxies) {
    print PROXIES $proxy, "\n";
}

close PROXIES;

# Создание HTTP-клиента на основе LWP (при кажом создании
# у клиента будет разные User-Agent
sub http_factory()
{
    my @agents = ('Mozilla 5.0/Firefox',
                  'Opera 9.02',
                  'Interner Explorer 7',
                  'Safari 3.0/Gecko 31337',
                  'Lynx/FreeBSD 6.0');
    my $client = LWP::UserAgent-&gt;new('agent' =&gt; $agents[rand($#agents)]);
    return $client;
}

# Процедура соединения с донором и парсинг прокси
sub find_proxy
{
    my $page = shift;
    my $url = sprintf('http://proxylist.sakura.ne.jp/index.htm?pages=%s', $page);
    my $client = &amp;http_factory();
    my $response = $client-&gt;get($url) or warn "Can't connect $url: $@\n";

    if ($response-&gt;is_success() &amp;&amp; $response-&gt;content_type() eq 'text/html') {
        my $content = $response-&gt;content();

        while ($content =~ m!
<td>(.*?)</td>

\s*?
<td>([a-z]{2})</td>

!sgi) {
            my $proxy = $1;
            my $country = $2;
            push @proxies, $proxy;
            print "Found $proxy [$country], saving it\n";
        }
    }

    else {
        print "fuck! $@\n";
    }
}</code></pre>
<p>В общем, вроде всё, балуйтесь, детишки. И не забывайте, что это только пример, демонстрирующий мощность многопоточных приложений на Perl <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Удачного дня <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=18&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-3-and-last/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
		<item>
		<title>Опять многопоточность, но теперь в PERL (часть 2-я)</title>
		<link>http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-2/</link>
		<comments>http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-2/#comments</comments>
		<pubDate>Tue, 06 Nov 2007 22:39:32 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Обо всём]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[многопоточность]]></category>
		<category><![CDATA[потоки]]></category>
		<category><![CDATA[multithread]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-2/</guid>
		<description><![CDATA[Преамбула Вот уже целый месяц нет ничего новенького про всеми любимую многопоточность (впрочем, не только про неё). Придётся срочно исправляться. Итак, поле для манёвров готово, можно продолжать наши игры. Про терминологию напоминать не буду, просто сошлюсь на пост месячной давности, &#8230; <a href="http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-2/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=17&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Преамбула</h2>
<p>Вот уже целый месяц нет ничего новенького про всеми любимую многопоточность (впрочем, не только про неё). Придётся срочно исправляться.</p>
<p>Итак, поле для манёвров готово, можно продолжать наши игры. Про терминологию напоминать не буду, просто сошлюсь на <a href="http://nopox.wordpress.com/2007/10/06/multithreading-in-perl/#more-16">пост месячной давности</a>, в котором упомянул про threads и forks. Впредь предлагаю к этой теме не возвращаться <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<h2>С места в карьер</h2>
<p>Теперь собственно о том, как программировать разделение на нити. Начну сразу с примера:<br />
<span id="more-17"></span></p>
<pre><code>#!/usr/bin/perl -w
use threads;

# Создаем три параллельных нити
threads-&gt;new(\&amp;get_now, 'number one');
threads-&gt;new(\&amp;get_now, 'number two');
threads-&gt;new(\&amp;get_now, 'number three');

sub get_now
{
    my $arg = shift;
    print "Thread ", $arg, ": time = ", time(), "\n";
    sleep 1;
}
</code></pre>
<p>Пробежимся по коду:</p>
<ol>
<li>Директива <code>use threads</code> подключает объектно-ориентированную обёртку для работы с <em>нитями</em> (далее будем использовать это слово) приложения. В общем, с этим всё ясно.</li>
<li>Далее идёт собственно деление основной программы на потоки. В нашем примере создаётся 3 нитки, в каждой из которых мы вызываем процедуру <code>get_now()</code>, которая, как Вы догадались, выводит некоторую строку, текущий UNIX TIMESTAMP и ложится спать на 1 секунду.</li>
</ol>
<p>Запустив код, Вы увидите примерно следующее:<br />
<code>%perl threads.pl<br />
Thread number one: time = 1194392538<br />
Thread number two: time = 1194392538<br />
A thread exited while 4 threads were running.</code></p>
<p>Как видите, таймштампы одинаковые, из чего можно заключить, что вторая нить запустилась, не дожидаясь окончания работы первой, которая, в свою очередь, &laquo;засыпает&raquo; на одну секунду (собственно, sleep в get_now() был поставлен именно для того, чтобы нить выполнялась некоторое ощутимое время). Однако у нас не всё благополучно: вместо выхода третьей ветки появилось какое-то странное сообщение. Его природу рассмотрим чуть ниже, а пока порадуемся полчаса: многопоточность работает <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<h2>О начальниках и подчинённых</h2>
<p>Над среднестатистическим работником обязательно есть начальник, который с этого самого работника должен спрашивать, чего же этот самый работник сделал полезного. Некоторые начальники ревностно и с удовольствием выполняют свои почётные обязанности; некоторые, более лояльные, норовят поскорее выдать подчинённым задания и смотаться с работы куда-нибудь в казино<s> с блек-джеком и шлюхами</s>, а всякого рода отчёты оставляют на потом (в этом случае, кстати, предприятие может влетать <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p>Многопоточность в Perl имеет схожую идеологию. Основное тело программы считается начальником, а порождаемые им нитки, соответственно — рабочими, выполняющими те или иные задачи. Поведение начальника можно задавать самим: это может быть как деспот и тиран, держащий в ежовых рукавицах подчинённых и уходящий с работы не раньше того, как все подчинённые завершат работу, так и раздолбай, убегающий с работы сразу же после того, как выдаст задания подчинённым. Но такое отношение к работе, опять же, может иметь некоторые последствия <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p>Теперь вернёмся к сообщению об ошибке из предыдущего раздела:</p>
<pre><code>A thread exited while 4 threads were running.</code></pre>
<p>Это сообщение как раз и означает, что основная программа завершилась раньше, чем отработали все нити (начальник после раздачи заданий спешно покинул работу). Можно показать это на примере, внеся небольшие коррективы в код примера:</p>
<pre><code>#!/usr/bin/perl -w
use threads;

# Создаем три параллельных нити
threads-&gt;new(\&amp;get_now, 'number one');
threads-&gt;new(\&amp;get_now, 'number two');
threads-&gt;new(\&amp;get_now, 'number three');

sleep 2;
print "Патрон ушёл домой\n";

sub get_now
{
    my $arg = shift;
    print "Thread ", $arg, ": time = ", time(), "\n";
    sleep 1;
}
</code></pre>
<p>Теперь результат работы скрипта будет таким:</p>
<pre><code>%perl threads.pl
Thread number one: time = 1194394574
Thread number two: time = 1194394574
Thread number three: time = 1194394574
Патрон ушёл домой
</code></pre>
<p>В этом случае, как видите, основной скрипт засыпает на 2 секунды (время с хорошим запасом, достаточное для того, чтобы все нити успели отработать) и всё заканчивается благополучно. </p>
<p>Из этого всего можно сделать вывод, что Perl по умолчанию ведёт себя ведёт как начальник-халтурщик. Нас это, разумеется, не устраивает, поэтому я продолжаю читать мануал вслух <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Оказывается, наш начальник может быть многоликим, как небезызвестный <s>Анус</s> Янус: строгим или добрее дедушки Ленина. А может вообще к каждому подчинённому относиться по-своему.</p>
<p>Если без метафор, то это означает следующее: при создании потока, можно указать интерпретатору Perl, ожидать ли завершение работы ветки или создать и забыть. Реализация поведения проста: достаточно при создании нити вызвать метод <code>join()</code> для ожидания завершения работы или же <code>dettach()</code> для отказа управления</p>
<p>Сразу приведу примеры: вот так выглядит вызов метода <code>join()</code> каждой нити:</p>
<pre><code>#!/usr/bin/perl -w
use threads;

# Создаем три параллельных нити
threads-&gt;new(\&amp;get_now, 'number one')-&gt;join();
threads-&gt;new(\&amp;get_now, 'number two')-&gt;join();
threads-&gt;new(\&amp;get_now, 'number three')-&gt;join();

sub get_now
{
    my $arg = shift;
    print "Thread ", $arg, ": time = ", time(), "\n";
    sleep 1;
}</code></pre>
<p>Результат обескураживает:</p>
<pre><code>% perl threads.pl
Thread number one: time = 1194395930
Thread number two: time = 1194395931
Thread number three: time = 1194395932</code></pre>
<p>Вдумчивый читатель обязательно задаст вопрос: &laquo;А где же здесь многопоточность?&raquo;. И будет абсолютно прав, потому что в данном примере многопоточности как таковой нет. Но ещё не вечер, читайте далее, наша цель — расставить все точки над &laquo;ё&raquo; <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p>А вот пример вызова <code>dettach()</code> при создании нити:</p>
<pre><code>#!/usr/bin/perl -w
use threads;

# Создаем три параллельных нити
threads-&gt;new(\&amp;get_now, 'number one')-&gt;dettach();
threads-&gt;new(\&amp;get_now, 'number two')-&gt;dettach();
threads-&gt;new(\&amp;get_now, 'number three')-&gt;dettach();

sub get_now
{
    my $arg = shift;
    print "Thread ", $arg, ": time = ", time(), "\n";
    sleep 1;
}</code></pre>
<p>Как это выглядит в консоли:</p>
<pre><code>%perl threads.pl
Thread number one: time = 1194396131
A thread exited while 2 threads were running.
</code></pre>
<p>В общем, как и ожидалось, основная программа отработала раньше нитей.</p>
<p>Как видите, ни один из вариантов нас не устраивает. Нам, напомню, до дрожи в коленках хочется запустить одновременно несколько нитей и быть уверенными, что они успешно отработают (т.е. родительский процесс не умрёт раньше нитей). Нам нужно что-то среднее&#8230;</p>
<h2>Ход конём</h2>
<p>Решение напрашивается само собой: сначала нужно  создать требуемое количество нитей, а потом, уже после их запуска, у каждой из них вызывать метод <code>join()</code>. Как это реализовать? Ход конём — сохраним объекты нитей в массиве (комментарии будут прямо в коде):</p>
<pre><code>#!/usr/bin/perl -w
use threads;

# В этом массиве будут храниться ссылки на
# созданные нити
my @threads;

# Создаём 3 нити в режиме по прниципу "создал и забыл", тем
# самым позволив открыть  параллельно несколько нитей. Объект
# каждой созданной нити помещается в массив @threads
for my $i (1..3) {
  push @threads, threads-&gt;create(\&amp;get_now, $i);
}

# Нити успешно созданы,  ссылки на объекты помещены в массив
# Теперь мы можем для каждого объекта вызвать метод join(),
# заставляющий интерпретатор ожидать завершение работы треда.

foreach my $thread (@threads) {
    # Обратите внимание, что $thread является не объектом, а ссылкой,
    # поэтому управление ему передано не будет.
    $thread-&gt;join();
}

sub get_now
{
    my $num = shift;
    print "thread ", $num, " =&gt; ", time(), "\n";
    sleep 1;
}
</code></pre>
<p>Вот теперь всё работает так, как и ожидалось.</p>
<pre><code>% perl threads.pl
thread 1 =&gt; 1194388015
thread 2 =&gt; 1194387015
thread 3 =&gt; 1194387015
</code></pre>
<p>Вот теперь, как видите, всё работает как надо <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p><strong>To be continued&#8230;</strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=17&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-2/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
		<item>
		<title>Опять многопоточность, но теперь в PERL (часть 1-я)</title>
		<link>http://nopox.wordpress.com/2007/10/06/multithreading-in-perl/</link>
		<comments>http://nopox.wordpress.com/2007/10/06/multithreading-in-perl/#comments</comments>
		<pubDate>Sat, 06 Oct 2007 01:20:13 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Обо всём]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[многопоточность]]></category>
		<category><![CDATA[http-клиент]]></category>
		<category><![CDATA[multithread]]></category>
		<category><![CDATA[сеть]]></category>

		<guid isPermaLink="false">http://nopox.wordpress.com/2007/10/06/multithreading-in-perl/</guid>
		<description><![CDATA[Про многопоточность в PHP мы уже говорили (напомню, что она работает только с сокетами). Пришло время поговорить о чём-нибудь более серьёзном. Например, о многопоточности в PERL. Однако прежде всего разберемся с терминологией, чтобы потом не возникло путаницы, как это случилось &#8230; <a href="http://nopox.wordpress.com/2007/10/06/multithreading-in-perl/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=16&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Про <a href="http://nopox.wordpress.com/2007/09/19/php-multithread-http-client/">многопоточность в PHP</a> мы уже говорили (напомню, что она работает только с сокетами). Пришло время поговорить о чём-нибудь более серьёзном. Например, о многопоточности в PERL.</p>
<p>Однако прежде всего разберемся с терминологией, чтобы потом не возникло путаницы, как это случилось в комментариях к вышеупомянутой статье. Под <strong>многопоточностью</strong> я буду понимать возможность одновременного выполнения различных операций (сисадмины любят употреблять термин <strong>thread</strong> — <strong>нить</strong>) в рамках <em>одного процесса</em>. Другая возможность параллельно выполнять задачи — расщепление процесса (когда вместо одного процесса будет запущено два), или <a href="http://ru.wikipedia.org/wiki/Fork">fork</a>. </p>
<p>С многопоточностью в моем понимании в PERL дела обстоят куда лучше, чем в PHP: возможность поддержки нитей заложена в ядре языка (хотя по умолчанию многопоточность выключена) начиная с версии 5.6, а в стандартном наборе пакетов имеется объектно-ориентированный модуль, позволяющий легко и просто манипулировать потоками.</p>
<p>В этой статье я расскажу, как проверить, поддерживает ли Perl на вашем сервере работу с нитями и, если не поддерживает, как эту самую поддержку активировать. </p>
<p><span id="more-16"></span><br />
Для управления потоками в стандартный состав Perl входит модуль threads.pm. Но если Perl собран без поддержки многопоточности (а по умолчанию это именно так), работать этот не будет. Поэтому самый простой способ проверки, поддерживается многопоточночть или нет — запуск из консоли пустого скрипта с подключением модуля threads:</p>
<pre><code>$ perl -e 'use threads'
$ </code></pre>
<p>Если ничего не произошло, то модуль threads отработал как надо, сладовательно, Perl собран с поддержкой нитей. А если в терминале наблюдается что-то вроде такого:</p>
<pre><code>$ perl -e 'use threads'
-e line 1:

This Perl hasn't been configured and built properly for the threads
module to work.  (The 'useithreads' configuration option hasn't been used.)

Having threads support requires all of Perl and all of the XS modules in
the Perl installation to be rebuilt, it is not just a question of adding
the threads module.  (In other words, threaded and non-threaded Perls
are binary incompatible.)

If you want to the use the threads module, please contact the people
who built your Perl.

Cannot continue, aborting.
BEGIN failed--compilation aborted at /usr/local/lib/perl5/5.8.8/mach/threads.pm line 28.
Compilation failed in require at -e line 1.
BEGIN failed--compilation aborted at -e line 1.</code></pre>
<p>то, очевидно, Perl установлен без поддержки многопоточности. Будем исправлять <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Обращаю внимание вот на этот фрагмент сообщения:</p>
<blockquote><p>Having threads support requires all of Perl and all of the XS modules in<br />
the Perl installation to be rebuilt, it is not just a question of adding<br />
the threads module.  (In other words, threaded and non-threaded Perls<br />
are binary incompatible.)</p></blockquote>
<p><em>Забегая вперед, скажу, что у меня после пересборки Perl перестал работать <code>HTML::Parser</code>, используемый пакетом LWP. Переустановка, разумеется, помогла <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</em></p>
<p>Perl, как и всё в FreeBSD, мы будем переустанавливать из портов (для порядка сошлюсь на <a href="http://freebsd.org/doc/ru_RU.KOI8-R/books/handbook/ports-using.html">мануал</a>, хотя ты, достопочтимый читатель, наверняка это всё отлично знаешь). </p>
<pre><code>$ su
# cd /usr/ports/lang/perl5.8
# make FORCE_PKG_REGISTER=1 WITH_THREADS=yes reinstall clean</code></pre>
<p>Небольшие пояснения (опять же, чтобы объяснение было полным, я не сомневаюсь, что все умеют работать с портами) о том, что же мы сделали этими командами:</p>
<ul>
<li><strong>Первая строка</strong> позволяет получить root-права. Разумеется, текущий пользователь должен входить в группу wheel и знать root-пароль <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Обратите внимание, что после получения root-привилегий приглашение в консоли изменилось. Чаще всего так и бывает <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</li>
<li><strong>Второй строкой</strong> мы переходим в каталог порта Perl 5.8. </li>
<li><strong>Третья строка</strong> запускает процесс переустановки perl с ключом usethreads (список всех параметров можно прочитать в Makefile порта). Параметр FORCE_PKG_REGISTER позволит переустановить программу, не удаляя ее из реестра установленных пакетов.</li>
</ul>
<p>Процесс пересборки довольно быстрый: на Celeron-1.7/512Mb он занял что-то около 5 минут (специально засечь не догадался. Если интересно — <code>man time</code> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>Когда сборка удачно завершится, ваш Perl станет многопоточным. Однако прежде чем начать программирование, желательно переустановить несколько пакетов. Как я уже говорил, у меня отказался работать <code>HTML::Parser</code>, который активно юзается веб-клиентом <code>LWP</code>. Других проблем пока не обнаружил.</p>
<p>Зная имя пакета, можно найти его порт и переустановить. Вот правила, по которым строится имя перлового модуля в дереве портов FreeBSD (опять же на примере <code>HTML::Parser</code>): названеие начинается на p5-, далее идёт название пакета (c учётом регистра), в котором двойное двоеточие (оно означает ссылку на пространство имён)  заменяются дефисом. То есть пакет <code>HTML::Parser</code> в дереве портов FreeBSD называется <code>p5-HTML-Parser</code>.</p>
<pre><code># cd /usr/ports
# make search name=p5-HTML-Parser

Port:   p5-HTML-Parser-3.56
Path:   /usr/ports/www/p5-HTML-Parser
Info:   Perl5 module for parsing HTML documents
Maint:  perl@FreeBSD.org
B-deps: p5-HTML-Tagset-3.10 p5-Test-Harness-2.64 p5-Test-Simple-0.70 p5-URI-1.35 perl-5.8.8
R-deps: p5-HTML-Tagset-3.10 p5-URI-1.35 perl-5.8.8
WWW:    http://search.cpan.org/dist/HTML-Parser/

# cd /usr/ports/www/p5-HTML-Parser
# make FORCE_PKG_REGISTER reinstall clean</code></pre>
<p>Делается это всё, разумеется, с правами суперпользователя. Вот теперь можно приступать к программированию <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>To be continued&#8230;</strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=16&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/10/06/multithreading-in-perl/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
		<item>
		<title>Многопоточность в PHP: HTTP-клиент</title>
		<link>http://nopox.wordpress.com/2007/09/19/php-multithread-http-client/</link>
		<comments>http://nopox.wordpress.com/2007/09/19/php-multithread-http-client/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 19:32:50 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Обо всём]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[многопоточность]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[http-клиент]]></category>
		<category><![CDATA[multithread]]></category>
		<category><![CDATA[сеть]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://nopox.wordpress.com/2007/09/19/php-multithread-http-client/</guid>
		<description><![CDATA[Давненько ничего полезного не писал, посему спешу исправиться. Собственно, эта тема обсасывалась уже уже не раз и не два (призываю Google в свидетели), поэтому не буду разводить тряхомудиюдемагогию, а сразу приведу исходник класса, который позволяет довольно просто выполнять несколько HTTP-запросов &#8230; <a href="http://nopox.wordpress.com/2007/09/19/php-multithread-http-client/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=14&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Давненько ничего полезного не писал, посему спешу исправиться.</p>
<p>Собственно, эта тема обсасывалась уже уже не раз и не два (призываю Google в <a HREF="http://www.google.com/search?hl=ru&amp;safe=off&amp;client=opera&amp;rls=ru&amp;hs=8D0&amp;q=%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C+%D0%B2+php&amp;btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&amp;lr=">свидетели</a>), поэтому не буду разводить <strike>тряхомудию</strike>демагогию, а сразу приведу исходник класса, который позволяет довольно просто выполнять несколько HTTP-запросов параллельно:</p>
<p><span id="more-14"></span></p>
<pre><code>class HttpQueue
{
    /**
     * An array of URLs
     *
     * @access  private
     * @var     array
     */
    private $_urls = array(); 

    /**
     * An array of server sockets
     *
     * @access  private
     * @var     array
     */
    private $_sockets = array(); 

    /**
     * An array of server responses
     *
     * @access  private
     * @var     array
     */
    private $_response = array(); 

    /**
     * Socket timeout
     *
     * @access  private
     * @var     integer
     */
    private $_timeout = 30; 

    /**
     * An array of sockets which can be received
     *
     * @access  private
     * @var     array
     */
    private $_read = array(); 

    /**
     * An array of sockets which can be sended
     *
     * @access  private
     * @var     array
     */
    private $_write = array(); 

    /**
     * Adds an URL into a tasklist
     *
     * @access  public
     * @param   string  $method
     * @param   string  $url
     * @return  void
     */
    public function add($method, $url)
    {
        $this-&gt;_urls[] = array(strtoupper($method), $this-&gt;_parseUrl($url));
    } 

    /**
     * Parses requested URL and checks for all URL parts
     *
     * @access  private
     * @param   string   $url
     * @return  array
     */
    private function _parseUrl($url)
    {
        $parts = parse_url($url);
        $parts['port'] = array_key_exists('port', $parts) ? $parts['port'] : 80;
        $parts['sock'] = sprintf('%s:%s', $parts['host'], $parts['port']);
        $parts['request'] = sprintf('%s?%s', $parts['path'], $parts['query']);
        return $parts;
    } 

    /**
     * Starts fetch process
     *
     * @access  public
     * @param   void
     * @return  array
     */
    public function fetch()
    {
        $this-&gt;_create();
        $this-&gt;_process();
        return $this-&gt;toArray();
    } 

    /**
     * Sets socket timeout (in seconds)
     *
     * @access  public
     * @param   integer  $timeout
     * @return  void
     */
    public function setTimeout($timeout)
    {
        $this-&gt;_timeout = $timeout;
    } 

    /**
     * Returns array of server responses
     *
     * @access  public
     * @param   void
     * @return  array
     */
    public function toArray()
    {
        return $this-&gt;_response;
    } 

    /**
     * Creates socket conenctions with hosts given in URL
     *
     * @access  private
     * @param   void
     * @return  void
     */
    private function _create()
    {
        foreach ($this-&gt;_urls as $id =&gt; $connect) {
            if ($socket = @stream_socket_client($connect[1]['sock'], $errno,
                $errstr, $this-&gt;_timeout,
                STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT)) {
                $this-&gt;_sockets[$id] = $socket;
                $this-&gt;_response[$id]  = 'processing';
                continue;
            } 

            $this-&gt;_response[$id] = "failed, $errno $errstr";
        }
    } 

    /**
     * Process opened sockets
     *
     * @access  private
     * @param   void
     * @return  void
     */
    private function _process()
    {
        while (count($this-&gt;_sockets)) {
            $this-&gt;_read  = $this-&gt;_sockets;
            $this-&gt;_write = $this-&gt;_sockets; 

            $select = stream_select($this-&gt;_read, $this-&gt;_write, $e = null,
                                    $this-&gt;_timeout); 

            if ($select &gt; 0) {
                $this-&gt;_read();
                $this-&gt;_write();
            } 

            else {
                foreach ($this-&gt;_sockets as $id =&gt; $s) {
                    $this-&gt;_response[$id] = 'Timed out';
                } 

                break;
            }
        }
    } 

    /**
     * Receives data from readable socket
     *
     * @access  private
     * @param   void
     * @return  void
     */
    private function _read()
    {
        foreach ($this-&gt;_read as $fp) {
            $id = array_search($fp, $this-&gt;_sockets);
            $data = fread($fp, 8192); 

            if (strlen($data) == 0) {
                if ($this-&gt;_response[$id] == 'processing') {
                    $this-&gt;_response[$id] = 'failed to connect';
                } 

                fclose($fp);
                unset($this-&gt;_sockets[$id]);
            } 

            else {
                $this-&gt;_response[$id].= $data;
            }
        }
    } 

    /**
     * Sends HTTP request into writeable socket
     *
     * @access  private
     * @param   void
     * @return  void
     */
    private function _write()
    {
        foreach ($this-&gt;_write as $fp) {
            $id = array_search($fp, $this-&gt;_sockets);
            $method  = $this-&gt;_urls[$id][0];
            $request = $this-&gt;_urls[$id][1]['request'];
            $host    = $this-&gt;_urls[$id][1]['host']; 

            fputs($fp, "$method $request HTTP/1.0rn");
            fputs($fp, "Host: $hostrnrn"); 

            $this-&gt;_response[$id] = '';
        }
    }
}</code></pre>
<p>Ну и, разумеется, пример использования:</p>
<pre><code>$http = new HttpQueue();
$http-&gt;setTimeout(20);
$http-&gt;add('get', 'http://ya.ru');
$http-&gt;add('get', 'http://google.com');
$http-&gt;add('get', 'http://wordpress.com');
$result = $http-&gt;fetch();</code></pre>
<p>Чтобы добавить URL в очередь, используется метод <code>HttpQueue::add($method, $url)</code>. Первый параметр указывает тип метода передачи данных (в данном классе заработают GET и HEAD; чтобы заработал POST, нужно внести несколько изменений, но это никому не интенесно <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), второй — собственно URL.</p>
<p>В результирующем массиве <code>$result</code> будут храниться ответы серверов в том порядке, в котором они были заданы.</p>
<p><strong>P.S.</strong> Если я буду продолжать публиковаться, то со временем перестану напоминать, что мои классы работают на PHP4.x и младше <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>P.P.S.</strong> Прошу сильно не пинать ногами за комментарии в DocBlock: по-английски пишу как умею.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=14&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/09/19/php-multithread-http-client/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
		<item>
		<title>В продолжение темы про YouTube</title>
		<link>http://nopox.wordpress.com/2007/08/27/v-prodolzhenie-temy-pro-youtube/</link>
		<comments>http://nopox.wordpress.com/2007/08/27/v-prodolzhenie-temy-pro-youtube/#comments</comments>
		<pubDate>Mon, 27 Aug 2007 07:02:26 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Обо всём]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nopox.wordpress.com/2007/08/27/%d0%92-%d0%bf%d1%80%d0%be%d0%b4%d0%be%d0%bb%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%82%d0%b5%d0%bc%d1%8b-%d0%bf%d1%80%d0%be-youtube/</guid>
		<description><![CDATA[Когда-то давным-давно, аж 22 июня 2007 года, на блоге одного хорошего человека появился занятный скрипт, который позволяет получать прямые ссылки на flv-файлы с YouTube для дальнейшего их скачивания себе локально (не мне, видать, одному надоело разгребать кеш Оперы в поисках &#8230; <a href="http://nopox.wordpress.com/2007/08/27/v-prodolzhenie-temy-pro-youtube/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=11&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Когда-то давным-давно, аж 22 июня 2007 года, на <a HREF="http://jeka911.wordpress.com">блоге</a> одного хорошего человека <a HREF="http://jeka911.wordpress.com/2007/06/22/php_script_download_video_from_youtube/">появился</a> занятный скрипт, который позволяет получать прямые ссылки на flv-файлы с <a HREF="http://youtube.com">YouTube</a> для дальнейшего их скачивания себе локально (не мне, видать, одному надоело разгребать кеш Оперы в поисках скачанных флешек <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ). Идея была классной, но скрипт почему-то работать отказался. Пришлось долго и муторно копаться. Результатом мытарств стала пара классов, написанных на PHP5 (<del>на баяне не играю</del>на PHP4.x, уж извините, не пишу: двадцать первый век на дворе, шестая версия на подходе, а пятой и вообще четвертый год пошёл). Кода получилось несколько больше, чем в оригинале, зато работает как часы. А еще он умеет выдирать название ролика <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Всю грязную работу выполняют два класса:</p>
<ol>
<li><strong>httpClient</strong> &#8211; объектно-риентированная обёртка к функциям библиотеки cURL. Простенький и чертовски удобный класс (мне так кажется, по крайней мере <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</li>
<li><strong>YouTube</strong> &#8211; непосредственно парсер кода.</li>
</ol>
<p>Будем считать, что эти классы лежат в файлах <strong>httpclient.php</strong> и <strong>youtube.php</strong> соответственно. Тогда скрипт морды будет выглядеть примерно так:<br />
<span id="more-11"></span><br />
<pre class="brush: php;">&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
    &lt;title&gt;YouTube DirectLink Extractor&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;YouTube DirectLink Extractor&lt;/h1&gt;
&lt;form method="get"&gt;
    &lt;label&gt;Enter Youtube URL:&lt;/label&gt;
    &amp;lt;input type="text" name="url" value="&lt;?php echo @$_GET['url'] ?&gt;" size="60" /?
    &lt;button type="submit"&gt;Get direct link&lt;/button&gt;
&lt;/form&gt;
&lt;?php if (isset($_GET['url'])): ?&gt;
&lt;pre&gt;
&lt;?php
include_once 'httpclient.php';
include_once 'youtube.php';

$client = new httpClient();
$client-&gt;setProxy('proxy.server.ru', 3128);

$youtube = new YouTube();
$youtube-&gt;setHttpClient($client);

/**
 * Execute programme
 *
 */
$result = $youtube-&gt;getResult($_GET['url']);

/**
 * Display all results as hash
 *
 */
print_r($result);

/**
 * or output title of url indepently
 *
 */
print 'URL: ' .$youtube-&gt;getUrl().'&lt;br /&gt;';
print 'Title: '.$youtube-&gt;getTitle().'&lt;br /&gt;';
?&gt;
&lt;/pre&gt;
&lt;?php endif; ?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></p>
<p>А вот и исходные коды классов: <strong>httpclient.php:</strong></p>
<pre>
<code>class httpClient
{
    /**
     * Свойство, хранящее дескриптор соединения
     *
     * @var  resource
     */
    private $_curl = null;           

    /**
     * Свойство, сохраняющее ответ сервера на запрос
     *
     * @var  stromg
     */
    private $_response = '';           

   /**
    * Конструктор класса
    *
    * @param   void
    * @return  void
    */           

    public function __construct()
    {
        $this-&gt;_curl = curl_init();
        $this-&gt;_setOption(CURLOPT_RETURNTRANSFER, true);
    }           

    /**
     * Устанавливает параметры дескриптора CURL
     *
     * @param   integer  $option
     * @param   mixed    $value
     * @return  void
     */
    private function _setOption($option, $value)
    {
        curl_setopt($this-&gt;_curl, $option, $value);
    }           

    /**
     * Выполняет HTTP-запрос и возвращает ответ сервера
     *
     * @param   string   $url
     * @param   boolean  $header
     * @return  string
     */
    public function get($url, $header = false)
    {
        $this-&gt;_setOption(CURLOPT_URL, $url);
        $this-&gt;_setOption(CURLOPT_HEADER, $header);
        return curl_exec($this-&gt;_curl);
    }           

    /**
     * Устанавливает адрес и порт прокси]
     *
     * @param   string   $host
     * @param   integer  $port
     * @return  void
     */
    public function setProxy($host, $port = 3128)
    {
        $this-&gt;_setOption(CURLOPT_PROXY, $host);
        $this-&gt;_setOption(CURLOPT_PROXYPORT, $port);
    }           

    /**
     * Деструктор класса
     *
     * @param   void
     * @return  void
     */
    public function __destruct()
    {
        curl_close($this-&gt;_curl);
    }
}</code></pre>
<p>&#8230; и <strong>youtube.php</strong></p>
<pre>
<code>class YouTube
{
    /**
     * Свойство, хранящее указатель на объе
     *
     * @var  httpRequest
     */
    private $_httpClient;           

    /**
     * Информация о клипе (по умолчанию пустая <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )
     *
     * @var  httpRequest
     */
    private $_result = array('url' =&gt; null, 'title' =&gt; null);           

    /**
     * Устанавливает используемый HTTP-клиент
     *
     * @param   httpClient   $client
     * @return  void
     */
    public function setHttpClient(httpClient $client)
    {
        $this-&gt;_httpClient = $client;
    }           

    /**
     * Выполняет запрос к серверу YouTube и возвращает хеш-массив с
     * полученным данными
     *
     * @param   string  $url
     * @return  array
     */
    public function getResult($url)
    {
        return $this-&gt;_parse($url)-&gt;_result;
    }           

    /**
     * Непосредственно парсинг UHTML-страничек и вычленение заголовков с
     * перенаправлениями.
     *
     * @param   string  $url
     * @return  YouTube
     */
    private function _parse($url)
    {
        $code = $this-&gt;_httpClient-&gt;get($url);           

        if (preg_match('/var fs = window.open( "/(.*?)" + "(.*?)" ,/si', $code, $match)) {
            $code = $this-&gt;_httpClient-&gt;get('http://youtube.com/'.$match[1]);
            $title = $match[2];           

            if (preg_match('/"/player2.swf?(.*)", "player"/si', $code, $match)) {
                $url = 'http://youtube.com/get_video.php?'.$match[1]; // работает
                $code = $this-&gt;_httpClient-&gt;get($url, true);           

                if (preg_match('/Location:s*?(.*?)n/si', $code, $match)) {
                    $this-&gt;_result['url'] = trim($match[1]);
                    $this-&gt;_result['title'] = urldecode($title);
                }
            }
        }           

        return $this;
    }           

    /**
     * Возвращает URL видео
     *
     * @param   void
     * @return  string
     */
    public function getUrl()
    {
        return $this-&gt;_result['url'];
    }           

    /**
     * Возвращает название видео
     *
     * @param   void
     * @return  string
     */           

    public function getTitle()
    {
        return $this-&gt;_result['title'];
    }
}</code></pre>
<p>Возвращаемая скриптом ссылка является прямой: клик по ней приведет к скачиванию ролика. Название, к сожалению, по дефолту будет «vet_video», но можно ведь и переименовать файл руками, зная название ролика <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Можно и немного расширить функционал скрипта таким образом, чтобы он автоматом начинал выкачивать файл и предлагал имя, соответствующее названию ролика&#8230; Но это уже будет другая история <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>А пока хотелось бы услышать отзывы, замечания, комментарии. И совет опытных блоггеров: какой лучше всего использовать клиент для постинга? Пользоваться веб-интерфейсом TinyMCE не очень хочется <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>UPD.: </strong>т.к. редакотор не может по-человечески обращаться с кодом и считает своим долгом поубивать лишние (по его мнению, естественно)  бекслеши из регулярных выражений, думаю, что лучше выложить исходники файлов (уберите расширение .txt из имени файла):</p>
<p><a HREF="http://nopox.files.wordpress.com/2007/08/indexphp.txt" TITLE="index.php.txt">index.php</a><br />
<a HREF="http://nopox.files.wordpress.com/2007/08/youtubephp.txt" TITLE="youtube.php.txt">youtube.php<br />
</a><a HREF="http://nopox.files.wordpress.com/2007/09/httpclientphp.txt" TITLE="httpclient.php">httpclient.php</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=11&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/08/27/v-prodolzhenie-temy-pro-youtube/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
		<item>
		<title>Викторина &#171;Ильф и Петров&#187; на Эхе</title>
		<link>http://nopox.wordpress.com/2007/08/13/echo-quiz-abut-ilf-and-petrov/</link>
		<comments>http://nopox.wordpress.com/2007/08/13/echo-quiz-abut-ilf-and-petrov/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 17:08:04 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Лытдыбр]]></category>
		<category><![CDATA[Обо всём]]></category>

		<guid isPermaLink="false">http://nopox.wordpress.com/2007/08/13/echo-quiz-abut-ilf-and-petrov/</guid>
		<description><![CDATA[Услышал сегодня о викторине, посвященной творчеству Ильфа и Петрова, которую проводит Эхо Москвы. Шутки ради решил поучаствовать. Викторина &#171;Ильф и Петров&#187; на Эхе Москвы Вы ответили правильно на 15 из 15 вопросов. Иначе говоря, Отлично. Принять участие в викторине Вроде бы круто, могу считать себя корифеем . А на самом-то деле&#8230; Не уверен, что &#8230; <a href="http://nopox.wordpress.com/2007/08/13/echo-quiz-abut-ilf-and-petrov/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=5&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Услышал сегодня о викторине, посвященной творчеству Ильфа и Петрова,<br />
которую проводит <a TITLE="�хо Москвы" HREF="http://echo.msk.ru">Эхо Москвы</a>. Шутки ради решил поучаствовать.</p>
<table CLASS="" STYLE="border-top-color: #eeeeee; border-left-color: #eeeeee; border-right-color: #eeeeee; border-bottom-color: #eeeeee; border-top-width: 1px; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-left-style: solid; border-right-style: solid; border-bottom-style: solid" BORDER="0">
<tr>
<td CLASS="" STYLE="text-align: center; background-color: #662215; color: #ffffff; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; font-size: 16px; line-height: normal; margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px">Викторина <a HREF="http://echo.msk.ru/quiz/show/3.html" TARGET="_blank">&laquo;Ильф и Петров&raquo;</a> на <a HREF="http://echo.msk.ru/" TARGET="_blank">Эхе Москвы</a></td>
</tr>
<tr>
<td CLASS="" STYLE="text-align: center; background-color: #ffffff; color: #000000; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; font-size: 12px; line-height: normal; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px">Вы ответили правильно на <strong>15</strong> из <strong>15</strong> вопросов. Иначе говоря, <font SIZE="4"><strong>Отлично</strong></font>. <img STYLE="border-top-color: #ff0000; border-left-color: #ff0000; border-right-color: #ff0000; border-bottom-color: #ff0000; border-top-width: 1px; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-left-style: solid; border-right-style: solid; border-bottom-style: solid" HEIGHT="300" WIDTH="300" SRC="http://echo.msk.ru/att/quizr-10-picture-024.jpg" /></td>
</tr>
<tr>
<td CLASS="" STYLE="text-align: center; background-color: #662215; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; font-size: 12px; line-height: normal; margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px"><a HREF="http://echo.msk.ru/quiz/show/3.html" TARGET="_blank">Принять участие в викторине</a></td>
</tr>
</table>
<p>Вроде бы круто, могу  считать себя корифеем <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . А на самом-то деле&#8230; Не<br />
уверен, что авторы этого теста сами удосужились прочитать книжки,<br />
скорее просто ограничились фильмами. Не знаю, на чем основано это<br />
убеждение, но оно имеет место быть <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Особенно первый вопрос порадовал: &raquo;Какую Песню напевает Остап<br />
Бендер на протяжении фильма?&raquo;.  По-моему, с Ильфом и Петровым это<br />
мало связано. И даже о каком фильме идёт речь не указали (лично мне,<br />
кстати, известно 5 экранизаций произведений о похождениях Великого<br />
комбинатора).</p>
<p>В общем, хвастаться особо нечем, как и в <a HREF="http://nopox.wordpress.com/2007/08/09/russianlanguage-and-vsmysle/">тесте на грамотность</a>. Но всё<br />
равно приятно <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=5&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/08/13/echo-quiz-abut-ilf-and-petrov/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
		<item>
		<title>Русский язык и &#171;всмысле&#187;</title>
		<link>http://nopox.wordpress.com/2007/08/09/russianlanguage-and-vsmysle/</link>
		<comments>http://nopox.wordpress.com/2007/08/09/russianlanguage-and-vsmysle/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 21:16:07 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Лытдыбр]]></category>
		<category><![CDATA[Обо всём]]></category>
		<category><![CDATA[Русский язык]]></category>

		<guid isPermaLink="false">http://nopox.wordpress.com/2007/08/09/russianlanguage-and-vsmysle/</guid>
		<description><![CDATA[Все началось с обычного дружеского спора в привате IRC, есть ли слово «всмысле» (именно так, слитно). Я утверждал, что «всмысле» имеет точно такое же право на жизнь, как и «в смысле» (такую точку зрения я слышал от своей незабвенной учительнцы по русскому языку еще в школе и полностью был с ней согласен). Моя же очаровательная &#8230; <a href="http://nopox.wordpress.com/2007/08/09/russianlanguage-and-vsmysle/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=6&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Все началось с обычного дружеского спора в привате IRC, есть ли слово «всмысле» (именно так, слитно). Я утверждал, что «всмысле» имеет точно такое же право на жизнь, как и «в смысле» (такую точку зрения я слышал от своей незабвенной учительнцы по русскому языку еще в школе и полностью был с ней согласен). Моя же очаровательная собеседница доказывала, что писать это злополучное словосочетание непременно надо раздельно. Я продолжал настаивать на своём и в итоге мне был брошен вызов:</p>
<blockquote><p>ты тоже дохера ошибок делаешь</p></blockquote>
<p>и предложение пройти <a HREF="http://rg.ru/test/">тест «Российской газеты»</a>, в котором моя очаровательная собеседница на тот момент набрала <strong>109</strong> баллов.</p>
<p>Вообще, надо сказать, я считаю, что пишу довольно грамотно. Причем не на уровне<br />
знания правил (их я, как раз, и не знаю), а интуитивно. Поэтому вызов был принят <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<table WIDTH="200" BORDER="0" CLASS="">
<tr>
<td ALIGN="center" BGCOLOR="#ffffff" STYLE="border-top-color: #666666; border-left-color: #666666; border-right-color: #666666; border-bottom-color: #666666; border-top-width: 1px; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-left-style: solid; border-right-style: solid; border-bottom-style: solid; font-family: Arial; font-size: smaller; padding-top: 10px; padding-right: 10px; padding-bottom: 0; padding-left: 10px" CLASS="">Мой результат <a HREF="http://www.rg.ru/test" TARGET="_blank">&laquo;Теста от ульяновского губернатора&raquo;</a></p>
<h2>113 из 116</h2>
<p><a HREF="http://www.rg.ru/test" TARGET="_blank">Пройти тест на грамотность</a><br />
<a HREF="http://www.rg.ru/" TARGET="_blank"><img SRC="http://rg.ru/i/mics/gramota_test_bottom.gif" BORDER="0" /></a></td>
</tr>
</table>
<p>Должен, однако, сознаться: этот тест я прохожу второй раз. Первый был давным-давно, когда он (этот тест) только-только появился (было это, если мне не изменяет память, в феврале сего года). Тогда результат был чуток поскромнее: <strong>106/116</strong>. Но все равно неплохо <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  .</p>
<p>Впрочем, как оказалось, ошибался именно я: подняв на уши кучу знакомых филологов, перерыв кучу справочников, я осознал, что слова «всмысле» как алиаса словосочетания «в смысле» не существует. В чём я прямо тут и расписываюсь  <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  . Придется теперь переучиваться&#8230;</p>
<p>Но результаты теста меня все равно порадовали, хоть и спорные там некоторые вопросы.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/6/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/6/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=6&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/08/09/russianlanguage-and-vsmysle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
		<item>
		<title>Вот и я!</title>
		<link>http://nopox.wordpress.com/2007/08/02/hello-world/</link>
		<comments>http://nopox.wordpress.com/2007/08/02/hello-world/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 12:08:18 +0000</pubDate>
		<dc:creator>nopox</dc:creator>
				<category><![CDATA[Обо всём]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[«Здравствуй, дорогой дневничок!» — cкорее всего, эти слова в своем первом посте пишут процентов пятьдесят (а то и больше) блоггеров. Что ж, не буду оригинальничать и пойду по проторенной дорожке. Если честно, я и сам толком не совсем понимаю, для &#8230; <a href="http://nopox.wordpress.com/2007/08/02/hello-world/">Читать далее <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=1&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>«Здравствуй, дорогой дневничок!» — cкорее всего, эти слова в своем первом посте пишут процентов пятьдесят (а то и больше)  блоггеров. Что ж, не буду оригинальничать и пойду по проторенной дорожке. Если честно,  я и сам толком не совсем понимаю, для чего создавал этот блог. Из первопричин, пожалуй, могу выделить следующее:</p>
<ul>
<li>Свободное имя&#8230;<em> Моё</em> родное имя</li>
<li>Потому что это модно, глупенькие  <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p>По первому пункту нужно сделать небольшое лирическое отступление: дело в том, что по просторам Интернета гуляет мой тезка (тоже <strong>nopox</strong>), который почти везде успевает зарегистрироваться до меня. Драматизм ситуации заключается в том, что наши интересы во многом пересекаются и нас, случается, путают.</p>
<p>Вторая причина а комментариях, понятно, не нуждается. Оно и понятно: иногда можно просто слепо поддаться веянию моды, какой бы глупой она не была <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>В общем, достопочтимое сообщество <a TITLE="WordPress Community" HREF="http://wordpress.com">WordPress</a>, принимайте в свои ряды очередного программиста, системного администратора, зануду и влюбленного по уши романтика <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nopox.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nopox.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nopox.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nopox.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nopox.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nopox.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nopox.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nopox.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nopox.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nopox.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nopox.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nopox.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nopox.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nopox.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nopox.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nopox.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nopox.wordpress.com&amp;blog=1457230&amp;post=1&amp;subd=nopox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nopox.wordpress.com/2007/08/02/hello-world/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">nopox</media:title>
		</media:content>
	</item>
	</channel>
</rss>
