<?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>mike &#187; Web программирование</title>
	<atom:link href="http://mikhail.krivyy.com/category/zametki/web-programmirovanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikhail.krivyy.com</link>
	<description>мнение автора может не совпадать с его точкой зрения ©</description>
	<lastBuildDate>Fri, 10 Feb 2012 08:08:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<mikes>en</mikes>		<item>
		<title>SQL_CALC_FOUND_ROWS &#8212; а я то думал Life Hack</title>
		<link>http://mikhail.krivyy.com/2009/04/20/sql_calc_found_rows/</link>
		<comments>http://mikhail.krivyy.com/2009/04/20/sql_calc_found_rows/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 07:19:16 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/?p=1476</guid>
		<description><![CDATA[Иногда такое бывает. Вот узнаешь о каком-то лайф хаке, а оказывается что это нифига не лайф ках, а всем известная штука и ты один баран о нем не знал. Первый раз я попал в такую ситуацию когда залечивал очередную спортивную болячку. На физио нужно было открыть тюбик с мазью. Тюбик бы металлический, с железной мембранной под крышечкой. [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда такое бывает. Вот узнаешь о каком-то <a href="http://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B9%D1%84%D1%85%D0%B0%D0%BA%D0%B5%D1%80" target="_blank">лайф хаке</a>, а оказывается что это нифига не лайф ках, а всем известная штука и ты один баран о нем не знал. Первый раз я попал в такую ситуацию когда залечивал очередную спортивную болячку. На физио нужно было открыть тюбик с мазью. Тюбик бы металлический, с железной мембранной под крышечкой. Всю жизнь я ее снимал всем что попадалось под руку. Тут мне под руку попались ключи&#8230;медсестра посмотрела на меня как на идиота, взяла тюбик, и специальным выступом на обратной стороне крышечки продырявила мембрану. Это было больше года назад.</p>
<p>И вот это чувство вернулось. Встретил в чужом примере нечто похожее вот на это:</p>
<p>SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 10,20;</p>
<p>полез разбираться, что же за зверь &#171;SQL_CALC_FOUND_ROWS&#187; и выяснилось что это опция позволяющая получать реальное количество строк в FOUND_ROWS(), а не то что осталось от них после LIMIT. А я, как баран, использовал два запроса, вместо такой простой конструкции. Эххх, пора уже отвыкать от MySql 3.23 :)</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2009/04/20/sql_calc_found_rows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проверка обновления страницы на Perl</title>
		<link>http://mikhail.krivyy.com/2008/09/30/web-site-update-check-perl/</link>
		<comments>http://mikhail.krivyy.com/2008/09/30/web-site-update-check-perl/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 10:47:38 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>
		<category><![CDATA[Интернет и сеть]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/?p=1100</guid>
		<description><![CDATA[Иногда нужно последить за обновление определенных страниц сайтов. Раньше даже были специальные программы &#8212; &#171;Whats new агенты&#187;. Погуглил, в топе выдачи ничего не нашел. Вероятно, из-за засилия динамически генерируемых сайтов, эти программы если не вымерли, а ушли на второй план. Ну нет, так нет, в конце концов Perl не просто так изобрели. Обожаю Perl: #!/usr/bin/perl my [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда нужно последить за обновление определенных страниц сайтов. Раньше даже были специальные программы &#8212; &#171;Whats new агенты&#187;. Погуглил, в топе выдачи ничего не нашел. Вероятно, из-за засилия динамически генерируемых сайтов, эти программы если не вымерли, а ушли на второй план.</p>
<p>Ну нет, так нет, в конце концов Perl не просто так изобрели. Обожаю Perl:</p>
<pre>#!/usr/bin/perl

my @url = (
        "<a href="http://mikhail.krivyy.com/">http://mikhail.krivyy.com/</a>",
        "<a href="http://www.novgorod.ru/">http://www.novgorod.ru/</a>",
        );

system("mv data.md5 data.old");

open(FILE,"&gt;data.md5");
foreach (@url) {print FILE $_."\t".(`fetch -q -o - $_ | md5 -q`);}
close(FILE);

print `diff data.md5 data.old`;
</pre>
<p>Все это в crontab и все :)</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2008/09/30/web-site-update-check-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Очередные баги WordPress</title>
		<link>http://mikhail.krivyy.com/2008/05/06/wordpress-restore-password-invalid-key/</link>
		<comments>http://mikhail.krivyy.com/2008/05/06/wordpress-restore-password-invalid-key/#comments</comments>
		<pubDate>Tue, 06 May 2008 17:50:36 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/?p=857</guid>
		<description><![CDATA[Версия: 2.5.1; Ошибка: не работает восстановление пароля. Причина: Явная несогласованность разработчиков. Один генерирует пароль из следующих символов &#8212; &#171;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&#38;*()&#187; . Другой проверяет чтобы пароль содержал только символы латинского алфавита и цифры. Исправление: Заменить, в файле wp-includes/pluggable.php, строка 1171: function wp_generate_password($length = 12) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&#38;*()"; $password = ''; for ( $i = 0; $i [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><strong>Версия:</strong> 2.5.1;</li>
<li><strong>Ошибка: </strong>не работает восстановление пароля.</li>
<li><strong>Причина:</strong> Явная несогласованность разработчиков. Один генерирует пароль из следующих символов &#8212; &#171;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&amp;*()&#187; . Другой проверяет чтобы пароль содержал только символы латинского алфавита и цифры.</li>
</ul>
<p>Исправление:<span id="more-857"></span></p>
<p>Заменить, в файле <strong>wp-includes/pluggable.php</strong>, строка 1171:</p>
<pre>function wp_generate_password($length = 12) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&amp;*()";
        $password = '';
        for ( $i = 0; $i &lt; $length; $i++ )
                $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        return $password;
}</pre>
<p>на</p>
<pre>function wp_generate_password($length = 12) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $password = '';
        for ( $i = 0; $i &lt; $length; $i++ )
                $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        return $password;
}</pre>
<p>или переписать регулярное выражение для проверки правильности ключа в файле wp-login.php, строка 116.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2008/05/06/wordpress-restore-password-invalid-key/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Особенности при работе с памятью в PHP</title>
		<link>http://mikhail.krivyy.com/2007/11/22/php-memory-usage/</link>
		<comments>http://mikhail.krivyy.com/2007/11/22/php-memory-usage/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 11:06:55 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/11/22/php-memory-usage/</guid>
		<description><![CDATA[Если Вам нужно обрабатывать большие объемы данных, то не стоит использовать для этого PHP. Вот почему: &#60;?php print memory_get_usage()."\n"; // 55048 $a="z"; print memory_get_usage()."\n"; // 55184 unset($a); print memory_get_usage()."\n"; // 55200 ?&#62; Тестировалось в 5.2.2 под Windows и в 5.2.5 под FreeBSD Paul Jones написал в своем блоге на похожу тему.]]></description>
			<content:encoded><![CDATA[<p>Если Вам нужно обрабатывать большие объемы данных, то не стоит использовать для этого PHP. Вот почему:</p>
<pre>&lt;?php
print memory_get_usage()."\n"; <strong>// 55048</strong>
$a="z";
print memory_get_usage()."\n"; <strong>// 55184
</strong>unset($a);
print memory_get_usage()."\n"; <strong>// 55200</strong>
?&gt;</pre>
<p>Тестировалось в 5.2.2 под Windows и в 5.2.5 под FreeBSD</p>
<p>Paul Jones написал в своем блоге на <a target="_blank" href="http://paul-m-jones.com/blog/?p=262">похожу тему</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/11/22/php-memory-usage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Использование syslog для логирования работы программ/скриптов</title>
		<link>http://mikhail.krivyy.com/2007/11/14/syslog/</link>
		<comments>http://mikhail.krivyy.com/2007/11/14/syslog/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 11:41:22 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>
		<category><![CDATA[Интернет и сеть]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/11/14/syslog/</guid>
		<description><![CDATA[Очередной раз заглянув в почту и обнаружив очередную пачку писем от серверов решил положить этому конец. Упрощало задачу то что, большую часть писем генерируют мои собственные программы и скрипты, которые установлены на различных серверах. Большая часть этих сообщений не являются критичными. Например, «Невозможно соединится с сервером», «Обработано файлов столько-то», «Затрачено времени столько-то» и т.п.  Я [...]]]></description>
			<content:encoded><![CDATA[<p>Очередной раз заглянув в почту и обнаружив очередную пачку писем от серверов решил положить этому конец. Упрощало задачу то что, большую часть писем генерируют мои собственные программы и скрипты, которые установлены на различных серверах.</p>
<p>Большая часть этих сообщений не являются критичными. Например, «Невозможно соединится с сервером», «Обработано файлов столько-то», «Затрачено времени столько-то» и т.п.  Я рассмотрел два основных варианта этой проблемы:</p>
<p><span id="more-637"></span></p>
<p><strong>Первый вариант, в лоб </strong>— использовать перенаправление вывода или собственные лог-файлы. Этот вариант не удобен для мониторинга, так как придётся просматривать больше количество файлов отчётов.</p>
<p><strong>Второй вариант</strong> — не изобретать велосипед и использовать <em><strong>syslog</strong></em>.</p>
<blockquote>
<p style="margin-bottom: 0cm"><strong>syslog</strong> &#8212; стандарт отправки сообщений о происходящих в системе событиях (логов), использующийся в компьютерных сетях, работающих по протоколу IP.</p>
<p style="margin-bottom: 0cm">Протокол <strong>syslog</strong> прост: отправитель посылает короткое текстовое сообщение, размером меньше 1024 байт получателю сообщения. Получатель при этом носит имя «<strong>syslogd</strong>», «<strong>syslog daemon</strong>», либо же, «<strong>syslog server</strong>». Сообщения могут отправляться как по UDP, так и по TCP. Как правило, такое сообщение отсылается в открытом виде.</p>
<p style="margin-bottom: 0cm"><strong>Syslog</strong> используется для удобства администрирования и обеспечения информационной безопасности. Он реализован под множество платформ и используется в множестве устройств. Поэтому, использование <strong>syslog</strong> позволяет обеспечить сбор информации с разных мест и хранение её в едином репозитории.</p>
</blockquote>
<p style="margin-bottom: 0cm">Как правило <strong>syslog</strong> и <strong>syslogd</strong> работают внутри одного сервера (то есть все соединения локальны) и никакой внешней сетевой деятельности не производится.</p>
<p style="margin-bottom: 0cm"><strong>Теперь, как все это выглядит на практике.</strong></p>
<p style="margin-bottom: 0cm"><strong>Perl:</strong></p>
<pre style="margin-bottom: 0cm">use Sys::Syslog;
openlog("имя вашей программы", "ndelay,pid", "local0");
syslog(LOG_WARNING, "Программа запущена");
...
# тут программа
...
syslog(LOG_WARNING, "Программа завершила выполнение");
closelog();</pre>
<p style="margin-bottom: 0cm"><strong>PHP:</strong></p>
<pre style="margin-bottom: 0cm">openlog("имя вашей программы", LOG_PID | LOG_PERROR, LOG_LOCAL0);
syslog(LOG_WARNING,"Программа запущена");
...
// тут программа
...
syslog(LOG_WARNING, "Программа завершила выполнение");
closelog();</pre>
<p style="margin-bottom: 0cm"><strong>C/C++:</strong></p>
<pre style="margin-bottom: 0cm">#include &lt;syslog.h&gt;
openlog("имя вашей программы", 0, LOG_USER);
syslog(LOG_NOTICE, "Can not open file \"%s\" for writing.",filename);
closelog();</pre>
<p style="margin-bottom: 0cm">Далее можете поискать ваши сообщения в журналах <strong>syslog</strong>. Тут все зависит от настроек <strong>syslogd</strong>. Обычно это /var/log/messages.</p>
<p style="margin-bottom: 0cm">В документации PHP написано, что в windows тоже работает, но я не пробовал.</p>
<p style="margin-bottom: 0cm">Подробнее о флагах и значениях можно прочитать в руководствах:</p>
<ul>
<li>
<p style="margin-bottom: 0cm">C &#8212; <a href="http://linux.die.net/man/3/syslog">http://linux.die.net/man/3/syslog</a></p>
</li>
<li>
<p style="margin-bottom: 0cm">PHP &#8212; <a href="http://www.php.net/syslog"><font color="#000080">http://www.php.net/syslog</font></a></p>
</li>
<li>
<p style="margin-bottom: 0cm">Perl &#8212; <a href="http://perldoc.perl.org/Sys/Syslog.html">http://perldoc.perl.org/Sys/Syslog.html</a></p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/11/14/syslog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Немного о поисковой оптимизации</title>
		<link>http://mikhail.krivyy.com/2007/07/04/sitemap/</link>
		<comments>http://mikhail.krivyy.com/2007/07/04/sitemap/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 07:09:14 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/07/04/sitemap/</guid>
		<description><![CDATA[Я не буду рассказывать про правильную расстановку ссылок, специальную обработку текста и другие серые методы оптимизации. Про это и так много написано, да и не сторонник я этих методов. Я расскажу немного о другом &#8212; как ускорить процесс индексации сайта поисковыми системами. Это тема меня тронула во время настройки поисковой системы CNSearch, которую я использую для [...]]]></description>
			<content:encoded><![CDATA[<p>Я не буду рассказывать про правильную расстановку ссылок, специальную обработку текста и другие серые методы оптимизации. Про это и так много написано, да и не сторонник я этих методов. Я расскажу немного о другом &#8212; как ускорить процесс индексации сайта поисковыми системами.</p>
<p>Это тема меня тронула во время настройки поисковой системы <a href="http://www.cn-software.com/ru/cnsearch/">CNSearch</a>, которую я использую для поиска по новгородскому региону. Оказывается, большую часть сайтов нельзя проиндексировать полностью &#8212; они содержат бесконечное количество страниц.</p>
<p><span id="more-409"></span></p>
<p><strong>Как так получилось ?</strong></p>
<p>Проблема тут в основном в некомпетентности программистов, разрабатывающих &#171;движки&#187; сайтов.</p>
<p>Для примера рассмотрим сайт: <a href="http://www.oldport.ru/">www.oldport.ru</a>. Заходим в гостевую книгу и в блоке навигации по страницам гостевой книги нажимаем на ссылку &#171;&gt;&gt;&#187;. Делать это можно бесконечно и каждый раз, загружается страница с уникальным адресом.</p>
<p>Точно так же ведут себя форумы на базе phpBB и vBulletin, сайты на базе Joomla и phpnuke. Кроме того, есть масса &#171;движков&#187; которые содержат большое количество страниц с дублирующейся информацией или просто страниц без информации. Про идентификаторы сессий (PHPSESSID, sid, ssid и пр.) я вообще молчу.</p>
<p>Решить эту проблему проще всего на стадии разработки &#171;движка&#187; сайта. Если сайт уже готов, или используется &#171;движок&#187; стороннего разработчика, то решить эту проблему на стадии разработки уже не получится. Но кое-что все равно можно исправить. <strong>Сделать это можно с помощью файлов </strong><a target="_blank" href="http://www.robotstxt.org/"><strong>robots.txt</strong></a><strong>, мета тегов &#171;noindex&#187; и &#171;nofollow&#187;. &#171;Прятанья&#187; ненужных ссылок.</strong></p>
<p>Например, в разы сократить количество индексируемых страниц в форуме, на базе vBulletin, можно добавив следующие строки в файл robots.txt</p>
<p>&#8212; robots.txt &#8212;&#8212;&#8212;&#8212;&#8212;<br />
User-Agent: *<br />
Disallow: /forum/calendar.php<br />
Disallow: /forum/misc.php<br />
Disallow: /forum/external.php<br />
Disallow: /forum/search.php<br />
Disallow: /forum/vB.Sponsors<br />
Disallow: /forum/showgroups.php<br />
Disallow: /forum/online.php<br />
Disallow: /forum/showthread.php?p=<br />
Disallow: /forum/showpost.php<br />
Disallow: /forum/printthread.php<br />
Disallow: /forum/attachment.php<br />
&#8212; robots.txt &#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Перечисленные страницы содержат либо несущественную, либо дублирующуюся информацию.</p>
<p>Для той же цели можно использовать мета теги &#171;noindex&#187; и &#171;nofollow&#187;. Но помните, чтобы обнаружить теги, поисковая система должна сначала скачать страницу с вашего сайта. По этому вместо использования мета тега &#171;noindex&#187; лучше просто &#171;спрятать&#187; ссылку на несущественную страницу.</p>
<p><strong>Следующий шаг - это проверка корректности индексации сайта с помощью собственной поисковой системы.</strong> При этом, решая эту задачу, можно убить еще одного зайца &#8212; создать <a target="_blank" href="http://www.google.com/sitemap.html">Google Sitemap</a>.</p>
<p>Для этих целей я использую все тот же CNSearch. Это платная система, но для нашей задачи подходит и незарегистрированная версия, так как фронтенд от нее не используется.</p>
<p>Для начала нужно положить фронтенд и индексатор в один каталог, настроить индексатор и фронтенд (об этом можно почитать в <a target="_blank" href="http://www.cn-software.com/ru/cnsearch/manual/">руководстве пользователя</a>, которое есть на официальном сайте CNSearch).</p>
<p>После того как настройки поисковой системы выполнены, нужно создать простой shell скрипт:</p>
<p>&#8212; sitemap.sh &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
#!/bin/sh</p>
<p>./indexer mike</p>
<p>export QUERY_STRING=&#187;sitemap=1&amp;password=парольнастатистику&#187;<br />
export REQUEST_METHOD=GET<br />
./search.cgi | tail -n +3 &gt; ../sitemap.xml</p>
<p>rm ./docs.cns<br />
rm ./files.cns<br />
rm ./fulltxt.cns<br />
rm ./index.cns<br />
rm ./stats.log<br />
&#8212; sitemap.sh &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Сначала запускается индексатор (indexer). Во время индексации выводится список индексируемых страниц. Визуально проверяем этот список. Если сайт содержит бесконечное количество страниц, то индексатор рано или поздно выдаст &#171;To many files&#187; (максимальное количество страниц &#8212; задается в настройках индексатора).</p>
<p>После того как произведена индексация, shell скрипт вызывает фронтенд (search.cgi), при этом, эмулируя Веб-сервер, так как фронтент является CGI приложением. После чего, с помощью tail удаляются http заголовки, которые вернул фронтенд. На этом этапе, на выходе мы имеем готовый файл sitemap.</p>
<p>Последний шаг &#8212; удаляем файлы поискового индекса &#8212; они нам не нужны.</p>
<p>Этот скрипт размещаем в отдельном каталоге и прописываем его в crontab.</p>
<p>После этого иногда заглядываем в файл sitemap.xml и смотрим нет ли там лишних страниц. Сам sitemap отправляем в Google, для ускорения процесса индексации сайта поисковым роботом Google.</p>
<p>Мой sitemap выглядит вот так: <a href="http://mikhail.krivyy.com/sitemap.xml">http://mikhail.krivyy.com/sitemap.xml</a>. И я точно знаю, что поисковому роботы не понадобится много времени, чтобы произвести индексацию моего сайта.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/07/04/sitemap/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Плавный переход от HTML к XHTML</title>
		<link>http://mikhail.krivyy.com/2007/04/13/xhtml/</link>
		<comments>http://mikhail.krivyy.com/2007/04/13/xhtml/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 11:54:28 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/04/13/xhtml/</guid>
		<description><![CDATA[Я уже не первый год пытаюсь перейти с HTML на XHTML. Привычки дают о себе знать и переход дается не так просто. Ниже я привожу 9 простых правил, соблюдая которые вы можете из valid HTML получить valid XHTML. Я не буду рассматривать все нюансы и подробности &#8212; просто 9 простых правил. Для проверки правильности кода [...]]]></description>
			<content:encoded><![CDATA[<p>Я уже не первый год пытаюсь перейти с HTML на XHTML. Привычки дают о себе знать и переход дается не так просто.</p>
<p>Ниже я привожу 9 простых правил, соблюдая которые вы можете из valid HTML получить valid XHTML. Я не буду рассматривать все нюансы и подробности &#8212; просто 9 простых правил.</p>
<p>Для проверки правильности кода я использую <em>FireFox</em> с плагином <em>&#171;Tidy Validator&#187;.</em> Быстро и удобно</p>
<p><span id="more-331"></span><strong>1. Название тегов пишем маленькими буквами. </strong></p>
<p>Было:</p>
<blockquote><p>&lt;BODY&gt;</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;body&gt;</p></blockquote>
<p><strong>2. Забываем про атрибут language у тега script.</strong></p>
<p>Было:</p>
<blockquote><p>&lt;script language=&#187;JavaScript&#187;&gt;</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;script type=&#187;text/javascript&#187;&gt;</p></blockquote>
<p><strong>3. Убираем из адресов все служебные символы.</strong></p>
<p>Было:</p>
<blockquote><p>&lt;a href=&#187;http://www.codenet.ru/?a=1&amp;b=3&#8243;&gt;CodeNet&lt;/a&gt;</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;a href=&#187;http://www.codenet.ru/?a=1&amp;amp;b=3&#8243;&gt;CodeNet&lt;/a&gt;</p></blockquote>
<p><strong>4. Слешим незакрывающиеся теги:</strong></p>
<p>Было:</p>
<blockquote><p>&lt;img src=&#187;image.gif&#187;&gt;</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;img src=&#187;image.gif&#187; /&gt;</p></blockquote>
<p><strong>5. Не забываем закрывать все теги</strong></p>
<p>Было:</p>
<blockquote><p>&lt;p&gt;Параграф</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;p&gt;Параграф&lt;/p&gt;</p></blockquote>
<p><strong>6. Соблюдаем объектную модель. (Не меняем теги местами)</strong></p>
<p>Было:</p>
<blockquote><p>&lt;table&gt;<br />
&lt;form&gt;<br />
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/form&gt;<br />
&lt;/table&gt;</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;form style=&#187;margin:0&#8243;&gt;<br />
&lt;table&gt;<br />
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/form&gt;</p></blockquote>
<p><strong>7. Все атрибуты пишем в кавычках.</strong></p>
<p>Было:</p>
<blockquote><p>&lt;table cellspacing=0 align=right&gt;</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;table cellspacing=&#187;0&#8243; align=&#187;right&#187;&gt;</p></blockquote>
<p><strong>8. Забываем про сокращения.</strong></p>
<p>Было:</p>
<blockquote><p>&lt;input type=&#187;radio&#187; selected&gt;</p></blockquote>
<p>Стало:</p>
<blockquote><p>&lt;input type=&#187;radio&#187; selected=&#187;selected&#187;&gt;</p></blockquote>
<p><strong>9. Не забываем про атрибут ALT.</strong></p>
<blockquote><p>&lt;img src=&#187;image.gif&#187; alt=&#187;hello&#187; /&gt;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/04/13/xhtml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Один миф о пяти мифах о веб-программировании :)</title>
		<link>http://mikhail.krivyy.com/2007/01/24/odin-mif-o-pyati-mifah-o-veb-programmirovanii/</link>
		<comments>http://mikhail.krivyy.com/2007/01/24/odin-mif-o-pyati-mifah-o-veb-programmirovanii/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 11:07:40 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/01/24/odin-mif-o-pyati-mifah-o-veb-programmirovanii/</guid>
		<description><![CDATA[Читать желательно вместе с комментариями: http://www.codenet.ru/webmast/php/PHP-myth/]]></description>
			<content:encoded><![CDATA[<p>Читать желательно вместе с комментариями:</p>
<p><a href="http://www.codenet.ru/webmast/php/PHP-myth/">http://www.codenet.ru/webmast/php/PHP-myth/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/01/24/odin-mif-o-pyati-mifah-o-veb-programmirovanii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Несовместимости версий MySql</title>
		<link>http://mikhail.krivyy.com/2007/01/10/mysql-errors/</link>
		<comments>http://mikhail.krivyy.com/2007/01/10/mysql-errors/#comments</comments>
		<pubDate>Tue, 09 Jan 2007 21:55:09 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/01/10/mysql-errors/</guid>
		<description><![CDATA[А работаю с MySql с версии 3.22, если мне не изменяет память. А сейчас на дворе уже 5.1.14-beta. Работаю не много но регулярно. Для себя я разделяю MySql на следующие версии: < 3.22 - лучше не трогать, я их не помню. 3.X - хорошая, быстрая, без запар с кодировками. 4.0.X - быстрая, запары с кодировками [...]]]></description>
			<content:encoded><![CDATA[<p>А работаю с MySql с версии 3.22, если мне не изменяет память. А сейчас на дворе уже 5.1.14-beta. Работаю не много но регулярно.</p>
<p>Для себя я разделяю MySql на следующие версии:</p>
<p>< 3.22 - лучше не трогать, я их не помню.<br />
3.X - хорошая, быстрая, без запар с кодировками.<br />
4.0.X - быстрая, запары с кодировками уже начались.<br />
4.1.X - на сегодняшний день это моя версия. Запары с кодировками присутствуют. Стала поувесистей.<br />
5.0.X - это уже не тот MySql с которым я хорошо знаком. Тут есть и транзакции и триггеры и прочие атрибуты нормальных реляционных СУБД. Эдакий недооракл.<br />
5.1.X - пока лучше не трогать. Я даже не смотрел.</p>
<p><span id="more-296"></span></p>
<p>А хочу сказать я лишь одно &#8212; быстрой миграции между этими ветками не получится, даже не думайте. Сделайте все не торопясь и вдумчиво.</p>
<p>Про несовместимости с кодировками я даже писать не буду. Тысячи программистов видели <a href="http://www.google.ru/search?num=20&#038;hl=ru&#038;newwindow=1&#038;safe=off&#038;rls=GFRC%2CGFRC%3A2007-01%2CGFRC%3Aru&#038;q=mysql+%D0%B7%D0%BD%D0%B0%D0%BA%D0%B8+%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D1%85+%D0%B1%D1%83%D0%BA%D0%B2&#038;lr=">знаки вопросов вместо русских букв</a>.</p>
<p>Я раскажу о несовместимостях, на которые нарвался буквально сегодня:</p>
<p>Это работает в MySql 4.1, но не работает в более ранних версиях:</p>
<p><code>SELECT SUBSTR(filed,5) FROM table</code></p>
<p>правильно, потому что в старых версиях не было синонима SUBSTR() для функции SUBSTRING(). Вот так работает во всех версиях:</p>
<p><code>SELECT SUBSTRING(filed,5) FROM table</code></p>
<p>Это классическая обратная несовместимость, и ничего ненормального в ней нет. Но есть и прямые несовместимости, например в MySql. 5.0.27 следующий запрос может вызывать ошибку:</p>
<p><code>INSERT INTO table SET field='';</code></p>
<p>если поле field не является текстовым, а например INT. В предыдущих версиях MySql молча туда вписывал &#171;0&#8243;.</p>
<p>Запрос</p>
<p><code>INSERT INTO table SET field='1234567890';</code></p>
<p>в версии 5.0.27 тоже вызовет ошибку &#171;слишком длинная строка&#187;, если максимальная длина поля field менее 10 символов, например VARCHAR[5]. Наверняка можно встретить подобные ошибки при переполнении в числовых полях, но я не проверял этого.</p>
<p>Эти ошибки связаны с <a href="http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html">режимами SQL</a>, которые появились еще в версии 4.1. Но только в дистрибутиве 5.0.27, который меня угораздило использовать, по умолчанию был включен режим &#171;TRADITIONAL&#187;. </p>
<p>Примечания: все испытываемые MySql сервера имели настройки по умолчанию.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/01/10/mysql-errors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа с изображениями в PHP</title>
		<link>http://mikhail.krivyy.com/2005/01/31/gd-php-lessons/</link>
		<comments>http://mikhail.krivyy.com/2005/01/31/gd-php-lessons/#comments</comments>
		<pubDate>Mon, 31 Jan 2005 16:06:44 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Web программирование]]></category>
		<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2005/01/31/gd-php-lessons/</guid>
		<description><![CDATA[Больше года у меня ушло на написание 14 простых уроков. Эти уроки помогут вам разобраться с тем, как средствами PHP и библиотеки GD создавать разного рода изображения &#8212; счетчики, диаграммы, графики. Урок 1 &#8212; Создание изображения Урок 2 &#8212; Рисование точки Урок 3 &#8212; Рисование линии Урок 4 &#8212; Рисование прямоугольника Урок 5 &#8212; Рисование [...]]]></description>
			<content:encoded><![CDATA[<p>Больше года у меня ушло на написание 14 простых уроков. Эти уроки помогут вам разобраться с тем, как средствами PHP и библиотеки GD создавать разного рода изображения &#8212; счетчики, диаграммы, графики. </p>
<ol>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Creating-Images.php">Урок 1 &#8212; Создание изображения</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Pixel-Line.php">Урок 2 &#8212; Рисование точки</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Pixel-Line.php#line">Урок 3 &#8212; Рисование линии</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Rectangle.php">Урок 4 &#8212; Рисование прямоугольника</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Circle-Ellipse.php">Урок 5 &#8212; Рисование эллипса и круга</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Polygon.php">Урок 6 &#8212; Работа с полигонами</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Fill.php">Урок 7 &#8212; Заливка замкнутой области</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Filled-Polygon.php">Урок 8 &#8212; Заливка сложной области</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/3D-Pie.php">Урок 9 &#8212; Построение круговой диаграммы</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Bars.php">Урок 10 &#8212; Построение гистограммы</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Graphics.php">Урок 11 &#8212; Построение графика</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/Resize.php">Урок 12 &#8212; Изменение размеров изображения</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/AntiAlias.php">Урок 13 &#8212; Сглаживание изображения</a>
</li>
<li><a target="_blank" href="http://www.codenet.ru/webmast/php/gd/GD-Version.php">Урок 14 &#8212; Как узнать версию библиотеки GD</a>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2005/01/31/gd-php-lessons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

