<?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; Заметки</title>
	<atom:link href="http://mikhail.krivyy.com/category/zametki/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikhail.krivyy.com</link>
	<description>мнение автора может не совпадать с его точкой зрения ©</description>
	<lastBuildDate>Tue, 31 Jan 2012 06:50:18 +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>Установка MapNik в Gentoo Linux</title>
		<link>http://mikhail.krivyy.com/2009/10/02/mapnik-gentoo-linux/</link>
		<comments>http://mikhail.krivyy.com/2009/10/02/mapnik-gentoo-linux/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 13:26:50 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Интернет и сеть]]></category>
		<category><![CDATA[mapnik]]></category>
		<category><![CDATA[postgis]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/?p=1918</guid>
		<description><![CDATA[Все что описано выше проверено на: Linux 2.6.23-gentoo-r3k1 Mapnik 0.6.0 (sci-geosciences/mapnik) osm2pgsql 20090707 (sci-geosciences/osm2pgsql) PostgreSQL 8.3.7 (dev-db/postgresql-base, dev-db/postgresql-server) Python 2.6.2-r1 Установка PostGIS и PostgreSQL 1. Устанавливаем Postgis и PostgreSQL: ACCEPT_KEYWORDS="~x86" USE="proj geos" emerge postgis emerge postgresql-server --config 2. Запускаем PostgreSQL: /etc/init.d/postgresql-8.3 start 3. Создаем базу данных PostGIS: su su - postgres createuser mike createdb -E [...]]]></description>
			<content:encoded><![CDATA[<p>Все что описано выше проверено на:</p>
<ul>
<li>Linux 2.6.23-gentoo-r3k1</li>
<li>Mapnik 0.6.0 (sci-geosciences/mapnik)</li>
<li>osm2pgsql 20090707 (sci-geosciences/osm2pgsql)</li>
<li>PostgreSQL 8.3.7 (dev-db/postgresql-base, dev-db/postgresql-server)</li>
<li>Python 2.6.2-r1</li>
</ul>
<p><span id="more-1918"></span></p>
<p><strong>Установка PostGIS и PostgreSQL</strong></p>
<p>1. Устанавливаем Postgis и PostgreSQL:</p>
<pre>ACCEPT_KEYWORDS="~x86" USE="proj geos" emerge postgis
emerge postgresql-server --config</pre>
<p>2. Запускаем PostgreSQL:</p>
<pre>/etc/init.d/postgresql-8.3 start</pre>
<p>3. Создаем базу данных PostGIS:</p>
<pre>su
su - postgres
createuser mike
createdb -E UTF8 -O mike gis
createlang plpgsql gis
psql -d gis -f /usr/share/postgresql/contrib/lwpostgis.sql
echo "ALTER TABLE geometry_columns OWNER TO mike; ALTER TABLE spatial_ref_sys OWNER TO mike;"  | psql -d gis
ACCEPT_KEYWORDS="~x86" USE="postgres proj doc gdal python bidi" emerge mapnik
ACCEPT_KEYWORDS="~x86" emerge osm2pgsql
psql -d gis -f /usr/share/postgresql/contrib/90000.sql</pre>
<p><strong>Установка Mapnik</strong></p>
<p>4. Устанавливаем Mapnik:</p>
<pre>USE="postgres proj debug doc gdal python bidi" emerge mapnik</pre>
<p>5. Устанавливаем данных Mapnik:</p>
<p>Более подробные инструкции можно найти на <a href="http://wiki.openstreetmap.org/index.php/Mapnik">http://wiki.openstreetmap.org/index.php/Mapnik</a>. Ниже только самое главное:</p>
<p>World boundaries (Границы, 51MB) and coastlines (Береговые линии) (~200MB):</p>
<pre>wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
wget http://hypercube.telascience.org/~kleptog/processed_p.zip
tar -zxvf world_boundaries-spherical.tgz
unzip processed_p.zip
mv coastlines/* world_boundaries/
rmdir coastlines
chmod -R 755 world_boundaries

mkdir /usr/local/share/mapnik
mv world_boundaries /usr/local/share/mapnik</pre>
<p><strong>Установка osm2pgsql</strong></p>
<p>6. Устанавливаем osm2pgsql:</p>
<pre>ACCEPT_KEYWORDS="~x86" emerge osm2pgsql</pre>
<p>7. Получаем данные OSM по заданным координатам:</p>
<pre>wget -O map.osm "http://www.informationfreeway.org/api/0.6/*[bbox=29.637569,56.918102,36.227985,59.435345]"</pre>
<p>7. Добавляем скачанные данных в базу данных:</p>
<pre>./osm2pgsql -d gis ../map.osm</pre>
<p><strong>Генерация карты</strong></p>
<p>8. Скачиваем с <a href="http://svn.openstreetmap.org/applications/rendering/mapnik/">http://svn.openstreetmap.org/applications/rendering/mapnik/</a> Pyhton скрипты для генерации квадратов &#8212; http://svn.openstreetmap.org/applications/rendering/mapnik/generate_image.py и http://svn.openstreetmap.org/applications/rendering/mapnik/generate_tiles.py. Также скачиваем XML файлы описывающие стили карт &#8212; osm.xml;</p>
<p>9. В самом конце файла <strong>generate_tiles.py</strong> правим координаты квадрата и уровни масштабирования. Запускаем <strong>generate_tiles.py</strong>;</p>
<p>10. Используем квадраты по своему усмотрению, например с Google Maps API.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2009/10/02/mapnik-gentoo-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Нужно ли указывать размеры изображений при верстке HTML</title>
		<link>http://mikhail.krivyy.com/2007/10/01/html-images/</link>
		<comments>http://mikhail.krivyy.com/2007/10/01/html-images/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 16:35:31 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/10/01/html-images/</guid>
		<description><![CDATA[Я начинал верстать HTML еще во времена Netscape 3.X. С самого начала я считал, что указывать размеры изображений нужно. Страница на которой есть изображения с неуказанными размерами может &#171;прыгать&#187; в процессе загрузки. Но сейчас стали появляться первые аргументы против, да  и вообще верстка в целом уже не та. Не нужно использовать &#171;растяжек&#187;, размеры блоков и ячеек таблиц [...]]]></description>
			<content:encoded><![CDATA[<p>Я начинал верстать HTML еще во времена Netscape 3.X. С самого начала я считал, что указывать размеры изображений нужно.</p>
<p>Страница на которой есть изображения с неуказанными размерами может &#171;прыгать&#187; в процессе загрузки.</p>
<p>Но сейчас стали появляться первые аргументы против, да  и вообще верстка в целом уже не та. Не нужно использовать &#171;растяжек&#187;, размеры блоков и ячеек таблиц заранее известны, браузеры перестают показывать рамки загружаемых изображений и т.п.</p>
<p>Все это я к чему&#8230;недавно не указал размеры у несуществующей картинки, и вот что выдал мне FireFox:</p>
<p><span id="more-590"></span></p>
<ul>
<li>В первой картинке указан размер - 10&#215;10.</li>
<li>Во второй картинке ну указан размер.</li>
<li>В третей картинке указан размер &#8212; 100&#215;100</li>
</ul>
<p><strong>FireFox 2.0.0.7 &#8212; HTML. </strong></p>
<p><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/10/firefox.gif" alt="firefox.gif" /></p>
<p><strong>FireFox 2.0.0.7 &#8212; XHTML</strong></p>
<p><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/10/firefox-xhtml.gif" alt="firefox-xhtml.gif" /></p>
<p><strong>Microsoft Internet Explorer 7.0.5730.11 &#8212; HTML и XHTML </strong>(одинаково)</p>
<p><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/10/msie.gif" alt="msie.gif" /></p>
<p><strong>Opera 9.23 &#8212; XHTML и HTML</strong> (одинаково)</p>
<p><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/10/opera.gif" alt="opera.gif" /></p>
<p><strong>Safari 3.0.3 &#8212; XHTML и HTML</strong> (одинаково)</p>
<p><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/10/safari.gif" alt="safari.gif" /></p>
<p>Как видно из картинок &#8212; FireFox, в случае если размеры картинки не указаны, отображает вместо картинки текст . Этот текст можно выделить, скопировать. Ничего не напоминает о наличии тега &lt;img&gt; (если не считать черную рамку, которая здесь только для наглядности)</p>
<p>При работе c XHTML FireFox так введет себя всегда, не зависимо от того, указаны размеры изображений или нет.</p>
<p>Остальным браузерам все по барабану. Если размер изображения не указан, то MSIE и Opera подгоняют рамку под &#171;Альт&#187;, Safari действует подобный образом, но &#171;Альт&#187; вообще не отображает.</p>
<p><strong>Вывод</strong>: если картинка маленькая и ее размеры указаны, то в FireFox &#187;Альт&#187; не отобразится, если размеры не указаны, то вместо картинки вы увидите простой текст.</p>
<p>Код используемый в примерах:</p>
<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Hello&lt;/title&gt;
&lt;style type="text/css"&gt;
img {border: solid 1px black;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;img src="notfound.gif" mce_src="notfound.gif" width="10" height="10" alt="Hello" /&gt;
&lt;hr /&gt;
&lt;img src="notfound.gif" mce_src="notfound.gif" alt="Hello" title="Hello" /&gt;
&lt;hr /&gt;
&lt;img src="notfound.gif" mce_src="notfound.gif" width="100" height="100" alt="Hello" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/10/01/html-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Наконец то пришло время отказываться от FTP</title>
		<link>http://mikhail.krivyy.com/2007/09/19/winscp-far-plugin/</link>
		<comments>http://mikhail.krivyy.com/2007/09/19/winscp-far-plugin/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 06:16:38 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2007/09/19/winscp-far-plugin/</guid>
		<description><![CDATA[Давно планировал перейти на SFTP, но не мог найти удобного клиента. Ну вот наконец то это случилось. SFTP &#8212; протокол прикладного уровня, предназначенный для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения. Расшифровывается как SSH File Transfer Protocol &#8212; SSH-протокол для передачи файлов. Как правило, в качестве базового протокола, обеспечивающего соединение, [...]]]></description>
			<content:encoded><![CDATA[<p>Давно планировал перейти на SFTP, но не мог найти удобного клиента. Ну вот наконец то это случилось.</p>
<p><strong><a target="_blank" href="http://en.wikipedia.org/wiki/SSH_file_transfer_protocol">SFTP</a></strong> &#8212; протокол прикладного уровня, предназначенный для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения. Расшифровывается как <strong>SSH File Transfer Protocol</strong> &#8212; SSH-протокол для передачи файлов. Как правило, в качестве базового протокола, обеспечивающего соединение, и используется протокол SSH2, но это не обязательно.</p>
<p><span id="more-569"></span></p>
<p>Существует заблуждение, что SFTP это просто обычный FTP, работающих поверх SSH. В действительности SFTP &#8212; это новый протокол, разработанный с нуля. Ещё его иногда путают с Simple File Transfer Protocol. SFTP расшифровывается как SSH File Transfer Protocol и ничего общего с <em>Simple File Transfer Protocol</em> не имеет.</p>
<p>У SFTP есть два явных преимущества:</p>
<ol>
<li>Безопасность протокола</li>
<li>Отсутствие необходимости поднимать FTP демона на сервере</li>
</ol>
<p><strong>Клиент SFTP</strong></p>
<p>Клиент который мне понравился &#8212; <a target="_blank" href="http://winscp.net/eng/docs/lang:ru">WinSCP</a>. Если быть точнее, не клиент, а его <a target="_blank" href="http://winscp.net/eng/docs/fm_plugins#plugin_to_far_manager">плагин к Far Manager</a>. Устанавливается все без каких либо трудностей, поддерживается SSH2 и все популярные методы аутентификации.</p>
<p align="center"><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/09/winscp.jpg" alt="winscp.jpg" /><br />
Так выглядит WinSCP в двухпанельном режиме (есть еще Проводник-Style режим)</p>
<p align="center"><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/09/21.jpg" alt="21.jpg" /><br />
Просмотр корневой директории Linux сервера</p>
<p align="center"><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/09/11.jpg" alt="11.jpg" /><br />
Установка прав на файлы</p>
<p align="center"><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/09/3.jpg" alt="3.jpg" /><br />
Диалог создания новой сессии</p>
<p align="center"><img src="http://mikhail.krivyy.com/wp-content/uploads/2007/09/4.jpg" alt="4.jpg" /><br />
Можно выполнять команды на стороне сервера &#8212; пример для &#171;ls -la&#187;</p>
<p><strong>Сервер SFTP</strong></p>
<p>SFTP-сервер встроен в OpenSSH. Он реализуется с помощью программы sftp-server. Для того чтобы включить <em>sftp-server</em> в <em>sshd</em>, необходимо указать его в конфигурационном файле <tt>sshd_config</tt> в качестве подсистемы:</p>
<pre>Subsystem sftp /usr/lib/openssh/sftp-server</pre>
<p>Как правило, это строка уже указана в конфигурационном файле <em>sshd</em> по умолчанию, так что SFTP работает сразу и не требует никаких дополнительных действий для включения.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2007/09/19/winscp-far-plugin/feed/</wfw:commentRss>
		<slash:comments>5</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>
	</channel>
</rss>

