<?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/tag/%d0%9f%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/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>Wed, 08 Feb 2012 20:11:59 +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>Топология корпораций глазами ученых (заговор?)</title>
		<link>http://blog.perlover.com/2011/10/24/economics-graph/</link>
		<comments>http://blog.perlover.com/2011/10/24/economics-graph/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 15:14:38 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Напрягуха :(]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Расслабуха :)]]></category>
		<category><![CDATA[Граф]]></category>
		<category><![CDATA[Корпорации]]></category>
		<category><![CDATA[о жизни]]></category>
		<category><![CDATA[Теория заговора]]></category>
		<category><![CDATA[Экономика]]></category>
		<category><![CDATA[Это интересно]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1452</guid>
		<description><![CDATA[Теорию графов применили для изучения структуры мирового рынка Специалисты по системному анализу из Цюриха доказали, что значительная часть экономики (около 40 процентов) контролируется совсем небольшой долей компаний, куда входят преимущественно финансовые институты. Несмотря на то, что такой вывод подозрительно напоминает классическую теорию заговора, полученный результат является первой попыткой анализа структуры финансовых потоков в экономической системе [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Теорию графов применили для изучения структуры мирового рынка</strong></p>
<blockquote><p>Специалисты по системному анализу из Цюриха доказали, что значительная часть экономики (около 40 процентов) контролируется совсем небольшой долей компаний, куда входят преимущественно финансовые институты. Несмотря на то, что такой вывод подозрительно напоминает классическую теорию заговора, полученный результат является первой попыткой анализа структуры финансовых потоков в экономической системе в целом. Также это отличный повод напомнить читателям &#171;Ленты.ру&#187; о существовании теории графов.</p>
<p>Подробнее &#8212; читаем <strong><a href="http://lenta.ru/articles/2011/10/24/graph/" target="_blank">статью на Lenta.RU</a></strong>. Довольно интересно! <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></blockquote>
<p>Также, еще <strong><a href="http://lenta.ru/news/2011/10/20/begindcurtain/" target="_blank">здесь</a></strong>:</p>
<blockquote><p>Первая пятерка самых влиятельных компаний выглядит следующим образом.</p>
<ol>
<li> Barclays plc</li>
<li> Capital Group Companies Inc.</li>
<li> FMR Corporation</li>
<li> AXA</li>
<li> State Street Corporation</li>
</ol>
</blockquote>
<p><strong>От себя:</strong> вот эта пятёрка &#8212; самое интересное. <strong><span style="color: #000000;">Ниодна компания мне не известна, но <span style="color: #ff0000;">они правят миром</span>&#8230;</span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/10/24/economics-graph/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git и &#8216;.&#8217; (точка) как remote</title>
		<link>http://blog.perlover.com/2011/10/21/git-dot-remote-name/</link>
		<comments>http://blog.perlover.com/2011/10/21/git-dot-remote-name/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 14:12:58 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Автоматизация труда]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1438</guid>
		<description><![CDATA[Знаете ли вы, что в git символ точка (dot &#8212; &#8216;.&#8217;) как имя для remote обозначает текущий репозитарий, в котором вы работаете? Когда-то я мельком нашел ссылку в документации на это, запомнил, и вот сегодня сделал вот это: И это сработало! Очень кстати полезно бывает привести ветку (например, master), от которой вы начали продолжать свою [...]]]></description>
			<content:encoded><![CDATA[<p>Знаете ли вы, что в git символ точка (dot &#8212; &#8216;.&#8217;) как имя для remote обозначает текущий репозитарий, в котором вы работаете? Когда-то я мельком нашел ссылку в документации на это, запомнил, и вот сегодня сделал вот это:</p>
<pre class="brush: bash; title: ; notranslate">git push . my_temp_branch:master
# А так ещё проще и лучше:
git push . HEAD:master
</pre>
<p>И это сработало! Очень кстати полезно бывает привести ветку (например, master), от которой вы начали продолжать свою временную ветвь,  в соответствие с ней. Первое, что хочется сделать:<span id="more-1438"></span></p>
<pre class="brush: bash; title: ; notranslate">
git checkout master
git merge my_temp_branch
git checkout my_temp_branch
</pre>
<p>Так и можно сделать, но это куча действий, плюс &#171;передергивание&#187; файлов (если открыт текстовый редактор, он может сыпать предупреждениями об открытых, но изменившихся файлах на диске), которые отслеживаются репозитарием из одного состояния в другое через checkout-ы. А вот если ветка master прямой потомок my_temp_branch, то вполне будет отлично работать первый мой пример (потому что там будет fast-forward метод &#8212; не требующий merge)</p>
<p>А потом мне стало интересно еще раз найти, где в документации git говорится о таком алиасе на local remote. Долго искал,  даже гуглил по инету &#8212; нигде нет! И вот единственное место &#8212; man git-config:</p>
<pre class="brush: plain; title: ; notranslate">

branch.&lt;name&gt;.merge
    ...
If you wish to setup git pull so that it merges into &lt;name&gt;
from another branch in the local repository,
you can point branch.&lt;name&gt;.merge to the desired branch,
and use the special setting . (a period) for branch.&lt;name&gt;.remote.
</pre>
<p>Вообщем, получается, это очень малоизвестная &#171;фишка&#187; и плохо задокументированная. Поэтому и решил поделиться с вами информацией о ней.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/10/21/git-dot-remote-name/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>Git &#8212; начинаем работать :)</title>
		<link>http://blog.perlover.com/2011/09/06/git-start-up/</link>
		<comments>http://blog.perlover.com/2011/09/06/git-start-up/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 13:22:03 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Автоматизация труда]]></category>
		<category><![CDATA[Контроль Версий]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1369</guid>
		<description><![CDATA[Итак, продолжаю группу статей, посвязенных Git &#8212; одному из замечательных инструментов по управлению версиями текстовых файлов, а еще более точно &#8212; исходных программных текстов. Этот пост предназначен для тех, кто приступает только работать на Git. Все нижесказанное будет предназначено для Unix окружения и оболочки Bash. Заходим в Unix, где есть bash &#38; git Для начала [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, продолжаю <strong><a title="Группа статей про GIt от Perlover" href="http://blog.perlover.com/tag/git/">группу статей, посвязенных Git</a></strong> &#8212; одному из <strong>замечательных инструментов по управлению версиями</strong> текстовых файлов, а еще более точно &#8212; исходных программных текстов.</p>
<p>Этот пост <strong>предназначен для тех</strong>, кто <strong>приступает только работать на Git</strong>. Все нижесказанное будет предназначено для Unix окружения и оболочки Bash.</p>
<ol>
<li><strong>Заходим в Unix</strong>, где есть bash &amp; git<span id="more-1369"></span></li>
<li>Для начала работ с git <strong>отконфигурируем его глобальные настройки</strong> для того пользователя, под которым мы будем работать, то есть под себя:
<pre class="brush: bash; title: ; notranslate">
git config --global user.name &quot;Your nickname/name&quot;
git config --global user.email &quot;your@email.com&quot;
git config --global i18n.commitEncoding utf8
git config --global status.showUntrackedFiles all
</pre>
<p>Здесь по строкам: 1 &#8212; указываем своё имя, будет видно в логах истории (git log); 2 &#8212; ваш email, будет видно там же; 3 &#8212; вы указываете, в какой кодировке будете писать комментарии к коммитам (commits), рекомендую UTF-8, а значит, надо, чтобы ваш терминал с Unix был в той же кодировке (если всё сделаете правильно &#8212; с русскими буквами проблем не будет, даже если кто-то будет писать commit в windows-1251 кодировке &#8212; git умеет конвертировать их прозрачно); 4 &#8212; весьма полезная опция &#8212; рекомендую поставить (см. последний пример) <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
<li><strong>Создание репозитария</strong> (&#171;репо&#187;, repo). Можно взять <strong>готовые исходники</strong>, которые вы хотите начать отслеживать git-ом, тогда:
<pre class="brush: bash; title: ; notranslate">
cd корень_исходников
git init
# теперь появится папка .git/
</pre>
<p>Либо, можете <strong>склонировать чей то проект</strong> для дальнейших правок, например так:</p>
<pre class="brush: bash; title: ; notranslate">
cd папка_где_будет_папка_исходников
git clone sshuser@ssh.host.com:where/git/repo/project.git
# Теперь будет папка project
</pre>
</li>
<li>Если вы хотите <strong>хранить репозитарий так, чтобы вы или кто-то другой могли его клонировать и закачивать туда</strong>, можете поступать так:
<ul>
<li>Если вы проект откуда то уже до этого клонировали, то &#171;закачка&#187; обратно делается просто:
<pre class="brush: bash; title: ; notranslate">git push</pre>
<p>Правда, одно условие &#8212; оригинальное место, откуда проект скачивали, должно быть read-write доступа. Обычно, общедоступные проекты лежат в read-only доступе.</li>
<li>Если вы <strong>проект только создали</strong>, то вам надо сделать:
<ol>
<li>Создать место, где будет храниться. Самый простой и надежный способ &#8212; <strong>создание отдельного Unix аккаунта</strong> для этого:
<pre class="brush: bash; title: ; notranslate">useradd mygit # Linux вариант</pre>
</li>
<li><strong>Очень рекомендую</strong> положить ваши ssh ключи в <em><strong>~/.ssh/authorized_keys</strong></em>, чтобы не вводить каждый раз пароль при запуске на удаленной машине:
<pre class="brush: bash; title: ; notranslate">man sshd # смотрим раздел &quot;AUTHORIZED_KEYS FILE FORMAT&quot;</pre>
</li>
<li>Из вашего репозитария, что вы проинициализировали <em><strong>git init</strong></em> сделать <strong>bare репозитарий</strong> &#8212; репозитарий, где нет будет рабочего дерева директорий с исходниками, а будет лишь база git со всеми версиями:
<pre class="brush: bash; title: ; notranslate">
cd our_project_before_git
git init # Теперь появилась .git папка с базой, но репозитарий не bare - не годится для всех
git clone --bare . ../our_project.git # Теперь выше мы создаем bare директорию
cd ..
scp -r our_project.git mygit@host.com:our_project.git # закачиваем на хост, откуда потом мы и другие будут забирать его
</pre>
</li>
<li>Теперь на удаленном хосте желательно <strong>аккаунт mygit ограничить доступом только по git</strong>:
<pre class="brush: bash; title: ; notranslate">echo /usr/bin/git-shell &gt;&gt;/etc/shells
# Уточните точный путь до git-shell
vipw
# там меняем shell у пользователя mygit на:
# /usr/bin/git-shell
# Можно указать shell сразу при создании пользователя через &lt;useradd&gt;</pre>
</li>
<li>Теперь, чтобы ваш первоначальный репозитарий был закреплен за тем хостом + путь (mygit@host.com:our_project.git) у вас есть два пути:
<ol>
<li><strong>Либо добавить</strong> хост и путь репо как remote origin командой:
<pre class="brush: bash; title: ; notranslate">git remote add origin mygit@host.com:our_project.git
# более подробно - смотрите man git-remote</pre>
</li>
<li><strong>Либо склонировать из удаленного</strong> залитого репозитария в новую директорию, а старую можете удалить (первый способ, наверное, лучше)
<pre class="brush: bash; title: ; notranslate">mygit@host.com:our_project.git</pre>
</li>
</ol>
</li>
</ol>
</li>
</ul>
</li>
</ol>
<h3>Теперь, пройдемся в кратце еще раз по концепции git, о которой я рассказывал <strong><a href="/2010/11/22/git-starting/">ранее</a></strong>:</h3>
<p>Git хранит в своём репозитарии, который хранится в папке .git внутри корня вашего проекта, все файлы всех версий файлов. Точнее, их упакованные версии. Последние версии git иногда хранят дельты, но это редко. Засчет этого, git очень быстро работает, так как оперирует сразу полными версиями файлов, основываясь на иерархии commit-ов. Каждый commit &#8212; &#171;снимок&#187; (правильнее &#8212; хеш SHA1) рабочей директории (точнее того, что добавлено в &#171;индекс&#187; при commit). То есть, не может быть одного и того же ID commit-в в мире, но с другим сожержимым, кроме вашего проекта именно с теми файлами.</p>
<p>Представьте себе иерархическое дерево, каждый узел которого может иметь одного и более &#171;родителей&#187; (parents), где есть &#171;конечные&#187; узлы, которые не являются родителем для какого либо узла &#8212; это &#171;концы&#187; ветки. Ветка в git &#8212; не что иное, как указатель на этот самый последний commit, которым все заканчивается. Когда вы делаете очередной commit, указатель ветки переназначается в новый последний commit, а предыдущий становится &#171;родительским&#187; для вновь созданного. Git, оперируя названиями веток, берет всегда от туда &#171;конечный&#187; commit, и далее по parents идет вверх по иерархии. У git есть очень гибкий синтаксис указания списка commit-ов через ветки и иерархические статусы узлов (parents, &#171;предков&#187;), а также через временным интервалы (например, что было сделано за последнюю неделю, например). Имена веток могут содержать &#8216;/&#8217; символ. Например: git diff feature/foo..master покажет изменения между веткой feature/foo и master, а если быть более точным &#8212; покажет изменения в commit-ах, которые недостежими в обоих ветках (то есть, если идти по иерархии от концов обеих веток вверх, то учитывать только те коммиты, которые есть только в одной их них. Если мы доходим до &#171;резвилки&#187;, то послее нее, разумеется, коммиты есть в обоих вариантах, и тогда поиск прекращается). По умолчанию принято, что <strong>default ветка</strong> в git имеет имя <strong>master</strong>. Часто, разработчики под ней выпускают релизные версии.</p>
<p>Но устройство git такого, что при работе с ним вам надо очень активно использовать ветвление &#8212; т.е. создавать свои ветки для новых &#171;фич&#187;, тестировать программу, и если все нормально &#8212; &#171;сливать&#187; с главной веткой. Это позволяет четко вести разрботку и разграничивать правки кода. Причем, создание веток вами идет локально &#8212; вы можете им давать любые имена, не опасаясь, что они пересекутся по названию с ветками других разрботчиков проекта &#8212; по умолчанию, новые имена веток хранятся в локальной копии репозитария и при &#171;push&#187; операциях это не затрагивается. Вы легко можете закачать новую ветку в удаленный репозитарий:</p>
<pre class="brush: bash; title: ; notranslate">git push origin my_new_branch:my_new_branch</pre>
<p>Либо даже удалить в удаленном репозитарии какую либо ветку:</p>
<pre class="brush: bash; title: ; notranslate">git push origin :my_new_branch</pre>
<p>Немного по этим двум примерам: синтаксис закачки/выкачки имеет формат src:dst, где src &#8212; имя ветки на source, dst &#8212; имя ветки на destination. То есть, если мы делаем push, то src &#8212; это имя ветки в нащем репозитарии, а dst &#8212; имя ветки в удаленном, а если мы делает :my_new_branch, то src &#8212; &#171;пусто&#187;, т.е. нет, а my_new_branch &#8212; имя удаленной ветки &#8212; то есть толкнуть &#171;нечто пустое&#187; куда-то &#8212; это значит &#171;удалить&#187;.</p>
<p>В git есть <strong>промежуточный слой между репозитарием и вашей рабочей директорией &#8212; индекс (index или stage)</strong>. Файлы, добавленные в индекс, в документации называются staged. Это поначалу может показаться непривычно, но потом это становится понятным. Это как бы &#171;фильтр&#187;, &#171;прослойка&#187;, между вашим проектом и репозитарием. Ведь проекты, почти всегда &#8212; это не просто исходними, но и служебные файлы, которые создаются при компиляции, тестировании и т.п.. Чтобы не тащить с собой в репозитарий весь &#171;этот мусор&#187;, который создается в директории проекта, и индивидуален для каждого разработчика проекта, git имеет этот index. Index &#8212; это тоже дерево файлов и директорий, но &#171;очищенное&#187;, и содержит в себе только то, что будет добавлено при очередном commit. Если git status показывает какой либо файл как untracked &#8212; значит того файла нет в индексе, и пока вы его специально не добавите git add, он не попадет в репозитарий. Для удобства можно делать git add . из корня проекта &#8212; добавить все, что не отслеживается, но тогда надо активно следить за файлами .gitignore!</p>
<p>Возьмите себе за правило активно использовать файл .gitignore (см. man gitignore). Этот файл указывает git-у, какие файлы надо исключать при работе и не добавлять в индекс! Эти файлы могут присутствовать в любой поддиректории проекта, и их действие распространяется либо на поддиректории той, где есть этот файл, либо только на файлы в этой &#8212; в зависимости, как описана маска файла. Например:</p>
<pre class="brush: plain; title: ; notranslate"># Это комментарий

# Исключать только Makefile.old из текущей директории!
/Makefile.old

# Исключать все файлы с расширением .o как в этой, так и в поддиректориях
*.o

# Исключать все txt файлы только в этой директории
/*.txt

# Исключать всю директорию build в текущей папке
/build/

#  Исключать все директории в этой и ниже с именем blib, файлы могут быть с таким именем
blib/
</pre>
<p>И еще парочка заметок. Git не хранит права файлов в репозитарии, за исключением &#8216;x&#8217; флага, и при клонировании все файлы имеют права либо 644, либо 755. Поэтому не делайте репозитариев, с расчетом на отдельные права некоторых файлов (например, права 600 или 700). Сначала это может кому-то не понравиться, потом привыкаешь. Для разработки проектов этого достаточно, так как все проекты по правильному делаются с двумя фазами &#8212; компиляция и инсталирование. Правильные права должны выставляться на последнем этапе дистрибутива. Также, любой клонированный репозитарий может быть репозитарием для другого, если вы это позволите &#8212; получается очень распределенная, несокрушимая система <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  К тому же, работа над каждым репозитарием не требует интернета &#8212; вы можете делать commit-ы в репозитарий на своем диске (вместо ssh хоста в моих примерах можно использовать обычные Unix пути), а если захотите, то при наличии интернета уже &#171;сливать&#187; коммиты в другой remote репозитарий (см. man git-remote, man git-push)</p>
<p>Вернемся к примерам в начале статтьи. Теперь мы имеем репозитарии, с которыми можно работать. Теперь несколько советов по работе</p>
<ol>
<li>Рекомендую прописать у себя в ~/.bash_profile такие команды, которые использую на основании своего опыта:
<pre class="brush: bash; title: ; notranslate">alias gitcommit='git commit -a'
alias gitdiff='git diff|less -S'
alias gitgraph='git log --graph --all --decorate|less -S'
alias gitremote=&quot;git remote show origin&quot;
alias gitlog='git log --decorate'
export LESS=S#4
</pre>
<p>Теперь пояснения:<br />
<strong> gitcommit</strong> &#8212; укороченная команда, когда вы делаете commit (принятие изменений, их фиксация в базе), так, чтобы перед commit были обновлены файлы из рабочего дерева в индекс, а также, чтобы те файлы, которые вы удалили, были также удалены в commit. При такой команде не попадают в commit те файлы, которые есть в рабочем дереве, но нет в индексе (из надо добавлять git add)<br />
<strong>gitdiff</strong> &#8212; просмотр изменений между рабочим деревом и индексом, но запускает less с опцией -S<br />
<strong>gitgraph</strong> &#8212; очень полезная командочка для просмотра &#171;дерева&#187; commit-ов и веток<br />
<strong> gitremote</strong> &#8212; смотрит в удаленный репозитарий origin (может быть несколько репозитариев в git &#8212; я сделал для широкоупотребимой ситуации) и показывает статус вашего репозитария в сравнении с удаленным<br />
<strong> gitlog</strong> &#8212; почти то же, что gitlog, но вместе с commit хешем показывается, если есть, имя версии ветки, которая заканчивается этим commit<br />
<strong>export LESS &#8230;</strong> &#8212; устанавливаем переменную, чтобы команда less работала наиболее удобным способом (см. man less)</li>
<li>Как правило, работа сводится к такому примерно списку команд:
<pre class="brush: bash; title: ; notranslate">cd my_project
# например, текущая ветка - master
git pull # вытащить, если есть, что-то новое из репозитария из ветки master

# не обязательно, но если вы работает в команде, лучше, чтобы ваша новая &quot;фича&quot; велась в отдельной ветке до ее окончания
git checkout -b new_branch
# теперь мы в new_branch
# редактируем как надо что либо

# Проверяем, что мы наделали, смотрим, появились ли новые файлы, которых нет в репозитарии (untracked)
# если есть untracked - думаем, либо добавлять их в репо,
# либо добавить в .gitignore, чтобы не маячили в глазах
# здесь нам пригодится настройка git config --global status.showUntrackedFiles all (см. начало статьи)
# без этой настройки новые целые директории не показываются пофайлово, а только как имя директории
git status

# опционально, если есть untracked файлы - можем добавить их, либо сразу директорию - как здесь - всё под '.'
git add .

# Если порядок наведен, тогда делаем commit:
# если есть alias из моих &quot;команд&quot;, тогда:
gitcommit
# либо на &quot;голом&quot; git:
git commit -a

# тестируем, проверяем, что наваяли, и если все OK, тогда...

# закидываем изменения либо нашей ветки &quot;новой&quot; с созданием оной там, что нежелательно, как правило:
git push origin new_branch:new_branch

# либо в master, не переключаясь с нашей new_branch, что нежелательно
git push origin new_branch:master

# А лучше сделать так:
# переключаемся обратно на master
git checkout master
# На всякий случаем тащим что-то новенькое - вдруг кто-то закинул новое, пока мы работали над new_branch
git pull
# Теперь объединяем изменения в new_branch с master, могут быть конфликты, если при последнем pull мы что-то получили новое
git merge new_branch
# если конфликты - смотрим git diff, правим file, помечаем как resolved (git add file), делаем git commit -a и т.п..
# Заливаем в репозитарий master уже с нашими изменениями
git push
</pre>
</li>
</ol>
<p>Пока всё. Думаю, этого вполне достаточно, чтобы стартануть для работы с git</p>
<p>P.S. Также можете почитать:</p>
<ol>
<li><strong><a href="http://progit.org/book/ru/" target="_blank">Книга &#171;Pro Git&#187; на русском</a>, в переводе (каждый может помогать в переводе через ее git репозитарий <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</strong></li>
<li><strong><a href="http://rb.labtodo.com/page/rasproboval-git" target="_blank">Сравнение Git с SVN</a> от Ruslan Brest</strong></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/09/06/git-start-up/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>Массивы JavaScript, Internet Explorer и запятые</title>
		<link>http://blog.perlover.com/2011/02/10/javascript-array-internet-explorer-comma-end/</link>
		<comments>http://blog.perlover.com/2011/02/10/javascript-array-internet-explorer-comma-end/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 13:53:06 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1208</guid>
		<description><![CDATA[Заметил такую особенность &#8212; если описывать массив как То в Firefox и Google Chrome &#8212; он будет иметь 3 элемента, а в Internet Explorer (тестировалось в 8-ой версии) &#8212; 4 элемента, причем 4-ый будет null. Это я все к тому, что некоторые программисты любят писать таким стилем, добавляя везде при этом запятую в конце каждой [...]]]></description>
			<content:encoded><![CDATA[<p>Заметил такую особенность &#8212; если описывать массив как</p>
<pre class="brush: jscript; title: ; notranslate">
var array = [
elem1,
elem2,
elem3,
];
</pre>
<p>То в Firefox и Google Chrome &#8212; он будет иметь 3 элемента, а в <strong>Internet Explorer</strong> (тестировалось в 8-ой версии) &#8212; <strong>4 элемента</strong>, причем <strong>4-ый будет null</strong>.</p>
<p>Это я все к тому, что некоторые программисты любят пис<strong>а</strong>ть таким стилем, добавляя везде при этом запятую в конце каждой строки (чтобы копировать и множить было удобнее).</p>
<p>Оказывается, <strong>такой стиль имеет скрытую угрозу</strong> &#8212; ошибки, когда &#171;прогулка&#187;  по массиву дает null элемент, тогда как такой программист предполагал, что будет три элемента и все &#8212; не null. Вообщем, программеры JavaScript &#8212; остерегайтесь <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><span id="more-1208"></span>На последок &#8212; тестовый HTML файл (сохраните код и откройте в броузере) &#8212; проверьте сами, что выдают броузеры <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: xml; title: ; notranslate">&lt;html&gt;
&lt;body&gt;
&lt;script&gt;var array = [1, 2, 3, ]; alert(array.length) &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/02/10/javascript-array-internet-explorer-comma-end/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

