<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Программизмы</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/" />
    <link rel="self" type="application/atom+xml" href="http://madjack.ru/developer/atom.xml" />
    <id>tag:madjack.ru,2010-03-16:/developer//4</id>
    <updated>2010-03-30T14:25:32Z</updated>
    <subtitle>Программное обеспечение, Личные разработки, Проекты, Портфолио, Хитрости, Заметки, Статьи...</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 5.01</generator>

<entry>
    <title>SunSpider 0.9.1: Тестирование производительности браузеров</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2010/03/sunspider-browser-perfomance-benchmark.html" />
    <id>tag:madjack.ru,2010:/developer//4.204</id>

    <published>2010-03-30T12:50:22Z</published>
    <updated>2010-03-30T14:25:32Z</updated>

    <summary>Начну с того, что основной из причин, для пользователя, при выборе браузера, является его производительность. Для многих не секрет, что самым ресурсоемким процессом для браузера, в современном интернете, является обработка и исполнение Java скриптов (или же Джава Сценариев что есть...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Статьи" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="3draytrace" label="3D raytrace" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="chrome" label="Chrome" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="firefox" label="Firefox" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="json" label="JSON" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="opera" label="Opera" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="safari" label="Safari" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sunspider" label="SunSpider" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="тестирование" label="Тестирование" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="производительность" label="Производительность" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<img alt="SunSpider 0.9.1: Тестирование производительности браузеров" src="http://madjack.ru/developer/2010/03/30/browser-wars-internet-explorer-vs-firefox-vs-safari-vs-opera-2.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="280" height="161" />Начну с того, что основной из причин, для пользователя, при выборе браузера, является его производительность. Для многих не секрет, что самым ресурсоемким процессом для браузера, в современном интернете, является обработка и исполнение Java скриптов (или же Джава Сценариев что есть одно и тоже). Для замеров производительности Java скриптов используются специальные бенчмарки (Benchmarks), которые нагружают ява машину браузера по самое небалуйся. И одним из самых требовательных к производительности бенчмарков является Apple SunSpider.]]>
        <![CDATA[<img alt="SunSpider 0.9.1" src="http://madjack.ru/developer/2010/03/30/sunspider_091.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="480" height="79" />Теперь немножко подробнее про SunSpider. SunSpider предназначен для сравнения разных версий одного и того же браузера, или разных браузеров по отношению друг к другу.&nbsp; По свидетельству разработчиков бенчмарка, компании Apple, основные отличия SunSpider от других широко доступных бенчмарк-тестов JavaScript следующие:<br /><ol><li><b>SunSpider отражает реальное положение вещей</b>. Этот тест, как правило, избегает микробенчмарк-тестов, пытаясь фокусироваться как на актуальных проблемах, решаемых JavaScript-разработчиками сегодня, так и на проблемах, за которые им придется взяться в ближайшем будущем, - когда браузеры будут обрабатывать Java-скрипты быстрее.</li><li><b>SunSpider включает тесты JSON, 3D raytracer, тесты криптографии, распаковки кода и многие другие</b>. SunSpider также включает несколько микробенчмарк-тестов, но они включены для тестирования реальных проблем, связанных с производительностью, с которыми столкнулись разработчики веб-браузеров.</li><li><b>Сбалансированность SunSpider.</b> Этот тест сбалансирован между различными языками программирования и различными типами кода. Дополнительно включены тесты в различных категориях, при этом индивидуальные тесты были сбалансированы таким образом, чтобы по возможности продолжительность теста была одинаковой на актуальных версиях всех популярных браузеров.</li><li><b>Статистическая надежность и повторяемость результатов.</b> Всем известно, что одной из проблем бенчмарк-тестов является большая погрешность в измерениях, которая дает значительный разброс результатов. SunSpider «прогоняет» каждый тест несколько раз и определяет диапазон ошибок (error range), при этом доверительный интервал (confidence interval) составляет 95%.</li></ol><div align="right"><i>Описание SunSpider взято у <a href="http://netler.ru/pc/sunspider.htm">netler.ru</a>.</i><br /></div><br /><font style="font-size: 1.25em;"><b>Методика тестирования.</b></font> <br />Пользователь переходит по ссылке на специальную страницу. Скрипт запускается автоматически и работает какое-то время. Затем пользователь попадает на страницу результатов, где в таблице показано время исполнения каждого из тестов а также сумарное время исполнения всех тестов. Далее пользователь заходит по тойже ссылке с другого браузера, дожидается выполнения тестов и попадает на страницу результатов. Затем он копирует данные о тесте из второго браузера и вставляет в результаты тестов первого браузера (незабыв нажать ентер) и пользователю показывается уже сравнительная таблица.<br /><br />Наглядный пример. Давайте рассмотрим тестирование FireFox 3.5.8 и Safari 4.0.3 (5531.9) на MacOS X 10.5.7.<br /><ul><li>Запускаем FireFox<br /></li><li>Открываем <a href="http://madjack.ru/developer/sunspider/driver.html">страницу тестирования SunSpider</a>.</li><li>Ждее-ее-е-м...</li><li>Смотрим <a href="http://bit.ly/aylD2N">результат</a>.</li><li>Затем запускаем Safari.</li><li>Открываем туже страницу тестирования <a href="http://madjack.ru/developer/sunspider/driver.html">SunSpider</a>.</li><li>Смотрим <a href="http://madjack.ru/developer/sunspider/results.html?%7B%22v%22:%20%22sunspider-0.9.1%22,%20%223d-cube%22:%5B45,45,44,44,44,45,44,44,45,47%5D,%223d-morph%22:%5B43,43,43,43,44,43,43,43,43,44%5D,%223d-raytrace%22:%5B28,27,26,26,26,28,26,26,26,26%5D,%22access-binary-trees%22:%5B6,6,6,6,6,6,6,6,6,6%5D,%22access-fannkuch%22:%5B14,15,15,14,14,15,14,14,14,14%5D,%22access-nbody%22:%5B32,31,30,31,30,30,31,31,29,31%5D,%22access-nsieve%22:%5B7,7,7,9,7,8,7,7,8,8%5D,%22bitops-3bit-bits-in-byte%22:%5B3,3,3,3,3,3,3,3,3,2%5D,%22bitops-bits-in-byte%22:%5B7,7,7,7,7,7,7,6,6,6%5D,%22bitops-bitwise-and%22:%5B3,4,3,4,5,3,3,3,3,3%5D,%22bitops-nsieve-bits%22:%5B18,18,17,18,18,17,18,18,17,18%5D,%22controlflow-recursive%22:%5B3,3,3,3,3,3,3,3,3,4%5D,%22crypto-aes%22:%5B13,13,12,13,12,12,12,12,12,12%5D,%22crypto-md5%22:%5B15,15,15,15,15,15,15,15,15,15%5D,%22crypto-sha1%22:%5B14,14,14,14,14,14,14,14,14,15%5D,%22date-format-tofte%22:%5B27,27,27,27,27,28,27,27,27,28%5D,%22date-format-xparb%22:%5B35,34,33,33,33,34,34,33,34,35%5D,%22math-cordic%22:%5B29,30,29,29,29,28,28,28,29,30%5D,%22math-partial-sums%22:%5B31,31,30,31,31,30,30,30,30,30%5D,%22math-spectral-norm%22:%5B13,13,13,13,13,13,12,13,13,13%5D,%22regexp-dna%22:%5B22,22,21,23,22,23,21,22,21,23%5D,%22string-base64%22:%5B19,18,18,18,18,19,19,18,19,18%5D,%22string-fasta%22:%5B32,32,32,33,32,32,32,32,32,33%5D,%22string-tagcloud%22:%5B36,36,36,36,35,36,36,35,36,36%5D,%22string-unpack-code%22:%5B51,51,51,52,51,53,51,55,52,51%5D,%22string-validate-input%22:%5B37,37,36,35,36,35,35,36,35,35%5D%7D">результат тестирования производительности Safari</a>.</li><li>Вставляем <a href="http://madjack.ru/developer/sunspider/results.html?%7B%22v%22:%20%22sunspider-0.9.1%22,%20%223d-cube%22:%5B45,45,44,44,44,45,44,44,45,47%5D,%223d-morph%22:%5B43,43,43,43,44,43,43,43,43,44%5D,%223d-raytrace%22:%5B28,27,26,26,26,28,26,26,26,26%5D,%22access-binary-trees%22:%5B6,6,6,6,6,6,6,6,6,6%5D,%22access-fannkuch%22:%5B14,15,15,14,14,15,14,14,14,14%5D,%22access-nbody%22:%5B32,31,30,31,30,30,31,31,29,31%5D,%22access-nsieve%22:%5B7,7,7,9,7,8,7,7,8,8%5D,%22bitops-3bit-bits-in-byte%22:%5B3,3,3,3,3,3,3,3,3,2%5D,%22bitops-bits-in-byte%22:%5B7,7,7,7,7,7,7,6,6,6%5D,%22bitops-bitwise-and%22:%5B3,4,3,4,5,3,3,3,3,3%5D,%22bitops-nsieve-bits%22:%5B18,18,17,18,18,17,18,18,17,18%5D,%22controlflow-recursive%22:%5B3,3,3,3,3,3,3,3,3,4%5D,%22crypto-aes%22:%5B13,13,12,13,12,12,12,12,12,12%5D,%22crypto-md5%22:%5B15,15,15,15,15,15,15,15,15,15%5D,%22crypto-sha1%22:%5B14,14,14,14,14,14,14,14,14,15%5D,%22date-format-tofte%22:%5B27,27,27,27,27,28,27,27,27,28%5D,%22date-format-xparb%22:%5B35,34,33,33,33,34,34,33,34,35%5D,%22math-cordic%22:%5B29,30,29,29,29,28,28,28,29,30%5D,%22math-partial-sums%22:%5B31,31,30,31,31,30,30,30,30,30%5D,%22math-spectral-norm%22:%5B13,13,13,13,13,13,12,13,13,13%5D,%22regexp-dna%22:%5B22,22,21,23,22,23,21,22,21,23%5D,%22string-base64%22:%5B19,18,18,18,18,19,19,18,19,18%5D,%22string-fasta%22:%5B32,32,32,33,32,32,32,32,32,33%5D,%22string-tagcloud%22:%5B36,36,36,36,35,36,36,35,36,36%5D,%22string-unpack-code%22:%5B51,51,51,52,51,53,51,55,52,51%5D,%22string-validate-input%22:%5B37,37,36,35,36,35,35,36,35,35%5D%7D">эту</a> ссылку в поле для сравнения в Firefox и жмем Enter.</li><li>Получаем сравнительную табличку производительности Firefox VS Safari</li></ul>Из всего этого стоит отметить строчку:<br /><pre id="console"><b>*2.14x as slow*   577.1ms +/- 0.6%   1234.2ms +/- 8.2%</b></pre>Что означает, что <i><b>Firefox 3.5.8 более чем в два раза медленнее Safari</b></i>. Таким же образом можно протестировать любой браузер по отношению к любому браузеру.<br /><br />Инструмент для тестирования бесплатный - <a href="http://madjack.ru/developer/sunspider/driver.html">пользуйтесь</a> на здоровье.<br />]]>
    </content>
</entry>

<entry>
    <title>Отправка Карты Сайта в поисковые системы</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2010/03/sitemap-submission.html" />
    <id>tag:madjack.ru,2010:/developer//4.199</id>

    <published>2010-03-27T09:48:39Z</published>
    <updated>2010-03-27T10:01:04Z</updated>

    <summary>Основной вопрос этой заметки, который я попытаюсь раскрыть - Как сделать так, чтобы мои карты сайта считывались поисковыми роботами регулярно и индексировались страницы, которые описаны в карте сайта? Заметка будет короткой, но позновательной. Чтобы решить данную проблему есть два способа....</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Заметки" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="seo" label="SEO" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sitemap" label="Sitemap" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="роботы" label="Роботы" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="картасайта" label="Карта Сайта" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="поисковыесистемы" label="Поисковые Системы" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        Основной вопрос этой заметки, который я попытаюсь раскрыть - Как сделать так, чтобы мои карты сайта считывались поисковыми роботами регулярно и индексировались страницы, которые описаны в карте сайта? Заметка будет короткой, но позновательной. Чтобы решить данную проблему есть два способа. Оба действенны и оба работают. Но ограничиваться одним не стоит, лучше реализовать их оба. Темболее что это не так сложно и долго, как может кому-то показаться. 
        <![CDATA[<font style="font-size: 1.25em;"><b>Способ первый.</b></font><br />Определить ваши карты сайта в файле robots.txt. Как это сделать? Очень просто! Допустим ваш блог имеет адрес http://madjack.ru. Есть карта сайта sitemap.xml и developer/sitemap.xml. Создаем файл robots.txt или же дописываем в него (в случае если он уже создан) следующие строки:
<pre class="brush: plain">Sitemap: http://madjack.ru/sitemap.xml
Sitemap: http://madjack.ru/developer/sitemap.xml
</pre>
Вот и все. Теперь, когда поисковая машина сунет свой вездесущий нос в ваш файл robots.txt, она обнаружит там карты сайта, загрузит их и будет их обрабатывать. Собственно то, что нам и нужно.
<br /><br /><font style="font-size: 1.25em;"><b>Способ второй.</b></font><br />Загрузить ваши карты сайта непосредственно в поисковую машину. Чтобы загрузить файлы в Google и Yandex особого ума не нужно, так как это можно сделать при помощи веб-интерфейса Yandex Webmaster и Google Webmaster Tools. НО! Существуют и другие популярные поисковые машины - такие как Yahoo! и Bing (он же Live он же MSN Search).<br /><br />Будем считать что мы загружаем карту сайта sitemap.xml с сайта http://madjack.ru. Чтобы загрузить карту сайта вторым способом, нужно лишь перейти на указанный URL в любом из браузеров.<br /><br />
<b>Загрузка карты сайта в Google.
</b><pre class="brush: plain">http://google.com/webmasters/sitemaps/ping?sitemap=http://madjack.ru/sitemap.xml
</pre>
<b>Загрузка карты сайта в Яндекс.</b>
<pre class="brush: plain">http://webmaster.yandex.ru/wmconsole/sitemap_list.xml?host=http://madjack.ru/sitemap.xml
</pre>
<b>Загрузка карты сайта в Yahoo!.</b>
<pre class="brush: plain">http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=SitemapWriter&amp;url=http://madjack.ru/sitemap.xml
http://search.yahooapis.com/SiteExplorerService/V1/ping?sitemap=http://madjack.ru/sitemap.xml
</pre>
<b>Загрузка карты сайта в Ask.</b>
<pre class="brush: plain">http://submissions.ask.com/ping?sitemap=http://madjack.ru/sitemap.xml
</pre>
<b>Загрузка карты сайта в Live Search.</b>
<pre class="brush: plain">http://webmaster.live.com/ping.aspx?siteMap=http://madjack.ru/sitemap.xml
</pre>
]]>
    </content>
</entry>

<entry>
    <title>Создание карты сайта (Google Sitemap) в Movable Type</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2010/03/movabletype-google-sitemap.html" />
    <id>tag:madjack.ru,2010:/developer//4.198</id>

    <published>2010-03-27T08:50:28Z</published>
    <updated>2010-03-27T09:09:45Z</updated>

    <summary>Практически все владельцы сайтов знают о существовании так называемых карт сайтов - Sitemap. Это файл в формате XML, который содержит в себе список страниц вашего сайта, дату их изменения и переодичность обновления. Эта информация очень важна для поисковых роботов, которые...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Заметки" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="google" label="Google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sitemap" label="Sitemap" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xml" label="XML" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="картасайта" label="Карта Сайта" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<img alt="Карта сайта - Google Sitemap - Своими руками" src="http://madjack.ru/developer/2010/03/27/sitemap_icon.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="343" height="191" />Практически все владельцы сайтов знают о существовании так называемых карт сайтов - Sitemap. Это файл в формате XML, который содержит в себе список страниц вашего сайта, дату их изменения и переодичность обновления. Эта информация очень важна для поисковых роботов, которые с помощью этого файла будут индексировать все ваши страницы, указанные в карте сайта, внезависимости от того есть ли на них ссылка в интернете или нет. В данной небольшой заметке пойдет речь о том, как создать своими руками карту сайта для вашего блога на <a href="http://movabletype.org/">Movable Type</a> без использования всяких там генераторов и прочей чуши. Итак начнем-с... ]]>
        <![CDATA[<font style="font-size: 1.25em;"><b>Для создания карты сайта нам понадобятся</b>:</font><br /><ol><li>Блог под управлением Movable Type</li><li>Админский доступ в этот блог</li><li>Прямые руки и умение читать с бумажки</li><li>Умение использовать секретную комбинацию Copy-Paste.</li></ol><font style="font-size: 1.25em;"><b>Шаг 1.</b></font><br />Заходим в раздел шаблонов вашего блога. Создаем модульный шаблон с именем "Google Sitemap". Потому что вроде как гугл и придумал эту штукенцию. Хотя может и не гугл, но все поисковики поддерживают карту сайта именно в гугловом формате.<br /><br /><font style="font-size: 1.25em;"><b>Шаг 2.</b></font><br />Копируем в шаблон следующий код:
<pre class="brush: xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
<mtignore>
Canonical sitemap.xml template v0.8
### START SETUP
Possible values for the frequency variables are:
always
hourly
daily
weekly
monthly
yearly
never
"always" should be used to describe documents that change each time they are accessed.
"never" should be used to describe archived URLs.
</mtignore>
&lt;$MTSetVar name="home-frequency" value="daily"$&gt;
&lt;$MTSetVar name="category-frequency" value="weekly"$&gt;
&lt;$MTSetVar name="current-monthly-frequency" value="daily"$&gt;
&lt;$MTSetVar name="past-monthly-frequency" value="never"$&gt;
&lt;$MTSetVar name="current-weekly-frequency" value="daily"$&gt;
&lt;$MTSetVar name="past-weekly-frequency" value="never"$&gt;
&lt;$MTSetVar name="current-daily-frequency" value="hourly"$&gt;
&lt;$MTSetVar name="past-daily-frequency" value="never"$&gt;
&lt;$MTSetVar name="recent-entry-frequency" value="hourly"$&gt;
&lt;$MTSetVar name="past-entry-frequency" value="monthly"$&gt;
&lt;$MTSetVar name="page-frequency" value="weekly"$&gt;
<mtignore>
    Values for priority range from 0.0 to 1.0 and reflect the relative importance of pages within your site.
    Do not set these all to a high value, as that's no different from setting them all to 0.0. 
    This does not affect how your pages are compared to other sites'.
</mtignore>
&lt;$MTSetVar name="home-priority" value="1.0"$&gt;
&lt;$MTSetVar name="category-priority" value="0.8"$&gt;
&lt;$MTSetVar name="monthly-priority" value="0.6"$&gt;
&lt;$MTSetVar name="weekly-priority" value="0.4"$&gt;
&lt;$MTSetVar name="daily-priority" value="0.2"$&gt;
&lt;$MTSetVar name="entry-priority" value="1.0"$&gt;
&lt;$MTSetVar name="page-priority" value="1.0"$&gt;
<mtignore>### END SETUP</mtignore>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url><mtignore>### This is your blog's homepage</mtignore>
    	<loc>&lt;$MTBlogURL encode_xml="1"$&gt;</loc>
			<changefreq>&lt;$MTGetVar name="home-frequency"$&gt;</changefreq>
			<priority>&lt;$MTGetVar name="home-priority"$&gt;</priority>
	</url>
	<mtignore>### START CATEGORY ARCHIVES</mtignore>
	<mtifarchivetypeenabled archive_type="Category">
		<mtcategories>
			<url>
				<loc>&lt;$MTCategoryArchiveLink encode_xml="1"$&gt;</loc>
					<lastmod><mtentries lastn="1">&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</mtentries></lastmod>
					<changefreq>&lt;$MTGetVar name="category-frequency"$&gt;</changefreq>
					<priority>&lt;$MTGetVar name="category-priority"$&gt;</priority>
				</url>
		</mtcategories>
	</mtifarchivetypeenabled>
	<mtignore>### END CATEGORY ARCHIVES</mtignore>
	
	<mtignore>### START MONTHLY ARCHIVES</mtignore>
	<mtifarchivetypeenabled archive_type="Monthly">
		<mtarchivelist archive_type="Monthly" lastn="1">
			<url><mtignore> ### The current month is still being updated.</mtignore>
				<loc>&lt;$MTArchiveLink encode_xml="1"$&gt;</loc>
				<lastmod><mtentries lastn="1">&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</mtentries></lastmod>
				<changefreq>&lt;$MTGetVar name="current-monthly-frequency"$&gt;</changefreq>
				<priority>&lt;$MTGetVar name="monthly-priority"$&gt;</priority>
			</url>
		</mtarchivelist>
		<mtarchivelist archive_type="Monthly" lastn="9999" offset="1">
			<url><mtignore> ### Past months are just archived.</mtignore>
				<loc>&lt;$MTArchiveLink encode_xml="1"$&gt;</loc>
				<lastmod><mtentries lastn="1">&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</mtentries></lastmod>
				<changefreq>&lt;$MTGetVar name="past-monthly-frequency"$&gt;</changefreq>
				<priority>&lt;$MTGetVar name="monthly-priority"$&gt;</priority>
			</url>
		</mtarchivelist>
	</mtifarchivetypeenabled>
	<mtignore>### END MONTHLY ARCHIVES</mtignore>
	
	<mtignore>### START WEEKLY ARCHIVES</mtignore>
	<mtifarchivetypeenabled archive_type="Weekly">
		<mtarchivelist archive_type="Weekly" lastn="1">
			<url><mtignore> ### The current week is still being updated.</mtignore>
				<loc>&lt;$MTArchiveLink encode_xml="1"$&gt;</loc>
				<lastmod><mtentries lastn="1">&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</mtentries></lastmod>
				<changefreq>&lt;$MTGetVar name="current-weekly-frequency"$&gt;</changefreq>
				<priority>&lt;$MTGetVar name="weekly-priority"$&gt;</priority>
			</url>
		</mtarchivelist>
		<mtarchivelist archive_type="Weekly" lastn="9999" offset="1">
			<url><mtignore> ### Past weeks are just archived.</mtignore>
				<loc>&lt;$MTArchiveLink encode_xml="1"$&gt;</loc>
				<lastmod><mtentries lastn="1">&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</mtentries></lastmod>
				<changefreq>&lt;$MTGetVar name="past-weekly-frequency"$&gt;</changefreq>
				<priority>&lt;$MTGetVar name="weekly-priority"$&gt;</priority>
			</url>
		</mtarchivelist>
	</mtifarchivetypeenabled>
	<mtignore>### END WEEKLY ARCHIVES</mtignore>
	
	<mtignore>### START DAILY ARCHIVES</mtignore>
	<mtifarchivetypeenabled archive_type="Daily">
		<mtarchivelist archive_type="Daily" lastn="1">
			<url><mtignore> ### The current day is still being updated.</mtignore>
				<loc>&lt;$MTArchiveLink encode_xml="1"$&gt;</loc>
				<lastmod><mtentries lastn="1">&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</mtentries></lastmod>
				<changefreq>&lt;$MTGetVar name="current-daily-frequency"$&gt;</changefreq>
				<priority>&lt;$MTGetVar name="daily-priority"$&gt;</priority>
			</url>
		</mtarchivelist>
		<mtarchivelist archive_type="Daily" lastn="9999" offset="1">
			<url><mtignore> ### Past days are just archived.</mtignore>
				<loc>&lt;$MTArchiveLink encode_xml="1"$&gt;</loc>
				<lastmod><mtentries lastn="1">&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</mtentries></lastmod>
				<changefreq>&lt;$MTGetVar name="past-daily-frequency"$&gt;</changefreq>
				<priority>&lt;$MTGetVar name="daily-priority"$&gt;</priority>
			</url>
		</mtarchivelist>
	</mtifarchivetypeenabled>
	<mtignore>### END DAILY ARCHIVES</mtignore>
	
	<mtignore>### START INDIVIDUAL ARCHIVES</mtignore>
		<mtifarchivetypeenabled archive_type="Individual">
			<mtentries lastn="10">
				<url><mtignore> ### The recent items you post are more likely to be active(comments, etc) than older ones.</mtignore>
					<loc>&lt;$MTEntryPermalink encode_xml="1"$&gt;</loc>
					<lastmod>&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</lastmod>
					<changefreq>&lt;$MTGetVar name="recent-entry-frequency"$&gt;</changefreq>
					<priority>&lt;$MTGetVar name="entry-priority"$&gt;</priority>
				</url>
			</mtentries>
			<mtentries lastn="999999" offset="10">
				<url><mtignore> ### And the rest of them.</mtignore>
					<loc>&lt;$MTEntryPermalink encode_xml="1"$&gt;</loc>
					<lastmod>&lt;$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</lastmod>
					<changefreq>&lt;$MTGetVar name="past-entry-frequency"$&gt;</changefreq>
					<priority>&lt;$MTGetVar name="entry-priority"$&gt;</priority>
				</url>
			</mtentries>
		</mtifarchivetypeenabled>
		<mtignore>### END INDIVIDUAL ARCHIVES</mtignore>

		<mtignore>### START PAGE ARCHIVES ###</mtignore>
		<mtifarchivetypeenabled archive_type="Page">
			<mtpages>
				<url>
					<loc>&lt;$MTPagePermalink encode_xml="1"$&gt;</loc>
					<lastmod>&lt;$MTPageModifiedDate format="%Y-%m-%dT%H:%M:%S"$&gt;&lt;$MTBlogTimezone$&gt;</lastmod>
					<changefreq>&lt;$MTGetVar name="page-frequency"$&gt;</changefreq>
					<priority>&lt;$MTGetVar name="page-priority"$&gt;</priority>
				</url>
			</mtpages>
		</mtifarchivetypeenabled>
		<mtignore>### END PAGE ARCHIVES ###</mtignore>
</urlset>
</pre>
<i><b>Затем! указываем, что шаблон у нас кэшируемый и истекает через 24 часа. Это даст нам автоматическую публикацию карты сайта каждые 24 часа.</b></i><br /><br /><font style="font-size: 1.25em;"><b>Шаг 3.</b></font><br />Создаем индексный шаблон под названием "Google Sitemap". И присваиваем ему имя файла "sitemap.xml". В нем пишем код:
<pre class="brush: xml">&lt;$mt:Include module="Google Sitemap"$&gt;
</pre>
Сохраняем и публикуем шаблон.<br />&nbsp;<br />Все. Теперь у вас есть карта сайта, которую понимают как минимум Google, Yandex, Yahoo, Bing и Ask. Есть вопросы? Пишите.<br /><br />Данный прием был позаимствован с <a href="http://movabletype.org/">MovableType.org</a>.<br />]]>
    </content>
</entry>

<entry>
    <title>Кодирование видео в FLV на FreeBSD</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2010/03/freebsd-flv-encoding.html" />
    <id>tag:madjack.ru,2010:/developer//4.196</id>

    <published>2010-03-26T07:53:18Z</published>
    <updated>2010-03-26T08:26:35Z</updated>

    <summary>Сегодня я расскажу маленький секрет, как самому кодировать видео любых форматов в FLV, дабы его можно было смотреть через Flash плееры. Все на самом деле очень просто. Нам потребуется /ports/multimedia/mencoder, /ports/multimedia/flvtool++ и маленький скриптик на shell....</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Заметки" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="avi" label="AVI" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flv" label="FLV" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="freebsd" label="FreeBSD" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flvtool" label="flvtool++" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mencoder" label="mencoder" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="кодирование" label="Кодирование" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="видео" label="Видео" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<img alt="Кодирование видео в FLV" src="http://madjack.ru/developer/2010/03/26/flvencoder.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="318" height="110" />Сегодня я расскажу маленький секрет, как самому кодировать видео любых форматов в FLV, дабы его можно было смотреть через Flash плееры. Все на самом деле очень просто. Нам потребуется <b>/ports/multimedia/mencoder</b>, <b>/ports/multimedia/flvtool++</b> и маленький скриптик на shell.<br />]]>
        <![CDATA[При установке mencoder выбираем те кодеки, которые нам нужны. Дабы не ошибиться можно выбрать все, что предлагают. Ну вот, установили <b>mencoder</b> и <b>flvtool++</b>. Кстати, FLVTool++ нам нужен, чтобы была поддержка перемотки видео при воспроизведении. Но это совсем не обязательно.<br /><br />Теперь создаем скрипт. Назовем его mencoder.sh. Этот скрипт позволит нам кодировать видео в любое разрешение, с любым битрейтом и с любым качеством как видео так и звука.<br /><br />
<pre class="brush: bash">#!/bin/sh
/usr/local/bin/mencoder $1 -o $2 \
-of lavf \
-oac mp3lame \
-aid 1 \
-lameopts abr:br=56 \
-srate 22050 \
-af volnorm=2 \
-ovc lavc \
-lavcopts vcodec=flv:vbitrate=1024:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 \
-vf scale=$3:$4,harddup
/usr/local/bin/flvtool++ $2 $2.seek.flv
</pre>
Теперь нам нужен видео файл. Допустим это будет фильм film.avi. Чтобы начать кодирование нам нужно знать какое разрешение у видео файла. Посмотреть можно либо в плеере либо на сайте, откуда это видео было скачано. Допустим видео имеет разрешение 720x304 как обычный фильм хорошего качества. Но для веба нам этого будет жирновато. Уменьшим разрешение в 2 раза. А также урежем качество звука в 2 раза с 44100 до 22050. Так как фильмы в веб смотрят в основном на компьютерных колонках или в наушниках на качество это заметно не отразится, зато отразиться на размер результирующего файла и его битрейт. В скрипте указан максимальный битрейт 1024 килобита. Что примерно 128килобайт в секунду.<br /><br />Переписываем видео файл в одну папку с mencoder.sh. Даем права на запуск скрипту командой <b>chmod +x mencoder.sh</b>. И запускаем скрипт такой строчкой:<br />
<pre class="brush: bash">./mencoder.sh film.avi film.flv 360 152
</pre>
Результатом выполнения скрипта будет 2 дополнительных файла и информация примерно такого содержания:<br />
<pre class="brush: plain">MEncoder 1.0rc2-3.4.6 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Xeon(R) CPU           X3210  @ 2.13GHz (Family: 6, Model: 15, Stepping: 11)
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
success: format: 0  data: 0x0 - 0x51328000
AVI file format detected.
[aviheader] Video stream found, -vid 0
[aviheader] Audio stream found, -aid 1
VIDEO:  [XVID]  720x304  12bpp  25.000 fps  1503.9 kbps (183.6 kbyte/s)
[V] filefmt:3  fourcc:0x44495658  size:720x304  fps:25.00  ftime:=0.0400
==========================================================================
Opening audio decoder: [liba52] AC3 decoding with liba52
Using SSE optimized IMDCT transform
Using MMX optimized resampler
AUDIO: 48000 Hz, 2 ch, s16le, 192.0 kbit/12.50% (ratio: 24000-&gt;192000)
Selected audio codec: [a52] afm: liba52 (AC3-liba52)
==========================================================================
** MUXER_LAVF *****************************************************************
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate
INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
Opening video filter: [harddup]
Opening video filter: [scale w=360 h=152]
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffodivx] vfm: ffmpeg (FFmpeg MPEG-4)
==========================================================================
MP3 audio selected.
VDec: vo config request - 720 x 304 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is 2.37:1 - prescaling to correct movie aspect.
SwScaler: reducing / aligning filtersize 9 -&gt; 8
SwScaler: reducing / aligning filtersize 9 -&gt; 8
SwScaler: reducing / aligning filtersize 9 -&gt; 8
SwScaler: reducing / aligning filtersize 9 -&gt; 8
[swscaler @ 0x8646f38]SwScaler: BICUBIC scaler, from yuv420p to yuv420p using MMX2
[swscaler @ 0x8646f38]SwScaler: using 8-tap MMX scaler for horizontal luminance scaling
[swscaler @ 0x8646f38]SwScaler: using 8-tap MMX scaler for horizontal chrominance scaling
[swscaler @ 0x8646f38]SwScaler: using n-tap MMX scaler for vertical scaling (YV12 like)
[swscaler @ 0x8646f38]SwScaler: 720x304 -&gt; 360x152
videocodec: libavcodec (360x152 fourcc=31564c46 [FLV1])
[VE_LAVC] High quality encoding selected (non-realtime)!
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler. You may try recompiling using gcc &gt;= 4.2.
Do not report crashes to FFmpeg developers.
VIDEO CODEC ID: 22
AUDIO CODEC ID: 15001, TAG: 0
Writing header...
Pos:   0.8s     22f ( 0%)  0.00fps Trem:   0min   0mb  A-V:0.082 [0:8]
Skipping frame!
Pos:  15.3s    385f ( 0%) 109.69fps Trem:   0min   0mb  A-V:0.066 [292:53]
</pre>
Перекодирование может затянуться до часа-двух. В зависимости от мощности компьютера.<br />Теперь о файлах, которые мы получим в результате выполнения скрипта.<br />film.flv - это файл перекодированный AVI =&gt; FLV.<br />film.flv.seek.flv - это файл FLV с поддержкой перемотки.<br /><br />Если нам файл без перемотки не нужен, то добавим в конец скрипта еще 2 строчки:
<pre class="brush: bash">rm -f $2
mv $2.seek.flv $2
</pre>
Тогда будет только <b>film.flv</b> и уже с поддержкой перемотки.<br /><br />Параметров у mencoder очень много. В скрипте использованы лишь основные. Давайте их рассмотрим.<br /><ul><li><b>-oac mp3lame</b> - Означает, что звук будем кодировать в MP3 формат.</li><li><b>-srate 22050</b> - Означает, что качество звука будет 22050Khz.</li><li><b>-af volnorm=2</b> - Означает, что будет производиться нормализация громкости.</li><li><b>vbitrate=1024</b> - Означает, что итоговый битрейт видеофайла не будет превышать 1024Килобита</li><li><b>-vf scale=$3:$4,harddup</b> - Означает что размер видео будет изменен в $3 по ширине и в $4 по высоте. А также harddup говорит о том, что при наличии плохих фреймов они будут пропускаться и заменяться хорошими. <br /></li></ul>На практике скажу - этот скрипт наиболее качественно конвертирует видео. Сам им пользуюсь. Примеры фильмов, перекодированные этим скриптом можно посмотреть у меня на блоге в разделе <a href="http://madjack.ru/blog/movies/">Фильмы</a>.<br /><br />Кому понравилось/не понравилось и есть что предложить жду отзывов в коментах.<br />]]>
    </content>
</entry>

<entry>
    <title>Кнопка Retweet своими руками? Легко!</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2010/03/retweet-button-standalone-script.html" />
    <id>tag:madjack.ru,2010:/developer//4.190</id>

    <published>2010-03-25T07:22:22Z</published>
    <updated>2010-03-25T08:13:31Z</updated>

    <summary>Многие владельцы блогов стремятся добавить больше интеграции с популярными соц-сетями такими как Twitter, LiveJournal, Google Buzz, Blogger и другими. Сегодня пойдет речь о Твиттере. Существует множество онлайн-сервисов, который предоставляют различные плагины для Wordpress и других популярных блоггинговых систем, чтобы владельцы...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Программный Код" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bitlyjavascriptapi" label="Bit.ly JavaScript API" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="retweet" label="Retweet" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="script" label="Script" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tweet" label="Tweet" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tweetter" label="Tweetter" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="кнопка" label="Кнопка" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<a href="http://madjack.ru/developer/2010/03/25/retweet.jpg"><img alt="Tweet и Retweet. Вот в чем вопрос." src="http://madjack.ru/developer/assets_c/2010/03/retweet-thumb-520x344-351.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="520" height="344" /></a>Многие владельцы блогов стремятся добавить больше интеграции с популярными соц-сетями такими как Twitter, LiveJournal, Google Buzz, Blogger и другими. Сегодня пойдет речь о Твиттере. Существует множество онлайн-сервисов, который предоставляют различные плагины для Wordpress и других популярных блоггинговых систем, чтобы владельцы блогов смогли добавить себе на сайт одну маленькую простенькую невзрачненькую кнопочку с надписью Retweet и количеством затвитченых записей. Некоторые даже на этой кнопке делают себе карьеру в интернете и неплохо зарабатывают. Я же предлагаю легкий и честный путь - сделай кнопку сам. Собственно далее и пойдет речь о кнопке Retweet.<br /> ]]>
        <![CDATA[Чтобы сделать кнопку нам потребуется создать 1 файл JavaScript. Не так уж и много. Правда? Возьмем за основу скрипт моего коллеги Джона Ресига (John Resig). Данный скрипт уже умеет делать все что нам нужно и даже больше. Скрипт создает симпотичную кнопочку с произвольной надписью, а также еще преобразует URL в которткий вид с помощью сервиса Bit.ly JavaScript API Сам скрипт можно будет забрать чуть ниже, а пока я расскажу как им пользоваться.<br /><br />Скрипт может создавать кнопки двух видов - вертикальные и горизонтальные. Тут уж кому как нравится. Но самое главное достоинство - это ассинхронная работа. Тобишь если внедрить эту кнопку без скрипта непосредственно в код сайта, то сайт будет поддтормаживать при загрузке, а с помощью скрипта вы лишены любых тормозов при проседании сервиса Twitter и Bit.ly.<br /><br />Итак, чтобы создать кнопку, нам нужно определить ссылку (&lt;a&gt; ... &lt;/a&gt;) и указать определенный класс (class) ссылки. Различные варианты определения ссылки и текста также присутствуют. Сейчас мы их и посмотрим на примере.<br /><br />Примеры (все кнопки кликабельны и рабочие на 100%):<br /><br /><a class="retweet" href="http://madjack.ru/">Блог Безумного Джека</a><br />
<pre class="brush: xml">&lt;a class="retweet" href="http://madjack.ru"&gt;Блог Безумного Джека&lt;/a&gt;
</pre>
<a class="retweet" href="http://yandex.ru/">Поисковая система Yandex</a>
<pre class="brush: xml">&lt;a class="retweet" href="http://yandex.ru"&gt;Поисковая система Yandex&lt;/a&gt;
</pre>
<div style="height: 60px; width: 70px;">
<a class="retweet vert" href="http://google.com/">Поисковая система Google</a>
</div>
<pre class="brush: xml">&lt;a class="retweet vert" href="http://google.com"&gt;Поисковая система Google&lt;/a&gt;
</pre>
<br />
Цвет и текст кнопки можно легко отредактировать. <br />Теперь о том, как подключить скрипт в свой блог.<br /><br />1. Подключите скрипт к странице<br />
<pre class="brush: xml">&lt;script src="http://madjack.ru/retweet/retweet.js"&gt;&lt;/script&gt;
</pre>
2. Добавьте класс retweet к любой ссылке и она превратиться в кнопку, как показано на примере выше.<br /><br />Скрипт можно скачать здесь - <a href="http://madjack.ru/retweet/retweet.js">Retweet Button Script</a>.<br /><br />Оригинал скрипта и мануала (на английском языке) автора находится <a href="http://ejohn.org/blog/retweet/">здесь</a>.<br />]]>
    </content>
</entry>

<entry>
    <title>Языки программирования для Веб - Часть 1</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2010/03/web-programming-languages-part1.html" />
    <id>tag:madjack.ru,2010:/developer//4.7</id>

    <published>2010-03-24T07:37:52Z</published>
    <updated>2010-03-24T18:36:53Z</updated>

    <summary><![CDATA[В данной статье я постараюсь рассмотреть все достоинства и недостатки, а также провести сравнительный анализ языков программирования для Веб, которые идут на популярных серверных платформах FreeBSD, Linux, Mac Os.Буду рассматривать: Perl,&nbsp;PHP, Python....]]></summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Статьи" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="python" label="Python" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[В данной статье я постараюсь рассмотреть все достоинства и недостатки, а также провести сравнительный анализ языков программирования для Веб, которые идут на популярных серверных платформах FreeBSD, Linux, Mac Os.<div><br /></div><div>Буду рассматривать: Perl,&nbsp;PHP, Python.</div>]]>
        <![CDATA[<div><span class="Apple-style-span" style="font-size: 20px; font-weight: bold; ">Perl</span></div><div>Perl -- это процедурный язык программирования -- универсальный инструмент для решения очень широкого круга задач. Perl не разрабатывался специально для Web-программирования.&nbsp;Perl, как и любой полноценный язык, имеет некоторое ядро -- набор функций и правил, которые не зависят от платформы, операционной системы и прочих обстоятельств.&nbsp;Код Perl мобилен и переносим и везде одинаков. Различия дистрибутивов Perl схожих версий сводятся наличием установленных модулей.&nbsp;Perl предоставляет программисту ограниченный набор стандартных инструментов. Это дисциплинирует программиста и облегчает обмен кодом и опытом. При этом, программист совсем не скован и всегда может получить требуемые возможности, подключив соответствующий модуль. Perl является зрелым языком. Мало подвержен всяческим багфиксам и изменениям. Снабжен развитыми средствами разработки. Все "детские" ошибки Perl пережил еще более чем 10 лет назад.&nbsp;Perl обеспечивает более высокую производительность в веб-разработках, только если использовать не CGI-подход, а mod_perl. Большинство провайдеров не предоставят вам такой возможности.&nbsp;Perl представляет минимум функций в своем ядре. Чтобы расширить функционал языка требуется подключать дополнительные модули. Большинство других языков имеют гораздо больше встроенных функций.&nbsp;Perl имеет собственную систему документирования и снабжён прекрасной документацией на английском языке.&nbsp;Перегрузка операторов возможна, но является очень ограниченной и искусственной надстройкой.&nbsp;В Perl исключения можно эмулировать, при помощи таких модулей, как Error.pm и Exception.pm, не входящих в стандартную поставку. Они основаны на умелом использовании eval/die, но это весьма искусственный приём, который никак не может обеспечить требуемой гибкости современного объектно-ориентированного языка. &nbsp;В Perl все переменные глобальны, если не указано иное. Но чаще всего требуется именно иное.&nbsp;В Perl аргументы функций задаются в магическом массиве.</div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.25em; "><font class="Apple-style-span" style="font-size: 1.25em; ">PHP</font></font></b></div><div>PHP псевдообъектный язык программирование и изначально предназначался для разработки Web-приложений. Он пытается сочетать мощь полноценного языка и преимущества узкоспециального средства. В поисках компромисса, PHP приобретает целый ряд спорных качеств.&nbsp;PHP не является полноценным языком программирования и практически не имеет своего ядра. Отсюда проистекает целый ряд особенностей PHP.&nbsp;Набор функций PHP, который оказывается в распоряжении программиста, практически полностью зависит от провайдера. («Правильные» провайдеры всегда пишут, с какими опциями был собран их PHP.)&nbsp;Эта разница весьма ощутима. Например, если сайт разработан с использованием Smarty, то он заработает далеко не на всяком хостинге. И происходит это только потому, что аппарат Smarty использует POSIX-расширение механизма регулярных выражений.&nbsp;Если ваше PHP-приложение написано с использованием функций, которых хостер не предоставляет, или вы использовали библиотеки, которые зависят от таких функций, то расширить набор функций PHP самостоятельно чаще всего нельзя.&nbsp;PHP предоставляет (потенциально) великое множество функций. На настоящий момент их более 3000. На реальном хостинге вы обнаружите около 1000 из них. Такой широкий набор выразительных средств не идёт на пользу языку. Разные программисты знают разные наборы операторов. Это затрудняет чтение чужого кода, обмен кодом и совместную разработку. PHP относительно молодой язык. Подвержен частым багфиксам и дополнениям. В&nbsp;PHP механизм указателей находится в зачаточном состоянии. В PHP не предусмотрена такая структура данных, как массив.&nbsp;В этом смысле PHP находится на уровне awk.&nbsp;Одним словом, PHP ещё долго будет меняться, создавая множество проблем разработчикам.&nbsp;При ведении именно Web-разработок, PHP обнаруживает ряд существенных преимуществ. Во-первых, интерпретатор PHP интегрируется в Web-сервер, что в разы увеличивает производительность.&nbsp;Во-вторых, Web-приложения на PHP проще отлаживать. Сообщения об ошибках часто выдаются клиенту, а не пишутся в error_log.&nbsp;В-третьих, PHP имеет широкий набор встроенных функций, для работы по протоколу HTTP.&nbsp;Однако, почти все эти преимущества оборачиваются серьёзными проблемами с точки зрения безопасности ресурса.&nbsp;То, что PHP встроен в сервер, затрудняет диагностику источника атак.&nbsp;PHP даёт большую свободу разработчику -- PHP-скрипт может быть размещён в любой директории сервера. Но это тоже создаёт дополнительные риски.&nbsp;Во многих случаях, по невнимательности разработчиков, посетитель сервера получает возможность «залить» на сервер не только картинки и другие безобидные файлы, но PHP-скрипты, а это уже очень серьёзная опасность.&nbsp;То, что PHP выдаёт сообщения об ошибках в ответ на HTTP-запрос, удобно для разработчика. Но с точки зрения безопасности это решение мне всегда казалось спорным, ведь любой посетитель вашего сайта может узнать об ошибках в ваших программах. А злоумышленнику может оказаться достаточно узнать версию вашего PHP, чтобы «сломать» ваш ресурс.&nbsp;Преимуществом документации PHP является то, что она переведена на русский язык. К недостаткам я бы отнёс её необъятность.&nbsp;Основной проблемой PHP является то, что этот язык позволяет смешивать HTML-код и PHP-код. Фактически, это смешение данных и кода.&nbsp;Человечество уже десятки лет назад осознало, что код и данные следует разделять. Для этого найдено множество изящных решений, от хедеров и конфигурационных файлов, до шаблонов и обособленных хранилищ данных. В этом смысле PHP представляется шагом назад; каким-то старорождённым.&nbsp;Если посмотреть на это с прикладной точки зрения, то ничего хорошего мы тоже не увидим. Объединение HTML- и PHP-кода не улучшает читабельность ни того, ни другого. Соответственно, сопровождение, модернизация и модификация программ тоже затрудняются.&nbsp;Но существуют недостатки, «встроенные» в сам язык. Так, например, представляется очень неудобным то, как регламентируется передача параметров функциям. Будет ли параметр передан по значению или по ссылке определяется не при вызове функции, а при её создании. Вызов же выглядит одинаково и в том и в другом случае. Это удобно, если автором всеx функций являетесь вы сами, и вы хорошо помните прототипы ваших функций. Но при активной работе в команде это приводит к путанице. Точно также обстоит дело и с функциями, возвращающими указатели. Это самый большой из тех недостатков PHP, которые никак нельзя обойти.</div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.25em; "><font class="Apple-style-span" style="font-size: 1.25em; ">Python</font></font></b></div><div>Python -- изначально объектно-ориентированный язык. Синтаксис Python естественный и компактный во всём: и в объявлении классов, и при организации наследования, и при доступе к данным и методам объекта.&nbsp;В Python имеется полноценный механизм обработки исключений, встроенный в язык.&nbsp;В Python исключения являются классами, обработка исключений ведётся с учётом структуры этих классов, что позволяет отслеживать целые группы исключений. Кроме того, на каждый класс исключений можно сделать свой обработчик.&nbsp;В Python конструктор всегда создаёт объект, что весьма логично. Если возникла ошибка, то генерируется exception.&nbsp;Python-way громоздкий, за то он позволяет не только корректно обработать ошибку, но и вернуть любую информацию о ней.&nbsp;Синтаксис Python максимально компактен. В нём нет ни фигурных скобок, ни точек с запятой, ни оператора -&gt; ни двойных двоеточий :: (всегда используется «.»). У переменных нет префиксов. Скобки можно опускать везде, где только возможно.&nbsp;В Python все переменные локальны (если не указано иное, глобальные переменные так же допустимы).&nbsp;В Python аргументы функций задаются как во всех нормальных языках.</div><div><br /></div>]]>
    </content>
</entry>

<entry>
    <title>Как обновить систему при помощи csup?</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2010/01/freebsd-update-csup.html" />
    <id>tag:omega.jyaa82,2010:/dyakoff/madjack.ru/developer//4.12</id>

    <published>2010-01-27T13:47:51Z</published>
    <updated>2010-03-24T18:32:29Z</updated>

    <summary>После установки системы FreeBSD обычно требуется обновить ее до актуальной версии. Это касается как ядра системы так и коллекции портов и уже установленного ПО.Для обновления многие используют CVSUp. Это довольно таки громоздкая утилита написанная на ruby. Также требует длительного времени...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="FreeBSD" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="freebsd" label="FreeBSD" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="csup" label="csup" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cvsup" label="cvsup" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="update" label="update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[После установки системы FreeBSD обычно требуется обновить ее до актуальной версии. Это касается как ядра системы так и коллекции портов и уже установленного ПО.<div><br /></div><div>Для обновления многие используют CVSUp. Это довольно таки громоздкая утилита написанная на ruby. Также требует длительного времени при установке из исходников. Многие даже и не догадываются о существовании маленькой утилиты, которая уже есть в сборке FreeBSD - csup. Это полный аналог CVSUp Without GUI, написанный на Си.&nbsp;</div><div><br /></div><div>Как ей пользоваться и как конфигурировать? Об этом мы сейчас и поговорим.</div>]]>
        <![CDATA[<font class="Apple-style-span" style="font-size: 1.25em; ">Создание папки с конфигурационными файлами:</font><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; border-collapse: collapse; line-height: 16px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "># mkdir /etc/csup</span></div><div><font class="Apple-style-span" color="#000000" face="Verdana, Arial, Helvetica, sans-serif" size="3"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 12px; line-height: 16px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><br /></span></font></div><div><font class="Apple-style-span" color="#000000" size="3"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 12px; line-height: 16px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><font class="Apple-style-span" style="font-size: 1.25em; ">Создание файла для обновления исходников системы:</font></span></font></div><div><font class="Apple-style-span" color="#000000" face="Verdana, Arial, Helvetica, sans-serif" size="3"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 12px; line-height: 16px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><strong>#&nbsp;cat /etc/csup/src-all</strong></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; ">*default host=cvsup3.ua.FreeBSD.org<br />*default base=/var/db<br />*default prefix=/usr<br />*default release=cvs tag=RELENG_7<br />*default delete use-rel-suffix<br />*default compress src-all</p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><br /></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><font class="Apple-style-span" style="font-size: 1.25em; ">Создание файла для обновления коллекции портов:</font></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><strong># cat /etc/csup/ports-all</strong><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; ">*default host=cvsup3.ua.FreeBSD.org<br />*default base=/var/db<br />*default prefix=/usr<br />*default release=cvs tag=.<br />*default delete use-rel-suffix<br />*default compress ports-all</p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><br /></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><font class="Apple-style-span" style="font-size: 1.25em; ">Создание файла для обновления документации:</font></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><strong># cat /etc/csup/doc-all</strong><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; ">*default host=cvsup2.ua.FreeBSD.org<br />*default base=/var/db<br />*default prefix=/usr<br />*default release=cvs tag=.<br />*default delete use-rel-suffix<br />*default compress doc-all</p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><br /></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><span class="Apple-style-span" style="font-size: 15px; ">Создание файла для обновления исходников ядра:</span></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><strong># cat /etc/csup/src-sys</strong></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; ">&nbsp;*default host=cvsup3.ua.FreeBSD.org<br />*default base=/var/db<br />*default prefix=/usr<br />*default release=cvs tag=RELENG_6<br />*default delete use-rel-suffix<br />*default compress src-sys</p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><br /></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><font class="Apple-style-span" style="font-size: 1.25em; ">Создание файла для обновления всех исходных кодов системы:</font></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><strong># cat /etc/csup/src-all</strong></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; ">*default host=cvsup3.ua.FreeBSD.org<br />*default base=/var/db<br />*default prefix=/usr<br />*default release=cvs tag=RELENG_7<br />*default delete use-rel-suffix<br />*default compress src-all</p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><br /></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><font class="Apple-style-span" style="font-size: 1.25em; ">Чтобы обновлять коллекцию портов регулярно:</font></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; ">Добавьте строчку в&nbsp;<span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-style: italic; ">/etc/crontab</span></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; ">25 2 * * * root /usr/bin/csup -g -L 2 /etc/csup/ports-all &gt; /dev/null 2&gt;&amp;1</p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><br /></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><font class="Apple-style-span" style="font-size: 1.25em; ">Запуск программы:</font></p><p style="font: normal normal normal 12px/1.4em Verdana, Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "># csup -g -L 2 /etc/csup/src-all</p></p></p></p></p></span></font></div>]]>
    </content>
</entry>

<entry>
    <title>Google PageRank API. Определяем PR страницы своими силами.</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2009/10/google-pagerank-api.html" />
    <id>tag:omega.jyaa82,2009:/dyakoff/madjack.ru/developer//4.11</id>

    <published>2009-10-25T16:15:05Z</published>
    <updated>2010-03-24T18:31:46Z</updated>

    <summary>Практически каждый знает что такое Google PageRank, а кто не знает - смело идем на википедю (ru.wikipedia.org/wiki/PageRank) и читаем. Но не каждый знает как его получить своими силами. Большинству пользователей интернет это конечно и не нужно знать, но большому количеству...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Программный Код" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="google" label="Google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pr" label="PR" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pagerank" label="PageRank" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<img alt="Google PageRank" src="http://madjack.ru/developer/2010/03/17/google-pagerank.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="425" height="281" />Практически каждый знает что такое Google PageRank, а кто не знает - смело идем на википедю (ru.wikipedia.org/wiki/PageRank) и читаем. Но не каждый знает как его получить своими силами. Большинству пользователей интернет это конечно и не нужно знать, но большому количеству держателей сайтов этот прием несомненно пригодится. Можно конечно залезть в Google Webmaster Tools и посмотреть его для своих сайтов, можно установить Google Toolbar, можно воспользоваться одним из многочисленных бесплатных (платных) сервисов по определению PR, можно поставить счетчик PR на свою страницу, можно даже купить готовый скрипт определения PR... Но также можно написать скрипт самому =) Собственно об этом я и расскажу.]]>
        <![CDATA[Переходим сразу к делу, тобишь к программе, а точнее к ее исходному коду. Назовем эту разработку Google PageRank API, раз уж гугл такой API не предоставляет, то предоставлю я =).<div><br /></div><div>Предлагаю вашему вниманию код определения Google PR на языке python. Код нашел в сети с ошибкой. Также нашел исправления алгоритма. Выкладываю полностью работоспособный код.</div><div>
<pre class="brush: python">#!/usr/local/bin/env python
# -*- coding: utf-8 -*-
# (C) 2008 Fred Cirera
# ported in Python from the Ruby code by Vsevolod S. Balashov
# fixed error with algorythm by Konstantin S. Dyakoff
# http://madjack.ru/developer/2009/10/google-pagerank-api.html
# http://snippets.dzone.com/posts/show/3284

import urllib2
import re
import time
import sys

from urllib import urlencode
from pprint import pprint

HOST = "toolbarqueries.google.com"

def mix(a, b, c): 
    M = lambda v: v % 0x100000000 # int32 modulo 
    a, b, c = (M(a), M(b), M(c))
    
    a = M((a-b-c) ^ (c &gt;&gt; 13))
    b = M((b-c-a) ^ (a &lt;&lt;  8))
    c = M((c-a-b) ^ (b &gt;&gt; 13))

    a = M((a-b-c) ^ (c &gt;&gt; 12))
    b = M((b-c-a) ^ (a &lt;&lt; 16))
    c = M((c-a-b) ^ (b &gt;&gt; 5))

    a = M((a-b-c) ^ (c &gt;&gt;  3))
    b = M((b-c-a) ^ (a &lt;&lt; 10))
    c = M((c-a-b) ^ (b &gt;&gt; 15))

    return a, b, c

def checksum(iurl):
    C2I = lambda s: sum(c &lt;&lt; 8*i for i, c in enumerate(s[:4]))
    
    a, b, c = 0x9e3779b9, 0x9e3779b9, 0xe6359a60
    lg  = len(iurl)
    k = 0
    
    while k &lt;= lg-12:
        a = a + C2I(iurl[k:k+4])
        b = b + C2I(iurl[k+4:k+8])
        c = c + C2I(iurl[k+8:k+12])
        a, b, c = mix(a, b, c)
        k += 12

    a = a + C2I(iurl[k:k+4])
    b = b + C2I(iurl[k+4:k+8])
    c = c + (C2I(iurl[k+8:])&lt;&lt;8) + lg
    a, b, c = mix(a, b, c)
    return c

def GoogleHash(value):
    I2C = lambda i: [i &amp; 0xff, i &gt;&gt; 8 &amp; 0xff,  i &gt;&gt; 16 &amp; 0xff, i &gt;&gt; 24 &amp; 0xff]
    ch = checksum([ord(c) for c in value])
    ch = ((ch % 0x0d) &amp; 7) | ((ch/7) &lt;&lt; 2)
    
    return "6%s" % checksum(sum((I2C(ch-9*i) for i in range(20)), []))


def make_url(host, site_url):
    url = "info:" + site_url
    ghash = GoogleHash(url)
    params = dict(client="navclient-auto", ch="%s" % ghash,
                  ie="UTF-8", oe="UTF-8", features="Rank", q=url)
    return "http://%s/search?%s" % (host, urlencode(params))


# Where the fun begins

if __name__ == "__main__":
    if len(sys.argv) != 2:
        url = 'http://www.google.com/'
    else:
        url = sys.argv[1]

    if not url.startswith('http://'):
        url = 'http://%s' % url

    print make_url(HOST, url)
    req = urllib2.Request(make_url(HOST, url))
    try:
        f = urllib2.urlopen(req)
        response = f.readline()
    except Exception, err:
        print err
        # print err.read()
        sys.exit(1)
        
    try:
        rank = re.match(r'^Rank_\d+:\d+:(\d+)', response.strip()).group(1)
    except AttributeError:
        print "This page is not ranked"
        rank = -1

    print "PagerRank: %d\tURL: %s" % (int(rank), url)
</pre>
</div><div>Я уже предвкушаю Ваш вопрос "А где ж код на PHP или на худой конец на PERL?!". Несложными манипуляциями код написал собственными руками основываясь на вышеприведенном исходнике и охотно им делюсь:</div><div>
<pre class="brush: perl">#!/usr/local/bin/perl
# (C) 2008 Fred Cirera
# ported in Perl from the Python code by Konstantin S. Dyakoff
# http://madjack.ru/developer/2009/10/google-pagerank-api.html

package PR;

use Acme::Lambda;
use URI::Escape;
use LWP::UserAgent;

sub mix{
    my $a = shift;
    my $b = shift;
    my $c = shift;
    my $M = lambda {$_ % 0x100000000};

    $a = $M-&gt;($a);
    $b = $M-&gt;($b);
    $c = $M-&gt;($c);
    
    $a = $M-&gt;(($a-$b-$c) ^ ($c &gt;&gt; 13));
    $b = $M-&gt;(($b-$c-$a) ^ ($a &lt;&lt;  8));
    $c = $M-&gt;(($c-$a-$b) ^ ($b &gt;&gt; 13));
    
    $a = $M-&gt;(($a-$b-$c) ^ ($c &gt;&gt; 12));
    $b = $M-&gt;(($b-$c-$a) ^ ($a &lt;&lt; 16));
    $c = $M-&gt;(($c-$a-$b) ^ ($b &gt;&gt; 5));
    
    $a = $M-&gt;(($a-$b-$c) ^ ($c &gt;&gt;  3));
    $b = $M-&gt;(($b-$c-$a) ^ ($a &lt;&lt; 10));
    $c = $M-&gt;(($c-$a-$b) ^ ($b &gt;&gt; 15));

    return ($a, $b, $c);
}

sub C2I{
    my $len = pop;
    my $from = pop;
    my @arr = @_;
    my $sum = 0;
    
    my $j = 0;
    for my $i ($from..$len){
	$sum += $arr[$i] &lt;&lt; (8 * $j++);
    }
    return $sum;
}

sub checksum{
    my @iurl = @_;    
    my ($a, $b, $c) = (0x9e3779b9, 0x9e3779b9, 0xe6359a60);
    
    my $lg  = scalar(@iurl);
    my $k = 0;
    while($k &lt;= $lg-12){
        $a = $a + C2I(@iurl, $k, $k+3);
        $b = $b + C2I(@iurl, $k+4, $k+7);
        $c = $c + C2I(@iurl, $k+8, $k+11);
        ($a, $b, $c) = mix($a, $b, $c);
        $k += 12;
    }
    
    $a = $a + C2I(@iurl, $k, $k+4);
    $b = $b + C2I(@iurl, $k+4, $k+8);
    $c = $c + (C2I(@iurl, $k+8, $k+scalar(@iurl))&lt;&lt;8) + $lg;
    ($a, $b, $c) = mix($a, $b, $c);
    return $c;
}

sub I2C{
    my $i = shift;
    return ($i &amp; 0xff, $i &gt;&gt; 8 &amp; 0xff, $i &gt;&gt; 16 &amp; 0xff, $i &gt;&gt; 24 &amp; 0xff);
}

sub GoogleHash{
    my $value = shift;
    @va = split '', $value;
    for $i (0..scalar(@va)-1){
	$va[$i] = ord($va[$i]);
    }
    $ch = checksum(@va);
    $ch = (($ch % 0x0d) &amp; 7) | (($ch/7) &lt;&lt; 2);
    
    my $sum;
    my $j = 0;
    for $i (0..19){
	($sum[$j++], $sum[$j++], $sum[$j++], $sum[$j++]) = I2C($ch-9*$i);
    }
    
    return sprintf("6%s", checksum(@sum));
}

sub MakePRQuery{
    my $url = shift;
    $url = "info:$url";
    return sprintf("http://toolbarqueries.google.com/search?q=%s&amp;ch=%d&amp;features=%s&amp;oe=%s&amp;ie=%s&amp;client=%s", 
	uri_escape($url), GoogleHash($url), "Rank", "UTF-8", "UTF-8", "navclient-auto");
}

sub QueryPR{
    my $url = shift;
    $url = MakePRQuery($url);
    
    my $a = LWP::UserAgent-&gt;new(
	agent =&gt; "Mozilla/4.0 (compatible; GoogleToolbar 2.0.108-big; Windows XP 5.1)",
    );
    $a-&gt;timeout(30);
    $a-&gt;env_proxy;
    my $r = $a-&gt;get($url);

    if($r-&gt;is_success){
	my @data = split ":", $r-&gt;content;
	if(scalar(@data) eq 3){
	    return $data[2];
	}
    }
    return -1;
}

1;
</pre>
</div>
<div>
Как видно это модуль PR.pm. Его можно кинуть в папку с любым другим приложением, которое будет его пользовать и просто подключить. Ниже прилагаю пример:</div>
<div>
<pre class="brush: perl">#!/usr/local/bin/perl

use PR;

print "PR: " . PR::QueryPR("http://www.madjack.ru") . "\n";
</pre>
</div>
<div>
Пользуйтесь на здоровье. Если нашли ошибку в коде или у вас есть пожелания или просто отзывы - пишите в комментариях или мне на почту: me (at) madjack (dot) ru
</div>]]>
    </content>
</entry>

<entry>
    <title>Как с проверить валидность EMail адреса?</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2009/08/email-validation-regex.html" />
    <id>tag:omega.jyaa82,2009:/dyakoff/madjack.ru/developer//4.10</id>

    <published>2009-08-06T08:02:08Z</published>
    <updated>2010-03-24T18:30:42Z</updated>

    <summary>Как с помощью регулярного выражения проверить правильность введенного E-Mail адреса? Существует несколько стандартных регулярных выражений, а также произвольные вариации заточенные для конкретных целей. Рассмотрим все варианты и выберем лучший. Примеры будут представлены с использованием языка PERL. Так как этот язык...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Программный Код" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="email" label="EMail" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rfc2822" label="RFC 2822" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="regex" label="RegEx" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="валидация" label="Валидация" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<p>Как с помощью регулярного выражения проверить правильность введенного E-Mail адреса? Существует несколько стандартных регулярных выражений, а также произвольные вариации заточенные для конкретных целей. Рассмотрим все варианты и выберем лучший. Примеры будут представлены с использованием языка PERL. Так как этот язык является отцом всех регулярных выражений в современном программировании.<br /> </p>]]>
        <![CDATA[Простое регулярное выражение для проверки E-Mail без наличия каких-либо уязвимостей. Совпадает с любым реальным E-Mail адресом.
<pre class='brush: perl'>$_ = &quot;some@email.com&quot;;
if(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/){
    return true;
}</pre>
Однако в крупных офисах есть свои внутренние домены и они могут не совпадать по размерности со стандартными доменами. Например michael@mail.office уже не подойдет к выше описанному регулярному выражению. Для таких целей можно использовать например такое регулярное выражение:
<pre class='brush: perl'>$_ = &quot;michael@mail.office&quot;;
if(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/){
    return true;
}</pre>
Но могут существовать и более длинные имена почтовых доменов например alex@server.department.new.mail.com. Как быть тут? Можно использовать вот такое выражение:
<pre class='brush: perl'>$_ = &quot;alex@server.department.new.mail.com&quot;;
if(/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/){
    return true;
}</pre>
Если ничего эдакого не требуется, то можно делать проверку валидности электронного почтового адреса по стандарту RFC 2822.
<pre class='brush: perl'>$_ = &quot;someone@mail.ru&quot;;
if(/(?:[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*|&quot;(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*&quot;)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/){
    return true;
}</pre>
Данное регулярное выражение состоит из двух частей. До собачки (@) и после.<br /><br />Если немного усовершенствовать это регулярное выражение то можно получить более короткую запись, которая будет удовлитворять 99.9% из всех используемых на сегодняшний день почтовых адресов.
<pre class='brush: perl'>$_ = &quot;user@gmail.com&quot;;
if(/[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/){
    return true;
}</pre>
Пользуйтесь на здоровье.]]>
    </content>
</entry>

<entry>
    <title>MySQL vs PostgreSQL</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2009/08/mysql-vs-postgresql.html" />
    <id>tag:omega.jyaa82,2009:/dyakoff/madjack.ru/developer//4.8</id>

    <published>2009-08-06T07:13:52Z</published>
    <updated>2010-03-24T18:29:54Z</updated>

    <summary>Выбор между MySQL и PostgreSQL - это решение, которое должен принять каждый разработчик веб-приложений, который выбирает между различными Open-Source СУБД. Оба решения проверены временем и оба заслуживают пристального внимания. СУБД MySQL задумывалась как более быстрая но менее функциональная, в то...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="СУБД" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Статьи" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<div><img alt="Миниатюра изображения для PostgreSQL VS MySQL" src="http://madjack.ru/developer/assets_c/2010/03/postgresql_vs_mysql-thumb-520x142-29.jpg" width="520" height="142" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Выбор между MySQL и PostgreSQL - это решение, которое должен принять каждый разработчик веб-приложений, который выбирает между различными Open-Source СУБД. Оба решения проверены временем и оба заслуживают пристального внимания. СУБД MySQL задумывалась как более быстрая но менее функциональная, в то время как разработчики PostgreSQL сосредоточились на большем количестве функционально полезных примочек чтобы как можно ближе соответствовать стандартам Oracle. MySQL очень популярен среди Web разработчиков по причине его высокой скорости и простоты использования. PosgreSQL менее популярен, так как удобен и просто только для тех разработчиков, которые ранее использовали Oracle или другие похожие базы данных. Но все скоростные характеристики MySQL по сравнению с PostgreSQL постепенно таят, так как с каждым обновлением PostgreSQL заметно прибавляет в скорости. Теперь рассмотрим эти две СУБД более пристально.</span></p></div><div><br /></div>]]>
        <![CDATA[<font style="font-size: 1.25em;"><b>Архитектура</b></font><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">PostgreSQL уникальная СУБД с единым сервером хранения данных (СХД). MySQL имеет два слоя в своей архитектуре. Первый слой - это набор серверов хранения данных. По этому при сравнении обычно указывают какой именно сервер хранения данных MySQL использовался. Каждый сервер отличают и параметры быстродейстсвия и его функциональные возможности. Самый распространенный из них - InnoDB. Он отличается от остальных полной поддержкой модели ACID и высокой производительностью. Прямым конкурентом InnoDB считается MyISAM, который годится для обработки и хранения сравнительно небольших объемов данных, которые преимущественно считываются из БД, а не записываются. А также когда не критично отсутствие ACID. Приложения, которые работают с MySQL, могут одновременно использовать несколько СХД для обеспечения наилучшего набора функциональности и производительности.</span></p><br /><font style="font-size: 1.25em;"><b>Производительность</b></font><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Производительность СУБД может быть оптимизирована исходя из среды использования. Сравнения производительности различных СУБД также нужно проводить очень аккуратно и обращать внимание на цель использования и конфигурацию в которой работает СУБД. И MySQL и PostgreSQL имеют множество рычагов, с помощью которых можно управлять производительностью.</span></p><br /><font style="font-size: 1.25em;"><b>Ориентированность СУБД</b></font><br /><br />Стандартная конфигурация обоих СУБД оптимизирована для небольших систем, которые используются большинством потребителей этих СУБД. Если сравнивать производительность стандартных конфигураций, то отличия минимальны и невозможно выделить явного лидера.<br /><br /><font style="font-size: 1.25em;"><b>Скоростные характеристики</b></font><br /><br /><b>PostgreSQL</b><br /><br />PostgreSQL предоставляет функционал, который может увеличить производительность для некоторых видов  SQL запросов. Из этих функций стоит выделить:<br />- частичное индексирование;<br />- сжатие данных;<br />- объем данных, хранимых в оперативной памяти;<br />- кэш запросов;<br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">PostgreSQL может сжимать и разжимать данные на лету с огромной скоростью. Данную функцию стоит применять в случаях, когда на счету каждый мегабайт дискового пространства, но также с использованием сжатия скорость передачи данных также заметно возрастает. Данная функция позволяет хранить данные на жестком диске в сжатом виде. На этом список функций, которые влияют на производительность в PostgreSQL, не ограничивается. Полный список таких функций можно найти в руководстве администратора PostgreSQL.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">PostgreSQL поддерживает только один единственный СХД. Он входит в стандартную поставку PostgreSQL.</span></p><br /><b>MySQL:ядро</b><br /><br />MySQL 5.1 поддерживает 9 различных СХД:<br /><ol><li>MyISAM</li><li>InnoDB</li><li>NDB Cluster</li><li>MERGE</li><li>MEMORY (HEAP)</li><li>FEDERATED</li><li>ARCHIVE</li><li>CSV</li><li>BLACKHOLE</li></ol><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Однако, Federated и Blackhole не являются серверами "хранения" данных (например, Blackhole ничего не хранит). InnoDB разработан сторонней компанией InnoBase, которая была основана компанией Oracle. InnoDB поддерживает транзакции и занимает лидирующее место из всех поставляемых с MySQL серверов хранения данных.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MySQL планирует представить новые СХД Maria и Falcon в предстоящей версии 6.x. На них возложена задача заменить существующие движки MyISAM и InnoDB соответственно.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Существуют и другие СХД, разработанные сторонними компаниями и группами разработчиков. Наиболее популярные из них:</span></p><br /><ul><li>SolidDB</li><li>NitroEDB</li><li>BrightHouse</li></ul><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MySQL MyISAM имеет примитивный кэш, который перед выполнением каждого запроса на выборку сверяет простым сравнением строку запроса с предыдущими выполненными запросами и если есть совпадение то выдает ранее выбранный результат. Данный подход годится для систем, где подавляющей операцией является считывание данных, потому как только любая из таблиц изменит свое состояние (INSERT, UPDATE, DELETE) весь кэш очищается и соответственно теряется преимущество в производительности.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Кэшировщик запросов запускается в отдельном потоке и обрабатывает каждый входящий запрос на выборку, так что в конечном итоге данный подход может стать узким местом и довольно сильно сказаться на общей производительности СУБД. Разработчики предусмотрели выключение данной функции, так что волноваться по этому поводу не стоит.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MySQL также поддерживает сетевой протокол сжатия данных, который включается и выключается на стороне клиента (если конечно позволяет сервер). Данная функция сжимает все данные которые идут от сервера к клиенту.</span></p><br /><b>MySQL:MyISAM</b><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MyISAM это традиционный СХД для MySQL и предлагает лучшее соотношение производительности и функциональности для баз данных предназначенных преимущественно для выборки данных (select). MySQL MyISAM обрабатывает запросы на выборку быстрее чем PostgreSQL, если речь идет о простых запросах. MyISAM не поддерживает транзакций и внешних ключей.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MyISAM поддерживает лидирующий префикс сжатия для ключей и сжатых таблиц предназначенных только для чтения.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Системный таблицы MySQL всегда используют СХД MyISAM. Это сделано для того, чтобы исключить даже потенциальную возможность потери данных.</span></p><br /><b>MySQL:InnoDB</b><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">InnoDB это полно функциональная ACID транзакционная система (сервер) хранения данных (СХД), которая использует технологию MVCC. Это хороший выбор для современных приложений MySQL.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">InnoDB хранит данные с первичным ключами, так что поиск по первичным ключам происходит очень быстро. Данный подход очень полезен для физической оптимизации БД. В случае когда он не применим и дает низкую производительность, то явно его можно не использовать и тогда система создаст невидимый внутренний первичный ключ типа Integer(15) и будет проводить индексацию по нему.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">InnoDB автоматически создает хэш индексы когда обрабатывает запросы на выборку (SELECT). Эта функция может быть отключена при необходимости. Некоторые процессы работают быстрее без этой функции.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">InnoDB имеет буфер вставки, который кэширует обновления вторичных индексов и фиксирует их в фоновом режиме. Данная функция фундаментально увеличивает производительность запросов на вставку данных. Чтобы уменьшить количество обращений к жесткому диску для записи новых данных их необходимо комбинировать в большие группы.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Если InnoDB установлен как плагин к MySQL 5.1, он поддерживает сжатие таблиц налету. Вы можете использовать атрибуты ROW_FORMAT=COMPRESSED или KEY_BLOCK_SIZE в запросах CREATE TABLE и ALTER TABLE, чтобы дать команду InnoDB сжать каждую страницу в 1K, 2K, 4K, 8K или 16K байт.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Innobase Oy, это компания, которая занимается разработкой InnoDB. Она была куплена компанией Oracle в октябре 2005 года. С тех пор InnoDB все больше и больше заимствует у СУБД Oracle. А теперь, с покупкой компании MySQL компанией SUN эти и без того тесные взаимоотношения между Oracle и MySQL стали еще крепче. MySQL выходит на качественно новый уровень возможностей.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MySQL:NDB Cluster</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">NDB это высокопроизводительный преимущественно располагающиеся в Оперативной Памяти (RAM) СХД. Не индексируемые атрибуты могут сохраняться на жестком диске. Данные и логи также периодически синхронизируются на жесткий диск, чтобы избежать потери данных в случае внезапного "падения" кластера. NDB преимущественно используется в сфере телекоммуникаций, где аптайм и производительность в реальном масштабе времени критичны. NDB прозрачно собирает данные в фрагменты которые регулярно доставляет во все участки кластера. NDB использует внутреннюю синхронную репликацию чтобы записи были распространенны по меньшей мере на двух участках кластера прежде чем совершать фиксацию на жесткий диск. NDB также поддерживает автоматическое восстановление "упавших" элементов кластера (нодов). Из слабых сторон NDB стоит отметить очень плохую поддержку сложных запросов с использованием операторов JOIN.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">В PostgreSQL похожих решений на данный момент просто нет.</span></p><br /><b>MySQL:Archive</b><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MySQL поддерживает сжатие на лету с версии 5.0, когда в дистрибутив попал СХД ARCHIVE. Archive - это СХД, который позволяет делать одновременно только 1 запись и множество чтений. Разработан специально для архивных баз данных, где запись в БД осуществляется гораздо реже и преимущественно одним источником данных. Сила сжатия достигает 90%. Archive не поддерживает индексы. В версии MySQL 5.1 Archive может работать с несколькими разделами (партициями).</span></p><br /><b>MySQL:Falcon</b><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Falcon это ACID транзакционный СХД, который был разработан самой MySQL. В данный момент он находится в зачаточном состоянии и доступен для тестирования в бета-ветке MySQL 6.0. Falcon поддерживает сжатие данных налету. Данные, сохраненные в таблицах Falcon, сжимаются на жестком диске, но в оперативной памяти хранятся не в сжатом ввиде. Сжатие происходит автоматически, когда данные синхронизируются на жесткий диск.</span></p><br /><b>MySQL:Maria</b><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Maria это ACID СХД, который был разработан Монти Вайденисом (Monty Widenius) и командой разработчиков MySQL.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Мультпроцессность</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Исторически сложилось, что MySQL разрабатывалась и оптимизировалась под однопроцессорные системы. PostgreSQL в этом смысле смотрится гораздо симпатичнее. Чем больше ядер в системе, тем PostgreSQL работает быстрее, чего о MySQL сказать трудно.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">С распространением на рынке мультипроцессорных систем, MySQL кинул свои силы на доработку СУБД. С каждой новой версией MySQL работает все быстрее и быстрее при использовании многопроцессорных систем. Наиболее удачными версиями, которые координально увеличивают производительность СУБД по сравнению с предыдущими версиями стоит отметить 5.0.30, 5.0.54 и 5.0.58. Данный факт подтверждается многими проведенными тестами.</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><br /></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><a href="http://madjack.ru/developer/2010/03/17/mysql_vs_postgresql.jpg"><img alt="PostgreSQL побеждает MySQL" src="http://madjack.ru/developer/assets_c/2010/03/mysql_vs_postgresql-thumb-520x403-31.jpg" width="520" height="403" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></p><font style="font-size: 1.25em;"><b>Ассинхронный Ввод/Вывод</b></font><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">PostgreSQL полностью поддерживает асинхронный API для использования в клиентских приложениях. Данная возможность позволяет увеличить производительность в некоторых случаях до 40%. В MySQL отсутствует поддержка асинхронного режима. Но существует несколько драйверов, которые предоставляют эту возможность. Например MySQL драйверы для perl и ruby.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">COUNT(*)</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Транзакционные версионные СУБД, которые построены на модели MVCC, например такие как PostgreSQL и InnoDB, выполняют COUNT(*) очень медленно в сравнении с не транзакционными СХД или транзакционными не версионными СХД, например такими как MyISAM. MyISAM в MySQL использует сканирование индексов для обработки COUNT(*) и также кэширует полученный результат, данный подход гораздо эффективнее. PostgreSQL и InnoDB требуют полного сканирования таблицы на предмет учета всех видимых полей. MVCC-совместимые СХД выполняют операцию COUNT(*) данным способом потому, что MVCC сохраняет информацию о видимости или не видимости транзакции в данных самой записи (ROW). Во всех MVCC-совместимых СХД кэширование результатов операции COUNT(*) приведет к возврату некорректных данных. PostgreSQL Count() работает медленнее чем COUNT(*) в InnoDB.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><br /></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px"><b><font class="Apple-style-span" style="font-size: 1.25em; "><font class="Apple-style-span" style="font-size: 1.25em; ">Тесты производительности</font></font></b></span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Все тесты производительности СУБД напрямую зависят от среды и целей использования. Каждая СУБД может быть настроена на оптимальную производительность для каждого отдельного случая. По этому будет не корректно проводить сравнения простых или сложных выборок из БД. Или же вставки. Чтобы определить наиболее быструю СУБД, нужно проводить сравнения в требуемых условиях на требуемом оборудовании и с требуемыми данными.</span></p><br /><font style="font-size: 1.25em;"><b>Модель ACID</b></font><br /><br />ACID следует понимать как Atomicity, Consistency, Isolation и Durability (Валентность, Последовательность, Изоляция и Длительность). Данная модель используется для обеспечения целостности данных средствами СУБД. Многие СУБД достигают соглашений ACID путем использования транзакций.<br /><br />PostgreSQL и MySQL использующий InnoDB, Cluster и Falcon СХД полностью соответствуют всем принципам и канонам модели ACID.<br />Возможности<br /><br />PostgreSQL и MySQL оба обладают внушительным набором возможностей и функций которые обеспечивают целостность данных, функциональность и производительность. Возможности, которые входят в состав PostgreSQL и MySQL позволяют улучшить производительность, легкость использования, функциональность или стабильность.<br /><br /><font style="font-size: 1.25em;"><b>Простота использования</b></font><br /><br />Готча (Gotcha) - это функция или функции которые работают так как описаны но не так как ожидалось (http://sql-info.de/mysql/gotchas.html). Поклонники PostgreSQL настаивают на том, что MySQL имеет больше готчей чем PostgreSQL.<br /><br />В последних версиях MySQL представила пользователям различные режими работы SQL, которые совместимы с различными стандартами SQL и позволяют легко разобраться в MySQL тем, кто с MySQL никогда не работал.<br /><br /><font style="font-size: 1.25em;"><b>Insert Ignore / Replace</b></font><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">MySQL поддерживает операторы 'INSERT IGNORE' и 'REPLACE' которые вставляют запись если ее не существует и ничего не делают в другом случае или заменяют текущую запись соответственно.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">PostgreSQL не поддерживает ничего из выше перечисленного и советует использовать сохраненные процедуры для достижения такого эффекта. Однако существует одно "НО". В одно и тоже время может быть вставлено только одно значение. Данное условие накладывает серьезные ограничения на производительность и вызывает определенные сложности. INSERT IGNORE и REPLACE обрабатывают вставку нескольких значений и их запись симпатичнее чем процедура.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Еше одна полезная запись в MySQL: INSERT ... ON DUPLICATE UPDATE также напрочь отсутствует в PostgreSQL и для реализации своими руками требует написания сохраненных процедур, которые могут обрабатывать только 1 запись в один момент времени.</span></p><br /><font style="font-size: 1.25em;"><b>Ограничители</b></font><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Обе СУБД PostgreSQL и MySQL поддерживают ограничители Not-Null, Unique, Primary Key и Foreign Key. Однако MySQL не поддерживает ограничение Check когда PostgreSQL поддерживает его уже довольно продолжительное время.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Таблицы InnoDB поддерживают проверки внешних ключей. Для остальных СХД MySQL разбирает и игнорирует FOREIGN KEY и REFERENCES в директиве CREATE TABLE.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Для движков MySQL не поддерживающих внешние ключи могут быть применены тригеры.</span></p><br /><font style="font-size: 1.25em;"><b>Значения по умолчанию</b></font><br /><br />PostgreSQL позволяет для колонок использовать в качестве значения по умолчанию любую функцию помеченную как IMMUTABLE или STABLE. В MySQL, на данный момент, лишь функция Now() может быть использована как значение по умолчанию для колонки.<br /><br /><font style="font-size: 1.25em;"><b>Сохраненные процедуры</b></font><br /><br />И PostgreSQL и MySQL поддерживают сохраненные процедуры.<br /><br />Главный язык запросов в PostgreSQL - PL/pgSQL, он похож на PL/SQL в Oracle. PostgreSQL также поддерживает SQL:2003 PSM сохраненные процедуры также как и другие популярные языки программирования Perl (PL/Perl), Python (PL/Python), TCL (PL/Tcl), Java (PL/Java) и даже C (PL/C).<br /><br />MySQL следует синтаксису SQL:2003 для сохраненных процедур, который также используется в IBM DB2.<br /><br />MySQL поддерживает другие языки программирования сохраненный процедур с помощью плагинов. Из самых популярных стоит отметить Java, Perl, XML-RPC.<br /><br /><font style="font-size: 1.25em;"><b>Триггеры</b></font><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">И PostgreSQL и MySQL поддерживают триггеры. Триггеры в PostgreSQL могут выполнять любые пользовательские функции из любого процедурного языка за исключением PL/pgsql.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Триггеры в MySQL активируют только SQL запросами. Они не активируются изменениями в таблицах, которые делаются при помощи MySQL API и не выполняют никаких SQL запросов.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">PostgreSQL также поддерживает правила (RULES), которые позволяют оперировать над синтаксисом запросов и могут делать некоторые операции проще, чем традиционный механизм триггеров.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333; min-height: 15.0px"><span style="letter-spacing: 0.0px"></span><br /></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Синтаксис для определения триггеров в PostgreSQL не так силен как в MySQL. PostgreSQL требует раздельного определения функции с специальным типом возвращаемого значения.</span></p><br /><br /><font style="font-size: 1.25em;"><b>Репликация и Высокая Доступность</b></font><br /><br /><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #333333"><span style="letter-spacing: 0.0px">Репликация - это механизм СУБД дублировать свои данные для резервных копий а также для зеркалирования на другие сервера для обеспечения высокой стабильности. PostgreSQL и MySQL оба поддерживают репликации:</span></p><br /><font style="font-size: 1.25em;"><b>PostgreSQL</b></font><br /><br />PostgreSQL поддерживает репликацию на уровне подключаемых модулей. Существует несколько модулей, которые позволяют осуществлять репликацию данных СУБД PostgreSQL:<br />- PGCluster<br />- Slony-I<br />- DBBalancer<br />- pgpool<br />- PostgreSQL table comparator<br />- SkyTools<br />- Sequoia<br />- Bucardo<br />- Mammoth Replicator<br />- Cubercluster<br />- GridSQL (shared-nothing)<br /><br />Существует заблуждение о том, что эти модули третих производителей как-то плохо интегрируются и выполняют свою работу не надлежащим образом. Например Slony, был спроектирован и разработан Жаном Вейком (Jan Weick), членом команды разработчиков PostgreSQL при участии множества людей из сообщества PostgreSQL. Однако, Slony, гараздо медленнее и использует больше ресурсов чем встроенный репликатор в MySQL. Но в версии PostgreSQL 8.4 вышел встроенный репликатор.<br /><br />Слабые места репликации в PostgreSQL<br /><br />Slony-I наиболее широко используемый инструмент для репликации данных в PostgreSQL и является прямой противоположностью встроенному механизму репликации данных в MySQL. Во первых он использует SQL и триггера для сбора данных для репликации по всему серверу. Этот подход координально медленнее чем родной способ репликации данных в MySQL, который использует бинарный режим обработки БД. Во вторых Slony-I не придатен для использования в огромных кластерах, так как потребление ресурсов равно квадрату используемых серверов для репликации данных.<br /><br />2 сервера: MySQL: 2 = 2 PostgreSQL: 2*2^2 = 8<br />4 сервера: MySQL: 4 = 4 PostgreSQL: 2*4^2 = 32<br />12 серверов: MySQL: 12 = 12 PostgreSQL: 2*12^2 = 288.<br /><br />Пока Slony-I адекватен для высокой доступности с использованием двух серверов. Slony-I очень тяжело администрировать.<br /><br />Bucardo написан на языке Perl и интенсивно использует триггеры PL/PGSQL и PL/PERLU.<br /><br />PGCluster не полезен там, где ожидается высокая производительность и большое количество источников данных потому, что в PGCluster реализована синхронная репликация которая ожидает пока проихойдет запись на всех машинах, участвующих в кластере. Однако в ситуациях, где количество источников данных минимально и требуется чтобы на всех машинах в кластере данные были всегда идентичны - PGCluster станет хорошим инструментом.<br /><br /><font style="font-size: 1.25em;"><b>MySQL</b></font><br /><br />MySQL поставляется с поддержкой асинхронной репликации данных. Начиная с версии 5.1, MySQL поддерживает два формата репликации. SBR отслеживает SQL запросы, которые вносят изменения в БД, в специальный бинарный логфайл, на который подписаны все дочерние сервера. Соответственно при изменениях в главной БД, все остальные БД получают копии данных. RBR отслеживает инкрементальные изменения записей и записывает их в бинарный лог-файл, из которого получают данные все дочерние БД. RBR используется автоматически, когда выполняется определенный запрос в главной БД. Некоторые СХД как NDB, Falcon и в некоторых случаях InnoDB для репликации используют только RBR.<br /><br />Начиная с версии 6.0 MySQL поддерживает полу-синхронную репликацию в которой мастер подтверждает получение хотя бы одной дочерней БД до возврата из процедуры комита данных. Этот метод позволяет уменьшить до минимума потери данных, особенно в больших кластерах.<br /><br /><font style="font-size: 1.25em;"><b>Типы данных</b></font><br /><br />PostgreSQL не поддерживает unsigned integer, но имеет более широкую поддержку типов данных в аспектах соответствия стандартам, базовый логический тип Boolean, определение пользовательских типов данных, встроенные типы данных.<br /><br />PostgreSQL позволяет колонкам таблиц быть определенными как мультиразмерный массив с изменяемой длинной. Массивы могут быть любого встроенного или пользовательского типа, enum или композитного типа. Но вот массивы доменов пока не поддерживаются.<br /><br />MySQL не имеет типа данных IP Адрес, который присутствует в PostgreSQL но для преобразований из и в IPV4 используются функции INET_ATON() и INET_NTOA(). В БД хранится как Integer.<br /><br /><font style="font-size: 1.25em;"><b>Подзапросы</b></font><br /><br />MySQL и PostgreSQL поддерживают подзапросы. В MySQL подзапросы появились недавно и требуют сильной доработки по части производительности. В PostgreSQL подзапросы доведены практически до совершенства.<br /><br /><br /><font style="font-size: 1.25em;"><b>Расширенное индексирование</b></font><br /><br />Расширенное индексирование позволяет СУБД выполнять запросы с гораздо более высокой скоростью. И MySQL и PostgreSQL поддерживают расширенное индексирование.<br /><br /><font style="font-size: 1.25em;"><b>Множественные индексы.</b></font><br /><br />MySQL поддерживает множественные индексы для каждой таблицы в отдельности и может использовать один индекс для одной таблицы. PostgreSQL поддерживает множественные индексы для каждого запроса в отдельности.<br /><br /><font style="font-size: 1.25em;"><b>Полнотекстовые индексы.</b></font><br /><br />MySQL идет с поддержкой полнотекстового поиска, но поиск может быть использован только на СХД MyISAM. Также MySQL поддерживает внешние модули для организации полнотекстового поиска - Sphinx Fulltext Search Engine. Данный плагин добавляет поддержку полнотекстового поиска для СХД InnoDB.<br /><br />PostgreSQL начиная с версии 8.2 имеет в своем распоряжении полнотекстовый поиск в модуле tsearch2. Начиная с версии 8.3 модуль tsearch2 интегрирован в ядро PostgreSQL.<br /><br /><font style="font-size: 1.25em;"><b>Частичное индексирование</b></font><br /><br />MySQL не поддерживает частичного индексирования. PostgreSQL поддерживает частичное индексирование. Частичный индекс - это индекс построенный на срезе таблицы. Срез определяется специальным выражением, которое называется предикатом частичного индекса. Индекс содержит записи, которые удовлетворяют предикату. Частичные индексы - это довольно специфичная штука, но существуют ситуации, в которых частичные индексы могут быть очень полезны.<br /><br />Один из важнейших аспектов использования частичных индексов - это избежание индексирования повторяющихся значений. Когда запрос ищет повторяющиеся значения, которые занимают не более нескольких процентов от всей таблицы, индексы не используются. Так что нет нужды хранить эти данные в индексе. Данный подход уменьшает размер индекса и увеличивает скорость обработки запросов. А также увеличивается скорость выполнения других операций над таблицами, например скорость обновления записей.<br /><br /><font style="font-size: 1.25em;"><b>Порционирование</b></font><br /><br />MySQL поддерживает несколько форм горизонтального порционирования:<br />- RANGE<br />- LIST<br />- HASH<br />- KEY<br />- Композитное порционирование используя RANGE или LIST с HASH или KEY<br /><br />PostgreSQL поддерживает только RANGE и LIST. HASH порционирование поддерживается с помощью внешних функций. Также PostgreSQL поддерживает композитные решения.<br /><br /><font style="font-size: 1.25em;"><b>Лицензирование</b></font><br /><br />PostgreSQL распространяется по лицензии BSD, в которой отмечены пункты Free Software Definition и Open Source Definition и стандарт Copyfree.<br /><br />MySQL доступен по лицензии GNU General Public License, в которой также отмечены пункты Free Software Definition и Open Source Definition но не по стандарту Copyfree. А это значит что если будет издан продукт, в котором используются исходники MySQL вам придется либо заплатить за коммерческую копию MySQL AB либо открыть исходные коды для общего пользования.<br /><br /><font style="font-size: 1.25em;"><b>Разработка</b></font><br /><br />MySQL владеет и спонсирует одна профилирующая компания MySQL AB. Правда теперь она является частью Sun Microsystems, которая в свою очередь была приобретена компанией Oracle. MySQL AB держит копирайты и исходники MySQL.<br /><br />PostgreSQL не принадлежит никакой компании и поддерживается глобальным сообществом разработчиков а также компаниями, которые участвуют в разработке. PostgreSQL имеет корпоративных спонсоров, которые дают деньги на разработку.<br /><br />MySQL - это ПРОДУКТ с открытым исходным кодом.<br />PostgreSQL - это ПРОЕКТ с открытым исходным кодом.<br /><br /><font style="font-size: 1.25em;"><b>Происхождение названия</b></font><br /><br />Когда был создан стандарт ANSI SQL, его автор сказал, что официально SQL произносится как "ess queue ell". Имена и MySQL и PostgreSQL отражают в своих именах этот стандарт. MySQL официально произносится как "my ess queue ell". Однако многие произносят MySQL как "my sequel".<br /><br />Так как MySQL является собственностью компании MySQL AB, то компания была вынуждена сохранить копирайты на имя своего детища и по этому название скорее всего останется неизменным.<br /><br />PostgreSQL произносится как "пост гресс ку элл". Название сформировано из старого названия Postgres (так называлась СУБД на базе которой был создан PostgreSQL) и SQL. Некоторые люди называют Постгрескуэл как пиджискуэл (pgsql). Ходят слухи, что PostgreSQL будет переименован назад в Postgres. На данный момент идут активные дебаты по этому поводу.<br /><br /><font style="font-size: 1.25em;"><b>Популярность</b></font><br /><br />MySQL широко известен и применяется в большинстве открытых (open-source) разработок по всему миру. Наиболее часто используется СХД MyISAM. И с уверенностью можно сказать, что MySQL самая популярная СУБД для вебразработок по всему миру.<br /><br />Основаниями для такой популярности служит то, что MySQL легче использовать, чем другие СУБД, в частности PostgreSQL. Это утверждение бытует уже много лет. Но фактически несколько лет назад PostgreSQL произвел серьезные изменения в своей структуре и может по праву считаться более легким в использовании нежели MySQL. Но вопрос по прежнему открыт. Что же выбрать? MySQL или PostgreSQL?<br /><br /><font style="font-size: 1.25em;"><b>Версия статьи</b></font><br /><br /><div>0.4</div><div><ul><li>Подсвечено жирным шрифтом название раздела. Спасибо Никите Бабакину (skew).</li></ul><div>0.3<div><ul><li>Исправлено множество грамматических ошибок. Спасибо Алексею (oktogen).</li></ul><div>0.2<br /><ul><li>Исправлены недочеты в разделе "Производительность". Спасибо Илье Звягину.<br /></li></ul>0.1<br /><ul><li>Первый релиз.<br /></li></ul><br /><font style="font-size: 1.25em;"><b>Послесловие</b></font><br /><br />Если Вы обнаружили ошибку или недочеты или неточности, сообщите мне об этом - me (dot) <a href="http://madjack.ru/">madjack.ru</a>.<br /><br /></div></div></div></div>]]>
    </content>
</entry>

<entry>
    <title>MovableType: Отличия Widgets и Template Module</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2009/07/movabletype-otlichija-widgets-i-template-module.html" />
    <id>tag:omega.jyaa82,2009:/dyakoff/madjack.ru/developer//4.9</id>

    <published>2009-07-14T06:24:51Z</published>
    <updated>2010-03-24T18:29:16Z</updated>

    <summary>Чем же отличаются эти столь похожие элементы дизайна? Постараюсь ответить на этот вопрос внятно и коротко. В общей своей сути эти объекты являются элементами интерфейса MovableType. Но есть некоторые отличия в предназначении и возможными операциями над этими объектами....</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Заметки" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="modules" label="Modules" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="templates" label="Templates" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="widgets" label="Widgets" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[Чем же отличаются эти столь похожие элементы дизайна? Постараюсь ответить на этот вопрос внятно и коротко. В общей своей сути эти объекты являются элементами интерфейса MovableType. Но есть некоторые отличия в предназначении и возможными операциями над этими объектами.<br />]]>
        <![CDATA[<font style="font-size: 1.25em;"><b>Widgets (Виджеты)</b></font><br /><ul><li>Можно объединять в группы Виджетов;</li><li>Снабжет интерфейсом перетаскивания Drag &amp; Drop;</li><li>Подключение группы виджетов в шаблон. После смены содержания группы, во всех шаблонах, где используется текущая группа будут внесены изменения автоматически;<br /></li><li>Виджеты это модули, но модули это не виджеты;</li><li>Поддержка кэширования;</li></ul><font style="font-size: 1.25em;"><b>Модули (Template Modules)</b></font><br /><ul><li>Нельзя объединять в группы Модулей;</li><li>Нет интерфейса Drag &amp; Drop;</li><li>Есть возможность включения в шаблоны;</li><li>Модули это не виджеты, но виджеты это модули;</li><li>Нет поддержки кэширования;</li></ul><font style="font-size: 1.25em;"><b>Заключение</b></font><br />Вот собственно и вся разница. Я вижу только одно выгодное применение виджетам - это создание сайдбара (Sidebar), на который можно выносить календари, последние комментарии, счетчики, рекламу. Такой блок виджетов очень удобно вставлять на различные страницы. И еще удобнее вносить изменения.<br />]]>
    </content>
</entry>

<entry>
    <title>ImageInfo 2 / MovableType</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2009/07/imageinfo-2.html" />
    <id>tag:omega.jyaa82,2009:/dyakoff/madjack.ru/developer//4.6</id>

    <published>2009-07-11T18:31:54Z</published>
    <updated>2010-03-24T18:28:27Z</updated>

    <summary>Русский:Исправленная версия одноименного плагина для отображения EXIF информации от Дэвида Филипса. Теперь плагин использует Image::ExifTool.English:Fixed version of ImageInfo plugin by David Philips. It supports Image::ExifTool. But syntax still old....</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Плагины" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="imageinfo" label="ImageInfo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="MovableType" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        <![CDATA[<b><font class="Apple-style-span" style="font-size: 1.25em; ">Русский:</font></b><div>Исправленная версия одноименного плагина для отображения EXIF информации от Дэвида Филипса. Теперь плагин использует Image::ExifTool.</div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.25em; ">English:</font></b></div><div>Fixed version of ImageInfo plugin by David Philips. It supports Image::ExifTool. But syntax still old.</div>]]>
        <![CDATA[<div><b><font class="Apple-style-span" style="font-size: 1.25em; "><font class="Apple-style-span" style="font-size: 1.25em; ">Руководство к использованию / User Manual</font></font></b></div><div><br /></div><div><div><b>Русский</b>:</div><div><br /></div><div>Отображает информацию EXIF из данных изображения на одной странице с самим изображением. Данный плагин будет особенно полезен для владельцев цифровых камер, которые обычно хранят множество EXIF данных в своих изображениях (дату создания, фокусное расстояние, выдержку, чувствительность ISO, баланс белого, и др.).</div><div><br /></div><div>Как пользоваться?</div><div>&lt;ul&gt;</div><div>&lt;MTImageInfo img="[MTBlogSitePath]/images/BrokenWindow.jpg"</div><div>leading_text="[li]" trailing_text="[/li]"&gt;</div><div>&lt;$MTImageInfoField name="width" label="[strong]Width:[/strong] "$&gt;</div><div>&lt;$MTImageInfoField name="height" label="[strong]Height:[/strong] "$&gt;</div><div>&lt;$MTImageInfoField name="CoolBits" label="[strong]Cool Bits:[/strong] "$&gt;</div><div>&lt;$MTImageInfoField name="DateTime" label="[strong]Date:[/strong] "&nbsp;</div><div>format="%a %d %b %Y"$&gt;&lt;br /&gt;</div><div>&lt;/MTImageInfo&gt;</div><div>&lt;/ul&gt;</div><div><br /></div><div><b>Требования к системе (хостингу)</b></div><div><br /></div><div>1. Image::ExifTool (версии 7.67 или выше)</div><div>2. File::Basename</div><div><br /></div><div><b>Пример</b></div><div>Пример использования плагина можно увидеть <a href="http://madjack.ru/foto">тут</a>. Просто выберите понравившееся изображение и посмотрите какие данные его сопровождают.</div><div><br /></div><div><b>Скачать</b></div><div>Щелкните по <a href="http://madjack.ru/developer/download/ImageInfo2.tar.gz">ссылке</a>, чтобы скачать плагин.</div><div><br /></div></div><div><b>English</b>:</div><div><br /></div><div>Display image EXIF data along with image on weblog page. Especially useful with digital camera pictures, which often store a lot of EXIF data (time stamp, f/stop, shutter speed, ISO setting, white balance, etc.) inside each picture.</div><div><br /></div><div>&lt;ul&gt;</div><div>&lt;MTImageInfo img="[MTBlogSitePath]/images/BrokenWindow.jpg"</div><div>leading_text="[li]" trailing_text="[/li]"&gt;</div><div>&lt;$MTImageInfoField name="width" label="[strong]Width:[/strong] "$&gt;</div><div>&lt;$MTImageInfoField name="height" label="[strong]Height:[/strong] "$&gt;</div><div>&lt;$MTImageInfoField name="CoolBits" label="[strong]Cool Bits:[/strong] "$&gt;</div><div>&lt;$MTImageInfoField name="DateTime" label="[strong]Date:[/strong] "&nbsp;</div><div>format="%a %d %b %Y"$&gt;&lt;br /&gt;</div><div>&lt;/MTImageInfo&gt;</div><div>&lt;/ul&gt;</div><div><br /></div><div><b>Requirements</b></div><div><br /></div><div>1. Image::ExifTool (version 7.67 or greater)</div><div>2. File::Basename</div><div><br /></div><div><b>Example</b></div><div>Example of plugin usage is <a href="http://madjack.ru/foto">here</a>. Just select any picture and look at the bottom.</div><div><br /></div><div><b>Download</b></div><div>Click <a href="http://madjack.ru/developer/download/ImageInfo2.tar.gz">here</a> to download plugin.</div>]]>
    </content>
</entry>

<entry>
    <title>Проект Apple Украина</title>
    <link rel="alternate" type="text/html" href="http://madjack.ru/developer/2009/07/apple-ukraine.html" />
    <id>tag:omega.jyaa82,2009:/dyakoff/madjack.ru/developer//4.5</id>

    <published>2009-07-10T16:49:44Z</published>
    <updated>2010-07-10T08:23:14Z</updated>

    <summary>Проект Apple Украина расположен по адресу mac.net.ua. Проект задумывался и создавался как информационный ресурс по технологиям Apple, ее продукции, программному обеспечению, слухам вокруг компании, творчеству, советам по использованию и околояблочным темам. Собственно от идеи до реализации прошло не так уж...</summary>
    <author>
        <name>Безумный Джек</name>
        
    </author>
    
        <category term="Мои Проекты" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apple" label="Apple" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gallery2" label="Gallery2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wordpress" label="Wordpress" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="macnetua" label="mac.net.ua" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://madjack.ru/developer/">
        Проект Apple Украина расположен по адресу mac.net.ua. Проект задумывался и создавался как информационный ресурс по технологиям Apple, ее продукции, программному обеспечению, слухам вокруг компании, творчеству, советам по использованию и околояблочным темам. Собственно от идеи до реализации прошло не так уж много времени и основные принципы сдвинуты небыли.
        <![CDATA[А поскольку получилось завладеть вкусным доменом mac.net.ua, то силушек для реализации проекта только прибавилось.<div><br /></div><div><b>Технические подробности</b></div><div>За основу движка решено было взять <a href="http://www.wordpress.com">Wordpress</a>. Тогда это был наиболее приемлемый вариант. Сейчас с уверенностью могу заявить что <a href="http://www.wordpress.org">Wordpress</a> - это довольно неповоротливая муторная штуковина. Ну да ладно. Как и любой другой информационный портал, Apple Украина должен гдето хранить изображения, подогнанные под размер новостной колонки + снабжать их клеймом сайта. Для этих целей в поддомене была установлена Gallery2 от <a href="http://gallery.menalto.com">Menalto</a>. Могу сказать, что со своими обязанностями программулина справляется на все 5+.</div><div><br /></div><div><span class="Apple-style-span" style="font-weight: bold; ">Резюме</span></div><div>Проект завершен на 95%. Работает на отлично. Отзывы в интернет вполне позитивные. Количество посетителей и подписчиков RSS неизменно растет. Пока проект нигде не рекламируется. Основной источник поситителей - Yandex и Google.</div>]]>
    </content>
</entry>

</feed>
