<?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>Vitamin's blog</title>
	<atom:link href="http://vitamin.org.ua/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://vitamin.org.ua/blog</link>
	<description>Ideas aloud</description>
	<lastBuildDate>Tue, 09 Feb 2010 10:54:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Firebug. Console.log(). Или почему JavaScript не срабатывает?</title>
		<link>http://vitamin.org.ua/blog/articles/firebug-ili-pochemu-javascript-ne-srabatyvaet/</link>
		<comments>http://vitamin.org.ua/blog/articles/firebug-ili-pochemu-javascript-ne-srabatyvaet/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 10:54:02 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[файрбаг]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/?p=110</guid>
		<description><![CDATA[Firebug безусловно крутая штука, но иногда он становится причиной некоторых неполадок с JavaScript на странице. Неоднократно встречался, что при включенной консоли без видимых причин не срабатывает JS на странице, всё исправляется отключением всех консолей. Так же, для тех кто использует команду console.log(); для вывода дебага в консоль Firebugа, будьте бдительны, если вы забудете убрать эту [...]]]></description>
			<content:encoded><![CDATA[<p>Firebug безусловно крутая штука, но иногда он становится причиной некоторых неполадок с JavaScript на странице.</p>
<p>Неоднократно встречался, что при включенной консоли без видимых причин не срабатывает JS на странице, всё исправляется отключением всех консолей.</p>
<p>Так же, для тех кто использует команду console.log(); для вывода дебага в консоль Firebugа, будьте бдительны, если вы забудете убрать эту команду из кода и на страничку зайдет человек, у которого этот плагин не установлен, это приведет к ошибке а-ля <strong>&#171;console is not a function&#187;</strong> (или что-то в этом роде) что и повлечет за собой невыполнение остального джаваскрипта на странице.</p>
<p>Кто ещё не в курсе что за зверь этот Firebug, посмотрите <a title="Web Development Evolved." href="http://getfirebug.com/" target="_self">сюда</a> и пользуйтесь на здоровье.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/firebug-ili-pochemu-javascript-ne-srabatyvaet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Smarty-кеш или сайт тормозит</title>
		<link>http://vitamin.org.ua/blog/articles/smarty-kesh-ili-sayt-tormozit/</link>
		<comments>http://vitamin.org.ua/blog/articles/smarty-kesh-ili-sayt-tormozit/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 16:59:01 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[кеш]]></category>
		<category><![CDATA[смарти]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/?p=106</guid>
		<description><![CDATA[Проект IIS+PHP+MySQL+FMS реализует видео-чат. В качестве шаблонизатора используется Smarty (http://www.smarty.net/). Спустя 3 года с выхода в live начал сдыхать. Это проявлялось дикими тормозами, странички которые в первое время продакшн-жизни грузились 1-2 секунды начали грузиться по 30-40 секунд. Что соответственно и породило необходимость изучить этот вопрос. Началом исследования были установка систем мониторинга на сервер (Cacti и [...]]]></description>
			<content:encoded><![CDATA[<p>Проект IIS+PHP+MySQL+FMS реализует видео-чат.</p>
<p>В качестве шаблонизатора используется Smarty (http://www.smarty.net/).<br />
Спустя 3 года с выхода в live начал сдыхать. Это проявлялось дикими тормозами, странички которые в первое время продакшн-жизни грузились 1-2 секунды начали грузиться по 30-40 секунд. Что соответственно и породило необходимость изучить этот вопрос.</p>
<p><span id="more-106"></span>Началом исследования были установка систем мониторинга на сервер (Cacti и т. д.), потому что грешили на нехватку системных ресурсов. После недельного контроля стало ясно, что все ресурсы в норме даже в часы пик.</p>
<p>Начали копать глубже, в сторону толщины интернет-канала. После подсчетов выяснили, что при таких нагрузках канал не должен загинаться.</p>
<p>Посмотрели в сторону работы Flash-части аппликухи, особых огрех не было найдено, те что нашли &#8212; исправили. Но это на ситуацию не повлияло.<br />
Не обминули вниманием и ПХП часть на предмет оптимизации запросов к базе и тому подобного, нашли мелочи всякие, оптимизнули &#8212; не помогло.</p>
<p>Оказались в тупиковой ситуации, так как уже не знали куда смотреть.<br />
По чистой случайности заглянули в папку, хранящую <strong>кеш-файлы</strong> <strong>Smarty</strong>. Она содержала ни много ни мало 29 тысяч файлов.<br />
После недолгого совещания решили их <strong>удалить</strong>. Результат был налицо, <strong>всё вернулось на круги своя</strong>, странички грузятся как в былые времена, сравнительно быстро и без лишних вопросов.</p>
<p>В результате написали крон-скрипт, который раз в 2 месяца делает &#171;зачистку&#187; папочки с кешом.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/smarty-kesh-ili-sayt-tormozit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>r is not a constructor. Ошибка в TinyMCE</title>
		<link>http://vitamin.org.ua/blog/articles/r-is-not-a-constructor/</link>
		<comments>http://vitamin.org.ua/blog/articles/r-is-not-a-constructor/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 12:57:02 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[o is not a constructor]]></category>
		<category><![CDATA[r is not a constructor]]></category>
		<category><![CDATA[tinymce]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/?p=93</guid>
		<description><![CDATA[Столкнулся с этой ошибкой. После небольшого ресерча нашел ответ на офсайтовском форуме. Проблема возникает если TinyMCE не хватает каких-то файлов, зачастую из папочек plugins или themes. После заливки MCEшки на FTP с помощью TC у меня этих папок с файлами не оказалось (Причины их отсутствия не ясны, скорее всего либо квоты на дисковое пространство или [...]]]></description>
			<content:encoded><![CDATA[<p>Столкнулся с этой ошибкой. После небольшого ресерча нашел ответ на офсайтовском форуме.<br />
Проблема возникает если TinyMCE не хватает каких-то файлов, зачастую из папочек plugins или themes.<br />
После заливки MCEшки на FTP с помощью TC у меня этих папок с файлами не оказалось (Причины их отсутствия не ясны, скорее всего либо квоты на дисковое пространство или траблы с коннектом)<br />
После дозаливки двух папочек на их законное место, TinyMCE заработала корректно.</p>
<p>Мораль: если TinyMCE ругается вот так: &#171;r is not a constructor&#187; или вот так: &#171;o is not a constructor&#187;, ну или подобным образом, проверь что бы все файлы и папки были на местах в нужном количестве.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/r-is-not-a-constructor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL. Манипуляция над данными из колонок и запись результата в другую колонку</title>
		<link>http://vitamin.org.ua/blog/articles/mysql-copy-columns-with-modifications/</link>
		<comments>http://vitamin.org.ua/blog/articles/mysql-copy-columns-with-modifications/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 13:43:45 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[columns copying]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[копирование данных из одной колонки в другую]]></category>
		<category><![CDATA[копирование колонок]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/?p=83</guid>
		<description><![CDATA[Столкнулся с тривиальной задачей. Нужно скопировать значения одной колонки в другую, преобразовав их в нижний регистр. Немного потупил, а потом спросил у комрада. Решение элементарное: UPDATE tablename SET col2 = LOWER(col1); где tablename &#8212; название таблицы, над которой происходят манипуляции, col1 &#8212; колонка с исходными значениями, col2 &#8212; колонка с преобразованными в нижний регистр значениями [...]]]></description>
			<content:encoded><![CDATA[<p>Столкнулся с тривиальной задачей. Нужно скопировать значения одной колонки в другую, преобразовав их в нижний регистр.<br />
Немного потупил, а потом спросил у комрада. Решение элементарное:</p>
<p><strong>UPDATE</strong><br />
tablename<br />
<strong>SET </strong><br />
col2 = <strong>LOWER</strong>(col1);</p>
<p>где<br />
tablename &#8212; название таблицы, над которой происходят манипуляции,<br />
col1 &#8212; колонка с исходными значениями,<br />
col2 &#8212; колонка с преобразованными в нижний регистр значениями из колонки col1,<br />
LOWER &#8212; команда преобразующая значение в нижний регистр;</p>
<p>Соответственно, основываясь на этом примере, можно производить всевозможные манипуляциями с данными из одной или нескольких колонок и записывать результат в третью.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/mysql-copy-columns-with-modifications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL. Проверка валидности даты</title>
		<link>http://vitamin.org.ua/blog/articles/mysql_date_validation/</link>
		<comments>http://vitamin.org.ua/blog/articles/mysql_date_validation/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 09:09:28 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[date validaion in mysql]]></category>
		<category><![CDATA[date validation]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[валидность даты]]></category>
		<category><![CDATA[валидность даты в mysql]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/?p=72</guid>
		<description><![CDATA[Если в MySQL сделать следующий запрос: select date(&#171;2008-02-31&#8243;); умный MySQL вернет в результате запроса NULL, ну логично, что в феврале месяце в 2008 году не было 31 дня, да и 30 собственно тоже не было, а вот если написать select date(&#171;2008-02-29&#8243;); то в ответе получим значение отличное от NULL, а именно эту же дату, что [...]]]></description>
			<content:encoded><![CDATA[<p>Если в MySQL сделать следующий запрос:</p>
<p>select date(&#171;2008-02-31&#8243;);</p>
<p>умный MySQL вернет в результате запроса NULL, ну логично, что в феврале месяце в 2008 году не было 31 дня, да и 30 собственно тоже не было, а вот если написать</p>
<p>select date(&#171;2008-02-29&#8243;);</p>
<p>то в ответе получим значение отличное от NULL, а именно эту же дату, что и будет доказательством её валидности и существования.</p>
<p>P.S. Не знаю как в ранних версиях с наличием такой фичи, но в 5.0.24 она есть и иногда бывает очень даже полезной</p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/mysql_date_validation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MySQL. Удаление записей с несуществующей ссылкой</title>
		<link>http://vitamin.org.ua/blog/articles/mysql_delete_crashed_links/</link>
		<comments>http://vitamin.org.ua/blog/articles/mysql_delete_crashed_links/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 14:15:03 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[delete links]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[как удалить запись с несуществующей ссылкой]]></category>
		<category><![CDATA[удаление битых ссылок]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/?p=71</guid>
		<description><![CDATA[Предположим у нас есть 2 таблички &#8212; ПАПКИ (folders) и ФАЙЛЫ (files). У файлов есть ссылка на айдишку папки, в которой они распологаются. Предположим, что по неосторожности мы удалили несколько ненужных нам папок, но забыли удалить файлы, которые лежали в этих папках. Итак, для того, что бы удалить файлы, у которых ссылка на несуществующую папку, [...]]]></description>
			<content:encoded><![CDATA[<p>Предположим у нас есть 2 таблички &#8212; ПАПКИ (folders) и ФАЙЛЫ (files). У файлов есть ссылка на айдишку папки, в которой они распологаются. Предположим, что по неосторожности мы удалили несколько ненужных нам папок, но забыли удалить файлы, которые лежали в этих папках. Итак, для того, что бы удалить файлы, у которых ссылка на несуществующую папку, выполняем запрос:</p>
<p><strong>delete from files<br />
where<br />
folder_id not in (select folder_id from folders) and folder_id &lt;&gt; -1</strong></p>
<p>В этом примере так же учтена корневая папка (-1).</p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/mysql_delete_crashed_links/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Проблема с сессиями в Internet Explorer</title>
		<link>http://vitamin.org.ua/blog/articles/session_cookies_vs_ie/</link>
		<comments>http://vitamin.org.ua/blog/articles/session_cookies_vs_ie/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 05:10:59 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/articles/session_cookies_vs_ie/</guid>
		<description><![CDATA[Проблема состоит в том, что из под Firefox нормально логинится на сайт (стартует сессия), а из под Internet Explorer(IE) не хочет. С помощью josser&#8216;а выяснили, что проблема в том, что не сохраняется сессионная кука. Ну а проблема не сохранения сессионной куки обстояла в том, что на сервере стояло время в прошлом, и кука сохранялась с [...]]]></description>
			<content:encoded><![CDATA[<p>Проблема состоит в том, что из под Firefox нормально логинится на сайт (стартует сессия), а из под Internet Explorer(IE) не хочет.<br />
С помощью <a title="iRupor's Blog" href="http://josser.baywords.com" target="_blank">josser</a>&#8216;а выяснили, что проблема в том, что не сохраняется сессионная кука.<br />
Ну а проблема не сохранения сессионной куки обстояла в том, что на сервере стояло время в прошлом, и кука сохранялась с &#171;заведомо проэкспайренной датой&#187;.<br />
IE и Opera  к сожалению на такой поворот событий обижаются.<br />
Firefox&#8217;у респект, за искусственную поддержку сессий.</p>
<p>Лечится это всё установкой нормальной таймзоны на сервере:<br />
# ntpdate pool.ntp.org</p>
<p># tzselect</p>
<p><em>Спасибо <a title="genotrance.wordpress.com" href="http://genotrance.wordpress.com/2006/11/23/session-cookies-rejected-by-internet-explorer/" target="_blank">им</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/session_cookies_vs_ie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Идея и реализация</title>
		<link>http://vitamin.org.ua/blog/articles/idea_and_implementation/</link>
		<comments>http://vitamin.org.ua/blog/articles/idea_and_implementation/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 05:10:45 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Вариации на тему]]></category>
		<category><![CDATA[idea and implementation]]></category>
		<category><![CDATA[Идея]]></category>
		<category><![CDATA[идея и реализация]]></category>
		<category><![CDATA[мысль]]></category>
		<category><![CDATA[проект]]></category>
		<category><![CDATA[реализация]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/articles/idea_and_implementation/</guid>
		<description><![CDATA[Идея (др.-греч. ἰδέα — видность, вид, форма) — понятие (мысленный образ) какой-либо реальности, (мысль или представление о ней). Каждый человек, если он не растение  конечно-же, способен с определенной периодичностью генерировать интересные идеи, реализация которых, со временем, начинает приносить либо славу человеку, либо деньги, либо ещё какие-нибудь позитивные штуки. Но есть одна проблема&#8230; Как от идеи [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border: medium none ; margin: 5px" src="http://vitamin.org.ua/blog/wp-content/uploads/2008/05/idea1.thumbnail.gif" alt="Идея" align="left" /><strong>Идея</strong> (<a title="Древнегреческий язык" href="http://ru.wikipedia.org/wiki/%D0%94%D1%80%D0%B5%D0%B2%D0%BD%D0%B5%D0%B3%D1%80%D0%B5%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA">др.-греч.</a> <span style="font-size: 110%; font-family: palatino linotype,new athena unicode,athena,gentium,code2000,serif;">ἰδέα</span> — видность, вид, форма) — <a title="Понятие" href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D0%B5">понятие</a> (<a title="Образ (психология)" href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B7_%28%D0%BF%D1%81%D0%B8%D1%85%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F%29">мысленный образ</a>) какой-либо <a title="Реальность" href="http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C">реальности</a>, (<a title="Мысль" href="http://ru.wikipedia.org/wiki/%D0%9C%D1%8B%D1%81%D0%BB%D1%8C">мысль</a> или <a title="Представление" href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5">представление</a> о ней).</p>
<p>Каждый человек, если он не растение  конечно-же, способен с определенной периодичностью генерировать интересные идеи, реализация которых, со временем, начинает приносить либо славу человеку, либо деньги, либо ещё какие-нибудь позитивные штуки. Но есть одна проблема&#8230;</p>
<p><span id="more-47"></span>Как от идеи пройти все этапы и окончить реализацией? Где взять на это время? Именно нехватка времени является главной преградой на пути воплощения идеи в жизнь. У меня достаточно много товарищей, которые при встрече делятся своими идеями по поводу реализации разноплановых проектов, но лишь малая доля этих идей принимается к разработке. Я неоднократно был свидетелем, когда кто-то в узком кругу высказал какую-то мысль, а через некоторое время в Интернете появляется ресурс, который в точности реализовует высказанную немногим раньше мысль, только в исполнении совершенно левых  людей, которым пришла в голову такая же идея и они нашли ресурсы для её реализации и теперь получают за это какие-то бонусы. Знакомо?</p>
<p>За полгода до появления всем известных социальных сетей, реализующих возможность найти своих школьных друзей и тому подобное, мы с командой неоднократно размышляли на тему создания именно такого ресурса, но дальше слов дело не пошло. Вуаля! Спустя некоторое время сразу пачка такого плана ресурсов в Интернете.</p>
<p>Заметьте также, что  одноплановых ресурсов в сети предостаточно и с каждым днем появляются новые и со временем тоже становятся популярными. Делаем вывод что, не стоит отчаиваться если вашу идею уже воплотили и она пользуется бешеным спросом, просто сделайте лучше и неизменно успех будет.</p>
<p>Изучая сетевые ресурсы, можно найти достаточно сайтов, которые в плане функциональности либо представляют малый интерес пользователю либо вовсе его не представляют, но, тем не менее, они неплохо посещаются и приносят копеечку. Не переведутся в сети пользователи, которые будут использовать даже самый бесполезный ресурс. Если даже ресурс не представляет интереса русскомыслящему пользователю, то хватает в мире пользователей, которые мыслят слегка по другому и он их точно заинтересует <img src='http://vitamin.org.ua/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Если пришла в голову идея по поводу реализации того или иного проекта и аналогов в сети нет,  знайте, что где-нибудь в Америке кому-нибудь пришла такая же идея и он уже начал её реализовывать.</p>
<p>Поделитесь своей идеей с самым близким человеком и если он не скажет: &#171;Друг, да это же лажа!&#187;, смело беритесь за работу.</p>
<p>Не бойтесь своих идей! Ищите время и делайте!</p>
<p><em>Послесловие.<br />
Лично у меня порядка десятка идей, которые будут с вероятностью 80% популярными после реализации.<br />
Четыре мои идеи спустя некоторое кол-во времени были реализованы посторонними людьми и приносят доход.<br />
К сожалению график работы, который я избрал для себя, не позволяет мне уделять время воплощению своих мыслей в жизнь.<br />
По окончанию проекта, разрабатываемого мной сейчас в качестве дополнительного заработка, сделаю попытку завязать с чужими проектами и заняться хотя бы одним своим вплотную.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/idea_and_implementation/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Большой проект. Советы</title>
		<link>http://vitamin.org.ua/blog/articles/big_project/</link>
		<comments>http://vitamin.org.ua/blog/articles/big_project/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 05:10:22 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[GUID]]></category>
		<category><![CDATA[ID]]></category>
		<category><![CDATA[integer]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[XML_RPC]]></category>
		<category><![CDATA[бинарные данные]]></category>
		<category><![CDATA[большой проект]]></category>
		<category><![CDATA[взаимозаменяемая разработка]]></category>
		<category><![CDATA[вьюхи]]></category>
		<category><![CDATA[гуид]]></category>
		<category><![CDATA[дата редактирования]]></category>
		<category><![CDATA[дата создания]]></category>
		<category><![CDATA[мультиязычность]]></category>
		<category><![CDATA[поле активности записи]]></category>
		<category><![CDATA[расширяемость базы]]></category>
		<category><![CDATA[рефакторинг]]></category>
		<category><![CDATA[стандарты кодирования]]></category>
		<category><![CDATA[сторонние библиотеки]]></category>
		<category><![CDATA[триггеры]]></category>
		<category><![CDATA[уникальный идентификатор]]></category>
		<category><![CDATA[функции]]></category>
		<category><![CDATA[функция генерации уникального идентификатора]]></category>
		<category><![CDATA[чистка кода]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/?p=4</guid>
		<description><![CDATA[В моем понимании большой проект &#8212; это проект, который длится более одного года при участии как минимум трех программистов. Именно в таком проекте я работаю уже в течении ~ полутора лет. За этот срок я неоднократно сталкивался с разного рода &#171;граблями&#187;. В двух словах о системе. Система состоит из вебной и десктопной частей, обмен данными [...]]]></description>
			<content:encoded><![CDATA[<p>В моем понимании большой проект &#8212; это проект, который длится более одного года при участии как минимум трех программистов. Именно в таком проекте я работаю уже в течении ~ полутора лет. За этот срок я неоднократно сталкивался с разного рода &#171;граблями&#187;.<span id="more-4"></span></p>
<p>В двух словах о системе.</p>
<p>Система состоит из вебной и десктопной частей, обмен данными между которыми происходит посредством XML_RPC. Система требует наличия уникальных идентификаторов(GUID) для некоторых сущностей. Объем данных передаваемых с клиентской части на серверную достаточно велик, варьируется от кол-ва экземпляров сущностей созданных на клиенткой стороне. База данных содержит более сорока таблиц, в третьей части которых кол-во записей может превышать сто тысяч. База данных &#8212; <a title="PostgreSQL:  The world's most advanced open source database " href="http://www.postgresql.org/" target="_blank">PostgreSQL</a>. Мультиязычность.</p>
<p>Далее список фишек, с которыми были проблемы или неясности.</p>
<p>1) <strong>GUID</strong></p>
<p>В процессе разработки стало понятно что без уникальных идентификаторов мы не сможем просинхронизировать данные между клиентской и серверной сторонами. Было решено сущностям, требующим уникальности добавить текстовое поле размером 32 байта и содержимым, которое генерируется выполнением следующей функции:</p>
<p>[cc lang="php" tab_size="2" lines="40"]function getGUID(){<br />
$str = &#187;;<br />
for ($i=0; $i &lt;100; $i++){<br />
$rand = rand(1,255);<br />
$str .= $rand;<br />
}<br />
return md5($str);</p>
<p>}[/cc]</p>
<p>В последних версиях базы данных PostgreSQL можно автоматизировать процесс генерации уникального идентификатора на уровне базы.</p>
<p>2. <strong>UTF-8</strong></p>
<p>Так как система нуждается в синхронизации со сторонними программами и должна реализовывать многоязычность, было решено использовать универсальную кодировку UTF-8. В связи с этим появились несколько проблем. Так как UTF-8 универсальная кодировка значит она должна позволять хранить любые наборы символов на любом языке, она это позволяет, но размер каждого из символов может варьироваться от одного байта до четырех, а для &#171;хитрых&#187; языков, типа китайский и того больше. Грубо говоря символ &#171;a&#187; на английской раскладке занимает в базе 1 байт, а сивол &#171;а&#187; на русской раскладке занимает 4 байта. Отсюда делаем вывод, что поле varchar(32) не сможет поместить фразу &#171;УТФ навсегда&#187;, кол-во символов в которой всего 12. Следует обратить на это особое внимание. Также нужно не забыть указать кодировку передаваемых данных в XML_RPC. Так как мы использовали XML_RPC от PEAR, при чем старой версии, пришлось лезть в сам файлик Server.php и там хардкодить строку</p>
<p>[cc lang="php" tab_size="2" lines="40"]</p>
<p>/**<br />
* The present response&#8217;s encoding<br />
* @var string<br />
* @see XML_RPC_Message::getEncoding()<br />
*/<br />
var $encoding = &#8216;UTF-8&#8242;;</p>
<p>[/cc]</p>
<p>так как на команду setEncoding(&#8216;UTF-8&#8242;) он реагировал не адекватно.</p>
<p>3. <strong>Безболезненная расширяемость базы</strong></p>
<p>В большинстве случаев больших проектов, заказчик со временем начинает желать, что бы отдельные сущности системы имели возможность &#171;размножаться&#187;.  Возьмем например электронный магазин, в котором изначально задумывался один человек, который торгует и множество, которые покупают. Я бы выделил 3 варианта решения такой задачи:</p>
<p>1) если продавец один, мы его не идентифицируем и считаем по умолчанию все транзакции с его участием (расширяемый с большими трудностями вариант);</p>
<p>2) мы делаем дефайн этого самого продавца и присваиваем ему ID например равный 1. И во всех табличках, где должен участвовать продавец, добавляем поле в которое и вписываем эту единичку(недоделанный простой вариант расширяемости);</p>
<p>3) делаем табличку продавцов, в которой есть 1 продавец и его ID используем в качестве ID в пункте номер 2 (правильный вариант, удоборасширяемый).</p>
<p>В случае использования варианта 3 мы без проблем расширим систему для использования множества продавцов(всего лишь добавив запись в табличку продавцов), если такая задача когда-то появится, а если не появится &#8212; не страшно, потерь в производительности мы не ощутим.  В крайнем случае можно сделать как описано в варианте 1, но предусмотреть возможность реализации как в вариантах 2 и 3.</p>
<p>4. <strong>INT(ID) и индексы</strong></p>
<p>Ни для кого не секрет, что каждая табличка в базе, должна содержать автоинкрементный ID типа INTEGER. Некоторые разработчики этим полем пренебрегают, а зря. Так же важным моментом являются <a title="Индексы в базе данных" href="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81_(%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)" target="_blank">индексы</a>.</p>
<p>5. <strong>Свои имена</strong></p>
<p>Важно, поля в таблицах, имена классов, переменных, методов называть осмысленными именами, что бы каждый человек, который будет просматривать или править ваш код, мог понять, что за матюки вы там написали.  Читайте <a title="Стандарты кодирования" href="http://www.google.com.ua/search?q=стандарты+кодирования" target="_blank">стандарты кодирования</a>.</p>
<p>6. <strong>Рефакторинг</strong></p>
<p>Зачастую в больших проектах наступают времена, когда максимально срочно, нужно реализовать ту или иную функциональность за короткий срок. Вы реализуете это, но не так качественно как хотелось бы, так как времени у вас нет. Но так же часто, после таких срочностей наступают моменты &#171;затишья&#187;, когда особо делать то и нечего. Такие моменты идеально подходят для рефакторинга существующего кода.  Это конечно-же в идеале. Когда таких моментов не появляется, можете смело рассказывать заказчику о &#171;костылестроении&#187; и предупреждать, что нормальная система может превратиться в один большой костыль и потом всё равно прийдется выделять время на рефакторинг либо на переписку кода.</p>
<p>7. <strong>Чистка кода</strong></p>
<p>Один раз за определенный срок (возьмем 2 месяца) необходимо проводить чистку кода. Например ранее вы использовали ту или иную функцию, а сейчас уже не используете, но так как вы не уверены в том, что эта функция используется только в вашей части проекта, вы её просто комментируете и ставите дату, когда вы её закомментировали. Если претензий типа: &#171;У меня всё отвалилось&#187; не поступало, значит при очередном осмотре кода, можете смело грохать эту функцию за ненадобностью. Можно конечно удалить, положившись на <a title="SVN" href="http://ru.wikipedia.org/wiki/Subversion" target="_blank">Subversion</a>, но я предпочитаю использовать комментарии.</p>
<p>8. <strong>Даты создания/редактирования, активность записи</strong></p>
<p>С давних пор выработал привычку, вне зависимости от таблицы в базе и её наполнения, хранить дату создания и редактирования записи. А так же стабильно добавляю булевской поле &#171;активности&#187; записи. Логика первых двух ясна. А поле активности записи используется для псевдоудаления записи. То есть все записи, у которых поле активности 0 не участвуют в выборках.</p>
<p>9. <strong>SQL &#8212; роботяга</strong></p>
<p>Логика PHP или других скриптовых языков, работающих с базой максимально должна быть переложена &#171;на плечи&#187; базы данных. Благо современные базы очень много позволяют взвалить на себя. Не стесняйтесь почитать руководства по функциям, вьюхам, триггерам и тому подобному добру.</p>
<p>10. <strong>Взаимозаменяемая разработка</strong></p>
<p>Есть большая система. Её разрабатывает несколько человек. Каждый занимается своей частью и не вникает в часть других разработчиков. Когда одно из звеньев выпадает из разработки(болезнь, отпуск), а по его части необходима доработка функционала, уходит много времени, что бы понять что к чему и всё таки внести доработки. Что бы такого избежать, нужно один раз в период(устанавливается в зависимости от ситуации лидером разработчиков) менять разработчиков местами или устраивать краткий обзор по коду, что бы каждый из них имел хорошее представление о своей части и более менее нормальное о соседской. На такие рокировки уходит определенное время, на оплату которого заказчик может не согласиться, но если такое сделать удается, эту возможность упускать не стоит.</p>
<p>11. <strong>Бинарные данные</strong></p>
<p>Хранить в базе бинарные бинарные данные не советую (даже если их размер ничтожно мал), пускай лежат в файле с уникальным именем, а в базе хранится всего лишь ссылка.</p>
<p>12. <strong>Кеширование</strong></p>
<p>Если вам приходится делать огромные однотипные выборки из базы, используйте кеширование, один из вариантов кеширования на PHP предложил мой напарник в <a title="Josser's Caching" href="http://josser.baywords.com/?p=11" target="_blank">этой статье</a>.</p>
<p>13. <strong>&#171;Левые&#187; библиотеки</strong></p>
<p>Для некоторых целей разумно использовать сторонние библиотеки (например генерация PDF). Важно провести <strong>детальнейший</strong> поиск и убедиться в том, что выбранная вами библиотека позволит вам реализовать все ваши потребности.</p>
<p>Вот в принципе и все, вспомню ещё &#8212; добавлю. Жду комментариев и дополнений. Спасибо</p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/big_project/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>PHPDocumentor. Как пользоваться?</title>
		<link>http://vitamin.org.ua/blog/articles/phpdocumentor/</link>
		<comments>http://vitamin.org.ua/blog/articles/phpdocumentor/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 05:10:03 +0000</pubDate>
		<dc:creator>vitamin</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[phpdocumentor]]></category>
		<category><![CDATA[Zend Studio]]></category>
		<category><![CDATA[документирование кода]]></category>
		<category><![CDATA[документор]]></category>
		<category><![CDATA[пхп-документор]]></category>

		<guid isPermaLink="false">http://vitamin.org.ua/blog/articles/phpdocumentor/</guid>
		<description><![CDATA[Кто такой PHPDocumentor (далее &#171;документор&#187;) можно почитать здесь: на PEAR&#8217;е &#8212; http://pear.php.net/package/PhpDocumentor/; на Сурсфорже &#8212; http://phpdocu.sourceforge.net/. А промануалиться здесь &#8212; http://www.phpdoc.org/manual.php . Вкратце скажу, что он умеет документировать PHP-код, то есть делать HTML с кликабельным описанием методов, классов и тому подобную инфу. Такая информация зачастую требуется по окончанию определенного этапа в проекте. Для пользователей Zend [...]]]></description>
			<content:encoded><![CDATA[<p>Кто такой PHPDocumentor (далее &#171;документор&#187;) можно почитать здесь:</p>
<ul>
<li>на PEAR&#8217;е &#8212; http://pear.php.net/package/PhpDocumentor/;</li>
<li>на Сурсфорже &#8212; http://phpdocu.sourceforge.net/.</li>
</ul>
<p>А промануалиться здесь &#8212; http://www.phpdoc.org/manual.php .</p>
<p>Вкратце скажу, что он умеет документировать PHP-код, то есть делать HTML с кликабельным описанием методов, классов и тому подобную инфу. Такая информация зачастую требуется по окончанию определенного этапа в проекте.</p>
<p>Для пользователей Zend Studio (http://www.zend.com/en/downloads/) нет никаких сложностей при в использовании документора, так как он встроен в нее и легко запускается &#187; <strong><span style="text-decoration: underline;">T</span>ools -&gt; PHPDocumentor </strong>&#171;. Правда, если вы используете операционную систему Windows, могут возникать некоторые проблемы с копированием необходимых файлов из за разности слешей. Пару раз столкнувшись с этой проблемой и не найдя моментального решения, решил поднять документор у себя на локали.</p>
<p>Исходники берем либо на сайте либо из папки с ZendStudio . DIRECTORY_SEPARATOR . bin  . DIRECTORY_SEPARATOR . phpdocumentor. Копируем их к себе в htdocs/phpdocumentor, заходим http://localhost/phpdocumentor/, в закладке  &#171;<strong>Files</strong>&#187; указываем  файлы либо папку, файлы в которой надо документировать. Затем в &#171;<strong>Output</strong>&#187; указываем папку в которую будут складываться htmlки и формат вывода из выпадающего списка. В &#171;<strong>Options</strong>&#187; указываем название пакета и нажимаем кнопку &#171;<strong>create</strong>&#187; справа внизу. Чуть ниже в отдельном горизонтальном фрейме можно будет проследить за ходом генерации.</p>
<p align="left">Приятного документирования <img src='http://vitamin.org.ua/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p align="center"><a title="PHPDocumentor" href="http://vitamin.org.ua/blog/wp-content/uploads/2008/05/phpdoc.jpg"><img src="http://vitamin.org.ua/blog/wp-content/uploads/2008/05/phpdoc.thumbnail.jpg" alt="PHPDocumentor" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://vitamin.org.ua/blog/articles/phpdocumentor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

