<?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; Программирование</title>
	<atom:link href="http://blog.perlover.com/category/programming/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>Thu, 12 Aug 2010 11:56:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Чуть улучшенный Live HTTP Headers</title>
		<link>http://blog.perlover.com/2010/08/09/patched-live-http-headers/</link>
		<comments>http://blog.perlover.com/2010/08/09/patched-live-http-headers/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 14:25:34 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Add-ons]]></category>
		<category><![CDATA[For AWMs]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[FireFox]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[patches]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Sniffing]]></category>
		<category><![CDATA[soft]]></category>
		<category><![CDATA[urls]]></category>
		<category><![CDATA[xpi]]></category>
		<category><![CDATA[сисадминам]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=987</guid>
		<description><![CDATA[Я часто пользуюсь Live HTTP headers, но постоянно раздражают установленные каждый раз флажки во вкладке Generator -&#62; Show &#171;images&#187; &#38; &#171;CSS&#187;. Обычно, Live HTTP headers используется для перехвата GET &#38; POST запросов HTTP трафика броузера, но при этом в 99% случаев не нужны данные о перехвате графики и CSS стилях. Постоянно приходится их отключать, так [...]]]></description>
			<content:encoded><![CDATA[<p>Я часто пользуюсь <strong><a href="https://addons.mozilla.org/en-US/firefox/addon/3829/" target="_blank">Live HTTP headers</a></strong>, но <strong>постоянно раздражают установленные каждый раз флажки</strong> во вкладке Generator -&gt; <strong>Show &laquo;images&raquo; &amp; &laquo;CSS&raquo;</strong>. Обычно, Live HTTP headers используется для перехвата GET &amp; POST запросов HTTP трафика броузера, но при этом в 99% случаев не нужны данные о перехвате графики и CSS стилях. Постоянно приходится их отключать, так как они &laquo;засоряют&raquo; поток других, более важных, данных. <strong>Решил покончить для себя с этим</strong>, поправив чуть чуть этот плагин. <strong>Кому надо &#8211; пользуйтесь. </strong>Правда, когда плагин выпустят с новой версией, эта будет перетерта и все перестанет работать. Как это произойдет, постараюсь придумать более лучшее решение. Исправлена пара строк, но зато так стало удобнее&#8230; <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><a href="http://blog.perlover.com/wp-content/uploads/2010/08/live_http_headers-0.16-fx+sm1.xpi" target="_self">Правленный Live HTTP headers v0.16</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/08/09/patched-live-http-headers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google 500 Server Error</title>
		<link>http://blog.perlover.com/2010/08/06/google-internal-server-error-500/</link>
		<comments>http://blog.perlover.com/2010/08/06/google-internal-server-error-500/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 09:36:20 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Расслабуха :)]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[webmaster]]></category>
		<category><![CDATA[о жизни]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=966</guid>
		<description><![CDATA[Впервые в жизни увидел, как сервис Google (Google Webmaster Tools) выдавал мне несколько раз 500-ую ошибку сервера. Для тех, кто не знает что это &#8211; это ошибка, когда на стороне сервера программа выполняет ошибку и документ не может быть сформирован. Другими словами, Google Webmaster Tools сбоит на уровне сервера, то есть где-то там, в глубине [...]]]></description>
			<content:encoded><![CDATA[<p>Впервые в жизни увидел, как сервис Google (Google Webmaster Tools) выдавал мне несколько раз 500-ую ошибку сервера. Для тех, кто не знает что это &#8211; это ошибка, когда на стороне сервера программа выполняет ошибку и документ не может быть сформирован. Другими словами, Google Webmaster Tools сбоит на уровне сервера, то есть где-то там, в глубине &laquo;датацентров&raquo; Гугля программисты что-то где-то накосячили. Я такого раньше не видел &#8211; сырые программы, они видимо, тщательно оттачивают перед размещением их &laquo;для всех&raquo;. А тут вот за день (6 августа 2010) &#8211; 5 или 6 раз, и всегда в том месте, когда я &laquo;авторизую&raquo; свой сайт при добавлении в сервис. Это говорит о том, что даже такой крупный гигант, как Гугль, иногда делает ляпы <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Скриншот прилагается <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div id="attachment_967" class="wp-caption alignnone" style="width: 580px"><a href="http://blog.perlover.com/wp-content/uploads/2010/08/google-500-error.jpg"><img class="size-full wp-image-967 " title="google-500-error" src="http://blog.perlover.com/wp-content/uploads/2010/08/google-500-error.jpg" alt="" width="570" height="160" /></a><p class="wp-caption-text">500 Internal Server Error of Google</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/08/06/google-internal-server-error-500/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl &#8211; надо ли делать свой дистрибутив проекта?</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, и читаете эту статью, то вы навярняка задавались вопросом &#8211; как устанавливать ваши скрипты, надо ли вообще делать дистрибутив, даже если вы не распространяете проект? Я несколько лет использовал свои скрипты, устанавливая их обычным копированием в отдельную папку и прописывая до нее путь, например через строки кода use lib qw(/path1 [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы программер на perl, и читаете эту статью, то вы навярняка задавались вопросом &#8211; как устанавливать ваши скрипты, <strong>надо ли вообще делать дистрибутив, даже если вы не распространяете проект?</strong> Я несколько лет использовал свои скрипты, устанавливая их обычным копированием в отдельную папку и прописывая до нее путь, например через строки кода <code>use lib qw(/path1 /path2)</code> и т.п.. Такие скрипты работали, проблем не возникало, и я вообще не думал о дистрибутивах. Затем, понадобилось устанавливать несколько своих скриптов на несколько серваков, вот тогда я и сделал свой первый дистрибутив. Но до недавнего времени, я придерживался взгляда, что дистрибутив нужен только для публичного распространения, или когда вам надо использовать свои разработки на нескольких серваках. Но так ли это на практике?</p>
<p><span id="more-843"></span>Мое последняя точка зрения &#8211; если надо запускать проект, пусть и на одном сервере, надо все таки стремится сразу создавать дистрибутив. Ниже я рассмотрю несколько плюсов и минусов в сравнении с вариантом, когда вы используете простое копирование.</p>
<p>Но пока, <strong>давайте, определимся с термином &laquo;дистрибутив&raquo; для perl</strong>. Этим термином я буду называть упакованный пакет файлов (например <em>tar.gz</em> формата), который в своем составе имеет <em>Makefile.PL</em> &#8211; стартовый perl скрипт для формирования <em>Makefile</em> файла утилиты make. Также, &laquo;правильный&raquo; дистрибутив, помимо использования make, должен иметь две раздельные фазы работы. Первая &#8211; подготовка файлов, для их дальнейшей установки, внутри своей рабочей директории (исполняется не от &#8216;<em>root</em>&#8216;, команда &#8216;<em>make all</em>&#8216;, например). Вторая &#8211; установочная: подготовленные файлы копируются в нужные установочные директории (&#8216;<em>make install</em>&#8216;). Эта фаза либо исполняется от &#8216;root&#8217;, либо от какого либо пользователя, в его внутреннюю home директорию. Хочется заметить, что в отличии от компиляционных языков, типа C/C++, perl &#8211; язык интерпретатора, поэтому в большинстве случаев в компиляции не нуждается (кроме &#8216;XS&#8217; модулей), а значит make мало что сможет сделать для нас, с первого взгляда. По этой причине, часто встает вопрос &#8211; а нужен ли дистрибутив?</p>
<p>Теперь давайте рассмотрим плюсы и минусы дистрибутива в сравнении с обычным копированием perl файлов.</p>
<h1>+)</h1>
<p><strong>Дистрибутив</strong> &#8211; это прежде всего <strong>порядок в вашей голове</strong> по поводу файлов проектов &#8211; какие файлы рабочие, где библиотеки, где директории, созданные в процессе инсталлирования. Создавая дистрибутив, вы вынуждены наводить этот порядок. Но это окупится в дальнейшем.</p>
<h1>-)</h1>
<p>На <strong>перевод готового проекта в дистрибутив требуется больше времени</strong> и изучение принципов построения дистрибутива (этот этап однократный). Но если начинать проект сразу с формирования дистрибута, этот минус уже не играет роли.</p>
<h1>-)</h1>
<p>Любые правки и их испытание на рабочем процессе &#8211; это всегда команда make install, заместо обычной правки PM или PL файла в месте, где он установлен руками. Но этот минус незначительный, так как make install обычно работает быстро &#8211; она отслеживает только те файлы, что вы изменили и инсталирует только их. Другими словами, <strong>после каждой правки исходников, для их тестирования, надо будет немного тратить больше времени.</strong></p>
<h1>+)</h1>
<p>Если вы используете <strong>написание XS модулей</strong> (вставок C кода) в проекте &#8211; то <strong>без дистрибутива вам не обойтись</strong> &#8211; такие файлы требуют компиляции, и команда make просто необходима.</p>
<h1>+)</h1>
<p>Самый большой плюс перехода на дистрибутив &#8211; это <strong>возможность использования программ контроля версий</strong>. Я остановился на git (пробовал SVN &#8211; не понравился). Дело в том, что многие программы контроля версий не учитывают точные права Unix файлов &#8211; например, git хранит в репозитарии только статус файлов: исполняемый (&#8216;x&#8217;) или нет &#8211; он не помнит user.group, в точности mode самого файла для (user, group, other) и даже не сохраняет дату модификации файла (то есть выставляет ее в &laquo;настоящее время&raquo;  между переключениями версий проекта, что на самом деле является плюсом, как нистранно &#8211; дата модификации служит ориентиром для make, что опять же плюс в использовании дистрибутива). То есть, если вы будете использовать git, вам надо будет иметь специальные свои программы, выставляющие права и/или копирующие файлы в другое месте после каждого переключения между версиями репозитария проекта (то есть без дистрибутива вы фактически создадите свой вариант дистрибутива без make, что будет являться &laquo;изобретением велосипеда&raquo;). А также надо учитывать то, что все программы контроля версий контролируют одну папку. А рабочие файлы проекта, как правило, живут не в одной папке, а раскиданы по нескольким. Поэтому программы контроля версий будут жить только с дистрибутивами.</p>
<h1>+)</h1>
<p>Написав грамотный make, можно улучшить порядок вашего проекта &#8211; <strong>make будет выставлять права, какие необходимы на рабочие директории</strong>, создавать их при необходимости и т.п.. Если вам придется запускать проект на другом нулёвом сервере &#8211; это будет минимум затрат по времени.</p>
<h1>+)</h1>
<p><strong>Использование таких команд, как <em>make distcheck</em></strong>, позволяет проверить, какие новые файлы вы добавили/создали, но не поместили их еще в MANIFEST (список файлов для дистрибутива, так сказать, список файлов &laquo;на экспорт&raquo;), поможет определиться, какие файлы надо убрать из дистрибутива (MANIFEST.SKIP). Все это &#8211; опять же порядок, который положительно скажется на вашем проекте (в MANIFEST не обязательно добавлять все файлы, некоторые можно иметь только в своей папке дистрибутива, а при подготовке &laquo;установочного&raquo; tar.gz архива они будут просто исключаться).</p>
<h1>+)</h1>
<p>Ваш проект, при создании дистрибутива, даст вам сразу такие преимущества: <strong>возможность легкого переноса вашего проекта на другие сервера без особых затрат</strong>, без проблем из него можно сделать open source проект и дать ему дальнейший импульс развития вне рамок вашей организации, или же сделать коммерческим проектом с легкой инсталяцией и т.п..</p>
<p>Вот вроде все плюсы и минусы, которые я обнаружил на основе своего опыта. Как видно, плюсов больше, чем минусов. Дополнительное время надо потратить только в самом начале проекта. Дальше &#8211; проще. В perl позаботились, чтобы облегчить жизнь разработчику &#8211; есть возможность отслеживать, какие новые файлы вы добавили в проект, но не добавили &laquo;на экспорт&raquo; в будущий дистрибут, или даже есть команды автоматического построения <em>MANIFEST</em> файла. Также, не надо руками создавать <em>Makefile</em> с длинным списком всех своих PL &amp; PM файлов &#8211; &laquo;<em>perl Makefile.PL</em>&raquo; за вас найдет в нужных папках такие файлы и автоматом включит их в <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>Copy Clipboard в Firefox методами JavaScript</title>
		<link>http://blog.perlover.com/2010/06/12/how-copy-clipboard-firefox/</link>
		<comments>http://blog.perlover.com/2010/06/12/how-copy-clipboard-firefox/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 15:36:17 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[FireFox]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=771</guid>
		<description><![CDATA[Если вы программер под JavaScript, вы навярняка сталкивались с такой проблемой &#8211; как реализовать копирование в буфер обмена средствами JavaScript в Firefox. С Internet Explorer все понятно &#8211; Microsoft &#171;постаралась&#187;, чтобы все, кому не лень, могли читать и писать в буфер обмена средствами JavaScript (по правильному, это конечно же, не должен делать любой сайт &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы программер под JavaScript, вы навярняка сталкивались с такой проблемой &#8211; как реализовать копирование в буфер обмена средствами JavaScript в Firefox. С Internet Explorer все понятно &#8211; Microsoft &laquo;постаралась&raquo;, чтобы все, кому не лень, могли читать и писать в буфер обмена средствами JavaScript (по правильному, это конечно же, не должен делать любой сайт &#8211; мало ли что у вас в буфере обмена на тот момент, например пароль&#8230;). А вот Firefox с его сильной защитой JavaScript, не позволяет любому сайту это делать. Как быть?</p>
<p><span id="more-771"></span>Маленький экскурс &#8211; Firefox позволяет делать копирование в буфер, но разрешает это выполнять либо в chrome приложениях (то есть установленным расширениям, или Add-ons, другими словами), либо подписанным цифровой подписью приложениям в jar архивах &#8211; но при этом, у вас в броузере должен быть установлен корневой сертификат того разработчика, кому вы доверили это делать. Поэтому, обычному сайтовому программеру, как может показаться, ничего не остается, как сгенерировать свой сертификат, попросить посетителя его скачать, а свои JavaScript скрипты упаковать в Jar архив и его подписать. При этом, конечно, при любом изменении кода надо заново будет проделывать: упаковка в Jar, подпись Jar архива (ведь код изменился, а значит и подпись надо менять)&#8230; Именно, по началу, я так и думал, и даже делал (ох и муторно это!). Но есть способ попроще и лучше, но он не такой правильный с точки зрения безопасности. Но он также, как и в случае сертификата, требует определенных действий со стороны пользователя &#8211; также, однократных (сделал и забыл). То есть, как никрути, а просто сделать сайт, который бы читал/писал в буфер Clipboard своего посетителя, не получиться &#8211; все равно потребуется участие посетителя сайта (оно и правильно &#8211; нефиг делать без спросу опасные вещи!).</p>
<p>Итак, все что нужно сделать пользователю сайта &#8211; однократно, и не только для вашего сайта, а в общем для всех сайтов &#8211; это разрешить броузеру &laquo;спрашивать&raquo; посетителя о том, можно ли исполнять расширенные действия такому то сайту или нет (по умолчанию &#8211; ничего не спрашивается и не исполняется). Если посетитель отвечает, что можно &#8211; броузер запоминает домен, для которого это разрешили, и затем, действует в соответствии с этим разрешением всегда. Если другой сайт захочет, например, поработать с вашим буфером обмена &#8211; броузер снова спросит вас и предупредит, но однократно для этого домена и так далее.</p>
<p>Итак, делаем в броузере: <strong>about:config</strong> в адресной строке, соглашаемся с предупреждением, если таковое есть и там ищем параметр <strong>signed.applets.codebase_principal_support</strong>, ставим его в <strong>true</strong>. Все! Теперь осталось написать JavaScript код, например, копирование текстового значения title ссылки в буфера обмена, например:</p>
<pre class="brush: jscript;">// Общая функция копирования - копирует текст переменной maintext в clipboard, рабоает для IE и Firefox
function copy_clip(maintext)
{
 maintext = String(maintext)
 if (window.clipboardData)
   window.clipboardData.setData(&quot;Text&quot;, maintext);
 else if (window.netscape)
  {
   try
    {
     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
     var gClipboardHelper = Components.classes[&quot;@mozilla.org/widget/clipboardhelper;1&quot;].
     getService(Components.interfaces.nsIClipboardHelper);
     gClipboardHelper.copyString(maintext);
    }
   catch(err)
    {
     alert (&quot;Clipboard copying error: &quot; + err); return false
    }
  }
 return true;
}
</pre>
<p>Затем, уже используем дополнительные функции для конкретных типов структуры DOM документа HTML:</p>
<pre class="brush: jscript;">function copyObjText(obj)
{
 copy_clip(document.all ? obj.innerText : obj.textContent)
 return false
}

function copyTitleInLink(obj)
{
 copy_clip(obj.title)
 return false
}</pre>
<p>А теперь, если нам надо скопировать в буфер значение поля title у ссылки типа <code>&lt;a title="что то" href="http://..."&gt;&lt;/a&gt;</code>, то делаем так:<code>&lt;a title="что то" onclick="return copyTitleInLink(this)" href="http://..."&gt;</code> Функция copyObjText может копировать текстовое поле тага textarea, например. Также, можно написать другой код для копирования любой информации из вашей страницы &#8211; очень удобно для автоматизации работы с ajax приложениями.</p>
<p>Вот, собственно и все! <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/2010/06/12/how-copy-clipboard-firefox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Отличная документация Subversion на русском</title>
		<link>http://blog.perlover.com/2010/03/14/russian-doc-subversion-svn/</link>
		<comments>http://blog.perlover.com/2010/03/14/russian-doc-subversion-svn/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 12:18:14 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[editors]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=741</guid>
		<description><![CDATA[Заинтересовался я сейчас изучением софта для контроля версий программ. Пока что я знаю, что CVS &#8211; старая и устаревшая платформа, SVN (Subversion) &#8211; современная, заменяющая CVS, и GIT &#8211; другая популярная система контроля версий. И встал вопрос, где и как изучить SVN (решил начать с неё). Английская дока &#8211; это, конечно, хорошо и правильно (термины [...]]]></description>
			<content:encoded><![CDATA[<p>Заинтересовался я сейчас изучением софта для контроля версий программ. Пока что я знаю, что <a href="http://ru.wikipedia.org/wiki/CVS" target="_blank">CVS</a> &#8211; старая и устаревшая платформа, <a href="http://ru.wikipedia.org/wiki/SVN" target="_blank">SVN</a> (Subversion) &#8211; современная, заменяющая CVS, и <a href="http://ru.wikipedia.org/wiki/GIT" target="_blank">GIT</a> &#8211; другая популярная система контроля версий. И встал вопрос, где и как изучить SVN (решил начать с неё). Английская дока &#8211; это, конечно, хорошо и правильно (термины часто не переводимы и меньше ошибок), но когда надо понять такой сложный программный комплекс за быстрое время, русская документация, как нельзя, кстати. И вот тут я нарыл отличную документацию SVN на русском &#8211; текст книги, <strong>изданной O&#8217;Reilly Media</strong>:</p>
<p><a title="Subversion дока на русском" href="http://svnbook.red-bean.com/nightly/ru/svn-book.html" target="_blank"><strong>SVN-документация одним файлом</strong> HTML для чтения (рекомендую)</a><br />
<a href="http://svnbook.red-bean.com/index.ru.html" target="_blank"><strong>Обобщенный список разных форматов</strong> этой книги</a></p>
<p>P.S. Если хотите знать, чем различаются и что чем лучше &#8211; Git или SVN &#8211; <a href="http://www.looble.com/git-vs-svn-which-is-better/" target="_blank">читайте здесь</a> и <a href="http://git.wiki.kernel.org/index.php/GitSvnComparison" target="_blank">здесь</a> (анг)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/03/14/russian-doc-subversion-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript &#8211; Middle Button Click</title>
		<link>http://blog.perlover.com/2010/03/14/javascript-middle-button-click/</link>
		<comments>http://blog.perlover.com/2010/03/14/javascript-middle-button-click/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 08:55:14 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Codes]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=648</guid>
		<description><![CDATA[Открываю тему программирования на JavaScript. Недавно решал проблему, казалось бы, тривиальной задачи отслеживания такого события, как middleclick mouse &#8211; клик колесиком мышки. Но на деле, такая задача далеко не тривиальная &#8211; об этом вы даже можете прочесть в хорошей и подробно описывающей статье на английском языке про события в разных броузерах. Итак, в самом JavaScript [...]]]></description>
			<content:encoded><![CDATA[<p>Открываю тему программирования на JavaScript. Недавно решал проблему, казалось бы, тривиальной задачи отслеживания такого события, как middleclick mouse &#8211; клик колесиком мышки. Но на деле, такая задача далеко не тривиальная &#8211; об этом вы даже можете прочесть в <a href="http://unixpapa.com/js/mouse.html" target="_blank">хорошей и подробно описывающей статье</a> на английском языке про события в разных броузерах.</p>
<p><span id="more-648"></span>Итак, в самом JavaScript есть такое событие клика мышки &#8211; тип &raquo;click&#8217;. Но данное событие разными броузерами происходит, или вообще не происходит, когда дело касается кликов кнопками мышки, отличными от левой. Стандарт W3C описывает событие click, но там не сказано про то, от какой кнопки мыши оно должно происходить. Видимо, от этого в броузерах наблюдается полная <a href="http://unixpapa.com/js/mouse.html" target="_blank">анархия</a> с этим делом.</p>
<p>Зачем мне понадобилось отслеживать событие middle click? Например, в броузере Firefox клик колесиком мышки по ссылке приводит к ее открытию в новом табе, но это событие не вырабатывает тип &#8216;click&#8217;. Мне нужно было отслеживать клики для сбора статистики, и для полноты картины я хотел учитывать даже эти клики. Лично я только так всегда открываю ссылки, значит такие люди есть (по моим последним данным, рассчитанным на основе 65 тыс. кликов &#8211; 2.5% из них &#8211; клик колесиком мышки). Но такого типа события в броузерах нет. Что делать?</p>
<p>Для начала, хочу сказать, что этот дурацкий Internet Explorer (ужасный броузер, особенно для программиста JavaScript) все таки генерирует событие &#8216;click&#8217; на клик колесиком (Safari также). То есть под IE можно не стараться отслеживать его, а просто отследить событие click (там также middleclick открывает ссылку в новом табе). А вот с Firefox и другими (Opera 8.x и новее, например) придется постараться. Они генерируют только события mousedown &amp; mouseup и все. Чтобы понять событие, надо отследить оба эти и еще одно событие &#8211; не ушла ли мышка на другой объект &#8211; ведь если между нажатием и отпусканием колесика пользователь двигал мышкой &#8211; событием клика это нельзя считать.</p>
<p>Я написал и использую два варианта кода &#8211; один для <a href="http://jquery.com/" target="_blank">jQuery</a>, другой в проектах, где jQuery не используется. Вот куски кодов:</p>
<h3>jQuery:</h3>
<pre class="brush: jscript;">jQuery.event.special.middleclick = {
    setup: function(data, namespaces) {
        var elem = this, $elem = jQuery(elem);
        $elem.bind('mousedown mouseup mouseout', jQuery.event.special.middleclick.handler);
    },

    teardown: function(namespaces) {
        var elem = this, $elem = jQuery(elem);
        $elem.unbind('mousedown mouseup mouseout', jQuery.event.special.middleclick.handler);
    },

    handler: function(event) {
        var elem = this, $elem = jQuery(elem);
        if (event.type == 'mousedown' &amp;&amp; event.which == 2)
          $elem.data('mouseTrigger', 1);
        else
          if (event.type == 'mouseout')
            $elem.data('mouseTrigger', 0);
          else
            if (event.type == 'mouseup')
             {
              if (event.which == 2 &amp;&amp; $elem.data('mouseTrigger'))
               {
                event.type = &quot;middleclick&quot;;
                jQuery.event.handle.apply(this, arguments)
               }
              $elem.data('mouseTrigger', 0);
             }
    }
};
</pre>
<h3>JavaScript без jQuery:</h3>
<pre class="brush: jscript;">mouseTrigger = function (elem, event)
{
 var nButton;

 if (document.all)
  {
   event = window.event;
   nButton = 4;
  }
 else
  {
   nButton = 1;
  }
 if (event.type == 'mousedown' &amp;&amp; event.button == nButton)
   elem.mouseTrigger = 1;
 else
   if (event.type == 'mouseout')
     elem.mouseTrigger = 0;
   else
     if (event.type == 'mouseup')
      {
       if (event.button == nButton &amp;&amp; elem.mouseTrigger)
         ourHandler(elem);
       elem.mouseTrigger = 0;
      }
 return true;
}</pre>
<p>Оба эти способа требуют установки обработчика событий &#8211; handler в виде функции function () {}. И тут есть важный момент. Поскольку оба моих предложенных варианта работают как под IE, так и под Firefox, возникает проблема в IE &#8211; сначала происходит моё событие и дергает ваш handler, затем IE производит событие click, которые, как правило, обрабатываются тем же обработчиком (я привожу в пример вариант, когда мы хотим отслеживать все клики по линкам &#8211; и обычные, и middleclick). То есть в IE на один клик колесиком мышки дергается два раза handler. Самым простым и эффективным решением лично я нашел способ исключения второго клика путем замерения времени &#8211; если наш handler на тот же элемент DOM дергают два раза с разницой менее 500 мс, значит это IE с его вторым click:</p>
<h3>jQuery:</h3>
<p>Для jQuery варианта наш handler должен выглядеть и устанавливаться так (для всех линков, которые залинкованы на картинки, например):</p>
<pre class="brush: jscript;">$('a &gt; img').bind('click middleclick', function (event)
   {
    var now = +new Date;
    if ($(this).data('lastClick') &amp;&amp; now - $(this).data('lastClick') &lt; 500)
      return; // Дубликат клика, например IE
    $(this).data('lastClick', now);

    // Здесь уже идет код нашего обработчика ...
   });
</pre>
<p>В этом примере, мы ищем все линки, которые линкуются на картинки, и ставим на них обработку двух событий &#8211; события &#8216;click&#8217; и своего события &#8216;middleclick&#8217;. Последнее событие реализовано через API jQuery как свой новый тип события &#8211; &#8216;middleclick&#8217;.</p>
<h3>JavaScript без jQuery:</h3>
<pre class="brush: jscript;">function ourHandler(elem)
{
var now = +new Date;
if (elem.lastClick &amp;&amp; now - elem.lastClick &lt; 500)
return;
elem.lastClick = now;

// Здесь уже идет код нашего обработчика ...
}
</pre>
<p>На этом я заканчиваю эту статейку. Надеюсь, эти примеры помогут вам лучше отслеживать клики на ваших страницах <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/2010/03/14/javascript-middle-button-click/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Как избавиться от сообщения &#171;Unresponsive script&#187; в Firefox</title>
		<link>http://blog.perlover.com/2010/02/23/fix-unresponsive-script-firefox/</link>
		<comments>http://blog.perlover.com/2010/02/23/fix-unresponsive-script-firefox/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 20:48:47 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[FireFox]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=716</guid>
		<description><![CDATA[﻿﻿Если вы часто работаете с сайтами, где используются интенсивные JavaScript вычисления, то вы навярняка сталкивались с таким сообщением «Unresponsive script». Оно выскакивает в Firefox, когда JavaScript использует под себя долгое время все процессорное время вашего компьютера. Firefox это замечает, скрипт приостанавливает, а вас спрашивает &#8211; продолжать выполнение скрипта или нет. Это, с одной стороны, хорошая [...]]]></description>
			<content:encoded><![CDATA[<p>﻿﻿Если вы часто работаете с сайтами, где используются интенсивные JavaScript вычисления, то вы навярняка сталкивались с таким сообщением «Unresponsive script». Оно выскакивает в Firefox, когда JavaScript использует под себя долгое время все процессорное время вашего компьютера. Firefox это замечает, скрипт приостанавливает, а вас спрашивает &#8211; продолжать выполнение скрипта или нет. Это, с одной стороны, хорошая фича Файрфокса, с другой &#8211; весьма надоедливая и неприятная, когда ваша работа требует каждодневного использования скриптов с такими вычислениями (например, массивные обработки крупной статистики).</p>
<p>Но это сообщение можно либо отключить совсем, либо увеличить лимит срабатывания. Для этого, наберите в строке броузера &laquo;<a href="http://kb.mozillazine.org/About:config" target="_blank">about:config</a>&laquo;, если будет предупреждение об осторожности смены настроек, согласитесь с ним. Там в строке фильтра неберите &laquo;dom.max_&raquo;, Fire Fox отфильтрует вам настройки, в том числе такую &#8211; <a href="http://kb.mozillazine.org/Dom.max_script_run_time" target="_blank"><strong>dom.max_script_run_time</strong></a>. Кликнете по ней и установите значение либо в ноль &#8211; отключить предупреждение, либо более 10 &#8211; это количество секунд, сколько максимум может использовать скрипт под себя процессорного времени &#8211; в таком случае, предупреждение будет появляться реже и только в крайних случаях.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/02/23/fix-unresponsive-script-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Каков % пользователей с JavaScript?</title>
		<link>http://blog.perlover.com/2009/12/18/javascript-enabled-users/</link>
		<comments>http://blog.perlover.com/2009/12/18/javascript-enabled-users/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 08:50:55 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[For AWMs]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=671</guid>
		<description><![CDATA[На своих нескольких проектах уже замечал неоднократно такую статистику &#8211; по моим данным, только 70-73% рядовых пользователей интернета имеют включеную поддержку JavaScript. Сразу хочу заметить, что не Java, а JavaScript! Делаю эту поправку потому, что некоторые ошибочно думают, смотря в Google Analytics или в данные некоторых других счетчиков в  колонку Java (там, как правило, цифры [...]]]></description>
			<content:encoded><![CDATA[<p>На своих нескольких проектах уже замечал неоднократно такую статистику &#8211; по моим данным, только 70-73% рядовых пользователей интернета имеют включеную поддержку <a href="http://ru.wikipedia.org/wiki/JavaScript" target="_blank">JavaScript</a>. Сразу хочу заметить, что не <a href="http://ru.wikipedia.org/wiki/Java" target="_blank">Java</a>, а JavaScript! Делаю эту поправку потому, что некоторые ошибочно думают, смотря в <a href="http://www.google.com/analytics/" target="_blank">Google Analytics</a> или в данные некоторых других счетчиков в  колонку Java (там, как правило, цифры за 90%). А ведь <strong>счетчики сами работают на JavaScript</strong>, и визит посетителя <strong>с отключенным JavaScript они просто не зафиксируют</strong>!</p>
<p><strong>Как я посчитал эти цифры?</strong> Возьмем, к примеру логи Apache сервера. Они показывают сколько реально было загрузок какой либо страницы. Берем данные о загрузке страницы из этих логов -V1, затем смотрим, сколько нам посчитал счетчик, например Google Analytics &#8211; V2 (я обсчитывал статистику даже своими JavaScript счетчиками на основе <a href="http://ru.wikipedia.org/wiki/Ajax" target="_blank">Ajax</a>). V1 &#8211; сколько всего смотрело людей, а V2 &#8211; у скольки включен скрипт. V2 всегда будет меньше V1, и если посчитать по формуле <strong>V2/V1*100%, то получится 70-73%</strong>. Проверьте сами! <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Конечно, могут возразить &#8211; боты и все такое… Но я замерял на разных проектах &#8211; на известных и нет, и из разных источников. Цифры всегда были примерно одинаковые. Не верю, что везде процент ботов одинаковый!</p>
<p>Так что <strong>помните об этом</strong>, когда создаете страницу, работающую только на чистом JavaScript коде!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/12/18/javascript-enabled-users/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Как русифицировать англоязычные темы под WordPress</title>
		<link>http://blog.perlover.com/2009/11/28/themes-english-to-russian/</link>
		<comments>http://blog.perlover.com/2009/11/28/themes-english-to-russian/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 10:02:27 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=382</guid>
		<description><![CDATA[Захотелось мне избавиться от английских фраз в своей теме WordPress-а. Тема изначальна не работала для русского языка &#8211; автор ее не русифицировал, так как пока никто на возжелал в этом ему помочь (я ему отправил файлы переводя для этой темы, посмотрим, как оперативно он добавит). Я, не зная изначально, как это делается, правил исходные коды [...]]]></description>
			<content:encoded><![CDATA[<p>Захотелось мне избавиться от английских фраз в своей теме WordPress-а. Тема изначальна не работала для русского языка &#8211; автор ее не русифицировал, так как пока никто на возжелал в этом ему помочь (я ему отправил файлы переводя для этой темы, посмотрим, как оперативно он добавит).</p>
<p>Я, не зная изначально, как это делается, правил исходные коды темы на PHP. Все бы ничего, но меня это достало, и я решил разобраться, как же это делается цивилизованно. Итак, мои инструкции, скорее всего, помогут русифицировать любую тему, которую вы себе поставили («скорее всего» потому, что не знаю я всю кухню русификации пока)</p>
<h3><span id="more-382"></span>Технические тонкости</h3>
<p>Этот параграф вы можете пропустить, если технические детали вам не интересны. Но я решил о них упомянуть, чтобы было более понятно, как все работает изнутри. Итак, грамотно запрограммированная тема (например, применение <a href="http://codex.wordpress.org/%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC/_2" target="_blank">&#8216;__&#8217; и &#8216;_e&#8217; функций</a> PHP везде, где надо иметь мульти-языковую поддержу) имеет языковую поддержку на уровне стандарта <a href="http://www.gnu.org/software/gettext/manual/html_node/index.html" target="_blank">gettext</a>. Что это значит? Изнутри это выглядит так: программист пишет программу, а там, где он использует фразы интерфейса, он вставляет строки через вызов определенных функций. Например, __(«Read more …»). Фразы на английском. А потом натравливает на свои исходные коды программку, которая формирует файл с расширением PO. В этом файле есть фраза «Read more…», а под ней можно указать фразу для другого языка. Потом файл PO с помощью специальной программы преобразуется в бинарный (расширение MO), понятный специальной библиотеке, а та в свою очередь используется той самой функцией &#8216;__()&#8217;. И тогда, когда идет вызов __(«Read more …&raquo;), на самом деле идет подмена этого текста на переведенный, который был в файлике PO, для того языка, который установлен в WordPress.</p>
<h3>Где расположены файлы перевода…</h3>
<p>Для каждого языка существуют два файлика &#8211; <a href="http://codex.wordpress.org/I18n_for_WordPress_Developers" target="_blank">*.PO &amp; *.MO</a>. Например, для русского это ru_RU.po &amp; ru_RU.mo. Итак, темы храняться в папке /wwws/директория_вашего_сайта/wp-content/themes/имя_темы, а директория с файлами перевода хранятся в подпапке languages/. Если ваш WordPress настроен на русский язык (файлик wp-config.php в корне блога имеет установку &laquo;define (&#8216;WPLANG&#8217;, &#8216;ru_RU&#8217;);&raquo;), а вы видите свою тему не в русском исполнении, значит этих файликов нет (ru_RU.po &amp; ru_RU.mo в директории /wwws/директория_вашего_сайта/wp-content/themes/имя_темы/languages). Для руссификации &#8211; ваша задача создать их. Как это сделать?</p>
<h3>Как сделать перевод?</h3>
<p>Вам нужен файл *.PO для английской темы (default.po). Скорее всего, в этой папке будут файлы default.po &amp; default.mo. Ваша задача &#8211; сделать копии default.* файлов, но с именем ru_RU.*, затем отредактировать файл ru_RU.po, скомпилировать его с помощью специальной программы в ru_RU.mo и залить их в папку languages. И все!</p>
<h3>Где взять софт?</h3>
<p>Но как отредактировать и скомпилировать? Поскольку gettext стандарт, как я сам понял, это целый стандарт для open-source разработок, он широко распространен. Для него разработано много инструментов, но я попробовал и вам рекомендую <a href="http://www.poedit.net/" target="_blank">Poedit</a>. Эта простая оболочка для редактирования PO файлов и их компилирования сразу в MO файлы. Она есть и под <a href="http://www.poedit.net/download.php#win32" target="_blank">Windows</a>, и под <a href="http://www.poedit.net/download.php#linux" target="_blank">Linux</a>.</p>
<p>Итак, скачиваем Poedit, ставим, открываем ru_RU.po (копию default.po), редактируем часть строк или все, если у вас хватит терпения, сохраняем и заливаем в директорию, указанную выше. После этого у вас должна работать ваша тема на русском языке.</p>
<h3>Рекомендуется для прочтения:</h3>
<ol>
<li>Стандарт <a href="http://www.gnu.org/software/gettext/manual/html_node/index.html" target="_blank">gettext (GNU проект)</a></li>
<li><a href="http://codex.wordpress.org/I18n_for_WordPress_Developers" target="_blank">Локализация WordPress изнутри (англ. версия)</a></li>
<li>Английская статья <a href="http://codex.wordpress.org/Translating_WordPress" target="_blank">Translating WordPress</a> и <a href="http://codex.wordpress.org/Translating_WordPress#Translation_Tools" target="_blank">инструменты для PO файлов</a></li>
<li><a href="http://www.wordpresser.ru/temy/20-luchshix-svezhix-tem-dlya-wordpress.html" target="_blank">20 лучших свежих тем для WordPress</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/11/28/themes-english-to-russian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Самая мощная DDoS атака и офигенный Firewall&#8230;</title>
		<link>http://blog.perlover.com/2009/11/26/facts-about-male/</link>
		<comments>http://blog.perlover.com/2009/11/26/facts-about-male/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 08:46:08 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Расслабуха :)]]></category>
		<category><![CDATA[anekdots]]></category>
		<category><![CDATA[jokes]]></category>
		<category><![CDATA[анекдоты]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=161</guid>
		<description><![CDATA[О самой мощной DDoS атаке, о самом крутом в мире Firewall ...]]></description>
			<content:encoded><![CDATA[<ol>
<li>Одна человеческая клетка содержит 75Мб генетической информации</li>
<li>Один сперматозоид содержит 37.5Мб.</li>
<li>В одном миллилитре содержится около 100 млн сперматозоидов.</li>
<li>В среднем, эякуляция длится 5 секунд и составляет 2.25 мл спермы.</li>
<li>Таким образом, пропускная способность мужского члена будет равна:</li>
<li>(37.5Мб x 100M x 2.25)/5 = (37 500 000 байт/сперматозоид x 100 000 000 сперматозоид/мл x 2.25 мл) / 5 секунд = 1 687 500 000 000 000 байт/секунду = 1 687.5 Терабайт/с<br />
Получается что женская яйцеклетка выдерживает эту DDoS-атаку на полтора терабайта в секунду, пропуская только один выбранный пакет данных и является самым офигенным в мире хардварным фаерволом&#8230;</li>
</ol>
<p>Но тот один пакет, который она пропускает, валит систему на 9 месяцев&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/11/26/facts-about-male/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
