<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Мир php моими глазами</title>
	<atom:link href="http://www.intval.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.intval.ru</link>
	<description>Грабли, костыли и другие умные мысли</description>
	<lastBuildDate>Thu, 24 Nov 2011 16:08:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Немного о drupal 6</title>
		<link>http://www.intval.ru/2011/11/24/%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%be-drupal-6/</link>
		<comments>http://www.intval.ru/2011/11/24/%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%be-drupal-6/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 15:45:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Технологии]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=168</guid>
		<description><![CDATA[Хочу упомянуть очень полезный модуль для drupal Devel. Одна из его функция позволяет нажатием Empty cache выполнить одноименную функцию, что часто требуется. Также встроенная функция 1 &#60;?php dsm ($переменная); ?&#62; позволяет посмотреть содержание любой переменной или любого массива в потрясающе удобном виде, на самом деле это альтернатива функции print_r, которую можно использовать в качестве плагина [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу упомянуть очень полезный модуль для drupal Devel. Одна из его функция позволяет нажатием Empty cache выполнить одноименную функцию, что часто требуется. Также встроенная функция</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="language" style="font-family:monospace;"> &lt;?php dsm ($переменная);  ?&gt;</pre></td></tr></table></div>

<p> позволяет посмотреть содержание любой переменной или любого массива в потрясающе удобном виде, на самом деле это альтернатива функции print_r, которую можно использовать в качестве плагина на любом сайте, не только drupal. Вот ссылка http://krumo.sourceforge.net/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2011/11/24/%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%be-drupal-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вызов меню выбора файла из javascript-а</title>
		<link>http://www.intval.ru/2010/12/02/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bc%d0%b5%d0%bd%d1%8e-%d0%b2%d1%8b%d0%b1%d0%be%d1%80%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b8%d0%b7-javascript-%d0%b0/</link>
		<comments>http://www.intval.ru/2010/12/02/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bc%d0%b5%d0%bd%d1%8e-%d0%b2%d1%8b%d0%b1%d0%be%d1%80%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b8%d0%b7-javascript-%d0%b0/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 10:20:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=161</guid>
		<description><![CDATA[Столкнулся с очень своеобразной проблемой - нужно было сделать, чтобы по крику на ссылку открывалось окошко выбора файла как в input type="file". Перерыл инет, нашел советы по поводу вызова метода click у input type="file", но у меня так оно и не прокатило. Стал рыться дальше - нашел даже очень большую статью, в которой написано мол [...]]]></description>
			<content:encoded><![CDATA[<p>Столкнулся с очень своеобразной проблемой - нужно было сделать, чтобы по крику на ссылку открывалось окошко выбора файла как в input type="file". Перерыл инет, нашел советы по поводу вызова метода click у input type="file", но у меня так оно и не прокатило. Стал рыться дальше - нашел даже очень большую статью, в которой написано мол "если бы браузеры давали возможность скриптам манипулировать этим типом инпута, то злоумышленники бы могли выкачать любой файл с компа человека". И я понимаю, безопасность все такое, но заказчик хочет.</p>
<p>В итоге на мою злочастную ссылку отдельным слоем сверху (через position: absolute) была наложена прозрачная кнопка из input type="hidden".</p>
<p>Вот так: &lt;div style="width: 100px; height: 20px;" &gt;&lt;input type="file" /&gt;&lt;/div&gt;</p>
<p>Т.е. это был div фиксированного размера, в нем поле input type="file" с большим шрифтом (чтобы сама кнопка обзор была большая), инпут перекручен так, чтобы видна была только кнопка (тогда cursor: pointer и пользователь не может тыкнуть в поле), т.е. инпут гораздо больше чем div, просто находится внутри него кнопкой попадая в то что из-под дива видно.</p>
<p>И разумеется все это счастье прозрачное. И вуаля! Пользователь думает что кликает на ссылку, а на самом деле кликает на кнопку - и наше менюшка выбора файла тут же появляется на экране.</p>
<p><a href="http://domystroy.ru/?p=696"> теплый дом .</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2010/12/02/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bc%d0%b5%d0%bd%d1%8e-%d0%b2%d1%8b%d0%b1%d0%be%d1%80%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b8%d0%b7-javascript-%d0%b0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Как работает removeChild :)</title>
		<link>http://www.intval.ru/2010/08/11/removechild-2/</link>
		<comments>http://www.intval.ru/2010/08/11/removechild-2/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 11:24:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Новое]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=159</guid>
		<description><![CDATA[Оказалось, что el.removeChild не удаляет сам элемент как мне раньше казалось, а лишь отвязывает элемент от родителя. А потом этот же элемент можно привязать к другому родителю скажем, что позволяет перемещать элементы по DOM-у. Например так: var el = document.getElementById('element'); el.parentNode.removeChild(el); document.getElementById('destination').appendChild(el);]]></description>
			<content:encoded><![CDATA[<p>Оказалось, что el.removeChild не удаляет сам элемент как мне раньше казалось, а лишь отвязывает элемент от родителя. А потом этот же элемент можно привязать к другому родителю скажем, что позволяет перемещать элементы по DOM-у. Например так:</p>
<p>var el = document.getElementById('element');<br />
el.parentNode.removeChild(el);<br />
document.getElementById('destination').appendChild(el);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2010/08/11/removechild-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>iLance CMS взляд изнутри</title>
		<link>http://www.intval.ru/2010/05/21/ilance/</link>
		<comments>http://www.intval.ru/2010/05/21/ilance/#comments</comments>
		<pubDate>Fri, 21 May 2010 10:58:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Обзоры]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=156</guid>
		<description><![CDATA[Не так давно столкнулся с замечательным движком iLance и о нем хотел бы написать свой первый обзор. Система платная, хотя есть и nulled версии вроде как. На сайте движка www.ilance.com описано как все там замечательно, все отлично настраивается и вообще убермегатру. Маркетологи как обычно постарались и описали все в лучших традициях, даже подготовив демки. К [...]]]></description>
			<content:encoded><![CDATA[<p>Не так давно столкнулся с замечательным движком iLance и о нем хотел бы написать свой первый обзор.</p>
<p>Система платная, хотя есть и nulled версии вроде как. На сайте движка www.ilance.com описано как все там замечательно, все отлично настраивается и вообще убермегатру. Маркетологи как обычно постарались и описали все в лучших традициях, даже подготовив демки.</p>
<p>К сожалению мне довелось увидеть эту систему не со стороны красивых админок и замечательных обзоров, а изнутри.<span id="more-156"></span>Честно говоря я очень давно программирую и мне нравится колупать именно чужой код, это очень обогащает идеями, и я не ожидал увидеть там четкой объекто-ориентированной вылизанной системы, но некоторые решения просто убили на месте...  Стоит отметить что iLance сам по себе по тому_что_он_может и что_там_можно_настроить довольно функционален. Действительно, на уровне самой цмски заложена мультиязычность с легкой возможностью настраивания через файлы конфигурации. И первое что отвалилось в процессе установки русской версии была именно она.  В программировании мультиязычных сайтов есть 2 основных подхода:</p>
<ul>
<li>Каждая языковая версия - это логически отдельный сайт со своей внутренней системой страниц, данных и т.п;</li>
<li>Структура данных одна и та же, но чуть ли не каждая запись сопровождается полем с идентификатором языка.</li>
</ul>
<p>Ребята же решили не париться со всеми этими сложными ссылками и прочей лабудой и просто продублировали каждую запись с языковым префиксом: title стал title_en и title_ru к примеру. И действительно зачем напрягаться, если title_en заполнен - значит английская, а нет - русская. И я честно понимаю разработчиков. Если бы я знал, что на сайте будет 2 языковые версии и только они - то в рамках баланса время/деньги действительно не стал бы заморачиваться. Принцип "делай то что нужно, а не то что может быть понадобится потом когда-нибудь а может и нет" знаете ли. Но парни явно забыли, что iLance - это система на продажу. И я не буду писать про расход памяти, про то какая задница добавить новую версию через тупое дублирование всех полей везде с дополнительным языковым префиксом - это хрен с ним, потому что даже эти 2 несчастных языка система не могла сожрать без глюков: Регионы глючили и глючили жестоко... И тут начался мой выход.</p>
<p>Первая попытка установить сайт на локальную площадку с треском провалилась. Мне искренне интересно, какой индусский долбоеб указал для половины полей в каждой таблице <strong>not null default null</strong> ? Но на удивление это работало на "живом" сайте, и не работало у меня. Любая попытка что-то записать в базу падала на инсерте когда такие поля были не заполнены. А система ведь на продажу, должна запускаться везде, ага <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>Как известно, многие продукты, которые выставляются на продажу пишутся на функциях без ООП. Это делается для того, чтобы система действительно работала абсолютно везде, при любой сборке php и на любом сервере. Если это не учитывается - строится мощная объектно-ориентированная архитектура приложения, все абстрагируется, пишутся требования к серверу и т.п. Но не тут. Действительно нет. Разработчики iLance настолько крутые ребята, что используют ООП в лучших традициях Индии. Первым делом я встретил антипаттерн God Object. Объект $ilance действительно настолько крутой что управляет и переменными реквеста, одновременно он и шаблонизатор и хранит настройки и вообще (я до многого не добрался, тут все его фичи описать не могу). Есть у объекта-бога и пару приспешников - объекты <em>некоторых </em>сущностей (функционально это не объекты вообще, а статические либы), <em>некоторых</em> означает примерно 10% сущностей, все же остальное хранится в файле с функциями на 4 тысячи строк и тотальной копипастой.</p>
<p>К слову об объектах. В php никогда не было толком никаких соглашений. Да, были попытки, но такого явного как скажем в java чтобы только camel hump и все, не было. И каждый мог выбрать то что ему нравилось. Но называть классы с маленькой буквы через подчеркивание, увольте.</p>
<p>А ужас нарастал. Вместо хоть какой-нибудь пародии на контроллеры и хотя бы уже черт с ним я бы смирился, чтобы отдельная страница отрисовывалась в отдельном php-файле без классов и функций. Пусть говногод ну да и ладно, в одном месте хотя бы, а значит - разобраться можно. Вместо этого меня встретили файлы по 3-5 тысяч сторок php кода, в очень редких местах были вызовы функций из либ (примерно таких же по объему и каше). Копипаста наполнила проект чуть более чем полностью. Некоторые записи вставляются через либы, а апдейтятся тут же через sql-ник. Кстати, очень много sql-ников и никакой абстракции под их генерацию даже для простейших тупых запросов из серии select * from table where че_то_там. Рендеринг страниц с помощью шаблонизатора идет вперемешку с расово индусским спагетти-кодом.</p>
<p>Кстати о шаблонизаторе. В iLance он есть, но лучше бы его не было. Все что он умеет - это условия (if-else) и циклы (loop). Кстати, я так и не нашел как же в цикл вставить условие <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  а все потому, что эти шаблоны никуда не транслируются. Обычно ж как, если есть псевдоязык - он транслируется в php файлик, который затем каждый раз подключается (чтобы не транслировать его еще раз) и уже по внутренностям этого файла можно догадаться о том как нужно писать в шаблонах чтобы оно работало. Но сохранения результатов нет, они есть в памяти черт знает где и потом по всему этому счастью происходит eval. Вот так-та.</p>
<p>Казалось бы, что уже после всего, что я увидел, сложно наляпать еще где-то. Я искренне в это верил пока не узнал как в iLance происходит работа с css. Надо отметить что во всех проектах, с которыми я работал (а это порядка 80 штук от самых мелких до монстров) я не встречал такого. Разработчики iLance действительно гении, они первые придумали хранить стили в базе данных! Нет, они не хранят там целые файлы стилей, это было бы еще полбеды. Каждый css-класс - это запись в базе. Имя записи к примеру .blog и код стиля padding: 0px; к примеру. А потом это все собирается в css-ку, которая ложится в кеш и подключается при запуске страниц. Редактирование этого всего - только через админский интерфейс. А в нем мегафишка! : область видимости стилей можно указать. Например можно чтобы определенный стиль был и в админке и на фронте, а другой только на фронте. Почему нельзя было сделать 3 файла скажем global.css, front.css и admin.css, как делают все нормальные люди? Да потому что там есть подсказки для стандартных стилей, наверное для того чтобы люди непросвященные в css легко могли добавлять и менять там что-то свое. Возможно, разработчики и не знали, но мы то точно знаем, что ни один нормальный человек, который в этих ваших стилях ничего не понимает никогда в жизни не попрется туда что-то править, а если уже человек решил разобраться в css, то в самих файлах ему будет куда проще (хотя бы потому что все доки именно по .css-файлам, а не по хренпойми чему), не говоря уже о профессиональных верстальщиках, которые скорее всего и будут делать редизайн в случае чего.</p>
<p>Подводя итоги моей работы с ее величеством iLance CMS хочу отметить, что, хотя она и ужасная внутри, работать с ней можно. Если ничего не нужно менять - работать она будет как 95% аналогичных систем по всему интернету. Парням из iLance искренне хочется пожелать хотя бы иногда включать мозг и прочитать пару книжек по ООП, их менеджерам - никогда не нанимать студентов, тем, кто прочитал эту статью и думает работать с этим или нет, подсказать уже нечего - вы и так молодцы, что не ограничиваетесь только тем что пишут на сайте самой cms-ки о ней, ну а программистам - никогда не повторять этих ошибок.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2010/05/21/ilance/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Вконтакте Merchant Пробатип</title>
		<link>http://www.intval.ru/2010/05/15/vkontakte-merchant/</link>
		<comments>http://www.intval.ru/2010/05/15/vkontakte-merchant/#comments</comments>
		<pubDate>Sat, 15 May 2010 06:28:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Технологии]]></category>

		<guid isPermaLink="false">http://www.intval.ru/?p=151</guid>
		<description><![CDATA[Не так давно ребята из Вконтакта сделали как известно свои Вконтактобабки. Голоса стали деньгами или вроде того. Сделали они и свои Payment Gateway назвав гордо Вконтакте Merchant. Мне довелось разобрать с этим, но дока оказалась очень сырой и местами с противоречиями, поэтому решил выложить пробатип этой API на суд интернетчиков. Система на мой взгляд еще [...]]]></description>
			<content:encoded><![CDATA[<p>Не так давно ребята из Вконтакта сделали как известно свои Вконтактобабки. Голоса стали деньгами или вроде того. Сделали они и свои Payment Gateway назвав гордо Вконтакте Merchant. Мне довелось разобрать с этим, но дока оказалась очень сырой и местами с противоречиями, поэтому решил выложить пробатип этой API на суд интернетчиков. Система на мой взгляд еще несколько сыровата, но <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  в общем, смотрите сами, вот он:</p>
<p><a href="http://www.intval.ru/upload/vk.zip">Вконтакте Merchant</a> в зипе</p>
<p>З.Ы. Код на 115 строк - ну не с руки в посте его писать.</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/2010/05/15/vkontakte-merchant/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</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>
		<slash:comments>3</slash:comments>
		</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>
		<slash:comments>6</slash:comments>
		</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>
		<slash:comments>2</slash:comments>
		</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>
		<slash:comments>5</slash:comments>
		</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>
		<slash:comments>0</slash:comments>
		</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' [...]]]></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>
		<slash:comments>3</slash:comments>
		</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' />  Вы считаете, что ваш аккаунт на вашем сайте - самое важно в жизни пользователя? ну-ну <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>
		<slash:comments>13</slash:comments>
		</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>
		<slash:comments>1</slash:comments>
		</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>
		<slash:comments>3</slash:comments>
		</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>
		<slash:comments>3</slash:comments>
		</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>
		<slash:comments>2</slash:comments>
		</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>
		<slash:comments>0</slash:comments>
		</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-шные части (например, отправка писем <img src='http://www.intval.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), то он все равно не сможет выполнять свою задачу.<br />
Так что отправка писем с ошибками администратору - тупая идея</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intval.ru/2009/05/01/mail-errors/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</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>
		<slash:comments>4</slash:comments>
		</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>
		<slash:comments>13</slash:comments>
		</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>
		<slash:comments>4</slash:comments>
		</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>
		<slash:comments>5</slash:comments>
		</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 включен (php.ini ну или php_value в [...]]]></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>
		<slash:comments>0</slash:comments>
		</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>
		<slash:comments>3</slash:comments>
		</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>
		<slash:comments>10</slash:comments>
		</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>
		<slash:comments>4</slash:comments>
		</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>
		<slash:comments>0</slash:comments>
		</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>
		<slash:comments>0</slash:comments>
		</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>
		<slash:comments>0</slash:comments>
		</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>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

