<?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/"
	>

<channel>
	<title>Мир php моими глазами</title>
	<atom:link href="http://www.intval.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.intval.ru</link>
	<description>Грабли, костыли и другие умные мысли</description>
	<pubDate>Mon, 22 Feb 2010 19:05:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Таймланс</title>
		<link>http://www.intval.ru/2010/02/22/%d1%82%d0%b0%d0%b9%d0%bc%d0%bb%d0%b0%d0%bd%d1%81/</link>
		<comments>http://www.intval.ru/2010/02/22/%d1%82%d0%b0%d0%b9%d0%bc%d0%bb%d0%b0%d0%bd%d1%81/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 19:05:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Пеар]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=151</guid>
		<description><![CDATA[Быстрый рост Интернета и информационных потребностей людей привели к появлению в Сети большого количества проектов, позволяющих свести покупателей и продавцов, однако зачастую эти связи оказываются недолгосрочными. Прочной основной удалённой работы, поиск исполнителей на выполнение услуг, а также продажа товаров доступны на Timelance.ru.

Здесь Вы легко сможете разместить предложения удалённой работы (в качестве заказчика) или зарегистрироваться в [...]]]></description>
			<content:encoded><![CDATA[<p>Быстрый рост Интернета и информационных потребностей людей привели к появлению в Сети большого количества проектов, позволяющих свести покупателей и продавцов, однако зачастую эти связи оказываются недолгосрочными. Прочной основной удалённой работы, поиск исполнителей на выполнение услуг, а также продажа товаров доступны на Timelance.ru.</p>
<p><span id="more-151"></span></p>
<p>Здесь Вы легко сможете разместить предложения удалённой работы (в качестве заказчика) или зарегистрироваться в качестве исполнителя. Таймланс охвачивает все возможные сферы деятельности людей и даёт возможность разместить предложения о продаже любых товаров.</p>
<p>Уникальность проекта проекта Timelance.ru - это возможность удовлетворения максимально возможного количества потребоностей человека благодаря одному веб-сервису. Здесь Вы можете как найти исполнителя любой полезной работы, так и сами выступить исполнителем других работ, специфичных Вашей любимой профессии.</p>
<p>Помимо этого, существует возможность покупки и продажи товаров через аукцион, в том числе через сделки в реальном времени.</p>
<p>Ждём Вас на <a href="http://www.timelance.ru" target="_blank">http://www.timelance.ru</a></p>
<p>P. S. Моего в сайте не очень много :) в основном его реанимация и небольшие доработки <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Но сейчас работает как часы, так что советую <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2010/02/22/%d1%82%d0%b0%d0%b9%d0%bc%d0%bb%d0%b0%d0%bd%d1%81/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PhpDoc для конкретной переменной</title>
		<link>http://www.intval.ru/2009/12/10/phpdoc-%d0%b4%d0%bb%d1%8f-%d0%ba%d0%be%d0%bd%d0%ba%d1%80%d0%b5%d1%82%d0%bd%d0%be%d0%b9-%d0%bf%d0%b5%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%bd%d0%be%d0%b9/</link>
		<comments>http://www.intval.ru/2009/12/10/phpdoc-%d0%b4%d0%bb%d1%8f-%d0%ba%d0%be%d0%bd%d0%ba%d1%80%d0%b5%d1%82%d0%bd%d0%be%d0%b9-%d0%bf%d0%b5%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%bd%d0%be%d0%b9/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 16:24:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=148</guid>
		<description><![CDATA[Мне никогда не нравился паттерн Factory в php. Не потому что он плохой или неудобный, нет. Просто IDE никак не понимали то что фабрика собственно возвращает. Это как и вечная проблема, что в phpDoc-ах можно указать какие параметры принимаются методом, какие возвращаются им, но никак нельзя указать класс для конкретной переменной.
Но недавно оказалось что можно. [...]]]></description>
			<content:encoded><![CDATA[<p>Мне никогда не нравился паттерн Factory в php. Не потому что он плохой или неудобный, нет. Просто IDE никак не понимали то что фабрика собственно возвращает. Это как и вечная проблема, что в phpDoc-ах можно указать какие параметры принимаются методом, какие возвращаются им, но никак нельзя указать класс для конкретной переменной.</p>
<p>Но недавно оказалось что можно. На примере:</p>
<p>$input = Input_Factory::factory('text'); /*@var $input Input_Text*/</p>
<p>И ура, подсказки работают <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/12/10/phpdoc-%d0%b4%d0%bb%d1%8f-%d0%ba%d0%be%d0%bd%d0%ba%d1%80%d0%b5%d1%82%d0%bd%d0%be%d0%b9-%d0%bf%d0%b5%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%bd%d0%be%d0%b9/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL альтернативный синтаксис INSERT</title>
		<link>http://www.intval.ru/2009/12/10/mysql-%d0%b0%d0%bb%d1%8c%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%82%d0%b8%d0%b2%d0%bd%d1%8b%d0%b9-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81-insert/</link>
		<comments>http://www.intval.ru/2009/12/10/mysql-%d0%b0%d0%bb%d1%8c%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%82%d0%b8%d0%b2%d0%bd%d1%8b%d0%b9-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81-insert/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 16:12:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=146</guid>
		<description><![CDATA[Недавно узнал, что оказывается MySQL поддерживает 2-й альтернативный синтаксис оператора INSERT  
Ну традиционный понятно:
INSERT INTO sometable (`field1`, `field2`,  `field3`)  VALUES ('value1', 'value2', 'value3');
А альтернативный как и UPDATE:
INSERT INTO sometable SET `field1`='value1' , `field2`='value2', `field3`='value3';
]]></description>
			<content:encoded><![CDATA[<p>Недавно узнал, что оказывается MySQL поддерживает 2-й альтернативный синтаксис оператора INSERT <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ну традиционный понятно:</p>
<p>INSERT INTO sometable (`field1`, `field2`,  `field3`)  VALUES ('value1', 'value2', 'value3');</p>
<p>А альтернативный как и UPDATE:</p>
<p>INSERT INTO sometable SET `field1`='value1' , `field2`='value2', `field3`='value3';</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/12/10/mysql-%d0%b0%d0%bb%d1%8c%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%82%d0%b8%d0%b2%d0%bd%d1%8b%d0%b9-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81-insert/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP_EOL</title>
		<link>http://www.intval.ru/2009/10/23/php_eol/</link>
		<comments>http://www.intval.ru/2009/10/23/php_eol/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 09:25:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=144</guid>
		<description><![CDATA[Наткнулся на прикольную предопределенную константу PHP_EOL в которой лежит "\n", если сервер линуксовый или "\r\n" если виндошный. Ниче особенного, просто прикольная штука
]]></description>
			<content:encoded><![CDATA[<p>Наткнулся на прикольную предопределенную константу PHP_EOL в которой лежит "\n", если сервер линуксовый или "\r\n" если виндошный. Ниче особенного, просто прикольная штука</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/10/23/php_eol/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Смена базы данных на php-проектах</title>
		<link>http://www.intval.ru/2009/05/27/%d1%81%d0%bc%d0%b5%d0%bd%d0%b0-%d0%b1%d0%b0%d0%b7%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%bd%d0%b0-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0%d1%85/</link>
		<comments>http://www.intval.ru/2009/05/27/%d1%81%d0%bc%d0%b5%d0%bd%d0%b0-%d0%b1%d0%b0%d0%b7%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%bd%d0%b0-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0%d1%85/#comments</comments>
		<pubDate>Wed, 27 May 2009 14:34:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Холивары]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=139</guid>
		<description><![CDATA[Есть в программировании люди, которых хлебом не корми - дай сделать систему настолько расширяемой и настраиваемой насколько это только возможно. Я уже упоминал про это косвенно в посте На будущее- но есть и частный случай такого подхода - чрезмерные абстракции с базами данных.
Суть ситуации в том, что люди намеряно сводят работу с базой данных до [...]]]></description>
			<content:encoded><![CDATA[<p>Есть в программировании люди, которых хлебом не корми - дай сделать систему настолько расширяемой и настраиваемой насколько это только возможно. Я уже упоминал про это косвенно в посте <a title="На будущее" href="http://www.intval.ru/2009/03/30/for-future/">На будущее</a>- но есть и частный случай такого подхода - чрезмерные абстракции с базами данных.</p>
<p>Суть ситуации в том, что люди намеряно сводят работу с базой данных до уровня insert, update, select, delete, создавая особо извращенные варианты доступа к этим самим данным. Любые - лишь бы не SQL. В итоге, понятное дело, без извращений в таких вещах очень сложно сделать простые с точки зрения запросов вещи. Ну например, счетчик посещений сайта и например ORM.</p>
<p>Алгоритм какой будет?</p>
<p>1. Выбрали данные;</p>
<p>2. Увеличили на 1;</p>
<p>3. Сохранили данные.</p>
<p>А что если на сайт почти одновременно зайдут 2 пользователя? <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Причем до шагов этого алгоритма они дойдут параллельно и в одно время. Т.е. 1-й делает выбор данных, потом второй, потом первый - увеличивает счетчик и т.п.? понимаете? <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>В самой базе все проще - UPDATE четотам SET `count`=`count`+1 WHERE четотам. И никаких глюков - потому что запросы будут выполняться последовательно.</p>
<p>Когда же копаешь глубже о причинах таких диких абстракций - оказывается, что все для того, чтобы:</p>
<p><em>Если заказчик захочет сменить базу данных скажем с MySQL на Oracle - то мы всего лишь переписали бы конфиг и все запалило на ура вместо того, чтобы переколбашивать весь сайт.</em></p>
<p>Я однажды не выдержал и поспрашивал всех кого знал, а сталкивался ли кто-нить из них с такой задачей - и оказалось что такое всплыло 1 раз на примерно 500-700 проектов, в которых участвовали опрошенные <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Проблема эта в мире по на заказ (при разработке пакетных вещей - другие законы совсем, не нужно путать эти миры) - надуманная и определенно не стоит тех мучений и костылей, которые приходится делать в подобных системах.</p>
<p>Надеюсь, кому-то этот пост поможет перестать наступать себе на яйца при разработке. Помните: какой бы ни была по сложности задача смены СУБД - вы или фирма все равно на ней нагреетесь - заказчик хочет - заказчик платит <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/27/%d1%81%d0%bc%d0%b5%d0%bd%d0%b0-%d0%b1%d0%b0%d0%b7%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%bd%d0%b0-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0%d1%85/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Многострочные строки в javascript</title>
		<link>http://www.intval.ru/2009/05/27/%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d1%81%d1%82%d1%80%d0%be%d1%87%d0%bd%d1%8b%d0%b5-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b8-%d0%b2-javascript/</link>
		<comments>http://www.intval.ru/2009/05/27/%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d1%81%d1%82%d1%80%d0%be%d1%87%d0%bd%d1%8b%d0%b5-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b8-%d0%b2-javascript/#comments</comments>
		<pubDate>Wed, 27 May 2009 14:05:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=137</guid>
		<description><![CDATA[Мож кто и в курсе, но я не знал и не сразу вкурил. Оказывается,  в джаваскрипте многострочные строки можно писать не только вот так:
var val = 'Индикатор ядовито'+
' гидролизует сернистый газ,'+
' таким образом за синтез';
А еще и вот так:
var val = 'Индикатор ядовито\
гидролизует сернистый газ,\
таким образом за синтез';
Не сказать, чтобы было гораздо читабельнее, но есть [...]]]></description>
			<content:encoded><![CDATA[<p>Мож кто и в курсе, но я не знал и не сразу вкурил. Оказывается,  в джаваскрипте многострочные строки можно писать не только вот так:<br />
var val = 'Индикатор ядовито'+<br />
' гидролизует сернистый газ,'+<br />
' таким образом за синтез';</p>
<p>А еще и вот так:<br />
var val = 'Индикатор ядовито\<br />
гидролизует сернистый газ,\<br />
таким образом за синтез';</p>
<p>Не сказать, чтобы было гораздо читабельнее, но есть и такой вариант <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/27/%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d1%81%d1%82%d1%80%d0%be%d1%87%d0%bd%d1%8b%d0%b5-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b8-%d0%b2-javascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Сравнение строк и чисел в MySQL</title>
		<link>http://www.intval.ru/2009/05/14/digits-and-strings/</link>
		<comments>http://www.intval.ru/2009/05/14/digits-and-strings/#comments</comments>
		<pubDate>Thu, 14 May 2009 11:41:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Грабли]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=135</guid>
		<description><![CDATA[За время работы я как-то привык, что если в интовые поля вставлять числа, оформленные как строки - то оно палит. Аналогично и если выбирает по id='5' например то тоже все ок и конвертируется в нужное...
Но вот недавно столкнулся с интересной ситуацией - поле varchar - там лежат числа. И получается что-то вроде:
select '33' &#62; '5';
причем [...]]]></description>
			<content:encoded><![CDATA[<p>За время работы я как-то привык, что если в интовые поля вставлять числа, оформленные как строки - то оно палит. Аналогично и если выбирает по id='5' например то тоже все ок и конвертируется в нужное...</p>
<p>Но вот недавно столкнулся с интересной ситуацией - поле varchar - там лежат числа. И получается что-то вроде:</p>
<p>select '33' &gt; '5';</p>
<p>причем выбирает есесна 0 <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> т.е. фолс, т.к. сравнивает строки. Такое вполне очевидно, но привыкаешь постепенно что с нестрогой нет проблем <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> вот тебе и такое <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/14/digits-and-strings/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Антиюзабилити в регистрации и авторизации</title>
		<link>http://www.intval.ru/2009/05/14/autorization/</link>
		<comments>http://www.intval.ru/2009/05/14/autorization/#comments</comments>
		<pubDate>Thu, 14 May 2009 10:42:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Тупые решения]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=133</guid>
		<description><![CDATA[Хотел вначале по посту о каждой - но понял что лучше все написать вместе. Вот самые распространенные тупые решения при создании авторизации пользователей на сайте:

Email в качестве логина -  пожалуй, первое место в списке тупых идей. Сама идея такого подхода как раз-таки направлена на то, чтобы пользователю было проще регистрироваться. Типа вбивать меньше данных и [...]]]></description>
			<content:encoded><![CDATA[<p>Хотел вначале по посту о каждой - но понял что лучше все написать вместе. Вот самые распространенные тупые решения при создании авторизации пользователей на сайте:</p>
<ol>
<li><strong>Email в качестве логина</strong> -  пожалуй, первое место в списке тупых идей. Сама идея такого подхода как раз-таки направлена на то, чтобы пользователю было проще регистрироваться. Типа вбивать меньше данных и все такое. Но на деле получается как раз наоборот - пользователь регистрируется не только на этом сайте, причем в большинстве случаев он вводит логин и пароль и ни разу не мыло в качестве логина. Он привыкает к этой паре логин-пароль и для него вбивать емэйл просто неочевидно, непривычно, не говоря уже о том, что если мыльников штук 5 - то какой именно был вбит при регистрации - вопрос достойный Что? Где? Когда?. Ну а если в форме авторизации еще и не подписано что вводить надо емэйл - ууууууууу <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>Ограничения на выбор пароля</strong> - секъюрность - это круто, несомненно. Только вот пользователь привыкает к своей привычной паре логин-пароль. А вот если привычный пароль не проходит ограничения, выбирает новый, который с 90%-й вероятностью забудет тут же как вбил. На следующем заходе запросит восстановление - и пароль будет пылиться на мыле и каждый раз он будет заходить на мыло, смотреть пароль и вставлять в форму <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Вы считаете, что ваш аккаунт на вашем сайте - самое важно в жизни пользователя? ну-ну :)) Безопасность - это важно, когда нужно. Пусть пользователи сами решают, важен для них ваш сайт или он достоин пароля 12345.</li>
<li><strong>Капча + подтверждение e</strong><strong>mail-а в регистрации </strong>- одной капчи с головой хватит чтобы вырубить ботов. Да есть метод леммингов для ее обхода, но много ли кому не влом его прикручивать? С подтверждением по emailу (активацией аккаунта) есть вечная проблема - обязательно у какого-нить письма не будут приходить. Или они в спам уйдут или еще какая-то фигня случится - неважно, так есть и будет. Не лучше ли высылать письмо со ссылкой на отписку, если ввели не правильный мыльник, чем на активацию? Да и настолько ли важно знать мыло пользователя для вашего сайта?</li>
<li><strong>Нераспознаваемая капча</strong> - кто-то криворукий создал новый тип капчи и все начали его пользовать. Не знаю видел ли кто - но я, человек из плоти и крови, вбиваю ее верно раза с 10-го.</li>
<li><strong>Капча без возможности перезагрузки</strong> - какой бы капча не была простой - обязательно однажды она сгенерит что-то ну просто совсем нечитаемое. А если пользователь уже вбил всю анкету - перегружать страницу не есть круто, ибо чревато потерей данных в некоторых браузерах.</li>
<li><strong>Лишние обязательные поля</strong> - какое вам дело как меня зовут или где я живу? Хочу введу хочу нет и нефиг делать это обязательным, поэтому для вас зовут меня "вапва" и фамилия "водаплвопвпвпавап".</li>
<li><strong>Малое ограничение на количество безпроблемных попыток ввода верного пароля</strong> - например, после 5 паролей начинает вылетать опять же капча или пишет типа подождите 20 минут. Лично у меня паролей штук 20, не меньше, и юзал я разные в зависимости от ситуации, вначале одни, потом другие и т.п. за лет 10 накопилось немало вариантов... А тут 5 - и потом мучайся... а в сочетании с п.4 - уххх  как весело авторизоваться становится...</li>
<li><strong>Блок при N неверных попыток авторизации</strong> - тут скорее дело не в идее блокировать доступ к аккаунту на время если кажется, что подбирают пароль, а в кривой реализации этого некоторыми товарищами. Так как куки чистятся - надо учитывать ip, с которого пытались это сделать, иначе кто угодно набьет другому N попыток авторизоваться всяким шлаком и заблочит ему на время аккаунт.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/14/autorization/feed/</wfw:commentRss>
		</item>
		<item>
		<title>С чего начать?</title>
		<link>http://www.intval.ru/2009/05/02/how-to-start/</link>
		<comments>http://www.intval.ru/2009/05/02/how-to-start/#comments</comments>
		<pubDate>Sat, 02 May 2009 15:54:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Важные баяны]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=130</guid>
		<description><![CDATA[В мире программирования задача никогда не бывает одна, если это так - значит поставлена она не верно. Зачада "Сделать сайт" - поставлена неверно, к примеру. Большие задачи обычно дробятся и каждому периоду работы обычно предшествует список определенных задач на реализацию. Среди таких задач бывают большие - например "Сделать фотогалерею" и тз, дизайн и т.п. по [...]]]></description>
			<content:encoded><![CDATA[<p>В мире программирования задача никогда не бывает одна, если это так - значит поставлена она не верно. Зачада "Сделать сайт" - поставлена неверно, к примеру. Большие задачи обычно дробятся и каждому периоду работы обычно предшествует список определенных задач на реализацию. Среди таких задач бывают большие - например "Сделать фотогалерею" и тз, дизайн и т.п. по ней. А бывают маленькие - например, сменить фразу "Выбранные товары" на фразу "Корзина".</p>
<p>С чего начать? С больших или с маленьких задач?</p>
<p>Обычно начинают всегда с больших. И так в целом абсолютно здраво делать, когда проектируется новый сайт или вы знаете систему отлично. На маленькие задачи надо меньше сил, а если вначале сделать мелочь - то на большое не всегда останется рвения. Да и если система создается новая - то вначале надо сделать "скелет", а уже потом навешивать мышцы и кожу <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Но такой подход абсолютно не оправдан в случае, если вы вносите изменения в систему в которой нифига не разбираетесь. В таких случаях лучше начинать с конца.</p>
<p>Например, пришел проект написанный фиг знает на чем, фиг знает кем и когда. Что внутри - непонятно. Делаем мелкий таск - изменение надписи. Дело пятиминутное - тупо прогнать поиск по коду (и базе если по коду не найдется) по этому слову - и поменять его. Задачу сделали - и уже кое-чему научились, например, как устроена система локализации, есть ли она вообще. Какие шаблоны есть в коде. Т.е. решение мелкой задачи помогло попутно разобраться с проектом и узнать что-то о нем, без того чтобы специально колупать его и смотреть что там и где. И так далее - от мелкого к крупному.</p>
<p>Такой подход позволяет убить сразу 2-х зайцев:</p>
<ol>
<li> Тратится минимум времени на изучение архитектуры проекта;</li>
<li>Всегда можно показать заказчику, что работа над проектом идет. Ему не придется месяц трястись и трахать мозг менеджеру, ожидая выполнения самой большой задачи.</li>
</ol>
<p>Так что, если в коде разбираешься или проект новый - то от сложного к простому, если нет - от простого к сложному.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/02/how-to-start/feed/</wfw:commentRss>
		</item>
		<item>
		<title>$i++ vs. ++$i</title>
		<link>http://www.intval.ru/2009/05/02/i-vs-i/</link>
		<comments>http://www.intval.ru/2009/05/02/i-vs-i/#comments</comments>
		<pubDate>Sat, 02 May 2009 15:36:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Важные баяны]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=128</guid>
		<description><![CDATA[Есть у меня товарищ, который кодит на c++. И как-то в его коде в цикле я заметил, что он пишет не i++; а ++i; - оказалось что так производительнее (ну они сишники вообще помешаны на этом всем). Почему лушче писать так, я как-то поленился разобраться, но пример я естесственно запомнил - и старался по мере сил писать [...]]]></description>
			<content:encoded><![CDATA[<p>Есть у меня товарищ, который кодит на c++. И как-то в его коде в цикле я заметил, что он пишет не i++; а ++i; - оказалось что так производительнее (ну они сишники вообще помешаны на этом всем). Почему лушче писать так, я как-то поленился разобраться, но пример я естесственно запомнил - и старался по мере сил писать такое же и в php, хуже ведь не будет все равно. Оказалось недавно, что и у нас это тоже оправдано.</p>
<p>Оказывается:</p>
<p><span style="color: #000080;">При использовании инструкции $count++ увеличение переменной $count выполняется после того, как будет рассчитано выражение с использованием данной переменной. Например, $i =$count++; — переменной $i будет присвоено значение переменной $count до того, как последнее будет увеличено на единицу. Это означает, что машина должна сохранить значение $count, чтобы использовать его в любом выражении с переменной $count. В инструкции же ++$count значение переменной увеличивается на единицу до вычислений, поэтому нет необходимости хранить временное значение (а это менее накладно). Если инструкция $count++ применяется в выражении, где значение переменной не используется (это называется пустым контекстом), то ее можно безопасно преобразовать в преинкрементную инструкцию.</span></p>
<p><span style="color: #000080;"><span style="color: #000000;">Конечно, фигня там получается, а не оптимизация, но зато в таком коде сразу видна рука мастера <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/02/i-vs-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Метод леммингов</title>
		<link>http://www.intval.ru/2009/05/02/method-of-lemmings/</link>
		<comments>http://www.intval.ru/2009/05/02/method-of-lemmings/#comments</comments>
		<pubDate>Sat, 02 May 2009 15:23:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Технологии]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=126</guid>
		<description><![CDATA[В последнее время в инете стала все больше распространена практика использования крайне нечитаемых капчей. Да настолько жутких, что даже человек введет правильно раза с десятого, не то что несчастная программа с нейронными сетями. Не знаю что думают создатели таких форм про безопасность вообще, но появляется стойкое убеждение, что они просто уверены что ни один бот [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время в инете стала все больше распространена практика использования крайне нечитаемых капчей. Да настолько жутких, что даже человек введет правильно раза с десятого, не то что несчастная программа с нейронными сетями. Не знаю что думают создатели таких форм про безопасность вообще, но появляется стойкое убеждение, что они просто уверены что ни один бот не сможет подобрать такую вот супер-нечитаемую капчу, и что с ней все будет капец как секюрно.</p>
<p>На деле же, нормальные ботописцы забили давно болт на распознавание компом капчи - потому что это слишком бессмысленно когда есть Его Величество "Метод Леммингов".</p>
<p>Суть метода очень простая. Бот заходит на страницу-жертву, выкачивает картинку с капчей - и отправляет на специальный сайт заявку. На сайте сием день и ночь сидят голодные дети из банановых стран, которые любят работать за копейки. Они эту картинку распознают, пишут текст в форму - и через пару минут робот может уже забирать текст капчи. Текст отправляется на сайт - и все :) Вот вам и супер-защита.</p>
<p>Гораздо эффективнее защищаться тем, что может браузер, но не может бот. Например, с выполнением javascript-а насколько я знаю у всех языков реальные проблемы. Конечно, можно пользоваться и браузерами как помошниками в спаме и т.п. - в винде например IE как ком-объект отлично вызывается. Да вот только программист, который это наколбасит будет стоить гораздо больше, чем годы работы голодающих детей банановых стран.</p>
<p>В реальности, распознавание капчи ботами - не проблема. Так что если тебе по-барабану на детей африки - поставь хитрожелтую проверку интерпретации javascript-а и это будет работать гораздо лучше.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/02/method-of-lemmings/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Вычисление констант в коде</title>
		<link>http://www.intval.ru/2009/05/02/const-in-code/</link>
		<comments>http://www.intval.ru/2009/05/02/const-in-code/#comments</comments>
		<pubDate>Sat, 02 May 2009 15:05:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Тупые решения]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=124</guid>
		<description><![CDATA[Продолжая тему тупых решений хочется отметить еще одно. Например вот такой кусок кода ну или аналогичный часто встречается в проектах, написанных не очень опытными программистами, точнее даже не очень знающими:
$seconds_count = 86400;
Не, я тут не буду писать про переменные и т.п. я буду писать про числа. Возьмем число в примере - слету и не разберешь че это такое [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжая тему тупых решений хочется отметить еще одно. Например вот такой кусок кода ну или аналогичный часто встречается в проектах, написанных не очень опытными программистами, точнее даже не очень знающими:</p>
<p><span style="color: #808000;">$seconds_count</span> = <span style="color: #ff0000;">86400</span>;</p>
<p>Не, я тут не буду писать про переменные и т.п. я буду писать про числа. Возьмем число в примере - слету и не разберешь че это такое вообще... Вот если бы:</p>
<p><span style="color: #808000;">$seconds_count</span> = <span style="color: #ff0000;">24*60*60</span>;</p>
<p>Эх, если бы те, кто вычисляет такие числа и пишут как в первом случае знали бы как устроены трансляторы кода, то никогда бы не стали ничего считать. На самом деле, все такие константы вычисляются на стадии формирования промежуточного кода. Одновременно с этим отсекаются недостижимые куски кода и т.п.</p>
<p>Другими словами, если код транслируется один раз, а потом берется уже откешированый, то смысла в этом нет вообще - ну один раз сделает комп вычисление умножения, которое само по себе очень легкое - что с того? Ну а если же нет - и php-код будет каждый раз интерпретироваться без сохранения промежуточных вариантов - то не проще ли врубить eAccelerator? Да и нужна ли такая типа оптимизация в проекте в котором все положили на реальное ускорение через кеширование?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/02/const-in-code/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Объявление объекта без скобок</title>
		<link>http://www.intval.ru/2009/05/01/new-object/</link>
		<comments>http://www.intval.ru/2009/05/01/new-object/#comments</comments>
		<pubDate>Fri, 01 May 2009 15:13:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Холивары]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=121</guid>
		<description><![CDATA[Иногда встречаю вот такую вот запись создания нового объекта:
$obj = new Typed;
Вначале мне казалось, что это просто от криворукости программистов и работает также как и массивы, в которых индексы пишутся без кавычек типа $a[index], где автоматом заводится константа с тем же значением и это на удивление работает. Оказалось констант никаких не заводится - а это [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда встречаю вот такую вот запись создания нового объекта:</p>
<p><span style="color: #808000;">$obj</span> = <span style="color: #0000ff;">new</span> Typed;</p>
<p>Вначале мне казалось, что это просто от криворукости программистов и работает также как и массивы, в которых индексы пишутся без кавычек типа $a[index], где автоматом заводится константа с тем же значением и это на удивление работает. Оказалось констант никаких не заводится - а это просто особенность языка.</p>
<p>Оказалось, что такая манера создания классов была описана в мануале по классам и объектом самими разрабочиками php для php4 на php.net.</p>
<p>Вопрос, нафига? В самых распространенных языках программирования везде пишутся скобки после имени класса. IDE от тех же Зендов тоже подсказывает <span style="color: #808000;">$obj</span> = <span style="color: #0000ff;">new</span> Typed(); По-моему, это только запутывает.</p>
<p>P.S. Кстати и в 5-м php та же фигня в описании...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/new-object/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Отправка писем с ошибками администратору</title>
		<link>http://www.intval.ru/2009/05/01/mail-errors/</link>
		<comments>http://www.intval.ru/2009/05/01/mail-errors/#comments</comments>
		<pubDate>Fri, 01 May 2009 14:34:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Тупые решения]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=117</guid>
		<description><![CDATA[Недавно наткнулся на интересную идею - на все типы ошибок повесить обработчик, который, если оная возникает, шлет письмо админу с указанием полного кода ошибки. На первый взгляд это действительно интересно, потому что гораздо проще проверять почту, чем колупаться в логах или ждать сообщений от пользователей. На деле же такое прокатит только на очень маленьких проектах, [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно наткнулся на интересную идею - на все типы ошибок повесить обработчик, который, если оная возникает, шлет письмо админу с указанием полного кода ошибки. На первый взгляд это действительно интересно, потому что гораздо проще проверять почту, чем колупаться в логах или ждать сообщений от пользователей. На деле же такое прокатит только на очень маленьких проектах, где посетителей очень мало.</p>
<p>Представим себе проект, который посещает человек 300 в день и у которого внезапно отвалилась база данных. Ну например, место кончилось или еще че-нить. Пользователь, который видит, что страница не загрузилась есстественно попробует ее перезагрузить несколько раз <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> для верности. Ну и каждый раз есстественно письмо админу <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Таким образом, пока админ успеет среагировать - его ящик будет переполнен ну или же, что скорее всего, сайт улетит в бан за спам и потребуется много времени чтобы объяснить почтовикам что он не спамер, а просто так получилось. Я имею ввиду, что спам-фильтр будет резать письма с этого сайта, которые идут на мыло админа.</p>
<p>Чтобы дать этой идее хоть какую-нить жизнь, нужно написать специальный анализатор, который будет разбирать ошибки и недопускать повторного отправления одного и того же, что в принципе довольно геморно, потому что написан он будет на php, стало быть если отвалятся некоторые php-шные части (например, отправка писем :)), то он все равно не сможет выполнять свою задачу.<br />
Так что отправка писем с ошибками администратору - тупая идея</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/mail-errors/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Форматирование sql-кода</title>
		<link>http://www.intval.ru/2009/05/01/formatting-sql/</link>
		<comments>http://www.intval.ru/2009/05/01/formatting-sql/#comments</comments>
		<pubDate>Fri, 01 May 2009 11:37:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Важные баяны]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=111</guid>
		<description><![CDATA[$res = mysql_query("select articles.title, articles.text, articles.id, articles.user_id, users.name from articles left join users on articles.user_id=users.id where $condition order by id desc limit 5, 10");
Такой жестяк часто встретишь, когда пишут код студенты или просто люди торопятся да так что ппц. Нифига не понятно. Запрос написан в стиле write-only.  В противовес индусам - нормальные программисты используют определенные правила форматирования кода в запросах. И хоть [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #808000;">$res</span> = mysql_query(<span style="color: #008000;">"select articles.title, articles.text, articles.id, articles.user_id, users.name from articles left join users on articles.user_id=users.id where <span style="color: #808000;">$condition</span> order by id desc limit 5, 10"</span>);</p>
<p>Такой жестяк часто встретишь, когда пишут код студенты или просто люди торопятся да так что ппц. Нифига не понятно. Запрос написан в стиле write-only.  В противовес индусам - нормальные программисты используют определенные правила форматирования кода в запросах. И хоть каждый использует свои, как правило они очень похожи.</p>
<p><span id="more-111"></span> Если честно меня бесит, когда запрос формируется налету прямо в параметре функции, поэтому я всегда стараюсь выносить строку запроса в отдельную переменную, если конечно запрос не настолько простейший что там заглючить просто нечему.</p>
<p><span style="color: #808000;">$query</span> =  <span style="color: #008000;">"select articles.title, articles.text, articles.id, articles.user_id, users.name from articles left join users on articles.user_id=users.id </span><span style="color: #008000;">where <span style="color: #808000;">$condition </span></span><span style="color: #008000;">order by id desc limit 5, 10"<span style="color: #000000;">;</span></span></p>
<p><span style="color: #808000;">$res</span> = mysql_query(<span style="color: #808000;">$query</span>);</p>
<p>Если запрос глючит - делаем принт $query - и смотрим что не так - и не надо ничего выдирать, особенно если ф-я в оболочке принимает 100500 параметров, один из которых длиннющий запрос.</p>
<p>Второе правило - все ключевые слова sql должны быть с большой буквы.</p>
<p><span style="color: #808000;">$query</span> =  <span style="color: #008000;">"SELECT articles.title, articles.text, articles.id, articles.user_id, users.name FROM articles LEFT JOIN users ON articles.user_id=users.id  WHERE  <span style="color: #808000;">$condition</span> ORDER BY id DESC LIMIT 5, 10</span><span style="color: #008000;">"<span style="color: #000000;">;</span></span></p>
<p><span style="color: #808000;">$res</span> = mysql_query(<span style="color: #808000;">$query</span>);</p>
<p>Так уже гораздо понятнее - по ключевым словам можно разобраться что и где находится.</p>
<p>Третье правило - выделять отступами и писать на новой строчке логические части запроса.<br />
Четвертое - использовать псевдонимы таблиц, если их больше 2-х. В конечном итоге получается такой запрос:</p>
<p><span style="color: #808000;">$query</span> =  <span style="color: #008000;">"
<pre>
    SELECT
        A.title,
        A.text,
        A.id,
        A.user_id,
        U.name
    FROM
        articles AS A
    LEFT JOIN
        users AS U
    ON
        A.user_id=U.id
    WHERE
        <span style="color: #808000;">$condition</span>
    ORDER BY
        id DESC
    LIMIT
        5, 10</span></pre>
<p><span style="color: #008000;">"<span style="color: #000000;">;</span></span></p>
<p><span style="color: #808000;">$res</span> = mysql_query(<span style="color: #808000;">$query</span>);</p>
<p>Некоторые используют конкатенацию в описании запроса, чтобы сделать его меньше, сохранив форматирование - т.е. также как и выше, но скажем 'SELECT '.'A.title' ну и отступы понятное дело также так и у меня, просто что они не в теле запроса. Такой подход делает запрос меньше по размерам и в некотором роде производительнее (т.е. базе пересылать надо меньше), однако форматирование сохраняется только в php коде, но не сохранятеся при выводе и отладке, что неудобно.</p>
<p>Стоит отметить что псевдонимам таблиц стоит давать осмысленные имена. Я часто видел псевдоними t1, t2, t4 - просто номера не дают никакой информации и не помогают с читаемостью таких запросов.</p>
<p>Так-то <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/formatting-sql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Чем echo отличается от print</title>
		<link>http://www.intval.ru/2009/05/01/echo-print/</link>
		<comments>http://www.intval.ru/2009/05/01/echo-print/#comments</comments>
		<pubDate>Fri, 01 May 2009 11:05:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Мир собеседований]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=109</guid>
		<description><![CDATA[На собеседованиях любят задавать самые каверзные вопросы с подколками. Одним из таких вопросов является вопрос о разнице между echo и print. Многие даже очень опытные программисты считают их синонимами, потому что ведут себя они одинаково:
&#60;?php
print "Hello World!";
echo "Hello World!";
И то и то выдаст  "Hello World!", однако разница между ними все же есть, просто сложно [...]]]></description>
			<content:encoded><![CDATA[<p>На собеседованиях любят задавать самые каверзные вопросы с подколками. Одним из таких вопросов является вопрос о разнице между echo и print. Многие даже очень опытные программисты считают их синонимами, потому что ведут себя они одинаково:</p>
<p><span style="color: #ff0000;">&lt;?php</span><br />
<span style="color: #0000ff;">print</span><span style="color: #008000;"> "Hello World!"</span>;<br />
<span style="color: #0000ff;">echo</span><span style="color: #008000;"> "Hello World!"</span>;</p>
<p><span style="color: #000000;">И то и то выдаст </span><span style="color: #008000;"> "Hello World!"<span style="color: #000000;">, однако разница между ними все же есть, просто сложно придумать ситуацию, в которой она была бы заметна:</span></span></p>
<ol>
<li><span style="color: #008000;"><span style="color: #000000;"><span style="color: #008000;"><span style="color: #000000;"> <span style="color: #0000ff;">print</span> возвращает <span style="color: #0000ff;">true</span>/<span style="color: #0000ff;">false</span> в зависимости от того, удачен вывод или нет. Я не представляю себе ситуации, в которой она бы вернула <span style="color: #0000ff;">false</span>, но наверное есть... <span style="color: #0000ff;">echo</span> ничего не возвращает;</span></span></span></span></li>
<li><span style="color: #0000ff;">echo</span> нельзя использовать со скобками, т.е. <span style="color: #0000ff;">echo</span>(<span style="color: #ff0000;">123</span>) - выдаст ошибку, <span style="color: #0000ff;">print</span>(<span style="color: #ff0000;">123</span>) - нормально отработает;</li>
<li>Понятное дело что из-за п.1 <span style="color: #0000ff;">echo</span> работает быстрее чем <span style="color: #0000ff;">print</span>. Разница несущественная, но есть и это неплохо знать;</li>
<li>В <span style="color: #0000ff;">echo</span> можно передать несколько параметров для вывода через запятую <span style="color: #0000ff;">(echo</span> <span style="color: #ff0000;">123</span>, <span style="color: #008000;">'aaa</span><span style="color: #008000;">a'</span>, <span style="color: #ff0000;">33</span> <img src='http://www.intval.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> и они выведутся последовательно.   В <span style="color: #0000ff;">print</span> нет.</li>
</ol>
<p>Я не уверен, все ли я описал тут, но думаю достаточно чтобы выяснить что они ни разу не синонимы. Если кто знает еще - пишите в коменты - буду рад узнать что-нить новое.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/echo-print/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Строки и is_int</title>
		<link>http://www.intval.ru/2009/05/01/is_int/</link>
		<comments>http://www.intval.ru/2009/05/01/is_int/#comments</comments>
		<pubDate>Fri, 01 May 2009 10:43:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Грабли]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=106</guid>
		<description><![CDATA[Интересное наблюдение вычитал в книжке "Профессиональное программирование в php". Автор пишет, что:
Использование вместо функции is_int регулярного выражения для определения того, является ли $п целым числом, может показаться странным. Однако функция is_int не делает того, что в данном случае требуется. Она только проверяет, типизирована ли переменная $п как строковая или как целочисленная, но не проверяет, является [...]]]></description>
			<content:encoded><![CDATA[<p>Интересное наблюдение вычитал в книжке "Профессиональное программирование в php". Автор пишет, что:</p>
<p><span style="color: #000080;">Использование вместо функции is_int регулярного выражения для определения того, является ли $п целым числом, может показаться странным. Однако функция is_int не делает того, что в данном случае требуется. Она только проверяет, типизирована ли переменная $п как строковая или как целочисленная, но не проверяет, является ли значение переменной $п целым числом. Данный нюанс может ввести разработчика в заблуждение, если он использует функцию is_int для проверки данных HTML-форм (среди прочего).</span></p>
<p><span style="color: #000000;">Я как-то не сталкивался с этим раньше и решил проверить. Оказалось действительно:</span></p>
<p><span style="color: #0000ff;"><span style="color: #ff0000;">&lt;?php</span><br />
</span><span style="color: #000000;">var_dump(is_int(<span style="color: #008000;">"56"</span>));<br />
var_dump(is_int(<span style="color: #ff0000;">56</span>));</span></p>
<p><span style="color: #000000;">Выдает: bool(false) bool(true) <span style="color: #000000;"> </span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/is_int/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Как вставить javascript в smarty</title>
		<link>http://www.intval.ru/2009/05/01/javascript-smarty/</link>
		<comments>http://www.intval.ru/2009/05/01/javascript-smarty/#comments</comments>
		<pubDate>Fri, 01 May 2009 10:23:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Тупые решения]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=102</guid>
		<description><![CDATA[Недавно постучался ко мне в аську знакомый сеошник с проблемой - дескать не могут они с верстальщиком в уже готовый проект, написанный фиг_знает_кем_кого_уже_нет_рядом, код то ли счетчика то ли еще чего, другими словами javascript вставить не получается. Какой там шаблонизатор, да и вообще на чем проект этот написан, они понятное дело не в курсе, потому [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно постучался ко мне в аську знакомый сеошник с проблемой - дескать не могут они с верстальщиком в уже готовый проект, написанный фиг_знает_кем_кого_уже_нет_рядом, код то ли счетчика то ли еще чего, другими словами javascript вставить не получается. Какой там шаблонизатор, да и вообще на чем проект этот написан, они понятное дело не в курсе, потому что один верстальщик, а второй сеошник а спросить не у кого. Я попросил прислать пример кода в html-ке (текста шаблона) и, как я и ожидал, оказалось что это Smarty.</p>
<p>Если кто не знает, в смарти используются разделители для того, чтобы обозначить что данный кусок кода все-таки написан на смарти а не просто текст. И хоть в доке по нему явно написано, что разделители дескать можно настроить любые какие только душе угодно - на деле же все используют именно то что там по умолчанию ( фигурные скобки ), ибо все готовое написано именно так, а переписывать готовое ради разделителя не айс ни разу.  Вот и получается что код javascript-а, обрамленный в блок (например function foo() { ... }, да или просто любой блок) шаблонизатор воспринимает как директиву Smarty и пытается его исполнить. И чтобы такого не возникало, придумали специальный костыль - обрамлять куски html, в которых встречаются разделители тегами {literal}тут код{/literal}.</p>
<p>Приятель, для которого код - это что-то из серии магии, воспринял это нормально. Их с версталем не бесило то, что они убили полдня на выполнение простейшей задачи. Но если бы они знали, что оффициально смарти (да и вообще любой шаблонизатор) нужен для того, чтобы разделить логику работы приложения от логики отображения и в куче зомбирующих постов про него написано, что верстальщикам проще редактировать шаблоны, написанные в нем, чем в чистом php, то наверное реакция у них была бы совершенно другая.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/javascript-smarty/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Грабли с короткими тегами и заголовком xml</title>
		<link>http://www.intval.ru/2009/05/01/short-tags-xml-header/</link>
		<comments>http://www.intval.ru/2009/05/01/short-tags-xml-header/#comments</comments>
		<pubDate>Fri, 01 May 2009 09:48:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Грабли]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=99</guid>
		<description><![CDATA[За все время программирования я так привык к тому, что в проекте используется какой-либо шаблонизатор для html-страниц да и вообще все что отдается пользователю идет через какой-то компонент и     отвык от проектов с мелкими кусками php-кода прям посреди html-разметки, что просто не мог наступить на эти грабли. Оказывается, если short_open_tag включен [...]]]></description>
			<content:encoded><![CDATA[<p>За все время программирования я так привык к тому, что в проекте используется какой-либо шаблонизатор для html-страниц да и вообще все что отдается пользователю идет через какой-то компонент и     отвык от проектов с мелкими кусками php-кода прям посреди html-разметки, что просто не мог наступить на эти грабли. Оказывается, если short_open_tag включен (php.ini ну или  php_value в .htaccess и т.п.), то  можно поймать вот такую вот проблему:</p>
<p>Если у нас есть php-ка, которая начинается с xml заголовка, то при включенном short_open_tag - заголовок будет интерпретироваться как php-код. Ну собственно вот для наглядности:</p>
<p>info.php c кодом:</p>
<p><span style="color: #ff0000;">&lt;?</span>xml version="1.0" <span style="color: #ff0000;">?&gt; </span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">[Дальше xml или html] </span></span></p>
<p>Выдаст: Parse error: syntax error, unexpected T_STRING in ...info.php on line 1</p>
<p>На относительно больших проектах, написаннх ровноруко, такой баг врятли поймаешь, но если писать скажем самопальную rss-ку без mod_rewrite или скажем XML Sitemap, то вполне.</p>
<p>Насчет же тегов  мне всегда казалось, что в тех же шаблонах, сделанных например в стиле Zend_View, гораздо удобнее писать <span style="color: #ff0000;">&lt;?=</span><span style="color: #808000;">$variable</span><span style="color: #ff0000;">?&gt;</span>, чем <span style="color: #ff0000;">&lt;?php</span> <span style="color: #0000ff;">echo</span> <span style="color: #808000;">$variable</span>; <span style="color: #ff0000;">?&gt;</span>, но на мелких доделках и самопальных решениях не все может прокатить, поэтому надо быть осторожными и стараться использовать чужие наработки.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/short-tags-xml-header/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Жесткая табуляция vs. Мягкая табуляция</title>
		<link>http://www.intval.ru/2009/05/01/hard-tabs-vs-soft-tabs/</link>
		<comments>http://www.intval.ru/2009/05/01/hard-tabs-vs-soft-tabs/#comments</comments>
		<pubDate>Fri, 01 May 2009 08:58:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Холивары]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=93</guid>
		<description><![CDATA[Чтобы немного прояснить для тех кто не в курсе, напишу определения обоих вещей. Итак:
Жесткая табуляция (hard tabs)— это обычные символы табуляции.
Мягкая табуляция (soft tabs) в действительности вообще не является табуляцией; каждый отступ в мягкой табуляции фактически представлен определенным количеством обычных пробелов.


Многие старые программисты почему-то предпочитают мягкую табуляцию. Единственным аргументом у них служит то, что дескать [...]]]></description>
			<content:encoded><![CDATA[<p>Чтобы немного прояснить для тех кто не в курсе, напишу определения обоих вещей. Итак:</p>
<p><span style="color: #000080;">Жесткая табуляция (hard tabs)— это обычные символы табуляции.</span></p>
<p><span style="color: #000080;">Мягкая табуляция (soft tabs) в действительности вообще не является табуляцией; каждый отступ в мягкой табуляции фактически представлен определенным количеством обычных пробелов.</span></p>
<p><span style="color: #000080;"></p>
<p></span></p>
<p><span style="color: #000000;">Многие старые программисты почему-то предпочитают мягкую табуляцию. Единственным аргументом у них служит то, что дескать в редакторе можно указать за сколько пробелов по ширине считать таб - и поэтому код в разных редакторах будет выглядеть по-разному. Они заменяют табы определенным числом пробелов - и в итоге код действительно выглядит одинаковым по отступам везде, даже во встроенном в ftp-клиент редакторе или блокноте.</span></p>
<p><span style="color: #000000;"><span id="more-93"></span><span style="color: #000000;">Нет смысла сильно акцентироваться на том, что замена табов пробелами увеличивает вес файлов проекта и что заливать их становится не так круто. Это было актуально раньше при диал-апах, но сейчас не принципиально. </span></span></p>
<p><span style="color: #000000;">Я бы хотел остановиться на все-таки отступах. Давайте не будем обманываться: любой нормальный программист использует для кодированию ту или иную IDE, ну а редкие случаи хотфиксов таких, что просто влом открывать IDE чтобы поправить тот или иной кусок - просто настолько редкие, что можно даже не упоминать про них. Ни один же нормальный прогер не будет кодить в блокноте. Так вот, фишка IDE-шек в том, что там можно настроить ширину табуляции, а вот ширину пробелов настроить нельзя. Возможность настройки - и есть преимущество, это не недостаток <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Я например, привык чтобы таб был в 4 пробела, но мне пришел проект, в котором ребята использовали мягкую табуляцию в 2 пробела или в 5 пробелов - в итоге я конечно перенастроюсь, но работать будет реально не удобно, потому что я привык к другому. С другой стороны, проект пришедший с табами - отлично отобразится у меня в том стиле, в котором мне удобно, даже если прогеры, что его писали использовали таб шириной в 1 пробел. С жесткой табуляцией я смогу спокойно внести изменения в такой чужой проект - и когда кто-нибудь другой его откроет - он увидит что все будет в одном стиле.</span></p>
<p><span style="color: #000000;"><span style="color: #000000;">Подытожив, хочу сказать, что проблема с отображением в разных редакторах и разными отступами на деле является надуманной, поэтому в этом холиваре  оливковая ветвь достается жесткой табуляции. Таб должен быть табом <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/hard-tabs-vs-soft-tabs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Приоритеты операций</title>
		<link>http://www.intval.ru/2009/04/20/operations-priority/</link>
		<comments>http://www.intval.ru/2009/04/20/operations-priority/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 12:48:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Мир собеседований]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=88</guid>
		<description><![CDATA[Программист, помни, на собеседовании всегда найдется человек, который высушит тебе мозги приоритетами операций и вот такой вот фигней - $a = ++$b - $a * ($b--) &#62; 5 ? ++$a^$b : $b-=5;
На деле знание приоритетов не особо нужно, потому что сложные выражения все равно лучше обрамлять скобками, чтобы не запутаться. Но часто бывает что человек [...]]]></description>
			<content:encoded><![CDATA[<p>Программист, помни, на собеседовании всегда найдется человек, который высушит тебе мозги приоритетами операций и вот такой вот фигней - $a = ++$b - $a * ($b--) &gt; 5 ? ++$a^$b : $b-=5;</p>
<p>На деле знание приоритетов не особо нужно, потому что сложные выражения все равно лучше обрамлять скобками, чтобы не запутаться. Но часто бывает что человек даже не знает что спросить (ну или просто хочет сбить цену, спрашивая то, что все по идее должны знать, но так как редко пользуются - то не помнят).</p>
<p><span id="more-88"></span>Поэтому, если ищем работу - то вот это надо выучить:</p>
<table class="doctable" border="1" style="border-width:1px;">
<thead>
<tr valign="middle">
<th> Ассоциативность</th>
<th>Операторы</th>
</tr>
</thead>
<tbody class="tbody">
<tr valign="middle">
<td align="left">неассоциативные</td>
<td align="left">clone new</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">[</td>
</tr>
<tr valign="middle">
<td align="left">неассоциативные</td>
<td align="left">++ --</td>
</tr>
<tr valign="middle">
<td align="left">неассоциативные</td>
<td align="left">~ - (int) (float) (string) (array) (object) (bool) @</td>
</tr>
<tr valign="middle">
<td align="left">неассоциативные</td>
<td align="left">instanceof</td>
</tr>
<tr valign="middle">
<td align="left">правая</td>
<td align="left">!</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">* / %</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">+ - .</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">&lt;&lt; &gt;&gt;</td>
</tr>
<tr valign="middle">
<td align="left">неассоциативные</td>
<td align="left">&lt; &lt;= &gt; &gt;= &lt;&gt;</td>
</tr>
<tr valign="middle">
<td align="left">неассоциативные</td>
<td align="left">== != === !==</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">&amp;</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">^</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">|</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">&amp;&amp;</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">||</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">? :</td>
</tr>
<tr valign="middle">
<td align="left">правая</td>
<td align="left">= += -= *= /= .= %= &amp;= |= ^= &lt;&lt;= &gt;&gt;=</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">and</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">xor</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">or</td>
</tr>
<tr valign="middle">
<td align="left">левая</td>
<td align="left">,</td>
</tr>
</tbody>
</table>
<p>Левая ассоциативность означает, что выражение будет вычисляться слева направо, правая - наоборот. На примере:</p>
<p><span style="color: #ff0000;">&lt;?php</span><br />
<span style="color: #808000;">$a</span> = <span style="color: #ff0000;">3</span> * <span style="color: #ff0000;">3</span> % <span style="color: #ff0000;">5</span>; <span style="color: #808080;">// (3 * 3) % 5 = 4</span><br />
<span style="color: #808000;">$a</span> = <span style="color: #0000ff;">true</span> ? <span style="color: #ff0000;">0</span>: <span style="color: #0000ff;">true</span> ? <span style="color: #ff0000;">1</span> : <span style="color: #ff0000;">2</span>; <span style="color: #808080;">// (true ? 0 : true) ? 1 : 2 = 2</span></p>
<p><span style="color: #808000;">$a</span> = <span style="color: #ff0000;">1</span>;<br />
<span style="color: #808000;">$b</span> = <span style="color: #ff0000;">2</span>;<br />
<span style="color: #808000;">$a</span> = <span style="color: #808000;">$b</span> += <span style="color: #ff0000;">3</span>; <span style="color: #808080;">// $a = ($b += 3) -&gt; $a = 5, $b = 5</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/20/operations-priority/feed/</wfw:commentRss>
		</item>
		<item>
		<title>REGEXP и RLIKE</title>
		<link>http://www.intval.ru/2009/04/20/regexp-and-rlike/</link>
		<comments>http://www.intval.ru/2009/04/20/regexp-and-rlike/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 10:46:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=86</guid>
		<description><![CDATA[Наткнулся недавно в коде проекта на вот такую вот конструкцию:
...AND (`struct`.`regions` = "" OR  `struct`.`regions` REGEXP "^a:[0-9]+:\{.*(i:[0-9]+;s:[0-9]+:\"'.$current_region_id.'\"\;).*\}$" OR `struct`.`regions` REGEXP "^a:[0-9]+:\{.*(i:[0-9]+;s:[0-9]+:\"'.ALL_REGIONS_ID.'\"\;).*\}$" OR `struct`.`regions` REGEXP "^a:[0-9]+:\{+(i:[0-9]+;s:[0-9]+:\"0\"\;)*\}$" )...
и не сразу вкурил что это за загадочный REGEXP. Оказалось что это синоним старого доброго RLIKE, ну точнее последний синоним первого  так-то  
]]></description>
			<content:encoded><![CDATA[<p><span style="color: #000000;">Наткнулся недавно в коде проекта на вот такую вот конструкцию:</span></p>
<p><span style="color: #000080;">...AND (`struct`.`regions` = "" OR  `struct`.`regions` <span style="color: #ff0000;">REGEXP</span> "^a:[0-9]+:\{.*(i:[0-9]+;s:[0-9]+:\"'.$current_region_id.'\"\;).*\}$" OR `struct`.`regions` <span style="color: #ff0000;">REGEXP</span> "^a:[0-9]+:\{.*(i:[0-9]+;s:[0-9]+:\"'.ALL_REGIONS_ID.'\"\;).*\}$" OR `struct`.`regions` <span style="color: #ff0000;">REGEXP</span> "^a:[0-9]+:\{+(i:[0-9]+;s:[0-9]+:\"0\"\;)*\}$" )...</span></p>
<p><span style="color: #000080;"><span style="color: #000000;">и не сразу вкурил что это за загадочный REGEXP. Оказалось что это синоним старого доброго RLIKE, ну точнее последний синоним первого <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> так-то <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/20/regexp-and-rlike/feed/</wfw:commentRss>
		</item>
		<item>
		<title>This page contains both secure and nonsecure items</title>
		<link>http://www.intval.ru/2009/04/17/this-page-contains-both-secure-and-nonsecure-items/</link>
		<comments>http://www.intval.ru/2009/04/17/this-page-contains-both-secure-and-nonsecure-items/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 12:00:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=83</guid>
		<description><![CDATA[Недавно наткнулся на хабре на стетейку о «//» в ссылках, т.е. идея писать абсолютные пути без указания протокола типа http://ya.ru заменять на //ya.ru/.
Не буду копипастить - статья лежит тут: http://bolknote.ru/2009/04/04/~2074 советую прочитать всем.
Раскажу я о том, что это может поправить. Так вот, дело в том, что когда IE подгружает страницу по https, в которой есть [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно наткнулся на хабре на стетейку о «//» в ссылках, т.е. идея писать абсолютные пути без указания протокола типа http://ya.ru заменять на //ya.ru/.</p>
<p>Не буду копипастить - статья лежит тут: <a rel="nofollow" href="http://bolknote.ru/2009/04/04/~2074">http://bolknote.ru/2009/04/04/~2074</a> советую прочитать всем.</p>
<p>Раскажу я о том, что это может поправить. Так вот, дело в том, что когда IE подгружает страницу по https, в которой есть ссылки на цсски или джээсники по http - ругается, дескать "This page contains both secure and nonsecure items". Такой баг я поймал когда прикручивал WorldPay - там страница ответа подгружается системой и отображается как своя - т.е. ваша страница ответа будет по урлу http://www.worldpay.com/etc.... Ясное дело, что если ссылки в урлах относительные - то css не загрузится и дизайну кабзда <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> поэтому ссылки делаются абсолютными - ну а если они генерятся автоматом - то путь на них будет по http - вот и получаем такой варнинг. Если же пользоваться «Common Internet Scheme Syntax», то все будет окей <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> жаль что я не знал этого пару лет назад <img src='http://www.intval.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/17/this-page-contains-both-secure-and-nonsecure-items/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Тег &lt;colgroup&gt;</title>
		<link>http://www.intval.ru/2009/04/17/colgroup/</link>
		<comments>http://www.intval.ru/2009/04/17/colgroup/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 09:59:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=75</guid>
		<description><![CDATA[Ширина ячеек таблицы - отдельная песня для создания сайтов. В больших таблицах, где линий много, тегов &#60;td&#62; еще больше. Чтобы указать ширину ячеек один раз - я обычно указывал ее только для первой линии (т.е. для td-шек 1-й tr-ки), а остальные уже подстраивались под первую. Если же таблица генерилась циклом, то width получалось был в [...]]]></description>
			<content:encoded><![CDATA[<p>Ширина ячеек таблицы - отдельная песня для создания сайтов. В больших таблицах, где линий много, тегов &lt;td&gt; еще больше. Чтобы указать ширину ячеек один раз - я обычно указывал ее только для первой линии (т.е. для td-шек 1-й tr-ки), а остальные уже подстраивались под первую. Если же таблица генерилась циклом, то width получалось был в каждой ячейке.</p>
<p><span id="more-75"></span> Оказалось, что все можно делать гораздо проще, используя тег &lt;colgroup&gt; и теги &lt;col&gt;, т.е. можно сделать вот так:</p>
<p>&lt;table&gt;<br />
&lt;colgroup&gt;<br />
&lt;col width="500"&gt;<br />
&lt;col width="100"&gt;<br />
&lt;/colgroup&gt;</p>
<p>и все td-ки будут отформатированы в соответствии с этим правилом.</p>
<p>Сам же тег позволяет делать гораздо большее:</p>
<p><span style="color: #000080;">Тег &lt;COLGROUP&gt; предназначен для задания ширины и стиля одной или нескольких колонок таблицы. Этот тег позволяет уменьшить код таблицы за счет сокращения повторяющихся параметров, и при наличии этого тега браузер начинает показывать содержимое таблицы, не дожидаясь ее полной загрузки. Тег &lt;COLGROUP&gt; можно использовать в комбинации с тегом &lt;COL&gt;, который определяет характеристики одной или нескольких колонок.Обычно закрывающий тег не требуется, но если &lt;COLGROUP&gt; выступает как контейнер для элементов &lt;COL&gt;, тогда следует добавить тег &lt;/COLGROUP&gt; в конце группы.Разница между свойствами тегов &lt;COLGROUP&gt; и &lt; COL&gt; не очень велика и состоит в следующем. &lt;COLGROUP&gt; позволяет объединять колонки в определенные группы, также при добавлении параметра rules="groups" к тегу &lt;TABLE&gt; браузер будет рисовать линию только между колонками, созданными с помощью &lt;COLGROUP&gt;. В остальных случаях поведение колонок назначенных через элементы &lt;COLGROUP&gt; и &lt;COL&gt; идентично.</p>
<p></span></p>
<p><span style="color: #000080;"><span style="color: #000000;">Кстати, уже раза 3-4 лезла верстка из-за того, что при добавлении/удалении новой td-ки забывал добавить новый col... такой вот потенциальный баг при использовании...</span> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/17/colgroup/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Тег &lt;nobr&gt;</title>
		<link>http://www.intval.ru/2009/04/17/nobr/</link>
		<comments>http://www.intval.ru/2009/04/17/nobr/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 09:50:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=73</guid>
		<description><![CDATA[Мне нравится работать в команде опытных ребят, постоянно тибрим друг у друга идеи и учимся чему-нить. На этот раз открытием для меня стал тег &#60;nobr&#62;. Я раньше часто мучался, выискавая место куда можно тыркнуть nowrap, а оказывается все гораздо проще:
Тег &#60;NOBR&#62; (NO BReak line) запрещает перевод строки. Бывают случаи, когда возникает надобность в операции противоположного [...]]]></description>
			<content:encoded><![CDATA[<p>Мне нравится работать в команде опытных ребят, постоянно тибрим друг у друга идеи и учимся чему-нить. На этот раз открытием для меня стал тег &lt;nobr&gt;. Я раньше часто мучался, выискавая место куда можно тыркнуть nowrap, а оказывается все гораздо проще:</p>
<p><span style="color: #000080;">Тег &lt;NOBR&gt; (NO BReak line) запрещает перевод строки. Бывают случаи, когда возникает надобность в операции противоположного назначения – запретить перевод строки. Текст, заключенный между тэгами &lt;NOBR&gt; и &lt;/NOBR&gt;, будет гарантированно располагаться в одной строке без переноса на другую. Длинная строка не уместится на экране, и для ее просмотра придется использовать горизонтальную полосу прокрутки. Закрывающий тег обязателен </span></p>
<p><span style="color: #000000;">Атрибутов нет, хотя какие-тут могуть быть аттрибуты <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/17/nobr/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Поиск через POST</title>
		<link>http://www.intval.ru/2009/04/12/post-search/</link>
		<comments>http://www.intval.ru/2009/04/12/post-search/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 10:32:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Тупые решения]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=70</guid>
		<description><![CDATA[Концепция "Friendly URLs " в последнее время полностью извратила метод GET протокола HTTP. Никаких тебе index.php?path='blog'&#38;record_id=100500 - все разделено слешами, даже этот пост, сайт без mod_rewrite кажется просто неполноценным. Однако остались еще места, где GET незаменим. Одно из таких мест - форма поиска.
У многих программистов (как правило, начинающих) в голове почему-то строится странное соответствие: формы [...]]]></description>
			<content:encoded><![CDATA[<p>Концепция "Friendly URLs " в последнее время полностью извратила метод GET протокола HTTP. Никаких тебе index.php?path='blog'&amp;record_id=100500 - все разделено слешами, даже этот пост, сайт без mod_rewrite кажется просто неполноценным. Однако остались еще места, где GET незаменим. Одно из таких мест - форма поиска.</p>
<p>У многих программистов (как правило, начинающих) в голове почему-то строится странное соответствие: формы = POST. Понятное дело, форма авторизации - постом, ибо показывать кому-то логин-пароль в урле - брррр, контактная форма - тоже пост и т.п.</p>
<p><span id="more-70"></span></p>
<p>Но это потому что POST:</p>
<p><span style="color: #000080;">Применяется для передачи пользовательских данных заданному ресурсу. (c) Википедия</span> (да-да, надо было со спецификации, но влом)</p>
<p>Т.е. POST создан для того, чтобы отправлять данные на сайт. А вот GET, чтобы получать данные с сайта:</p>
<p><span style="color: #000080;">Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. (c) Википедия</span></p>
<p><span style="color: #000000;">Поиск - это получение данных (посмотрите тру поисковики - они это знают <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), так что делать его постом - просто не по стандартам.</span></p>
<p><span style="color: #000000;">Хотя на деле все и так ложат болт на эти стандарты абы работало и я бы не стал писать об этом. И фигня даже то, что человек никогда не сможет дать товарищу ссылку на результаты поиска (потому что постом урл не изменится) - мало ли такого чтоли. Фиг с ним.</span></p>
<p><span style="color: #000000;">Жопа начинается, когда появляется постраничный вывод результатов поиска.</span></p>
<p><span style="color: #000000;">Дело в том, что параметры поиска (которых нет в урле) надо где-то помнить. И один из костылей - это чтобы при нажатии на номер страницы форма сабмитилась снова (со всеми параметрами) + скрытый инпут с номером страницы. Ежу ясно, что открыть страницу в новом окне просто не получится никак.</span></p>
<p><span style="color: #000000;">Второй вариант костыля в том, чтобы помнить в сессии параметры поиска, а номер страницы уже добавлять в урл. Тут появляется жопа #2. Если пользователь открыл страницу в новой вкладке и на ней зашел на вторую страницу поиска (т.е. сессия та же, но открыты 2 страницы поиска), то одна из страниц будет перекрывать вторую. На это тоже ставится костыль и т.д.</span></p>
<p><span style="color: #000000;">В целом, поиск постом - это не по стандартом и провоцирует множество костылей. Однако есть одна ситуация, когда без этого просто никак: а именно когда длина url получается больше допустимой (в ie 2048 символов, в остальных побольше). </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/12/post-search/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CSV-парсеры</title>
		<link>http://www.intval.ru/2009/04/11/csv-parser/</link>
		<comments>http://www.intval.ru/2009/04/11/csv-parser/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 17:53:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Тупые решения]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=65</guid>
		<description><![CDATA[CSV - один из форматов файлов. Удобен он тем, что позволяет заказчикам, непросвященным в вопросах технологий редактировать данные в обычном экселе, а программистам легко забирать то что они там понаписали. Заказчик делает обычную таблицу, сохраняет ее в формате csv - и получается файлик, в котором записи разделены по определенным правилам.
1. Каждая строка - это отдельная запись;
2. [...]]]></description>
			<content:encoded><![CDATA[<p>CSV - один из форматов файлов. Удобен он тем, что позволяет заказчикам, непросвященным в вопросах технологий редактировать данные в обычном экселе, а программистам легко забирать то что они там понаписали. Заказчик делает обычную таблицу, сохраняет ее в формате csv - и получается файлик, в котором записи разделены по определенным правилам.</p>
<p>1. Каждая строка - это отдельная запись;</p>
<p>2. Записи разных колонок разделяются определенным разделителем (в основном зяпятая или точка с запятой);</p>
<p>3. Если в записи есть разделитель, то запись берется в кавычки;</p>
<p>4. Если в записи есть кавычки, то они представляются в виде 2-х кавычек;</p>
<p><span id="more-65"></span> Пример, текста файла csv (например, список товаров [id, title, цена]):</p>
<p><span style="color: #008000;">1; Гранатомет;2000</span></p>
<p><span style="color: #008000;">2;Кинжал ""Бодрячком"";10</span></p>
<p><span style="color: #008000;"><span style="color: #000000;">Формат довольно удобный, и вроде все очевидно, но т.к. никому не хочется каждый раз изобретать велосипед, разработчики пхп создали огромное число различных csv-парсеров. Я и сам в начале своего пути пользовался каким-то ужасным парсером, который глючик с utf-8, причем неподецки, был огромен как слон и нифига не очевиден. И это в довольно серьезной фирме было стандартом <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></span></p>
<p><span style="color: #008000;"><span style="color: #000000;">Но прошло время и оказалось, что php сам это все умеет. Еще с 4-й версии в нем есть супер-функция:</span></span></p>
<p><span style="color: #008000;"><span style="color: #003366;">array fgetcsv (resource descriptor, int lenght [, string separator [, string offset]])</span></span></p>
<p><span style="color: #008000;"><span style="color: #000000;">простая до безобразия и понятная даже ежу.</span></span></p>
<p><span style="color: #008000;"><span style="color: #000000;">С записью, конечно не все так гладко как с чтением - тут разработчики языка постарались на славу (как обычно в общем-то) ибо</span></span></p>
<p><span style="color: #008000;"><span style="color: #003366;">int fputcsv ( resource handle [, array fields [, string delimiter [, string enclosure]]] )</span></span></p>
<p><span style="color: #008000;"><span style="color: #000000;">появилась только в 5-й версии php.</span></span></p>
<p><span style="color: #008000;"><span style="color: #000000;"><span style="color: #008000;"><span style="color: #000000;">Тем не менее, сейчас, когда 5-ка стала стандартом,   до сих пор очень много людей пользуется велосипедами под названием "Парсер csv". Завязывайте <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/11/csv-parser/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Избавиться от LIMIT через id последней записи</title>
		<link>http://www.intval.ru/2009/04/11/%d0%b8%d0%b7%d0%b1%d0%b0%d0%b2%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d0%be%d1%82-limit-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-id-%d0%bf%d0%be%d1%81%d0%bb%d0%b5%d0%b4%d0%bd%d0%b5%d0%b9-%d0%b7%d0%b0%d0%bf%d0%b8%d1%81/</link>
		<comments>http://www.intval.ru/2009/04/11/%d0%b8%d0%b7%d0%b1%d0%b0%d0%b2%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d0%be%d1%82-limit-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-id-%d0%bf%d0%be%d1%81%d0%bb%d0%b5%d0%b4%d0%bd%d0%b5%d0%b9-%d0%b7%d0%b0%d0%bf%d0%b8%d1%81/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 17:26:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=62</guid>
		<description><![CDATA[Иногда нужно перебрать много записей из базы. Если таблицы большие, то сразу выбрать все - довольно тупое решение, поэтому обычно выбираются записи с лимитом. Вначале первые N, потом от N до 2N и т.д.  Недавно я узнал, что использовать конструкцию с лимитом ( LIMIT n, m ) на больших таблицах - не верно, потому что [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда нужно перебрать много записей из базы. Если таблицы большие, то сразу выбрать все - довольно тупое решение, поэтому обычно выбираются записи с лимитом. Вначале первые N, потом от N до 2N и т.д.  Недавно я узнал, что использовать конструкцию с лимитом ( LIMIT n, m ) на больших таблицах - не верно, потому что при выборке скажем:</p>
<p>SELECT * FROM table WHERE true LIMIT 100500, 100600;</p>
<p>вначале выберутся 100600 записей, а потом отбросятся 100500, т.е. в двусторонних лимитах вначале выбирается все до последнего предела, а потом уже отбрасывается то что не нужно. Я раньше как-то не задумывался, но на огромных таблицах - это просто фатально для базы <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Оказалось, что есть решение и для этой проблемы. Вполне логичное, но пока яблоко не упадет бывает так и не догадаешься до очевидных вещей. Суть идеи в том, чтобы помнить не позицию, а последний айдишник записи, его подставлять в WHERE и уже потом делать односторонний быстрый лимит.</p>
<p>Например:</p>
<p>SELECT * FROM table WHERE id&gt;100500 LIMIT 100;</p>
<p>Такое будет гораздо быстрее работать на больших базах (а иногда только оно и будет работать <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Конечно, не самый красивый костыль, но какой есть <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/11/%d0%b8%d0%b7%d0%b1%d0%b0%d0%b2%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d0%be%d1%82-limit-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-id-%d0%bf%d0%be%d1%81%d0%bb%d0%b5%d0%b4%d0%bd%d0%b5%d0%b9-%d0%b7%d0%b0%d0%bf%d0%b8%d1%81/feed/</wfw:commentRss>
		</item>
		<item>
		<title>href=&#8221;#&#8221; vs. href=&#8221;javascript: ;&#8221;</title>
		<link>http://www.intval.ru/2009/04/11/href-vs-hrefjavascript/</link>
		<comments>http://www.intval.ru/2009/04/11/href-vs-hrefjavascript/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 09:30:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Важные баяны]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=59</guid>
		<description><![CDATA[Ссылки, как известно, не всегда нужно делать именно ссылками, иногда нужно чтобы они выполняли роли кнопок - чтобы по событию на клик отрабатывал нужный скрипт. В таких случаях, понятное дело, нужно, чтобы по клику на ссылку страница не перегружалась. И делают это обычно через жопу, а именно как:
&#60;a href="#" onclick="return someScript(this);" &#62;Ссылка&#60;/a&#62;
И вроде бы все соответствует тому, [...]]]></description>
			<content:encoded><![CDATA[<p>Ссылки, как известно, не всегда нужно делать именно ссылками, иногда нужно чтобы они выполняли роли кнопок - чтобы по событию на клик отрабатывал нужный скрипт. В таких случаях, понятное дело, нужно, чтобы по клику на ссылку страница не перегружалась. И делают это обычно через жопу, а именно как:</p>
<p><span style="color: #000000;">&lt;a</span><span style="color: #ff0000;"> href="#"</span> onclick="return someScript(this);" &gt;Ссылка&lt;/a&gt;</p>
<p>И вроде бы все соответствует тому, что нужно - ссылка не нажимается, перехода на другую страницу не происходит - солнце светит, птички поют, тестеры и заказчик довольны - все кул. НО! это пока не появляется вертикальной прокрутки на странице и пользователь ее не прокрутит вниз до того как нажмет на такую ссылку. Потому что как только он это сделает, прокрутка магическим образом прокрутится вверх <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Проблема такого подхода собственно в том, что в html по ссылкам можно переходить не только на другие страницы - но и прокручиваться к элементам текущей. Сделано это через так называемые якоря. То есть, если к примеру, в каком-то месте страницы у нас есть:</p>
<p>&lt;div<span style="color: #ff0000;"> id="aaa"</span>&gt;дивка&lt;/div&gt;</p>
<p>и есть ссылка:</p>
<p>&lt;a <span style="color: #ff0000;">href="#aaa"</span>&gt;ссылка&lt;/a&gt;</p>
<p>то по клику на ссылку - произойдет прокрутка к блоку div.</p>
<p>Если же указано просто href="#", то почему-то, браузеры считают что нужно сделать прокрутку в самое начало страницы.</p>
<p>Помнится, я долго бился с этой проблемой - и таки нашел альтернативу:</p>
<p>&lt;a <span style="color: #ff0000;">href="javascript: ;"</span>&gt;ссылка&lt;/a&gt;</p>
<p>По клику - никуда он не переходит и никуда ничего не прокручивает :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/11/href-vs-hrefjavascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>alert anchor-а выдает то что в href :(</title>
		<link>http://www.intval.ru/2009/04/10/alert-anchor/</link>
		<comments>http://www.intval.ru/2009/04/10/alert-anchor/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 11:32:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=57</guid>
		<description><![CDATA[3 часа времени убил недавно на непонятное поведение браузеров. Было у меня примерно следующее:
&#60;div id="aa"&#62;
&#60;a href="javascript: ;"&#62;Ссылочка&#60;/a&#62;
&#60;a href="javascript: ;"&#62;и еще ссылочка&#60;/a&#62;
&#60;a href="javascript: ;"&#62;и еще&#60;/a&#62; 
&#60;/div&#62;
через jQuery дергаю массив ссылок:
var links = $('#aa a');
и когда пробегаюсь по ним циклом - то при алерте элемента (другими словами, alert(a), где a - anchor) - получаю текст "javascript: ;".
2,5 [...]]]></description>
			<content:encoded><![CDATA[<p>3 часа времени убил недавно на непонятное поведение браузеров. Было у меня примерно следующее:</p>
<p><span style="color: #0000ff;">&lt;div</span> <span style="color: #993300;">id=</span><span style="color: #008000;">"aa"</span><span style="color: #0000ff;">&gt;</span></p>
<p><span style="color: #0000ff;">&lt;a</span> <span style="color: #993300;">href=</span><span style="color: #008000;">"javascript: ;"</span><span style="color: #0000ff;">&gt;</span>Ссылочка<span style="color: #0000ff;">&lt;/a&gt;</span></p>
<p><span style="color: #0000ff;">&lt;a</span> <span style="color: #993300;">href=</span><span style="color: #008000;">"javascript: ;"</span>&gt;и еще ссылочка<span style="color: #0000ff;">&lt;/a&gt;</span></p>
<p><span style="color: #0000ff;">&lt;a</span> <span style="color: #993300;">href=</span><span style="color: #008000;">"javascript: ;"</span>&gt;и еще<span style="color: #0000ff;">&lt;/a&gt; </span></p>
<p><span style="color: #0000ff;">&lt;/div&gt;</span></p>
<p>через jQuery дергаю массив ссылок:</p>
<p><span style="color: #3366ff;">var</span> links = $(<span style="color: #339966;">'#aa a'</span>);</p>
<p>и когда пробегаюсь по ним циклом - то при алерте элемента (другими словами, alert(a), где a - anchor) - получаю текст "javascript: ;".</p>
<p>2,5 часа я думал что дело в том как я выбираю данные в массив - мне казалось что цикл пробегает по полям &lt;a /&gt; и выводит собственно их, пробовал даже через $('#aa').getElementsByTagName('a'), но потом оказалось, что браузеры почему-то ведут себя неадекватно, если делается alert по &lt;a /&gt;.</p>
<p>К примеру:</p>
<p><span style="color: #0000ff;">&lt;a</span> <span style="color: #993300;">id=</span><span style="color: #339966;">"diablog"</span> <span style="color: #993300;">href=</span><span style="color: #339966;">"http://www.diablog.ru"</span><span style="color: #0000ff;">&gt;</span>Диаблогъ<span style="color: #0000ff;">&lt;/a&gt;</span><br />
<span style="color: #0000ff;">&lt;span</span> <span style="color: #993300;">id=</span><span style="color: #339966;">"oneone"</span><span style="color: #0000ff;">&gt;</span>АДЫНАДЫН<span style="color: #0000ff;">&lt;/span&gt;</span><br />
<span style="color: #0000ff;">&lt;script</span> <span style="color: #993300;">type=</span><span style="color: #339966;">"text/javascript"</span><span style="color: #0000ff;">&gt;</span><br />
alert(document.getElementById('diablog'));<br />
alert(document.getElementById('oneone'));<br />
<span style="color: #0000ff;">&lt;/script&gt;</span></p>
<p>Про спан все честно скажут, что это Object HTMLElement (Opera),  Object HTMLSpanElement (FF) и просто object в IE6, а вот зато про анчор - тупо выведется то, что в параметре href.</p>
<p>this is kind of magic o-o-ou <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/04/10/alert-anchor/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
