<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>codeart.ru</title>
	
	<link>http://www.codeart.ru</link>
	<description>Для тех, кто видит WEB иначе</description>
	<pubDate>Fri, 30 Jul 2010 10:36:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/codeart" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="codeart" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">codeart</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fcodeart" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fcodeart" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>Подсмотрел интересный прием в ExtJs</title>
		<link>http://www.codeart.ru/2010/07/30/podsmotrel-interesnyj-priem-v-extjs/</link>
		<comments>http://www.codeart.ru/2010/07/30/podsmotrel-interesnyj-priem-v-extjs/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 10:15:12 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Главная]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/?p=518</guid>
		<description><![CDATA[Программируя на JavaScript я очень часто использую замыкания (а кто их не использует?). Штука, безусловно, очень удобная и полезная. Правда есть несколько неудобных моментов, например, в теле функции для которой создается замыкание (внутренняя функция) нельзя использовать указатель this. Точнее использовать его можно, но указывает он на контекст внутренней функции, а очень часто хочется обратится к [...]]]></description>
			<content:encoded><![CDATA[<p>Программируя на <strong>JavaScript</strong> я очень часто использую замыкания (а кто их не использует?). Штука, безусловно, очень удобная и полезная. Правда есть несколько неудобных моментов, например, в теле функции для которой создается замыкание (внутренняя функция) нельзя использовать указатель <strong>this</strong>. Точнее использовать его можно, но указывает он на контекст внутренней функции, а очень часто хочется обратится к контексту внешней (функции). Обычно, я из таких ситуаций выхожу следующим образом.<br />
<span id="more-518"></span></p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">//&#8230; тут объявляется код объекта</span><br />
someFunction: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">this</span>.<span class="me1">title</span> = <span class="st0">&quot;Город-герой Москва&quot;</span>;<br />
&nbsp; <span class="co1">// &#8230; тут какой-то код</span><br />
&nbsp; <span class="kw2">var</span> that&nbsp; = <span class="kw1">this</span>; <span class="co1">// </span><br />
&nbsp; <span class="kw2">function</span> innerFunction<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;that.<span class="me1">title</span> = <span class="st0">&quot;Город герой Санкт-Петербург&quot;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">title</span><span class="br0">&#41;</span>;</p>
<p><span class="br0">&#125;</span></div>
</div>
<p>Казалось бы ничего криминального здесь нет, чтобы получить во внутренней функции указатель <strong>this</strong>, вводим дополнительную переменную &#8220;<strong>that</strong>&#8221; и благополучно используем ее в функции. Но есть одно &#8220;но&#8221;, иногда <strong>this.title</strong> и <strong>that.title</strong> воспринимаются как две разные переменные и в результате появляются ошибки. </p>
<p>Работая с  фреймворком <strong>ExtJS</strong>, я обратил внимание, что  часто в исходниках ExtJS вместо  указателя <strong>this</strong> используется переменная &#8220;<strong>me</strong>&#8220;, которая является указателем на <strong>this</strong> . Т.е. фактически <strong>this</strong> используется только один раз - при определении переменной <strong>me</strong>, а потом (в пределах функции) уже не используется.</p>
<p>Думаю что, по задумке разработчиков это решение используется с целью экономии, ведь <strong>me</strong> на целых два байта короче чем <strong>this</strong>. Но кроме экономии есть еще один плюс, который возникает при работе с замыканиями - независимо от того где пишется код во внешней или внутренней функции у программиста переменная &#8220;me&#8221; четко ассоциируется с внешней функцией и шансов сделать ошибку (как в случае с <strong>this</strong> и <strong>that</strong>) становится меньше. </p>
<p>Вот как это выглядит в ExtJS:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw3">focus</span> : <span class="kw2">function</span><span class="br0">&#40;</span>defer, <span class="coMULTI">/* private */</span> dom<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> me = <span class="kw1">this</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dom = dom || me.<span class="me1">dom</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Number<span class="br0">&#40;</span>defer<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; me.<span class="kw3">focus</span>.<span class="me1">defer</span><span class="br0">&#40;</span>defer, <span class="kw2">null</span>, <span class="br0">&#91;</span><span class="kw2">null</span>, dom<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dom.<span class="kw3">focus</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">catch</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> me;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</div>
<p>Мне интересно, что скажет общественность, по этому поводу. Возможно мои умозаключения - не более чем бред кодо-параноика, который видит смысл там где его нет :-)?</p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/C3NHKmllvWs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2010/07/30/podsmotrel-interesnyj-priem-v-extjs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Проблемы с PHP DirectoryIterator</title>
		<link>http://www.codeart.ru/2010/07/26/problemy-s-php-directoryiterator/</link>
		<comments>http://www.codeart.ru/2010/07/26/problemy-s-php-directoryiterator/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 14:13:27 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Главная]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/?p=510</guid>
		<description><![CDATA[В последнее время очень часто приходится сталкиваться с SPL классами в PHP. Не то чтобы они мне не нравились, но работать с ними не всегда удобно. Сегодня наткнулся на проблему с указателями в DirectoryIterator. Ее суть  хорошо демонстрирует следующий код.


$dirTree = new DirectoryIterator&#40;&#34;/testDir&#34;&#41;; // Допустим в директории файлы a.php и b.php
$items = array&#40;&#41;;&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время очень часто приходится сталкиваться с <strong>SPL</strong> классами в <strong>PHP</strong>. Не то чтобы они мне не нравились, но работать с ними не всегда удобно. Сегодня наткнулся на проблему с указателями в <strong>DirectoryIterator</strong>. Ее суть  хорошо демонстрирует следующий код.<br />
<span id="more-510"></span></p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="re0">$dirTree</span> = <span class="kw2">new</span> DirectoryIterator<span class="br0">&#40;</span><span class="st0">&quot;/testDir&quot;</span><span class="br0">&#41;</span>; <span class="co1">// Допустим в директории файлы a.php и b.php</span><br />
<span class="re0">$items</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$dirTree</span> <span class="kw1">as</span> <span class="re0">$item</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$item</span>-&gt;<span class="me1">isDir</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$items</span><span class="br0">&#91;</span><span class="br0">&#93;</span> =&nbsp; <span class="re0">$item</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$item</span>-&gt;<span class="me1">getFilename</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Здесь все ок - сначало выводится a.php, затем b.php</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
<span class="br0">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>
<p><span class="re0">$firstElement</span> = <span class="re0">$items</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
<a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$firstElement</span>-&gt;<span class="me1">getFilename</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// вот здесь выводится пустая строка, а я ожидал что будет &#8216;a.php&#8217;</span></div>
</div>
<p>Проблема заключается в том, что при выполнении <strong>foreach</strong> у нас в элементе <strong>$item</strong> хранится указатель на указатель текущего элемента в <strong>DirectoryIterator</strong>. Получить этот указатель можно с помощью функции <strong>$dirTree->current()</strong>. Таким образом, при изменении этого самого внутреннего указателя изменяется и результат выполнения команды <strong>getFilename</strong>. А так как после выполнения <strong>Foreach</strong> указатель смотрит на несуществующий (null) элемент итератора, то <strong>getFilename</strong> возвращает пустое значение.</p>
<p>Пока я ничего лучше не придумал, чем копировать <strong>$item</strong> с помощью метода <strong>clone</strong>:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="re0">$dirTree</span> = <span class="kw2">new</span> DirectoryIterator<span class="br0">&#40;</span><span class="st0">&quot;/testDir&quot;</span><span class="br0">&#41;</span>; <span class="co1">// Допустим в директории файлы a.php и b.php</span><br />
<span class="re0">$items</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$dirTree</span> <span class="kw1">as</span> <span class="re0">$item</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$item</span>-&gt;<span class="me1">isDir</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$items</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = clone <span class="re0">$item</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$item</span>-&gt;<span class="me1">getFilename</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Здесь все ок - сначало выводится a.php, затем b.php</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
<span class="br0">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>
<p><span class="re0">$firstElement</span> = <span class="re0">$items</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
<a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$firstElement</span>-&gt;<span class="me1">getFilename</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// теперь тоже все ок и на экран выводитя - &#8216;a.php&#8217;</span></div>
</div>
<p>Решение мне кажется не очень изящным, поэтому если кто-то подскажет действительно красивый способ выдернуть из <strong>DirectoryIterator</strong> набор директорий в виде массива директорий, то буду очень признателен.</p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/kyvKtXuseI0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2010/07/26/problemy-s-php-directoryiterator/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Как быстро проверить число на NaN</title>
		<link>http://www.codeart.ru/2010/02/04/kak-bystro-proverit-chislo-na-nan/</link>
		<comments>http://www.codeart.ru/2010/02/04/kak-bystro-proverit-chislo-na-nan/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 14:02:42 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Статьи]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[NaN]]></category>

		<category><![CDATA[интересное]]></category>

		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/2010/02/04/kak-bystro-proverit-chislo-na-nan/</guid>
		<description><![CDATA[Сегодня копался в коде jQuery и обратил внимание на то каким образом осуществляется проверка числа на NaN. Вместо того, чтобы использовать стандартную функцию isNaN() Johng Resig преобразует число к строке и сравнивает его со строкой &#8216;NaN&#8217;. 
Я подумал, что раз используется такой странный способ, то тому есть свое логическое объяснение. Первое, что пришло мне на [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня копался в коде jQuery и обратил внимание на то каким образом осуществляется проверка числа на NaN. Вместо того, чтобы использовать стандартную функцию isNaN() Johng Resig преобразует число к строке и сравнивает его со строкой <em>&#8216;NaN&#8217;</em>. </p>
<p>Я подумал, что раз используется такой странный способ, то тому есть свое логическое объяснение. Первое, что пришло мне на ум —  выигрыш в скорости, но как оказалось это совершенно не так.<br />
<span id="more-494"></span></p>
<p>Для проверки  я написал простенький скрипт:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> a<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i = <span class="nu0">0</span>; i &lt; <span class="nu0">100000</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> n = parseInt<span class="br0">&#40;</span><span class="st0">'AAAA'</span><span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isNaN<span class="br0">&#40;</span>n<span class="br0">&#41;</span>; <span class="co1">// true</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>

<span class="kw2">function</span> b<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i = <span class="nu0">0</span>; i &lt; <span class="nu0">100000</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> n = parseInt<span class="br0">&#40;</span><span class="st0">'AAAA'</span><span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'NaN'</span> == n.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> ; <span class="co1">// true</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>

a<span class="br0">&#40;</span><span class="br0">&#41;</span>;
b<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</div>
</pre>
<p>Чтобы не заморачиваться на измерение скорости средствами <strong>JavaScript</strong> использовал  профилирование встроенное в плагин <strong>FireBug</strong>. </p>
<p>После проведение замеров <strong>FireBug</strong> показал следующее:</p>
<blockquote><p>
&nbsp;функция b() - <strong>32 мс</strong><br />
&nbsp;функция a()  - <strong>13 мс.</strong>
</p></blockquote>
<p>Получается, что <strong>isNaN()</strong> работает быстрее более чем в два раза!</p>
<p>Ради справедливости стоит отметить,что  в других браузерах результаты  могут быть иными, возможно даже в более старой версии <strong>FireFox-а</strong> выигрыш будет на стороне <strong>toString()</strong>. Но в <strong>FireFox 3.6 </strong>ситуация такая как я описал выше. </p>
<p>Если кто-то может привести данные о времени работы аналогичного кода для <strong>Оперы</strong> и <strong>IE</strong> милости прошу отписаться в комментариях.</p>
<p>Из сказанного выше, можно сделать вывод, что для работы в <strong>FireFox</strong> лучше использовать функцию <strong>isNaN</strong>. Но значит ли, что не существует другого более быстрого способа проверить число на <strong>NaN</strong>? </p>
<p>Чтобы ответить на данный вопрос, я решил провести еще пару экспериментов. </p>
<p>Первое, что пришло мне на ум — это изменить способ перевода числа в строку, для этого я заменил код <strong>n.toString() == &#8216;NaN&#8217;</strong> на <strong>n&nbsp;+&nbsp;&#8221;&nbsp;===&nbsp;&#8217;NaN&#8217;;</strong> в результате функция <strong>b();</strong> стала выполняться на <strong>5мс</strong> быстрее. Но функция <strong>isNaN()</strong> все равно работала значительно лучше.</p>
<p>Второе решение, я нашел в интернете и заключается оно в том, чтобы проверить равно ли число само себе, а точнее <strong>не</strong> равно ли оно само себе:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">var</span> n = parseInt<span class="br0">&#40;</span><span class="st0">'AAAA'</span><span class="br0">&#41;</span>;
&nbsp;n != n <span class="co1">// true</span></div>
</div>
</pre>
<p>Я уже писал <a href='http://www.codeart.ru/2010/01/28/javascript-grabli-s-nan/'>об особенностях числа NaN</a> одно из которых заключается в том, что <strong>NaN</strong> не равно самому себе, таким образом сравнение <strong>n != n</strong> будет истинным только в случае когда <strong>n</strong> равно <strong>NaN</strong>.</p>
<p>Чтобы проверить указанный метод. Я заменил проверку <strong>toString()</strong> на <strong>n != n</strong> и запустил профилирование повторно. В результате были получены следующие значения:</p>
<blockquote><p>
&nbsp;функция a() - 13 мс<br />
&nbsp;функция b() - 8 мс (!)
</p></blockquote>
<p>Таким образом, на сегодняшний день самый быстрый способ (известный мне) проверить число на значение NaN — это выполнить проверку <strong>n != n</strong>. </p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/nSsD-ZXFAoU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2010/02/04/kak-bystro-proverit-chislo-na-nan/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JavaScript. Грабли с NaN</title>
		<link>http://www.codeart.ru/2010/01/28/javascript-grabli-s-nan/</link>
		<comments>http://www.codeart.ru/2010/01/28/javascript-grabli-s-nan/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 13:04:55 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Статьи]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[NaN]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/2010/01/28/javascript-grabli-s-nan/</guid>
		<description><![CDATA[Программируя на javascript никогда не знаешь когда встанешь на очередную граблю. Иногда складывается впечатление, что в языке больше плохого чем, хорошего. 
Например, в JS есть такое значение — NaN расшифровывается как Not A Number. Обычно это значение возвращается при ошибке выполнения операций с числами.



parseInt&#40;'AAAA'&#41;; // NaN
parseInt&#40;'1'&#41;; // 1
parseInt&#40;'16 somthing else'&#41;; // 16 — неожиданно, правда?


В [...]]]></description>
			<content:encoded><![CDATA[<p>Программируя на javascript никогда не знаешь когда встанешь на очередную граблю. Иногда складывается впечатление, что в языке больше плохого чем, хорошего. </p>
<p>Например, в JS есть такое значение — <strong>NaN</strong> расшифровывается как <strong>Not A Number</strong>. Обычно это значение возвращается при ошибке выполнения операций с числами.<br />
<span id="more-488"></span></p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">parseInt<span class="br0">&#40;</span><span class="st0">'AAAA'</span><span class="br0">&#41;</span>; <span class="co1">// NaN</span>
parseInt<span class="br0">&#40;</span><span class="st0">'1'</span><span class="br0">&#41;</span>; <span class="co1">// 1</span>
parseInt<span class="br0">&#40;</span><span class="st0">'16 somthing else'</span><span class="br0">&#41;</span>; <span class="co1">// 16 — неожиданно, правда?</span></div>
</div>
</pre>
<p>В данном примере, при выполнении первой операции функция <strong>parseInt</strong> не смогла преобразовать строку в число и поэтому вернула значения <strong>NaN</strong>. А вот в 3-ей строке, все прошло успешно, что кажется мне не совсем логичным.</p>
<p>Другие фокусы, которые выкидывает <strong>JavaScript</strong> хорошо демонстрирует следующий пример:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">NaN == NaN; <span class="co1">// false</span>
NaN != NaN; <span class="co1">// true</span>
NaN &gt; NaN; <span class="co1">// false</span>
NaN &lt; NaN; <span class="co1">// false</span>

<span class="kw1">typeof</span> NaN === <span class="st0">'number'</span>;&nbsp; <span class="co1">// true</span></div>
</div>
</pre>
<p>Получается, что NaN не равен сам себе, одновременно NaN не больше и не меньше самого себя. А если запросить его тип, то оказывается, что это число. Непонятно, почему тогда не работают операции сравнения.</p>
<p>Плохо в данной ситуации то, что код который многим кажется вполне рабочим, на самом деле таковым не является:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> sum<span class="br0">&#40;</span>a, b<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; a = parseInt<span class="br0">&#40;</span>a, <span class="nu0">10</span><span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; b = parseInt<span class="br0">&#40;</span>b, <span class="nu0">10</span><span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>a == NaN || b == NaN<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">'Ошибка'</span><span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>; 
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> a+b;
<span class="br0">&#125;</span>

sum<span class="br0">&#40;</span><span class="st0">'1'</span>, <span class="st0">'bbbb'</span><span class="br0">&#41;</span>;&nbsp; <span class="co1">// NaN</span></div>
</div>
</pre>
<p>Причина, в том, что сравнение <strong>a == NaN || b == NaN</strong> — всегда будет возвращать false, даже если a или b будут иметь значение NaN.</p>
<p>Для того, чтобы узнать содержит ли переменная значение NaN используется функция isNaN:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">isNaN<span class="br0">&#40;</span>NaN<span class="br0">&#41;</span>; <span class="co1">// true</span>
isNaN<span class="br0">&#40;</span><span class="st0">'AAAA'</span><span class="br0">&#41;</span>; <span class="co1">// true</span>
isNaN<span class="br0">&#40;</span><span class="st0">'0'</span><span class="br0">&#41;</span>; <span class="co1">// false</span></div>
</div>
</pre>
<p>Чтобы избежать проблем со значением NaN я использую собственную функцию определения является ли переменная числом:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> isNum<span class="br0">&#40;</span>v<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">typeof</span> v === <span class="st0">'number'</span> &amp;&amp; isFinite<span class="br0">&#40;</span>v<span class="br0">&#41;</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<img src="http://feeds.feedburner.com/~r/codeart/~4/XIvNvymsQ_Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2010/01/28/javascript-grabli-s-nan/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Подводные камни JavaScript или опасное свойство Semicolon insertion.</title>
		<link>http://www.codeart.ru/2010/01/25/podvodnye-kamni-javascript-ili-opasnoe-svojstvo-semicolon-insertion/</link>
		<comments>http://www.codeart.ru/2010/01/25/podvodnye-kamni-javascript-ili-opasnoe-svojstvo-semicolon-insertion/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 14:18:19 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Статьи]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/2010/01/25/podvodnye-kamni-javascript-ili-opasnoe-svojstvo-semicolon-insertion/</guid>
		<description><![CDATA[Я очень люблю язык JavaScript, на мой взгляд его преимущества с лихвой покрывают многочисленные недостатки. Но чтобы писать хорошие программы на этом языке нужно четко понимать какие опасности в нем таятся.
Одна из них заключается в том, что синтаксис JS  не требует обязательного использования точки с запятой для разделения конструкций языка, но при этом на [...]]]></description>
			<content:encoded><![CDATA[<p>Я очень люблю язык JavaScript, на мой взгляд его преимущества с лихвой покрывают многочисленные недостатки. Но чтобы писать хорошие программы на этом языке нужно четко понимать какие опасности в нем таятся.</p>
<p>Одна из них заключается в том, что синтаксис JS  не требует обязательного использования точки с запятой для разделения конструкций языка, но при этом на этапе выполнения недостающие символы расставляются автоматически.<br />
<span id="more-486"></span></p>
<p>Данная особенность, упрощает программирование и в простейших случаях  не вызывает никаких проблем. Возьмем следующий код:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">var</span> a
<span class="kw2">var</span> b</div>
</div>
</pre>
<p>Во время выполнения он будет преобразован к следующем виду:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">var</span> a;
<span class="kw2">var</span> b;</div>
</div>
</pre>
<p>И это не приведет к негативным последствиям. Но к сожалению ни один язык в мире не способен читать мысли программиста, поэтому в другой ситуации неудачное преобразование может вызвать появление серьезных ошибок. </p>
<p>Для примера возьмем следующий код:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> a<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> 
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">false</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Не трудно догадаться, что в данной ситуации программист хотел чтобы функция возвращала значение «false». Но на самом деле она возвращает значение «undefined». И это вполне закономерно, потому что реально исполняется совсем другой код:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> a<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> ; <span class="co1">// Обратите внимание JS сам доставил «недостающий» знак точки с запятой</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">false</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Самое простое, что можно сделать для избежания проблем с Semicolon insertion — это не разрывать строки на две подстроки.  Но и этого будет недостаточно, для написания абсолютно безопасного кода.</p>
<p>Синтаксис JavaScript очень похож на синтаксис языка «Си». Например, для выделения блоков когда в JS как и в «Си» используются фигурные скобки. </p>
<p>Обычно программисты предпочитают один из двух вариантов оформления. </p>
<p>Первый — это когда открывающая фигурная скобка находится на одном уровне с конструкцией к которой она относится:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> a<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value: <span class="kw2">false</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Второй - когда открывающую скобку помещают на уровень ниже</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> a<span class="br0">&#40;</span><span class="br0">&#41;</span> 
<span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> 
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value: <span class="kw2">false</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Не трудно догадаться, что для JavaScript второй вариант пригоден не во всех случаях,  в примере выше во время выполнения будет получен следующий код:</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> a<span class="br0">&#40;</span><span class="br0">&#41;</span> 
<span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> ;
&nbsp; &nbsp; &nbsp; &nbsp; value: 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">false</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Обратите внимание, что в этом примере не только прибавились «недостающие» знаки, но и исчезли «лишние»  символы фигурных скобок. Поэтому, чтобы избежать  проблем в JavaScript, лучше не использовать переносы строк перед открывающей фигурной скобкой.</p>
<p>Конечно, сказанное выше описывает далеко не все возможные ситуации когда Semicolon insertion вызовет проблемы при выполнении кода. Поэтому я приглашаю всех дополнить эту статью своими примерами и мыслями используя для этого комментарии.</p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/p64EApX5pIc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2010/01/25/podvodnye-kamni-javascript-ili-opasnoe-svojstvo-semicolon-insertion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ограничения на Cookie</title>
		<link>http://www.codeart.ru/2010/01/20/ogranicheniya-na-cookie/</link>
		<comments>http://www.codeart.ru/2010/01/20/ogranicheniya-na-cookie/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 14:13:53 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/2010/01/20/ogranicheniya-na-cookie/</guid>
		<description><![CDATA[Давно хотел разобраться с тем какие ограничения накладывают браузеры на хранение куков (cookie). Сегодня смог выкроить на это время и провести несколько простых тестов. Так как на полноту эксперимента я не претендую, то для исследования взял только три браузера -  Opera 9, FireFox 3, InternetExplorer 8. Далее о том, какие результаты получены.

Для начала  [...]]]></description>
			<content:encoded><![CDATA[<p>Давно хотел разобраться с тем какие ограничения накладывают браузеры на хранение куков (cookie). Сегодня смог выкроить на это время и провести несколько простых тестов. Так как на полноту эксперимента я не претендую, то для исследования взял только три браузера -  Opera 9, FireFox 3, InternetExplorer 8. Далее о том, какие результаты получены.<br />
<span id="more-472"></span></p>
<p>Для начала  я прошелся по стандартным вещам - <strong>максимальный суммарный размер данных для всех куков на один домен</strong> и <strong>их общее количество</strong>. </p>
<p>В плане размера все браузеры показали примерно одинаковые результаты - 4096 симовлов (это включая знак равенства и имя самой куки). Что касается количества, то тут результаты разные:</p>
<blockquote><p>
<strong>&nbsp;FireFox 3</strong> - 50 куков на домен;<br />
<strong>&nbsp;Opera 9</strong> - 30 куков на домен;<br />
<strong>&nbsp;InternetExplorer</strong> - 50 куков на домен. (<em>напомню, что в IE6 можно было хранить не более 20 куков на домен</em>)
</p></blockquote>
<p>
Затем, мне стало интересно, а что будет если количество куков, полученных от сервера, превысит указанные ограничения. Логично предположить, что в таком случае браузер удалит самую старую куку и добавит одну из новых. Данное предположение оказалось истинным только для IE8 и Opera 9, а вот FireFox повел себя странным образом начав удалять куки в произвольном порядке.</p>
<p>Последний вопрос, который меня интересовал заключается в следующем: существует ли ограничение на общее количество хранимых куков. Фактически я хотел определить сколько различных сайтов можно посетить не боясь, что часть куков будет потеряна. Может быть кто-то помнит, в Netscape-их спецификациях было указано, что суммарное количество хранимых куков должно быть не менее 300.</p>
<p>Прежде чем я приведу результаты проверки, пара слов о том как я ее проводил. Для имитации большого числа различных доменов, я внес в файл хостов (hosts) порядка 30 тыс. доменов, следующего вида &#8220;www.d<em>XXXXX</em>.ru&#8221;, где вместо <em>XXXXX</em> - указывается порядковый номер домена. Затем, с помощью небольшого скрипта на JS, загруженного в браузере, я последовательно обошел все домены и установил максимально разрешенное количество куков. После чего, другим скриптом проверил какие куки были сохранены. </p>
<p>В итоге у меня получились следующие ограничения (еще раз обращаю внимание, что приведенные ниже цифры отражают максимальное количество куков, которое может запомнить браузер!) :</p>
<blockquote><p>
&nbsp;<strong>FireFox 3</strong> - 3000 куков;<br />
&nbsp;<strong>Opera 9</strong> - 65535 куков;<br />
&nbsp;<strong>InternetExplorer</strong> - неограниченное число куков (<em>мне надоело проверять после того как были успешно установлено 150 тыс. куков</em>).
</p></blockquote>
<p>Честно говоря, меня очень разочаровал показатель полученный в FireFox, ведь при установке 50 куков на один домен можно хранить информацию только от 60 сайтов, а это мало. С другой стороны, на практике даже скромного значения в 3000 куков оказывается вполне достаточно. Главное понимать для чего нужны куки и как их правильно использовать.</p>
<p>Полученные сведения, еще раз доказывают, что использовать куки нужно без фанатизма, так как у них существуют весьма значительные ограничения (особенно в FireFox).</p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/svctNi88r9g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2010/01/20/ogranicheniya-na-cookie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Что-то странное творится с моим WordPress-ом</title>
		<link>http://www.codeart.ru/2009/12/16/chto-to-strannoe-tvoritsya-s-moim-wordpress-om/</link>
		<comments>http://www.codeart.ru/2009/12/16/chto-to-strannoe-tvoritsya-s-moim-wordpress-om/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 14:02:51 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Офтопик]]></category>

		<category><![CDATA[Hack]]></category>

		<category><![CDATA[WordPress]]></category>

		<category><![CDATA[Хак]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/2009/12/16/chto-to-strannoe-tvoritsya-s-moim-wordpress-om/</guid>
		<description><![CDATA[Наткнулся на большое количество странных комментариев в своем блоге. Странность их заключается в том, что у все в поле URL внесено значение начинающееся со знака - &#8216;%&#8217; (процент). И все бы ничего. Но такие комментарии почему-то не попадают на модерацию, а вместо этого сразу публикуются в блог. 
Изучать этот вопрос сейчас нет времени. Но почему-то [...]]]></description>
			<content:encoded><![CDATA[<p>Наткнулся на большое количество странных комментариев в своем блоге. Странность их заключается в том, что у все в поле URL внесено значение начинающееся со знака - &#8216;%&#8217; (процент). И все бы ничего. Но такие комментарии почему-то не попадают на модерацию, а вместо этого сразу публикуются в блог. </p>
<p>Изучать этот вопрос сейчас нет времени. Но почему-то кажется, что это какая-то дыра в WordPress. Кто-нибудь может подтвердить или опровергнуть мое предположение? </p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/bqU6nb8X4uQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2009/12/16/chto-to-strannoe-tvoritsya-s-moim-wordpress-om/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CakePHP. Как создать модуль без привязки к таблице в базе данных</title>
		<link>http://www.codeart.ru/2008/09/06/cakephp-kak-sozdat-modul-bez-privyazki-k-tablice-v-baze-dannyx/</link>
		<comments>http://www.codeart.ru/2008/09/06/cakephp-kak-sozdat-modul-bez-privyazki-k-tablice-v-baze-dannyx/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 08:54:07 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Вопрос/Ответ]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/2008/09/06/cakephp-kak-sozdat-modul-bez-privyazki-k-tablice-v-baze-dannyx/</guid>
		<description><![CDATA[Недавно я решил пересесть с фреймворка CodeIgniter на CakePHP. Такой выбор был сделан по двум причинам: во-первых, некоторые читатели моего блога смогли меня убедить в полезности этого шага, во-вторых в Интернете полным полно утверждений, что CakePHP - это мега крутое приложение с невероятными возможностями.
Переход состоялся, но не так гладко как хотелось. Вот одна из проблем [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно я решил пересесть с фреймворка CodeIgniter на CakePHP. Такой выбор был сделан по двум причинам: во-первых, некоторые читатели моего блога смогли меня убедить в полезности этого шага, во-вторых в Интернете полным полно утверждений, что CakePHP - это мега крутое приложение с невероятными возможностями.</p>
<p>Переход состоялся, но не так гладко как хотелось. Вот одна из проблем - по умолчанию CakePHP считает, что каждый модуль имеет собственную таблицу в базе данных. При этом имя таблицы совпадает с именем самого модуля. Но иногда  встречаются ситуации когда модуль не имеет данных, которые нужно сохранять в базе. В таком случае необходимо дополнительно указать, что у модуля нет собственной таблицы. О том как это сделать и какие трудности у меня возникли далее в этом посте.<br />
<span id="more-450"></span><br />
После недолгих изысканий выяснилось, что для указания таблицы с данными используется специальная переменная <i>$useTable</i>. Если значение переменной не задано (равно null), то фреймворк подставляет его самостоятельно. В случае, если имя таблицы в базе отлично от имени самого модуля, необходимо самостоятельно задать значение переменной <em>$useTable</em>. Если таблицы нет, то нужно присвоить переменной значение false. </p>
<p>Важный момент, при создании модуля через &#8220;CakePHP console&#8221; невозможно создать модуль без привязки к таблице. Точнее возможность есть, только реализована она некорректно. Поясню более детально. Допустим мы создаем модуль &#8220;test&#8221;, тогда в консоли будет задан следующий вопрос:</p>
<blockquote><p>Given your model named &#8216;test&#8217;, Cake would expect a database table named tests<br />
Do you want to use this table? (y/n)</p></blockquote>
<p>Т.е. либо фремворк попытается самостоятельно определить имя таблицы, либо, при получении отрицательного ответа на вопрос, предложит вам задать имя самостоятельно:</p>
<blockquote><p>What is the name of the table (enter &#8220;null&#8221; to use NO table)?</p></blockquote>
<p>Если при ответе на данный вопрос ввести &#8220;null&#8221; (как сказано в подсказке), то в модуль будет добавлена следующая строка:</p>
<div class="codesnip-container" >var $useTable = &#8216;null&#8217;;</div>
<p>Что CakePHP понимает как необходимость обратиться к таблице с именем &#8220;null&#8221;, такой таблице в базе, естественно нет, в результате выдается ошибка.</p>
<p>Или вот еще одна особенность, связанная с привязкой модуля к контроллеру. Контроллер  автоматически пытается найти принадлежащий ему модуль, но тут есть одна деталь, если имя контроллера заканчивается на &#8217;s&#8217;, то CakePHP обрежет эту букву и получившееся имя будет воспринимать как название модуля. Например: если имя контроллера - blogs, то имя модуля - blog. Чтобы указать имя модуля в явном виде, нужно в контроллере задать переменную <em>$uses</em> и присвоить имя нужного модуля.</p>
<p>На самом деле, великое множество разных предположений, которые делает CakePHP, с одной стороны, конечно, ускоряют процесс разработки. Но с другой стороны, если где-то возникает ошибка, требуется очень много времени, чтобы разобраться, а почему собственно фреймворк делает что-то так, а не иначе. Плюс остается небольшой страх, что не зная какой-то особенности, в результате может получиться приложение которое будет функционировать не как ты задумал, а как бог на душу положит.</p>
<p>Например, на то, чтобы понять, почему модуль созданный чере &#8220;CakePHP console&#8221;, категорически отказывается работать, у меня ушло больше половины рабочего дня. А всего-то надо было заменить <em>$useTable = &#8216;null&#8217;;</em> на <em>$useTable = false;</em>. </p>
<p>Так что пока CodeIgniter как-то ближе, и намного понятнее!</p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/E5P9NdqU9EU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2008/09/06/cakephp-kak-sozdat-modul-bez-privyazki-k-tablice-v-baze-dannyx/feed/</wfw:commentRss>
		</item>
		<item>
		<title>О многоязычных (IDN) доменах</title>
		<link>http://www.codeart.ru/2008/09/04/o-mnogoyazychnyx-idn-domenax/</link>
		<comments>http://www.codeart.ru/2008/09/04/o-mnogoyazychnyx-idn-domenax/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 05:18:03 +0000</pubDate>
		<dc:creator>Evgeny Sergeev</dc:creator>
		
		<category><![CDATA[Главная]]></category>

		<guid isPermaLink="false">http://www.codeart.ru/2008/09/04/o-mnogoyazychnyx-idn-domenax/</guid>
		<description><![CDATA[Сегодня получил письмо от RU-CENTER, в котором говорится о том, что они начали регистрацию многоязычных (IDN) доменов в зоне СОМ и NET. Среди поддерживаемых алфавитов в том числе и кириллица. Так как совсем недавно я закинул на счет в RU-CENTER деньги на текущие расходы. То часть этих денег решил потратить на кириллистические домены. Далее пару [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня получил письмо от RU-CENTER, в котором говорится о том, что они начали регистрацию многоязычных (IDN) доменов в зоне СОМ и NET. Среди поддерживаемых алфавитов в том числе и кириллица. Так как совсем недавно я закинул на счет в RU-CENTER деньги на текущие расходы. То часть этих денег решил потратить на кириллистические домены. Далее пару мыслей о нужности/ненужности этих доменов.<br />
<span id="more-449"></span></p>
<p>На самом деле очень забавно пытаться придумать красивое доменное имя на родном языке. При этом стараться не строить описательные имена, а вместо этого найти короткое словечко, бьющее прямо в цель. В итоге я остановился только на двух именах &#8220;баг.net&#8221; и &#8220;веб-программирование.com&#8221;, которые благополучно скупил. </p>
<p>Уже в процессе покупки мне пришло в голову, что если запомнить такие доменные имена несложно, то вводить в строку браузер информацию на двух языках неудобно - имя вводишь на русском, а  зону &#8220;COM&#8221; или &#8220;NET&#8221; на  английском (где-то читал про алиасы с com на ком, но есть ли такое на самом деле не знаю). Я успокоил себя мыслю, что в большинстве случае никто вручную не вводит адреса сайтов. А если и вводят то делают это не так часто чтобы запариться.  </p>
<p>Еще не понравилась цена 600р. - для COM и 450р. - для NET. Я уже давно <a href="http://gogolev.net/domains">покупаю домены  за 110р.</a> у Саши Гоголева. Поэтому, жаба немного зажала. Так что если знаете дешевых регистраторов русскоязычных доменов милости прошу в комментарии.</p>
<p>Думаю, что понимание того стоит или не стоит покупать русские доменные имена придет позже. Но к тому времени хороших имен может не остаться. Поэтому надо брать пока дают. Правда, на данный момент мне кажется, что домены на английском как были востребованы так и будут. В пользу этого говорит хотя бы тот факт, что IDN существует аж с 2001 года, но до сих пор не набрал большой популярности.</p>
<p>В заключение, хочу немного отвлечься от темы доменов и сказать, что Дима Наумов  <a href="http://maxibiz.blogspot.com/2008/08/2008.html">упомянул мой блог</a> сказав, что он обладает приятно атмосферой. Приятно, черт возьми! </p>
<img src="http://feeds.feedburner.com/~r/codeart/~4/Q9E25gvvDRo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codeart.ru/2008/09/04/o-mnogoyazychnyx-idn-domenax/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
