<?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>Perlover&#039;s Blog &#187; Perl</title>
	<atom:link href="http://blog.perlover.com/category/programming/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.perlover.com</link>
	<description>Blog about Unix, Perl, Firefox, JavaScript and other internet technologies</description>
	<lastBuildDate>Fri, 20 Jan 2012 15:23:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Perl: DBI &amp; MySQL &#8212; авто реконнект (reconnect)</title>
		<link>http://blog.perlover.com/2011/12/27/dbd-dbi-mysql-auto-reconnect-init-commands/</link>
		<comments>http://blog.perlover.com/2011/12/27/dbd-dbi-mysql-auto-reconnect-init-commands/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 11:52:43 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Советы]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1491</guid>
		<description><![CDATA[Если вы программист на Perl и работаете с MySQL, то вот вам совет, как обеспечить коннект к серверу, и в тоже время, обеспечить себе легкую жизнь. Ведь если истечёт таймаут при работе с сервером, $dbh (database handle) будет не актуальным и выдаст ошибку. Особенно это актуально тогда, когда ваша программа работает с MySQL, и в [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы программист на <strong>Perl</strong> и работаете с <strong>MySQL</strong>, то вот вам совет, как <strong>обеспечить коннект к серверу</strong>, и в тоже время, обеспечить себе <strong>легкую жизнь</strong>. Ведь если истечёт <strong>таймаут</strong> при работе с сервером, <strong>$dbh</strong> (database handle) <strong>будет не актуальным</strong> и выдаст ошибку. Особенно это актуально тогда, когда ваша программа работает с MySQL, и в то же время выполняет другие длительные операции, время которых может превысить таймаут-значение (connect timeout) MySQL. В такой ситуации ваш handle будет не актуальным.</p>
<p><strong>Решение есть</strong>. Но в то же время есть ещё одна тонкость. DBB::mysql драйвер имеет опцию автореконнекта (mysql_auto_reconnect) и будет следить за актальностью handle и при случае переконнектится. Но вот что делать с коммандами, которые иногда надо выполнить сразу после коннекта, например SET NAMES &#8216;utf8&#8242;;SET CHARACTER SET &#8216;utf8&#8242; ? И тут есть решение! Хотя найти его не всегда легко в интернет <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Вообщем, вот <strong>код для коннекта</strong> из под Perl к MySQL так, <strong>чтобы всё работало пучком</strong>:</p>
<pre class="brush: perl; title: ; notranslate">
$dbh = DBI-&gt;connect( &quot;dbi:mysql:database=database_name;mysql_client_found_rows=1;mysql_enable_utf8=1;mysql_socket=/socket_of_mysql&quot;, 'user', 'password',
    {
	RaiseError		=&gt; 1,
	AutoCommit		=&gt; 1,
	mysql_multi_statements	=&gt; 1,
	mysql_init_command	=&gt; q{SET NAMES 'utf8';SET CHARACTER SET 'utf8'}
    } ) or die &quot;Cannot connect&quot;;
$dbh-&gt;{mysql_auto_reconnect} = 1;
</pre>
<p>Код проверен мною и тщательно протестирован</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/12/27/dbd-dbi-mysql-auto-reconnect-init-commands/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Музеи бывают разные&#8230;</title>
		<link>http://blog.perlover.com/2011/10/27/museum-of-program-code/</link>
		<comments>http://blog.perlover.com/2011/10/27/museum-of-program-code/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 12:01:53 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Это интересно]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1459</guid>
		<description><![CDATA[Вот пришла мне сегодня такая мысль: программирование &#8212; это тоже искусство, код бывает написан так, что грамотный программист может долго восхищаться тем, как он написан и потом черпать от туда идеи для вдохновления. Например, если говорить о perl &#8212; мне очень нравится, как пишет код Tatsuhiko Miyagawa, и что самое интересное &#8212; он много очень [...]]]></description>
			<content:encoded><![CDATA[<p>Вот пришла мне сегодня такая мысль: <strong>программирование &#8212; это тоже искусство</strong>, код бывает написан так, что грамотный программист может долго восхищаться тем, как он написан и потом черпать от туда идеи для вдохновления. Например, если говорить о perl &#8212; мне очень нравится, как пишет код <strong><a href="http://search.cpan.org/%7Emiyagawa/" target="_blank">Tatsuhiko Miyagawa</a></strong>, и что самое интересное &#8212; он много очень написал. Например, много полезных приёмов можно подчерпнуть даже в таком хорошем и полезном инструменте для парсинга html &amp; xml, как <strong><a href="http://search.cpan.org/dist/Web-Scraper/" target="_blank">Web::Scraper</a></strong> &#8212; простой то туда <strong><a href="http://cpansearch.perl.org/src/MIYAGAWA/Web-Scraper-0.34/lib/Web/Scraper.pm" target="_blank">пример для программеров перла</a></strong> <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Дак вот, я о том, что раз программирование &#8212; это искусство, то <strong>почему бы, подумал я, не открыть где нибудь музей</strong>, где вместо картин были бы исходные коды. Потом моя мысль пошла дальше &#8212; мол код интереснее смотреть на экране компа, тем более в цифровом виде &#8212; чтобы легче было копипасты делать, проверить если что и т.п.. Значит, музей должен быть в интернете! И вот, подумал я, наверное, я один до этого додумался <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Погуглил &#8212; как бы не так&#8230; Опередили меня ровно на год! По крайней мере в русском сегменте сети.</p>
<p>Итак, встречайте <strong><a href="http://codemuseum.ru/" target="_blank">музей программного кода</a></strong>! <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/10/27/museum-of-program-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Несколько полезных jQuery модулей от Odyniec</title>
		<link>http://blog.perlover.com/2011/09/27/jquery-plugins-from-odyniec/</link>
		<comments>http://blog.perlover.com/2011/09/27/jquery-plugins-from-odyniec/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 11:02:12 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[CJ/TGP]]></category>
		<category><![CDATA[For AWMs]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Sony Ericsson]]></category>
		<category><![CDATA[tabs]]></category>
		<category><![CDATA[webmaster]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1416</guid>
		<description><![CDATA[Сегодня посмотрел страничку одного разработчика по ник &#8212; имени Odyniec. Очень понравились его разработки. Спешу поделиться с вами imgAreaSelect &#8212; jQuery плугин для кропинга (cropping images) картинок (точнее, выделение области &#8212; кропинг делайте сами ) &#8212; (пример) imgZoom &#8212; Красивое листание картинок с анимацией, ротацией и приближением из далека (пример) selectList &#8212; мультивыборочный select лист, [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня посмотрел страничку одного разработчика по ник &#8212; имени Odyniec. <strong>Очень понравились его разработки</strong>. Спешу поделиться с вами <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li><strong><a href="http://odyniec.net/projects/imgareaselect/" target="_blank">imgAreaSelect</a></strong> &#8212; jQuery плугин <strong>для кропинга</strong> (cropping images) картинок (точнее, выделение области &#8212; кропинг делайте сами <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ) &#8212; (<strong><a href="http://odyniec.net/projects/imgareaselect/examples.html" target="_blank">пример</a></strong>)<strong></strong></li>
<li><strong><a href="http://odyniec.net/projects/imgzoom/" target="_blank">imgZoom</a></strong> &#8212; Красивое <strong>листание картинок с анимацией</strong>, ротацией и приближением из далека (<strong><a href="http://odyniec.net/projects/imgzoom/" target="_blank">пример</a></strong>)<strong></strong></li>
<li><strong><a href="http://odyniec.net/projects/selectlist/" target="_blank">selectList</a></strong> &#8212; <strong>мультивыборочный select лист</strong>, показывающий выбранные опции отдельно с возможностью легкого их удаления (<strong><a href="http://odyniec.net/projects/selectlist/examples.html" target="_blank">пример</a></strong>)</li>
</ul>
<p>Также, автор написал <strong>несколько полезных статей</strong> по CSS (как создать &#171;деревья&#187;, &#171;табы&#187;)</p>
<p>Также, автор написал несколько модулей на perl для <strong><a href="http://search.cpan.org/dist/Dancer/" target="_blank">Dancer</a></strong> (его сайт также <strong>работает под Dancer</strong>): <strong><a href="http://search.cpan.org/dist/Dancer-Plugin-DebugToolbar/" target="_blank">Dancer::Plugin::DebugToolbar</a></strong>, <strong><a href="http://search.cpan.org/dist/Dancer-Plugin-DirectoryView/" target="_blank">Dancer::Plugin::DirectoryView</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/09/27/jquery-plugins-from-odyniec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Термин &#171;Lexical scope&#187; в Perl</title>
		<link>http://blog.perlover.com/2011/09/08/term-lexical-scope-i-perl/</link>
		<comments>http://blog.perlover.com/2011/09/08/term-lexical-scope-i-perl/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 13:52:22 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1404</guid>
		<description><![CDATA[Довольно часто в документации к Perl встречается такой термин, как Lexical Scope. Однако лично я пока не нашел точного определения этому термину в man-ах perl-а. Порывшись в интернете, нашел все таки точное определение этому термину. В терминах Perl, lexical scope определяется либо границами файла-исходника (если было за пределами первого блока в файле), либо блоком, в [...]]]></description>
			<content:encoded><![CDATA[<p>Довольно часто в документации к Perl встречается такой термин, как <strong>Lexical Scope</strong>. Однако лично я пока не нашел точного определения этому термину в man-ах perl-а. Порывшись в интернете, <strong><a href="http://www.stonehenge.com/merlyn/UnixReview/col46.html" target="_blank">нашел все таки точное определение этому термину</a></strong>.</p>
<p>В терминах Perl, <strong>lexical scope</strong> определяется либо <strong>границами файла-исходника</strong> (если было за пределами первого блока в файле), <strong>либо блоком</strong>, в котором определен ({&#8230;}), <strong>либо внутри &#171;eval&#187;</strong>. Поскольку блоки могут быть вложенными, то и <strong>lexical scope может быть вложенным</strong>. Это очень важно понимать, так как некоторые директивы имеют именно этот lexical scope (my, our, package)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/09/08/term-lexical-scope-i-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>perl, utf8 и encode &amp; decode термины</title>
		<link>http://blog.perlover.com/2011/07/20/perl-utf8-encode-decode-ter/</link>
		<comments>http://blog.perlover.com/2011/07/20/perl-utf8-encode-decode-ter/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 11:07:24 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[сисадминам]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1334</guid>
		<description><![CDATA[Полезно будет знать Perl программерам. Дело в том, что часто в документациях к perl (perldoc utf8) и модулям (например JSON) употреблаются такие термины, которые лично меня часто путали своим смыслом, а именно: encode to UTF-8, decode to UTF-8. Что подумает нормальный программер, услышав слово encode to? То, что что-то кодируется во что-то, а именно &#171;encode [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Полезно будет знать Perl программерам</strong>. Дело в том, что часто в документациях к perl (perldoc utf8) и модулям (например JSON) употреблаются такие термины, которые лично меня часто путали своим смыслом, а именно: encode to UTF-8, decode to UTF-8. <strong>Что подумает</strong> нормальный программер, <strong>услышав слово encode to?</strong> То, что что-то кодируется во что-то, а именно &#171;encode to UTF-8&#8243; -&gt; &#171;кодирование в UTF-8&#8243;. Я знаю, что perl хранит внутри себя строки UTF-8 со специальным флагом &#8212; если он установлен &#8212; строка UTF-8, если нет &#8212; бинарная. Поэтому, когда в доке я читал encode to UTF-8, я все время путался &#8212; думал, что говорят про установку этого флага. Оказалось, все в точности наоборот.</p>
<p><strong>Правильно так:</strong> когда пишут <strong><span style="color: #0000ff;">encode to UTF-8</span></strong>, это значит, что внутри перла строка с UTF-8 данными остается как есть, но <strong><span style="color: #0000ff;">флаг UTF-8 убирается</span></strong>, и perl начинает вести себя со строкой так, как будто там бинарные (octet) байтовые данные (то есть посути, строка внутри перла перестает быть UTF8, хотя слово &#171;encode&#187; несет в себе другой смысл). И наоборот &#8212; <strong><span style="color: #993300;">decode to UTF-8 -&gt; UTF8 флаг ставится</span></strong> (то есть для perl-а строка становится UTF8).</p>
<p>P.S. В Perl есть такая функция &#8212; encode (модуль Encode). Смысл ее в том, чтобы перевести строку из внутреннего содержания на perl (которое всегда UTF-8 внутри, т.е. Unicode символы) в байтовую последовательность, которая бы отражала ту кодировку, которую ей указали (то есть раз байтовая &#8212; значит всегда utf8 флаг в результате отсутсвует). Если мы делаем $result = encode(&#8216;utf-8&#8242;, $string), то результат как раз будет в том, что флаг utf8 будет просто снят для $result и в реальности никакого переводирования не будет (то есть побайтово внутри perl-а $string &amp; $result будут содержать одни и те же байты, только $string еще будет иметь взведенный utf8 флаг). И это как раз вписывается в те понятия, которые я описал ранее. Для decode и байтового UTF8 всё обратно &#8212; флаг utf8 просто ставится в $result.</p>
<p>Вот такая абракодабра&#8230; <strong>Будьте внимательны!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/07/20/perl-utf8-encode-decode-ter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Немного о супер направлениях в Web на Perl</title>
		<link>http://blog.perlover.com/2011/07/19/perl-plack-psgi/</link>
		<comments>http://blog.perlover.com/2011/07/19/perl-plack-psgi/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 10:15:38 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[For AWMs]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[mod_perl]]></category>
		<category><![CDATA[Plack]]></category>
		<category><![CDATA[PSGI]]></category>
		<category><![CDATA[webmaster]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[сисадминам]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1328</guid>
		<description><![CDATA[Немогу не поделиться своими выводами об изучении нескольких новых технологий в Perl и в Web программировании. Немного предистории. Я сам программирую динамические веб сайты (CGI) только на Perl. Никогда не использовал PHP. Это не только потому, что я фанат Perl, но и дань эффективности &#8212; под Perl много модулей, много возможностей, и при грамотном подходе [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Немогу не поделиться своими выводами</strong> об изучении нескольких <strong>новых технологий в Perl и в Web программировании</strong>. Немного предистории.</p>
<p>Я сам программирую <strong>динамические веб сайты</strong> (CGI) только <strong>на Perl</strong>. Никогда не использовал PHP. Это не только потому, что я фанат Perl, но и дань эффективности &#8212; под Perl много модулей, много возможностей, и при грамотном подходе сайты на Perl будут работать быстрее PHP &#8212; ведь Perl код после компиляции хранится в памяти в виде байт кода (типа &#171;<a href="http://en.wikipedia.org/wiki/P-code_machine" target="_blank">Пи кода</a>&#187; кода в Pascal). А если знаешь Perl, то и разработка может идти гораздо быстрее.<span id="more-1328"></span></p>
<p><strong>До недавнего времени я использовал</strong> технологию <strong>Apache + mod_perl + Embperl</strong>, а сам внешний WWW сервер имел фронтенд -Apache + mod_accel либо еще лучший вариант &#8212; nginx  (оба &#8212; реализуют проксирование). Лет 8 назад это было отличным решением, когда я начал использовать эту технологию. Но сейчас она устарела и сложна в использовании.</p>
<p>Сейчас я <strong>всем программерам на Perl</strong>, пишущим приложения под Web, <strong>очень рекомендую обратить внимание</strong> на следующие технологии в Perl, которые, несомненно эффективнее и проще, чем вышеуказанная связка:</p>
<ul>
<li><strong><a href="https://github.com/miyagawa/psgi-specs/blob/master/PSGI.pod" target="_blank">PSGI</a></strong> технология, а также ее реализация через модули <strong><a href="https://github.com/miyagawa/Plack" target="_blank">Plack</a></strong></li>
<li><strong><a href="http://github.com/miyagawa/Starman" target="_blank">Starman</a></strong> &#8212; perl сервер, с режимами pre-fork, контроля количества процессов и многое другое. Вообщем, почти как apache.</li>
<li><strong><a href="http://dancer.sukria.net/" target="_blank">Dancer</a></strong> &#8212; отличное решение для реализации своих PSGI приложений, но с более простым программированием.</li>
</ul>
<h3>Сейчас немного подробнее</h3>
<p>PSGI &#8212; недавно придуманный стандарт для Perl, который реализует простой и понятный программисту подход &#8212; вместо написания CGI скриптов и всей этой ваши с передачей параметров серверам и т.п.., очень умный человек (<a href="http://bulknews.typepad.com/" target="_blank">Tatsuhiko Miyagawa</a>) придумал (правда взяз за основу наработки из Python) простой подход &#8212; любое приложение (будь то скрипт или группа скриптов)  оформляется в виде обычной perl функции, которая чётко принимает и возвращает определенные параметры: принимает ссылку на хеш, в котором есть и заголовки HTTP, и служебные заголовки (вместо старых в CGI переменных окружения), а возвращает ссылку на массив из трех элементов: HTTP ответ, ссылку на массив заголовков ответа и ссылку на массив данных (HTTP BODY). Просто и со вкусом! Причем, можно возвращать и ссылку на код функции для реализации stream потоков. То есть <strong>в PSGI можно реализовать любой вид сервера</strong> &#8212; <strong>простой</strong>, отдающий <strong>потоковые</strong> данные (типа видео, например), либо удерживающее соединение (<strong>Comet</strong> технология). Но и это не все. Прелесть такой структуры функции PSGI в том, что одна функция может вызывать другую PSGI, но при этом делающее что-то своё. То есть другими словами &#8212; стек вызова. Называется это &#8212; middleware. А <strong>Plack служит клеем</strong> &#8212; имеет в своем составе сервис функции для формирования такого стека.</p>
<p>И, конечно же, если подумать, <strong>нужен сам сервер</strong>, который будет принимать TCP соединения, парсить заголовки и формировать хеш для PSGI, вызывать его и отдавать ответ. И таких серверов написано уже много. <strong>Один из них &#8212; Starman</strong>. Он, практически, выполняет те же функции, что выполняла бы связка Apache + mod_perl, только гораздо эффективнее, так как он проще, и нет тех &#171;костылей&#187;, которые были приделаны в apache &amp; mod_perl для их функционирования.</p>
<p><strong>А что же делает Dancer?</strong> Он называется типом <strong>Frameworks</strong> в терминологии Plack. Он для сервера Starman работает как PSGI, но вы сами пишите на perl через предоставляемые <strong>Dancer-ом функции, которые облегчают вам жизнь</strong>. Dancer сам парсит входные данные от Starman, формирует их в удобный вид для обработки в perl и также формирует обратные заголовки и данные. К тому же, Dancer может работать без Starman &#8212; он имеет свой простой вебсервер. Также, раз Dancer может работать как PSGI функция, его можно вызывать из под любого сервера Plack типа, а также на нем можно написать свои middleware. Вообщем, тут вам как ваша фантазия и профессионализм подскажет.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/07/19/perl-plack-psgi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perl &#8212; перекрестные ссылки и &#171;утечка памяти&#187;</title>
		<link>http://blog.perlover.com/2011/03/28/perl-memory-leak-weaken-cross-refs/</link>
		<comments>http://blog.perlover.com/2011/03/28/perl-memory-leak-weaken-cross-refs/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 10:21:03 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[Good Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Советы]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1239</guid>
		<description><![CDATA[Недавно столкнулся с такой не очевидной проблемой, как &#171;утечка памяти&#187; там, где вроде бы ее не должно было быть. Маленькое вступление &#8212; perl имеет механизм чистки уже неиспользуемых переменных. Работает просто - новая переменная всегда имеет счетчик ссылок, равный единице. Этот счетчик увеличивается на единицу, как только вы ставите на ту переменную ссылку или где-то [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно столкнулся с такой не очевидной проблемой, как <strong>&#171;утечка памяти&#187;</strong> там, где вроде бы ее не должно было быть.</p>
<p><strong>Маленькое вступление</strong> &#8212; <strong>perl</strong> имеет механизм чистки уже неиспользуемых переменных. Работает просто <span id="more-1239"></span>- новая переменная всегда имеет счетчик ссылок, равный единице. Этот счетчик увеличивается на единицу, как только вы ставите на ту переменную ссылку или где-то используете эту переменую в функции, а саму функцию передаете куда либо еще &#8212; всё это отражается на счетчике. И пока этот счетчик не равен нулю &#8212; perl не освобождает память этой переменной. Счетчик также уменьшается на единицу, как только удаляется ссылка на переменную или, как во втором примере &#8212; удаляется ссылка на функцию, ее использующую, либо когда переменная становится не нужной после блока <em><strong>{}</strong></em>. Все это работает нормально, и сделано правильно, с точки зрения чистки памяти. Но бывают такие нюансы, о которых просто сходу не додумаешься &#8212; я баг искал несколько дней, и кое как нашел. Вообще, в большинстве случаев утечек памяти не будет &#8212; надо очень сильно постараться, чтобы они были, или писать программы в стиле 80-х годов, когда был Бейсик (perl позволяет писать в разных стилях) и о локальных переменных никто не думал.</p>
<p>Итак, рассмотрим несколько примеров, когда может быть утечка памяти, которую не так просто заметить:</p>
<pre class="brush: perl; title: ; notranslate">
{
 my $a = {};
 my $b = {};

 $a-&gt;{ref} = $b;
 $b-&gt;{ref} = $a;
}
</pre>
<p>Посмотрим, что здесь. Итак, <em><strong>$a</strong></em> &#8212; содержит ссылку на хеш-таблицу, <em><strong>$b</strong></em> &#8212; на другую. Все они &#8212; обернуты в блок. Казалось бы, <em><strong>$a</strong></em> &amp; <em><strong>$b</strong></em> должны освободить память после окончания блока, так как после блока видимость переменных пропадает и в таких случаях perl все очищает. Тем более, ссылки на хеш-таблицы мы никуда не передавали и не возвращали через <em><strong>return</strong></em>. Но все будет не так. <em><strong>$a-&gt;{ref}</strong></em> получает ссылку на <em><strong>$b</strong></em>. Если бы этим все и ограничилось &#8212; память бы освободилась. Но проблема в том, что <em><strong>$b-&gt;{ref}</strong></em> сохраняет ссылку на <em><strong>$a</strong></em>, которая имеет ссылку на <em><strong>$b</strong></em>. Это и есть ключевой момент! <strong><span style="color: #ff0000;">Когда две переменные, как либо связаны через ссылки друг на друга</span></strong> (либо прямые ссылки, либо через хеши, как тут, либо через ссылки на функции, их использующие) &#8212; <strong><span style="color: #ff0000;">очистки памяти не происходит</span></strong>. И все потому, что perl не освобождает <strong>$a</strong> потому, что <strong>$b</strong> имеет ссылку на неё (тут счетчик ссылок для хеша под $a равен 2 внутри блока, для хеша под $b также равен 2 внутри блока), а $a имеет ссылку на $b. Когда блок заканчивается, perl уменьшает счетчики ссылок у обоих, и если в обычной ситуации все свелость бы к тому, что в результате у всех наступило бы по &#171;нулям&#187;, то здесь у обоих счетчики ссылки так и остануться равными единицами. Выход &#8212; можно внутри блока в конце написать <strong>undef $b-&gt;{ref}</strong> (как бы разрубив гордиев узел), тем самым разрушим перекрестность ссылок.</p>
<p>Но есть пример и по интереснее, который приключился со мной. Он примерно, такой:</p>
<pre class="brush: perl; title: ; notranslate">
{
 my $ref = {};
 $ref-&gt;{func} = sub
  {
   ...
   $ref-&gt;{foo} = 2;
   ...
  }
}
</pre>
<p>Тут опять же &#8212; перекрестные ссылки, но более изощренно. <em><strong>$ref</strong></em> имеет в своем составе ссылку на функцию, например &#8212; callback по своей сути, а сам callback внутри себя использует <em><strong>$ref</strong></em> переменную. Выходит, что когда дело дойдет до чистки памяти &#8212; будет такая же ситуация &#8212; перекрестные ссылки и память не будет освобождена под $ref хеш, так и память переменных стека под sub {} (функции могут &#171;удерживать&#187; данные, которые им доступны из их &#171;контекста&#187; видимости и которые они используют). Как быть?</p>
<p>Второй пример решается одним способом, как ни странно (может есть и другой, с той же undef, но этот самый эффективный и &#171;правильный&#187;). Есть такой сервисный модуль &#8212; Scalar::Util с фунцией weaken. Код выше меняется на такой:</p>
<pre class="brush: perl; title: ; notranslate">
use Scalar::Util 'weaken';

{
 my $ref = {};
 weaken $ref;
 $ref-&gt;{func} = sub
  {
   ...
   $ref-&gt;{foo} = 2;
   ...
  }
}
</pre>
<p>Функция weaken управляет как раз тем счетчиком ссылок. Если говорить точно, то она перестает &#171;удерживать&#187; счетчик ссылок на тот объект, на который ссылается. А именно, в примере, <em><strong>$ref</strong></em> &#8212; удерживает без weaken счетчик на хеш &#8212; {}. После <em><strong>$ref = {}</strong></em> счетчик ссылок хеша равен двум &#8212; единице он был равен сразу после создания хеша, а затем еще увеличился на елиницу после присвоения $ref-у. Если мы используем <em><strong>weaken $ref</strong></em>, тогда после этого счетчик снова уменьшится на единицу для хеша, а внутри perl данных где-то в глубине это запомнится, и тогда в любой момент, как только perl очистит память под хеш (то есть когда счетчик ссылок станет нулевым), переменная <em><strong>$ref</strong></em> станет равной <em><strong>undef</strong></em>. Но, как правило, если правильно написать программу, возникновение значения undef для $ref нам не помешает. Тут главное, запомнить простое правило &#8212; <strong><span style="color: #ff0000;">если вы имеете ссылку на функцию, которая сама как либо использует ту переменную, которая ссылается на нее (прямо или опосредовано) &#8212; тут надо применять weaken, иначе будет утечка памяти!</span></strong> И это будет не вина perl, а ваша! Я в своей большой практике программирования на perl пока еще не сталкивался с утечкой памяти по вине perl &#8212; все было по вине программера, то есть меня <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/03/28/perl-memory-leak-weaken-cross-refs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Perl &#8212; надо ли делать свой дистрибутив проекта?</title>
		<link>http://blog.perlover.com/2010/06/23/why-need-perl-makefile-pl-make/</link>
		<comments>http://blog.perlover.com/2010/06/23/why-need-perl-makefile-pl-make/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 07:32:38 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[make]]></category>
		<category><![CDATA[Makefile]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=843</guid>
		<description><![CDATA[Если вы программер на perl, и читаете эту статью, то вы навярняка задавались вопросом &#8212; как устанавливать ваши скрипты, надо ли вообще делать дистрибутив, даже если вы не распространяете проект? Я несколько лет использовал свои скрипты, устанавливая их обычным копированием в отдельную папку и прописывая до нее путь, например через строки кода use lib qw(/path1 [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы программер на perl, и читаете эту статью, то вы навярняка задавались вопросом &#8212; как устанавливать ваши скрипты, <strong>надо ли вообще делать дистрибутив, даже если вы не распространяете проект?</strong> Я несколько лет использовал свои скрипты, устанавливая их обычным копированием в отдельную папку и прописывая до нее путь, например через строки кода <code>use lib qw(/path1 /path2)</code> и т.п.. Такие скрипты работали, проблем не возникало, и я вообще не думал о дистрибутивах. Затем, понадобилось устанавливать несколько своих скриптов на несколько серваков, вот тогда я и сделал свой первый дистрибутив. Но до недавнего времени, я придерживался взгляда, что дистрибутив нужен только для публичного распространения, или когда вам надо использовать свои разработки на нескольких серваках. Но так ли это на практике?</p>
<p><span id="more-843"></span>Мое последняя точка зрения &#8212; если надо запускать проект, пусть и на одном сервере, надо все таки стремится сразу создавать дистрибутив. Ниже я рассмотрю несколько плюсов и минусов в сравнении с вариантом, когда вы используете простое копирование.</p>
<p>Но пока, <strong>давайте, определимся с термином &#171;дистрибутив&#187; для perl</strong>. Этим термином я буду называть упакованный пакет файлов (например <em>tar.gz</em> формата), который в своем составе имеет <em>Makefile.PL</em> &#8212; стартовый perl скрипт для формирования <em>Makefile</em> файла утилиты make. Также, &#171;правильный&#187; дистрибутив, помимо использования make, должен иметь две раздельные фазы работы. Первая &#8212; подготовка файлов, для их дальнейшей установки, внутри своей рабочей директории (исполняется не от &#8216;<em>root</em>&#8216;, команда &#8216;<em>make all</em>&#8216;, например). Вторая &#8212; установочная: подготовленные файлы копируются в нужные установочные директории (&#8216;<em>make install</em>&#8216;). Эта фаза либо исполняется от &#8216;root&#8217;, либо от какого либо пользователя, в его внутреннюю home директорию. Хочется заметить, что в отличии от компиляционных языков, типа C/C++, perl &#8212; язык интерпретатора, поэтому в большинстве случаев в компиляции не нуждается (кроме &#8216;XS&#8217; модулей), а значит make мало что сможет сделать для нас, с первого взгляда. По этой причине, часто встает вопрос &#8212; а нужен ли дистрибутив?</p>
<p>Теперь давайте рассмотрим плюсы и минусы дистрибутива в сравнении с обычным копированием perl файлов.</p>
<h1>+)</h1>
<p><strong>Дистрибутив</strong> &#8212; это прежде всего <strong>порядок в вашей голове</strong> по поводу файлов проектов &#8212; какие файлы рабочие, где библиотеки, где директории, созданные в процессе инсталлирования. Создавая дистрибутив, вы вынуждены наводить этот порядок. Но это окупится в дальнейшем.</p>
<h1>-)</h1>
<p>На <strong>перевод готового проекта в дистрибутив требуется больше времени</strong> и изучение принципов построения дистрибутива (этот этап однократный). Но если начинать проект сразу с формирования дистрибута, этот минус уже не играет роли.</p>
<h1>-)</h1>
<p>Любые правки и их испытание на рабочем процессе &#8212; это всегда команда make install, заместо обычной правки PM или PL файла в месте, где он установлен руками. Но этот минус незначительный, так как make install обычно работает быстро &#8212; она отслеживает только те файлы, что вы изменили и инсталирует только их. Другими словами, <strong>после каждой правки исходников, для их тестирования, надо будет немного тратить больше времени.</strong></p>
<h1>+)</h1>
<p>Если вы используете <strong>написание XS модулей</strong> (вставок C кода) в проекте &#8212; то <strong>без дистрибутива вам не обойтись</strong> &#8212; такие файлы требуют компиляции, и команда make просто необходима.</p>
<h1>+)</h1>
<p>Самый большой плюс перехода на дистрибутив &#8212; это <strong>возможность использования программ контроля версий</strong>. Я остановился на git (пробовал SVN &#8212; не понравился). Дело в том, что многие программы контроля версий не учитывают точные права Unix файлов &#8212; например, git хранит в репозитарии только статус файлов: исполняемый (&#8216;x&#8217;) или нет &#8212; он не помнит user.group, в точности mode самого файла для (user, group, other) и даже не сохраняет дату модификации файла (то есть выставляет ее в &#171;настоящее время&#187;  между переключениями версий проекта, что на самом деле является плюсом, как нистранно &#8212; дата модификации служит ориентиром для make, что опять же плюс в использовании дистрибутива). То есть, если вы будете использовать git, вам надо будет иметь специальные свои программы, выставляющие права и/или копирующие файлы в другое месте после каждого переключения между версиями репозитария проекта (то есть без дистрибутива вы фактически создадите свой вариант дистрибутива без make, что будет являться &#171;изобретением велосипеда&#187;). А также надо учитывать то, что все программы контроля версий контролируют одну папку. А рабочие файлы проекта, как правило, живут не в одной папке, а раскиданы по нескольким. Поэтому программы контроля версий будут жить только с дистрибутивами.</p>
<h1>+)</h1>
<p>Написав грамотный make, можно улучшить порядок вашего проекта &#8212; <strong>make будет выставлять права, какие необходимы на рабочие директории</strong>, создавать их при необходимости и т.п.. Если вам придется запускать проект на другом нулёвом сервере &#8212; это будет минимум затрат по времени.</p>
<h1>+)</h1>
<p><strong>Использование таких команд, как <em>make distcheck</em></strong>, позволяет проверить, какие новые файлы вы добавили/создали, но не поместили их еще в MANIFEST (список файлов для дистрибутива, так сказать, список файлов &#171;на экспорт&#187;), поможет определиться, какие файлы надо убрать из дистрибутива (MANIFEST.SKIP). Все это &#8212; опять же порядок, который положительно скажется на вашем проекте (в MANIFEST не обязательно добавлять все файлы, некоторые можно иметь только в своей папке дистрибутива, а при подготовке &#171;установочного&#187; tar.gz архива они будут просто исключаться).</p>
<h1>+)</h1>
<p>Ваш проект, при создании дистрибутива, даст вам сразу такие преимущества: <strong>возможность легкого переноса вашего проекта на другие сервера без особых затрат</strong>, без проблем из него можно сделать open source проект и дать ему дальнейший импульс развития вне рамок вашей организации, или же сделать коммерческим проектом с легкой инсталяцией и т.п..</p>
<p>Вот вроде все плюсы и минусы, которые я обнаружил на основе своего опыта. Как видно, плюсов больше, чем минусов. Дополнительное время надо потратить только в самом начале проекта. Дальше &#8212; проще. В perl позаботились, чтобы облегчить жизнь разработчику &#8212; есть возможность отслеживать, какие новые файлы вы добавили в проект, но не добавили &#171;на экспорт&#187; в будущий дистрибут, или даже есть команды автоматического построения <em>MANIFEST</em> файла. Также, не надо руками создавать <em>Makefile</em> с длинным списком всех своих PL &amp; PM файлов &#8212; &#171;<em>perl Makefile.PL</em>&#187; за вас найдет в нужных папках такие файлы и автоматом включит их в <em>Makefile</em>.</p>
<p>В следующей статье я расскажу вам, как легко и быстро создавать perl дистрибутивы. Для начинающих это может показаться сложно, так как надо читать много документации, прежде чем понять это. Я попробую рассказать об этом, опуская все лишнее.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/06/23/why-need-perl-makefile-pl-make/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sed &#8212; некоторые тонкости regexp</title>
		<link>http://blog.perlover.com/2009/10/29/sed-regexp/</link>
		<comments>http://blog.perlover.com/2009/10/29/sed-regexp/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 06:08:41 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Regexp]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=115</guid>
		<description><![CDATA[До недавнего времени сколько бы я не делал попыток написать для sed хоть мало мальское регулярное выражение, оно у меня не работало ...]]></description>
			<content:encoded><![CDATA[<p>До недавнего времени сколько бы я не делал попыток написать для sed хоть мало мальское регулярное выражение, оно у меня не работало. Я не мог понять в чем дело, ведь там синтаксис должен быть практически такой же, как в perl. Но для меня Sed оставался странной лошадкой, которую хотелось бы обуздать, но не получалось.</p>
<p>И вот, наконец, сегодня я прочел <a href="http://www.gnu.org/software/sed/manual/sed.html">грамотную доку</a>, а также в другом месте нашел объяснение моим проблемам. Оказывается, в sed есть очень мелкие, но важные отличия, поняв которые, вы сможете писать sed команды легко.</p>
<p>Итак, оказывается, по историческим причинам, чтобы не нарушать работу старых sed команд, в sed группировка (&#8216;(&#8216;, &#8216;)&#8217;) и некоторые другие спец. символы (&#8216;+&#8217; , &#8216;?&#8217;) были заменены на символы со слешем. Вот эти отличия:</p>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tbody>
<tr>
<th width="33%">В языке Perl</th>
<th width="33%">В sed редакторе</th>
<th width="33%">Пояснение</th>
</tr>
<tr>
<td width="33%">(&#8230;)</td>
<td width="33%">\(&#8230;\)</td>
<td width="33%">Группировка</td>
</tr>
<tr>
<td width="33%">{X,Y}</td>
<td width="33%">\{X,Y\}</td>
<td width="33%">Заданный множитель</td>
</tr>
<tr>
<td width="33%">+</td>
<td width="33%">\+</td>
<td width="33%">Повторитель &#8212; один и более раз</td>
</tr>
<tr>
<td width="33%">?</td>
<td width="33%">\?</td>
<td width="33%">Повторитель &#8212; один или ноль раз</td>
</tr>
<tr>
<td width="33%">\bfoo\b</td>
<td width="33%">\&lt;foo\&gt;</td>
<td width="33%">поиск &#8216;foo&#8217; с границами слова</td>
</tr>
<tr>
<td width="33%">$1, $2</td>
<td width="33%">\1, \2</td>
<td width="33%">Подмена на группу</td>
</tr>
</tbody>
</table>
<p>Самое главное, на чем я спотыкался всегда &#8212; я никак не мог додуматься, что &#8216;\&#8217; должен ставиться перед &#8216;(&#8216;, или перед &#8216;?&#8217; и &#8216;+&#8217; символами, например. Я видел иногда эти слеши в примерах, но я думал, что эти слеши относились к shell, но оказалось, что это тонкость sed-а.</p>
<p>P.S. Возникает вопрос, а как же тогда заменять сами символы: &#171;?+{}()&#187; в sed? А оказывается, их просто не надо ескейпить символом &#8216;\&#8217;. Получается как бы наоборот &#8212; эти символы сами по себе не ескейпяться, а когда нужно их специальное назначение, то перед ними ставим &#8216;\&#8217;. Типа все с ног на голову, если сравнивать с perl.</p>
<p><strong><span style="color: #ff0000;">Чуть позже я выяснил</span></strong>, что <strong>у sed есть ключик запуска &#8216;-r&#8217;</strong>, который, собственно, <strong><span style="color: #ff0000;">переключает sed в тот режим, который работает со спецсимволами уже без слеша</span></strong> (то есть так, как привыкли perl программисты). Поэтому, есть второй вариант: просто добавить ключ -r в sed запуска, и усё будет работать по привычному <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/10/29/sed-regexp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

