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

<channel>
	<title>В поисках успеха &#187; php</title>
	<atom:link href="http://sheremetov.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Sun, 22 Aug 2010 06:53:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Инструменты анализа кода на предмет &#171;говнокода&#187;, copy/paste, соответствию стандартам</title>
		<link>http://sheremetov.com/php/pm-tools/</link>
		<comments>http://sheremetov.com/php/pm-tools/#comments</comments>
		<pubDate>Wed, 12 May 2010 05:00:43 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=726</guid>
		<description><![CDATA[Если вы&#160;работаете с&#160;командой php-разработчиков, то&#160;вы&#160;знаете как много кода они пишут, особенно если это высокопроизводительная команда разработчиков. программистам свойственно автоматизировать любой рутинный труд, поэтому и&#160;труд по&#160;контролю над кодом тоже понемногу автоматизируется.
Самым полезным, для меня, оказался инструмент Copy/Paste Detector for PHP code. Как ясно из&#160;названия, этот инструмент используется для дублирующегося кода, ярым поборником которого я&#160;являюсь.
Устанавливается он&#160;очень просто, [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы&nbsp;работаете с&nbsp;командой php-разработчиков, то&nbsp;вы&nbsp;знаете как много кода они пишут, особенно если это высокопроизводительная команда разработчиков. программистам свойственно автоматизировать любой рутинный труд, поэтому и&nbsp;труд по&nbsp;контролю над кодом тоже понемногу автоматизируется.</p>
<p>Самым полезным, для меня, оказался инструмент <a href="http://github.com/sebastianbergmann/phpcpd">Copy/Paste Detector for PHP code</a>. Как ясно из&nbsp;названия, этот инструмент используется для дублирующегося кода, ярым поборником которого я&nbsp;являюсь.</p>
<p>Устанавливается он&nbsp;очень просто, как PEAR пакет:</p>
<pre>sb@ubuntu ~ % pear channel-discover pear.phpunit.de
Adding Channel "pear.phpunit.de" succeeded
Discovery of channel "pear.phpunit.de" succeeded

sb@ubuntu ~ % pear channel-discover components.ez.no
Adding Channel "components.ez.no" succeeded
Discovery of channel "components.ez.no" succeeded

sb@ubuntu ~ % pear install phpunit/phpcpd
downloading phpcpd-1.3.0.tgz ...
Starting to download phpcpd-1.3.0.tgz (7,809 bytes)
.....done: 7,809 bytes
downloading File_Iterator-1.1.0.tgz ...
Starting to download File_Iterator-1.1.0.tgz (3,181 bytes)
...done: 3,181 bytes
downloading ConsoleTools-1.6.tgz ...
Starting to download ConsoleTools-1.6.tgz (869,925 bytes)
.........................................................
.........................................................
.........................................................
..done: 869,925 bytes
downloading Base-1.8.tgz ...
Starting to download Base-1.8.tgz (236,357 bytes)
...done: 236,357 bytes
install ok: channel://components.ez.no/Base-1.8
install ok: channel://components.ez.no/ConsoleTools-1.6
install ok: channel://pear.phpunit.de/File_Iterator-1
install ok: channel://pear.phpunit.de/phpcpd-1.3.0</pre>
<p>Пользоваться, тоже,&nbsp;&mdash; очень просто:</p>
<pre>bash-3.2# phpcpd PEAR/tests/
phpcpd 1.3.1 by Sebastian Bergmann.

Found 5 exact clones with 85 duplicated lines in 5 files:

  - MDB2/tests/MDB2_extended_testcase.php:398-404
    MDB2/tests/MDB2_extended_testcase.php:453-459

  - MDB2/tests/MDB2_manager_testcase.php:61-75
    MDB2/tests/MDB2_reverse_testcase.php:86-100

  - MDB2/tests/MDB2_usage_testcase.php:1289-1321
    MDB2/tests/MDB2_usage_testcase.php:1577-1609

  - MDB2/tests/MDB2_usage_testcase.php:1567-1593
    MDB2/tests/MDB2_usage_testcase.php:1739-1765

  - Structures_Graph/tests/testCase/BasicGraph.php:111-118
    Structures_Graph/tests/testCase/BasicGraph.php:142-149</pre>
<p>Еще один полезный инструмент, это <a href="http://pdepend.org/">PHP Depend</a>. Он&nbsp;позволяет взглянуть на&nbsp;ваш проект, как&nbsp;бы, с&nbsp;&laquo;высоты птичьего полета&raquo;, предоставляя такие метрики как: количество строк кода, классов, пакетов, методов, вызовов и&nbsp;даже эмпирическую метрику &laquo;сложность кода&raquo;. <a href="http://manuel-pichler.de/categories/3-php/P4.html">Здесь</a> можно прочитать расшифровку всех показателей.</p>
<p>Я&nbsp;сравнил два довольно больших проекта, которые веду и&nbsp;метрики отразили в&nbsp;цифрах почти то&nbsp;же что и&nbsp;было &laquo;по&nbsp;ощущению&raquo;,&nbsp;&mdash; более новый проект проще и&nbsp;лучше приблизительно в&nbsp;<nobr>2-3 раза,</nobr> при том что имеет более сложную бизнес логику и&nbsp;функционал:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/pyramid.svg_.jpg"><img class="alignleft size-medium wp-image-728" title="pyramid.svg" src="http://sheremetov.com/wp-content/uploads/2010/05/pyramid.svg_-300x61.jpg" alt="" width="300" height="61" /></a></p>
<p>Следующий, хороший инструмент это <a href="http://phpmd.org/">PHP Mess detector</a>. Устанавливается он&nbsp;аналогично, с&nbsp;помощью PEAR installer:</p>
<pre>mapi@arwen ~ $ pear channel-discover pear.phpmd.org
mapi@arwen ~ $ pear channel-discover pear.pdepend.org
mapi@arwen ~ $ pear install --alldeps phpmd/PHP_PMD-alpha</pre>
<p>Эта утилита дает нам массу интересной информации для размышления:</p>
<pre>bash-3.2# phpmd PEAR/Pear.php text codesize

PEAR.php:87	This class has a bunch of public methods and attributes
PEAR.php:87	This class has too many methods, consider refactoring it.
PEAR.php:87	This class PEAR has an overall complexity of 102 which is very high. The configured complexity threshold is 50.
PEAR.php:323	The method setErrorHandling() has a Cyclomatic Complexity of 11.
PEAR.php:511	The method raiseError() has a Cyclomatic Complexity of 20.
PEAR.php:511	The method raiseError() has an NPath complexity of 1600.
PEAR.php:771	The function _PEAR_call_destructors() has a Cyclomatic Complexity of 12.
PEAR.php:831	This class has a bunch of public methods and attributes
PEAR.php:866	The method PEAR_Error() has a Cyclomatic Complexity of 19.
PEAR.php:866	The method PEAR_Error() has an NPath complexity of 11520.

bash-3.2# phpmd PEAR/Pear.php text unusedcode

PEAR.php:450	Avoid unused local variables such as '$key'.
PEAR.php:788	Avoid unused local variables such as '$k'.</pre>
<p>Здесь важно насколько много проблемных мест в&nbsp;вашем коде. Изучая подобные отчеты вы&nbsp;будете всегда видеть какие части приложения должны быть подвергнуты рефакторингу в&nbsp;первую очередь.</p>
<p>Похожий по&nbsp;своему применению инструмент <a href="http://matrix.squiz.net/developer/tools/php_cs">PHP_CodeSniffer</a>, позволяет оценить насколько ваш код соответствует стандартам кодирования.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/pm-tools/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Semantic Web на PHP при помощи библиотеки ARC</title>
		<link>http://sheremetov.com/php/semantic-web-php-arc/</link>
		<comments>http://sheremetov.com/php/semantic-web-php-arc/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 22:16:48 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[semantic web]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=461</guid>
		<description><![CDATA[Прежде чем рассказывать о самой библиотеке, расскажу несколько слов о том что такое Semantic Web (семантическая паутина или web 3.0, как его еще называют), для тех кто не знает.
Итак, всемирная паутина продолжает развиваться. С одной стороны, объёмы существующей информации, огромны и кардинальные изменения происходят медленнее, в силу того, что для изменения нужно затрачивать больше усилия. С другой стороны, именно благодаря масштабу и размаху [...]]]></description>
			<content:encoded><![CDATA[<p>Прежде чем рассказывать о самой библиотеке, расскажу несколько слов о том что такое Semantic Web (семантическая паутина или web 3.0, как его еще называют), для тех кто не знает.</p>
<p>Итак, всемирная паутина продолжает развиваться. С одной стороны, объёмы существующей информации, огромны и кардинальные изменения происходят медленнее, в силу того, что для изменения нужно затрачивать больше усилия. С другой стороны, именно благодаря масштабу и размаху существующие проблемы становятся очивиднее. Информации становится больше, и найти нужную, упорядочить её становится всё сложнее. Тим Бернерс-Ли, изобретатель существующей версии интернета предлагает свою версию обновленного интернета, называя его Семантической Сетью. Идея новой модели немного непривычно ложится на существующие стереотипы понимания сети. Смысл его в том что документы это не голый текст, а какой-то смысл, изложенный текстом на каком-то языке, или еще шире, графика, видео, суть неважно. Научив машины «понимать» этот смысл мы сможем оперировать с информацией на более высоком уровне, — например делать умозаключения, искать неочевидные решения, избегать излишнего дублирования информации и многое другое. Я сейчас не хочу говорить о том насколько реалистичным является построение Семантической Сети в ближайшее время, пусть копья ломают те, у кого есть на это время и силы, но в узких прикладных областях (например в экспертных системах), эти идеи уже нашли свое применение.</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/01/semantic-web.png"><img class="alignnone size-full wp-image-480" title="Классическая иллюстрация, описывающая пирамиду идей на которых строится Семантическая паутина" src="http://sheremetov.com/wp-content/uploads/2010/01/semantic-web.png" alt="semantic-web" width="304" height="258" /></a></p>
<p>Это классическая иллюстрация, описывающая пирамиду идей, на которых строится Семантическая паутина. Видно что в центре идеи находятся онтологии OWL, описывающие взаимосвязи между понятиями (URI). Неймспейсы (namespaces) поволяют одни и те же понятия описывать по разному в рамках разных предметных областей. RDF предлагает простой способ описания взаимосвязей между понятиями в виде троек (триплетов): субъект — предикат — объект. Вот примеры таких троек:</p>
<ul>
<li>крушовице — чешское — пиво</li>
<li>чешское — очень хорошее — пиво</li>
<li>Иннокентий — любит — пиво</li>
</ul>
<p>В этом примере интересно что основываясь на этих данных машина может делать некоторые предположения, — например о том, что Иннокентию, скорее всего, понравится крушовице. То что мы только делаем предположения относительно результата, а не гарантируем его, может смутить, но на самом деле вся информация в сети, это просто предположения а не факты в последней инстанции. OWL расширяет семантику и логику «троек» до классов с описанием взаимодействий внутри этих классов, причем класс может быть определен разными способами:</p>
<ul>
<li>идентификатором класса (URI)</li>
<li>перечислением всех экземпляров класса</li>
<li>ограничением свойства</li>
<li>пересечением 2 и более определений классов</li>
<li>объединением 2 и более определений классов</li>
<li>дополнением определения класса</li>
</ul>
<p>OWL описывает классами предметную область, языком которой можно описать факты, касающиеся предметной области.</p>
<p>Есть два видения развития сети, — первый это постепенное создание онтологий вокруг существующих предметных областей (медицина, право и т.д.), второй — это построение синтаксических анализаторов, способных разбирать обычные тексты и строить онтологии на основании предположений записанных обычным, человеческим языком. При всей футуристичности второго подхода существуют довольно интересные наработки в эту сторону, например <a href="http://wordnet.princeton.edu/">WordNet</a>.</p>
<p>Надо сказать что шум вокруг Semantic Web докатился и до PHP. <a href="http://arc.semsol.org/">ARC</a> развивается с конца 2007 года и, превратился в весьма функциональный инструмент. Вот неполный перечень того что умеет ARC:</p>
<ul>
<li>Web Reader, для построения ботов с поддержкой проки и редиректов</li>
<li>Парсеры: RDF/XML, Turtle, SPARQL + SPOG, Legacy XML, HTML tag soup, RSS 2.0, Google Social Graph API JSON</li>
<li>Сериализаторы: N-Triples, RDF/JSON, RDF/XML, Turtle, SPOG dumps</li>
<li>Сохранение RDF в mysql базу (SPARQL SELECT, ASK, DESCRIBE, CONSTRUCT, + aggregates, LOAD, INSERT, and DELETE)</li>
<li>RDF экстракторы (DC, eRDF, microformats, OpenID, RDFa)</li>
<li>Поддержка SPARQL</li>
</ul>
<p>Код у библиотеки шикарный, и отлаживаться-расширятся она должна очень легко. Но, как говорится, лучше один раз увидеть чем сто раз услышать, — приведу несколько примеров её использования:</p>
<pre class="php"><span style="color: #b1b100;">include_once</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'arc/ARC2.php'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">$parser</span> = ARC2::<span style="color: #006600;">getRDFParser</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$parser</span>-&gt;<span style="color: #006600;">parse</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'http://www.w3.org/TR/owl-guide/wine.rdf'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// загружаем онтологию</span>
<a href="http://www.php.net/var_dump"><span style="color: #000066;">var_dump</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$parser</span>-&gt;<span style="color: #006600;">getTriples</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// получаем массив &quot;троек&quot; онтологий вида:</span></pre>
<pre>array(2012) {
  [0]=&gt;
  array(7) {
    ["s"]=&gt;
    string(52) "http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine"
    ["p"]=&gt;
    string(47) "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
    ["o"]=&gt;
    string(38) "http://www.w3.org/2002/07/owl#Ontology"
    ["s_type"]=&gt;
    string(3) "uri"
    ["o_type"]=&gt;
    string(3) "uri"
    ["o_datatype"]=&gt;
    string(0) ""
    ["o_lang"]=&gt;
    string(0) ""
  }
...</pre>
<p>Загруженную онтологию или RDF можно сохранить в N-Triples, RDF/JSON и даже HTML:</p>
<pre class="php"><span style="color: #0000ff;">$ser</span> = ARC2::<span style="color: #006600;">getSer</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'LegacyHTML'</span><span style="color: #66cc66;">&#41;</span>;
<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #0000ff;">$ser</span>-&gt;<span style="color: #006600;">getSerializedArray</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$triples</span><span style="color: #66cc66;">&#41;</span>;</pre>
<p>Но самое интересное, что позволяет ARC, это безусловно SPARQL:</p>
<pre class="php"><span style="color: #0000ff;">$config</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span>
	<span style="color: #808080; font-style: italic;">/* db */</span>
	<span style="color: #ff0000;">'db_host'</span> =&gt; <span style="color: #ff0000;">'localhost'</span>,
	<span style="color: #ff0000;">'db_name'</span> =&gt; <span style="color: #ff0000;">'db_name'</span>,
	<span style="color: #ff0000;">'db_user'</span> =&gt; <span style="color: #ff0000;">'user'</span>,
	<span style="color: #ff0000;">'db_pwd'</span> =&gt; <span style="color: #ff0000;">'password'</span>,
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">$store</span> = ARC2::<span style="color: #006600;">getStore</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #0000ff;">$store</span>-&gt;<span style="color: #006600;">isSetUp</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">// проверяем инициализацию базы</span>
  <span style="color: #0000ff;">$store</span>-&gt;<span style="color: #006600;">setUp</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//  если таблицы не были созданы, - они создаются</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">$store</span>-&gt;<span style="color: #006600;">query</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;PREFIX base:
INSERT INTO base:Graph {
	base:testEntity1 base:testPredicate1 'test object 1' .
	base:testEntity1 base:testPredicate2 base:testEntity3 .
	base:testEntity2 base:testPredicate1 'test object 2' .
	base:testEntity2 base:testPredicate2 base:testEntity4 .
	base:testEntity3 rdf:type base:Type1 .
	base:testEntity4 rdf:type base:Type2 .
}
&quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// выполняем запрос на добавление &quot;троек&quot;</span>
&nbsp;
<span style="color: #0000ff;">$store</span>-&gt;<span style="color: #006600;">query</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SELECT *
WHERE {
	?obj ?predic &quot;test object 1&quot; .
}'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// выполняем запрос</span></pre>
<p>Для того чтобы попробовать «поиграть» с элементами семантического веба, в ваших приложениях, функционала <a href="http://arc.semsol.org/">ARC</a> вполне достаточно. Ну а если вы всерьез заинтересуетесь этой темой, рекомендую обратить внимание на открытый проект <a href="http://jena.sourceforge.net/">Jena</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/semantic-web-php-arc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Специально для заядлых пхпшников, &#8211; смотрите как php &#171;сливает&#187; питону</title>
		<link>http://sheremetov.com/php/python-threading/</link>
		<comments>http://sheremetov.com/php/python-threading/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 23:30:08 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[threading]]></category>
		<category><![CDATA[потоки]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=410</guid>
		<description><![CDATA[Я как-то рассказывал, что играюсь с вычислением трендов. Так вот, задачка это непростая, — для того чтобы определять устойчивые тренды, нужна обработка большого объема информации, чем больше тем устойчивее тренд виден. Мой бот собирает приблизительно 300-400 тысяч записей за сутки, для того чтобы обрабатывать такой объем, пришлось действительно поломать голову. Для начала, было интересно поиграть с бенчмарками. По итогу бенчмарков, уже [...]]]></description>
			<content:encoded><![CDATA[<p>Я как-то рассказывал, что играюсь с вычислением трендов. Так вот, задачка это непростая, — для того чтобы определять устойчивые тренды, нужна обработка большого объема информации, чем больше тем устойчивее тренд виден. Мой бот собирает приблизительно 300-400 тысяч записей за сутки, для того чтобы обрабатывать такой объем, пришлось действительно поломать голову. Для начала, было интересно поиграть с бенчмарками. По итогу бенчмарков, уже написанный бот остался на php, а вот все эксперименты с алгоритмами проводились на питоне, о чем, кстати, ни разу пока не пожалел. Но об этом я уже пробовал <a href="http://sheremetov.com/php/php-vs-python/">писать ранее</a>. Машинка, на которой запускаются просчеты, — двуядерная, в какой-то момент, захотелось распараллелить вычисления, и я окунулся, немного глубже, в работу с потоками на питоне. Честно говоря, это даже проще чем в Delphi, C#, Java. Приведу пример, в котором мы организуем пул задач (грубо говоря ограничиваем кол-во одновременно выполняемых потоков), и пользуемся блокировками для доступа к совместному ресурсу (self.data):</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Test:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">data</span> = <span style="color: #ff4500;">0</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">lock</span> = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Lock</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> process<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">data</span> += <span style="color: #ff4500;">1</span>
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>,
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>,
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">data</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        pool = <span style="color: #dc143c;">threading</span>.<span style="color: black;">BoundedSemaphore</span><span style="color: black;">&#40;</span>value=<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
            pool.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            proc = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=<span style="color: #008000;">self</span>.<span style="color: black;">process</span>, name=<span style="color: #483d8b;">&quot;p&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>, args=<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            proc.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            pool.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">test</span> = Test<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">test</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">1</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">2</span>
<span style="color: #ff4500;">2</span> <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">3</span>
<span style="color: #ff4500;">0</span> <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">4</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">5</span>
<span style="color: #ff4500;">2</span> <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">6</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">7</span>
<span style="color: #ff4500;">0</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">8</span>
<span style="color: #ff4500;">2</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">9</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">3</span> <span style="color: #ff4500;">10</span></pre>
<p>Правда, изящно?</p>
<p>UPDATE:<br />
К сожалению, запросто переписав мою систему на запуск в несколько потоков никакого прироста производительности не обнаружилось, скорее наоборот, а питон как работал на одном CPU так и работает. Первая же ссылка подтвердила догадку:</p>
<blockquote><p>The C implementation of Python uses a global interpreter lock that only<br />
allows one thread to interpret bytecode at a time, so while the threads may<br />
be distributed across multiple processors you will get little or no speedup<br />
over a single processor. (If your threads spend most of their time in a<br />
non-Python extension, they may be able to get some benefit from multiple<br />
processors).</p>
<p>The only way to take advantage of multiple processors with Python is to run<br />
at least one separate process for each processor.</p></blockquote>
<p>Что в переводе означает: "волшебства не бывает, брат"</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/python-threading/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SCRUM board для mantis</title>
		<link>http://sheremetov.com/php/scrum-board-%d0%b4%d0%bb%d1%8f-mantis/</link>
		<comments>http://sheremetov.com/php/scrum-board-%d0%b4%d0%bb%d1%8f-mantis/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 10:52:02 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[mantis]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=380</guid>
		<description><![CDATA[Как  я уже говорил ранее, в качестве багтрекера мы используем mantis. Начав внедрять SCRUM захотелось использовать что-то типа SCRUM board. Что из этого вышло, - читайте под катом.]]></description>
			<content:encoded><![CDATA[<p>Как я&nbsp;уже говорил <a href="/php/cvs-and-mantis-integration/">ранее,</a> в&nbsp;качестве багтрекера мы&nbsp;используем <a href="http://www.mantisbt.org/">mantis</a>. Начав внедрять SCRUM захотелось использовать что-то типа SCRUM board, в&nbsp;классическом представлении это выглядит как-то так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2009/12/scrum_board.jpg"><img class="alignnone size-full wp-image-382" title="scrum_board" src="http://sheremetov.com/wp-content/uploads/2009/12/scrum_board.jpg" alt="scrum_board" width="500" height="323" /></a></p>
<p>Поскольку доски у&nbsp;нас нет, ну&nbsp;как-то не&nbsp;сложилось, да&nbsp;мы&nbsp;больше тяготеем к&nbsp;онлайновым инструментам для совместной работы было решено допилить к&nbsp;мантису желаемый функционал. Заняло это, от&nbsp;силы, часа полтора времени, львиную долю которого было потрачено на&nbsp;выбор приятных глазу стилей. Получилось, вот так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2009/12/mantis-board-750.gif"><img class="alignnone size-full wp-image-383" title="mantis-board-750" src="http://sheremetov.com/wp-content/uploads/2009/12/mantis-board-750.gif" alt="mantis-board-750" width="750" height="513" /></a></p>
<p>Для тех кто не&nbsp;знает что это такое: жизнь любой задачи (желтого стикера), в&nbsp;проекте (на&nbsp;доске), это движение слева направо через такие пункты как &laquo;назначено&raquo;, &laquo;выполняется&raquo;, &laquo;завершено&raquo;, &laquo;протестировано&raquo;, &laquo;закрыто&raquo;. Таким образом можно легко ориентироваться в&nbsp;потоке небольших задач, свойственных веб разработке.</p>
<p>Исходный код скрипта, <a href="http://sheremetov.com/wp-content/uploads/2009/12/board.zip">прилагается</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/scrum-board-%d0%b4%d0%bb%d1%8f-mantis/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Взгляд на HAXE, как на платформу для разработки веб приложений</title>
		<link>http://sheremetov.com/php/have-nekovm-php-comparison/</link>
		<comments>http://sheremetov.com/php/have-nekovm-php-comparison/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 10:48:06 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=340</guid>
		<description><![CDATA[В процессе работы над нашим приложением, некоторые, ненужные сложности в разработке большого приложения заставили задуматься в целесообразности использования php. Собственно поэтому я посматриваю на языки-фреймворки, на которые максимально безболезненно сможет перейти команда php программистов.  
Сразу скажу что php язык хороший, и написать на нем можно всё, но не всё можно написать одинаково хорошо, быстро, [...]]]></description>
			<content:encoded><![CDATA[<p>В процессе работы над нашим приложением, некоторые, ненужные сложности в разработке большого приложения заставили задуматься в целесообразности использования php. Собственно поэтому я посматриваю на языки-фреймворки, на которые максимально безболезненно сможет перейти команда php программистов.  </p>
<p>Сразу скажу что php язык хороший, и написать на нем можно всё, но не всё можно написать одинаково хорошо, быстро, и без лишних проблем в перспективе развития проекта. Т.е. для домашней странички-форума-блога, — да, шикарное решение, а для разработки сложного корпоративного софта, с большим количеством частоизменяющихся бизнес требований, веб приложений под нагрузками, как мне кажется, можно найти более подходящий инструмент. Конечно, идеально использование java/.net, но поскольку не все проекты у нас большие, а технологии эти довольно тяжелы для «подъёма» в эту сторону пока смотреть не хочется. В этом цвете мне и приглянулся <a href="http://haxe.org/">haxe</a>. С одной стороны — шикарный язык, в лучших традициях java/c#, с другой, — не перегруженный, простой для понимания и освоения php программистами. Главная идея haxe, — это различные платформы на выходе: c++, neko, javascript, php, flash, что дает массу гибкости и при хорошо организованной архитектуре позволит безболезненно переводить уже написанное приложение с платформы на платформу, в зависимости от нужд. Со списком преимуществ haxe можно познакомится <a href="http://haxe.org/doc/features">здесь</a>. Это в теории, на практике, конечно же нужно что-то делать с платформозависимыми библиотеками, либо писать заведомо ограниченные приложения.  </p>
<p>Ну чтож, перейдем к самому интересному, — бенчмаркам. Ничего особо сложного тестировать я не хотел, написал простой тест, который включает в себя создание локальных переменных, простейшие операции, циклы, сравнения. Это то что мы чаще всего пишем в коде. Мне было интересно сравинить скорость выполнения чистого php, разницы в скорости вызовов функций перед статическими методами класса, разницы выполнения в консоли и через модуль apache, haxe кода скомпилированного в php и производительности <a>nekovm</a>.</p>
<p>Вот что получилось:</p>
<table border="0">
<tbody>
<tr>
<td></td>
<td>10000 циклов</td>
<td>20000 циклов</td>
</tr>
<tr>
<td>pure php console</td>
<td>0.724</td>
<td>1.433</td>
</tr>
<tr>
<td>pure php apache</td>
<td>0.747</td>
<td>1.708</td>
</tr>
<tr>
<td>php with class console</td>
<td>0.867</td>
<td>1.733</td>
</tr>
<tr>
<td>php with class apache</td>
<td>0.862</td>
<td>1.731</td>
</tr>
<tr>
<td>hexephp (-debug)</td>
<td>4.91</td>
<td>9.816</td>
</tr>
<tr>
<td>haxephp</td>
<td>0.887</td>
<td>1.73</td>
</tr>
<tr>
<td>nekovm (mod_neko2)</td>
<td>0.013</td>
<td>0.097</td>
</tr>
<tr>
<td>pure neko</td>
<td>0.011</td>
<td>0.027</td>
</tr>
</tbody>
</table>
<p>Выводы: скомпилированный php код не намного уступает обычному php коду. Вполне очевидно что код nekovm выполняется быстрее чем php, благодаря строгой типизации и прочим фичам. Разница в выполнении из консоли или через апач видна только в nekovm, из-за того что скорость выполнения значительно выше чем php.  Несмотря на то что <a href="http://haxe.org">haxe</a> платформа довольно молодая, перспективы у неё огромные. Возможность относительно легко мигрировать приложеня с php в nekovm мне кажется пока усложнена отсутствием высокопроизводительного движка шаблонов (в php с этим отлично справляется pure php), но уже сейчас стоит обратить внимание на такие возможности как <a href="http://haxe.org/doc/neko/spod">SPOD (объектная работа с базой данных)</a>, <a href="http://haxe.org/doc/neko/threads">многопоточное программирование</a>, <a href="http://haxe.org/doc/neko/ffi">интеграция с кодом на C</a></p>
<p><a href='http://sheremetov.com/wp-content/uploads/2009/10/php-haxe-neko.zip'>Исходный код тестов</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/have-nekovm-php-comparison/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Интеграция cvs и mantis</title>
		<link>http://sheremetov.com/php/cvs-and-mantis-integration/</link>
		<comments>http://sheremetov.com/php/cvs-and-mantis-integration/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 14:29:36 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[mantis]]></category>
		<category><![CDATA[интеграция]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=330</guid>
		<description><![CDATA[Так случилось, что в работе над проектом центральный инструмент коммуникации, аналитики и планирования стал багтрекер mantis. В какой-то момент он просто перестал справляться с теми задачами, которые перед нами стояли, и мы начали подыскивать альтернативу. Первым кандидатом была jira + confluence. Системы шикарные: масса функциональности, многое расширяется плагинами, но, мелких фич, сделавших нашу работу проще и приятнее туда легко не допилишь, потому решено было отказать. [...]]]></description>
			<content:encoded><![CDATA[<p>Так случилось, что в работе над проектом центральный инструмент коммуникации, аналитики и планирования стал багтрекер <a href="http://www.mantisbt.org/">mantis</a>. В какой-то момент он просто перестал справляться с теми задачами, которые перед нами стояли, и мы начали подыскивать альтернативу. Первым кандидатом была <a href="http://www.atlassian.com/software/jira/">jira</a> + <a href="http://www.atlassian.com/software/confluence/">confluence</a>. Системы шикарные: масса функциональности, многое расширяется плагинами, но, мелких фич, сделавших нашу работу проще и приятнее туда легко не допилишь, потому решено было отказать. Понравился <a href="http://trac.edgewall.org/">trac</a> залихвацкая интеграция с svn, симпатичный дизайн, красота минимализма подкупала но, было решено отказать. Нашлось еще много кандидатов на «попробовать», однако времени на эксперименты не было, да и истина: «старый друг, лучше новых, двух подруг» какбы говорила, — пользуйте мантис. Что мы собственно и сделали. Обновившись до 1.2.0 у нас заработали такие заманчивые штуки как Roadmap, интеграция с wiki (правда, её мы немного перепишем, «под себя», но всё равно приятно что ребята движутся в нужном нам направлении). А недостающей интеграции с CVS мы написали свою альтернативу. Работает это предельно просто: мы по крону распарсиваем лог проекта и складываем в базу информацию о багах (при этом комментарии коммитов должны включать в себя строке типа # ISSUE_ID). Эта очень удобная для нас функциональность плюс viewvc позволила очень быстро и удобно видеть прямо в броузере внесенные изменения, касающиеся любого issue, закоммиченную и последнюю ревизию.</p>
<p>Вот как это выглядит:</p>
<div id="attachment_331" class="wp-caption aligncenter" style="width: 844px"><img class="size-full wp-image-331" title="Так выглядят коммиты CVS в mantis" src="http://sheremetov.com/wp-content/uploads/2009/09/mantis_cvs_screent.gif" alt="Так выглядят коммиты CVS в mantis" width="834" height="552" /><p class="wp-caption-text">Так выглядят коммиты CVS в mantis</p></div>
<p>К viewvc мы прикрутили <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter">SyntaxHighlighter</a>, и код стал на порядок читабельнее:</p>
<div id="attachment_334" class="wp-caption alignnone" style="width: 844px"><img class="size-full wp-image-334" title="просмотр кода с ViewVC и SyntaxHighlighter" src="http://sheremetov.com/wp-content/uploads/2009/09/view_source_screen.gif" alt="просмотр кода с ViewVC и SyntaxHighlighter" width="834" height="552" /><p class="wp-caption-text">просмотр кода с ViewVC и SyntaxHighlighter</p></div>
<p>Для тех кто заинтересовался, прилагаю измененные мною файлы мантиса: <a href="http://sheremetov.com/wp-content/uploads/2009/09/patch_mantis_for_cvs_support.zip">mantis_patch_for_cvs_support</a>. Возникнут вопросы - спрашивайте.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/cvs-and-mantis-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP и Python. Взгляд со стороны PHP</title>
		<link>http://sheremetov.com/php/php-vs-python/</link>
		<comments>http://sheremetov.com/php/php-vs-python/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 12:38:45 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=324</guid>
		<description><![CDATA[Так случилось что в книге, которую сейчас читаю, примеры на питоне. Надо сказать что красота и лаконичность подкупили меня на более пристальный взгляд внутрь, и тут я покажу те штуки которые мне уж очень понравились после долгой работы с php. Некоторые штуки на php вообще нельзя сделать, некоторые можно но "с бубном", а какие-то просто [...]]]></description>
			<content:encoded><![CDATA[<p>Так случилось что в книге, которую сейчас читаю, примеры на питоне. Надо сказать что красота и лаконичность подкупили меня на более пристальный взгляд внутрь, и тут я покажу те штуки которые мне уж очень понравились после долгой работы с php. Некоторые штуки на php вообще нельзя сделать, некоторые можно но "с бубном", а какие-то просто лаконичнее смотрятся.</p>
<pre class="python">&nbsp;
<span style="color: #808080; font-style: italic;"># инициализация переменных</span>
&nbsp;
a, b = <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>a + b<span style="color: black;">&#41;</span>
&nbsp;
&gt;<span style="color: #ff4500;">7</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># последовательные вызовы</span>
&nbsp;
<span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;out.txt&quot;</span>, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span>i.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;input.txt&quot;</span>, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># lambda функции</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">math</span> <span style="color: #ff7700;font-weight:bold;">import</span> sqrt
&nbsp;
a = <span style="color: #ff7700;font-weight:bold;">lambda</span> x, y : sqrt<span style="color: black;">&#40;</span>x**<span style="color: #ff4500;">2</span> + y**<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; <span style="color: #ff4500;">2.82842712475</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># собственные операции над экземплярами классов, в данном случае сравнение</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyString:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: #008000;">str</span> = <span style="color: #008000;">str</span>        
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__cmp__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">cmp</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #008000;">str</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span>.<span style="color: #008000;">str</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>MyString<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;a&quot;</span><span style="color: black;">&#41;</span> &gt; MyString<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;abc&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; <span style="color: #008000;">False</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># множественное наследование</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> A:
    <span style="color: #ff7700;font-weight:bold;">def</span> a<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;a&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> B:
    <span style="color: #ff7700;font-weight:bold;">def</span> b<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;b&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> C<span style="color: black;">&#40;</span>A,B<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> c<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">a</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #008000;">self</span>.<span style="color: black;">b</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">test</span> = C<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">test</span>.<span style="color: black;">c</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; ab
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># классы-итераторы</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">random</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> RandomArray:    
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">len</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">lst</span> = <span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span> + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">current</span> = <span style="color: #ff4500;">0</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__iter__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> next<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">current</span> += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">lst</span><span style="color: black;">&#41;</span> &gt; <span style="color: #008000;">self</span>.<span style="color: black;">current</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">lst</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">current</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">StopIteration</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> RandomArray<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> i 
&nbsp;
&gt; <span style="color: #ff4500;">0.756338496947</span>
&gt; <span style="color: #ff4500;">0.0337045293883</span>
&gt; <span style="color: #ff4500;">0.50394288767</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># синтаксис привычного in_array()</span>
&nbsp;
arr = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">in</span> arr<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span> <span style="color: #ff7700;font-weight:bold;">in</span> arr<span style="color: black;">&#41;</span>
&nbsp;
&gt; <span style="color: #008000;">True</span>
&gt; <span style="color: #008000;">False</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># метаклассы, своего рода ООП-пластелин</span>
<span style="color: #808080; font-style: italic;"># надо сказать что весь код на Python напоминает мне пластелин</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> classFactory<span style="color: black;">&#40;</span>func<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">class</span> X<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>
    <span style="color: #008000;">setattr</span><span style="color: black;">&#40;</span>X, func.__name__, func<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> X
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> my_method<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;I am here&quot;</span>
&nbsp;
MyClass = classFactory<span style="color: black;">&#40;</span>my_method<span style="color: black;">&#41;</span>
my_object = MyClass<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
my_object.<span style="color: black;">my_method</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; I am here
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># операции с массивами</span>
&nbsp;
arr = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>arr<span style="color: black;">&#91;</span>:<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>arr<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>arr<span style="color: black;">&#91;</span>:<span style="color: #ff4500;">-2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>arr<span style="color: black;">&#91;</span><span style="color: #ff4500;">-2</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>arr<span style="color: black;">&#91;</span>::<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
&gt; <span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span>
&gt; <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>
&gt; <span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span>
&gt; <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># аналогичные операции со строками</span>
&nbsp;
<span style="color: #008000;">str</span> = <span style="color: #483d8b;">&quot;abcdefg&quot;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">str</span> = <span style="color: #483d8b;">&quot;abcdefg&quot;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#91;</span>:<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; cdefg
&gt; a
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># работа с потоками</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">time</span> <span style="color: #ff7700;font-weight:bold;">import</span> sleep
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> proc<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Process&quot;</span>, n
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
        sleep<span style="color: black;">&#40;</span><span style="color: #008000;">float</span><span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> n + <span style="color: #483d8b;">&quot; : &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
p1 = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=proc, name=<span style="color: #483d8b;">&quot;t1&quot;</span>, args=<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;1&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
p2 = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=proc, name=<span style="color: #483d8b;">&quot;t2&quot;</span>, args=<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;2&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
p1.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
p2.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; Process <span style="color: #ff4500;">1</span>
&gt; Process <span style="color: #ff4500;">2</span>
&gt; <span style="color: #ff4500;">1</span> : <span style="color: #ff4500;">0</span>
&gt; <span style="color: #ff4500;">2</span> : <span style="color: #ff4500;">0</span>
&gt; <span style="color: #ff4500;">1</span> : <span style="color: #ff4500;">1</span>
&gt; <span style="color: #ff4500;">1</span> : <span style="color: #ff4500;">2</span>
&gt; <span style="color: #ff4500;">2</span> : <span style="color: #ff4500;">1</span>
&gt; <span style="color: #ff4500;">2</span> : <span style="color: #ff4500;">2</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># системные вызовы - запросто</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">winsound</span> <span style="color: #ff7700;font-weight:bold;">import</span> Beep
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">random</span> <span style="color: #ff7700;font-weight:bold;">import</span> randrange
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span>:
    Beep<span style="color: black;">&#40;</span>randrange<span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span>, <span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># дебагер &quot;из коробки&quot;. его красота не столько в функциональности,</span>
<span style="color: #808080; font-style: italic;"># столько в том что на питоне это весьма просто реализовывается</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">pdb</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fun<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>:
    lst = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> s:
        lst.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> lst
&nbsp;
<span style="color: #dc143c;">pdb</span>.<span style="color: black;">runcall</span><span style="color: black;">&#40;</span>fun, <span style="color: #483d8b;">&quot;ABCDE&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
&gt; c:\main.<span style="color: black;">py</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">35</span><span style="color: black;">&#41;</span>fun<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
-&gt; lst = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#40;</span>Pdb<span style="color: black;">&#41;</span> n
&gt; c:\main.<span style="color: black;">py</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">36</span><span style="color: black;">&#41;</span>fun<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
-&gt; <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> s:
<span style="color: black;">&#40;</span>Pdb<span style="color: black;">&#41;</span> n
&gt; c:\main.<span style="color: black;">py</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">37</span><span style="color: black;">&#41;</span>fun<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
-&gt; lst.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#40;</span>Pdb<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">print</span> i
A
<span style="color: black;">&#40;</span>Pdb<span style="color: black;">&#41;</span> n
&nbsp;</pre>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># профайлер из коробки, тоже, как по мне - очень круто</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">profile</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">math</span> <span style="color: #ff7700;font-weight:bold;">import</span> sqrt
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> print_close_matches<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    arr = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span>:
        arr.<span style="color: black;">append</span><span style="color: black;">&#40;</span>sqrt<span style="color: black;">&#40;</span>i**<span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> arr
&nbsp;
<span style="color: #dc143c;">profile</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'print_close_matches()'</span><span style="color: black;">&#41;</span>
&nbsp;
         <span style="color: #ff4500;">2005</span> function calls <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #ff4500;">0.051</span> CPU seconds
&nbsp;
   Ordered by: standard name
&nbsp;
   ncalls  tottime  percall  cumtime  percall filename:lineno<span style="color: black;">&#40;</span>function<span style="color: black;">&#41;</span>
     <span style="color: #ff4500;">1000</span>    <span style="color: #ff4500;">0.001</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.001</span>    <span style="color: #ff4500;">0.000</span> :<span style="color: #ff4500;">0</span><span style="color: black;">&#40;</span>append<span style="color: black;">&#41;</span>
        <span style="color: #ff4500;">1</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.000</span> :<span style="color: #ff4500;">0</span><span style="color: black;">&#40;</span><span style="color: #008000;">range</span><span style="color: black;">&#41;</span>
        <span style="color: #ff4500;">1</span>    <span style="color: #ff4500;">0.045</span>    <span style="color: #ff4500;">0.045</span>    <span style="color: #ff4500;">0.045</span>    <span style="color: #ff4500;">0.045</span> :<span style="color: #ff4500;">0</span><span style="color: black;">&#40;</span>setprofile<span style="color: black;">&#41;</span>
     <span style="color: #ff4500;">1000</span>    <span style="color: #ff4500;">0.001</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.001</span>    <span style="color: #ff4500;">0.000</span> :<span style="color: #ff4500;">0</span><span style="color: black;">&#40;</span>sqrt<span style="color: black;">&#41;</span>
        <span style="color: #ff4500;">1</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.006</span>    <span style="color: #ff4500;">0.006</span> &lt;string&gt;:<span style="color: #ff4500;">1</span><span style="color: black;">&#40;</span>&lt;module&gt;<span style="color: black;">&#41;</span>
        <span style="color: #ff4500;">1</span>    <span style="color: #ff4500;">0.003</span>    <span style="color: #ff4500;">0.003</span>    <span style="color: #ff4500;">0.006</span>    <span style="color: #ff4500;">0.006</span> main.<span style="color: black;">py</span>:<span style="color: #ff4500;">7</span><span style="color: black;">&#40;</span>print_close_matches<span style="color: black;">&#41;</span>
        <span style="color: #ff4500;">1</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.000</span>    <span style="color: #ff4500;">0.051</span>    <span style="color: #ff4500;">0.051</span> <span style="color: #dc143c;">profile</span>:<span style="color: #ff4500;">0</span><span style="color: black;">&#40;</span>print_close_matches<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff4500;">0</span>    <span style="color: #ff4500;">0.000</span>             <span style="color: #ff4500;">0.000</span>          <span style="color: #dc143c;">profile</span>:<span style="color: #ff4500;">0</span><span style="color: black;">&#40;</span>profiler<span style="color: black;">&#41;</span>
&nbsp;
&lt;/module&gt;&lt;/string&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/php-vs-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java vs PHP. Производительность и работа с памятью.</title>
		<link>http://sheremetov.com/php/java-vs-php/</link>
		<comments>http://sheremetov.com/php/java-vs-php/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 14:53:05 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=315</guid>
		<description><![CDATA[Удивительное рядом. В ходе работы нужно было сравнить сколько памяти занимает массив строк в java и php, ну и параллельно было интересно узнать сколько времени займет заполнение такого массива данных. Я поступил просто - сгенерировал 999999 элементов md5 от текущего времени. Любопытно, что php оказался на высоте.]]></description>
			<content:encoded><![CDATA[<p>Удивительное рядом. В ходе работы нужно было сравнить сколько памяти занимает массив строк в java и php, ну и параллельно было интересно узнать сколько времени займет заполнение такого массива данных. Я поступил просто - сгенерировал 999999 элементов md5 от текущего времени. Любопытно, что php оказался на высоте. Вот результаты тестов:</p>
<p>Результат работы на java:</p>
<pre>java -Xmx256m -jar tester.jar
7.813sec
142Mb</pre>
<p>Результат работы на php:</p>
<pre>php test.php
6.19590497017sec
118.501411438Mb</pre>
<p>Исходники можно скачать <a href="http://sheremetov.com/wp-content/uploads/2009/08/test.zip">здесь</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/java-vs-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
