<?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>В поисках успеха</title>
	<atom:link href="http://sheremetov.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Wed, 24 Feb 2010 12:55:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Мониторинг сайтов и уведомление по почте без установленного почтового сервера</title>
		<link>http://sheremetov.com/programming/site-monitoring/</link>
		<comments>http://sheremetov.com/programming/site-monitoring/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 12:55:08 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[мониотринг сайта]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=562</guid>
		<description><![CDATA[По независящим от нас причинам упал сайт, спустя несколько часов только узнали об этом, поэтому было решено, для "быстрого реагирования", сделать мониторинг на локальном сервере, одна беда, он в интранете и почтового сервера на нем нет. В результате был сделан несложный скрипт, позволяющий отправлять отчеты о падении с любого доступного вам почтового адреса (gmail.com, mail.ru, yandex.ru). Поддерживается TLS авторизация для SMTP и HTTPS для протокола мониторинга.
]]></description>
			<content:encoded><![CDATA[<p>По независящим от нас причинам упал сайт, спустя несколько часов только узнали об этом, поэтому было решено, для "быстрого реагирования", сделать мониторинг на локальном сервере, одна беда, он в интранете и почтового сервера на нем нет. В результате был сделан несложный скрипт, позволяющий отправлять отчеты о падении с любого доступного вам почтового адреса (gmail.com, mail.ru, yandex.ru). Поддерживается TLS авторизация для SMTP и HTTPS для протокола мониторинга.</p>
<p>Инструкция по эксплуатации:</p>
<pre>
Usage: site_down_notifier.py -s http://site.com -n email@site.com
Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -s SITE, --site=SITE  define site for monitoring (url like http://site.com/)
  -n EMAILS, --notify=EMAILS
                        emails for notification (comma separated)
  -r STR, --str=STR     phrase for checking on your site page
  -t TLS, --mailtls=TLS
                        use secure email connection (True/1, False/0)
  -m SERVER, --mailserver=SERVER
                        mail server (smtp.gmail.com)
  -p PORT, --mailport=PORT
                        smtp port of mail server (25)
  -w PASSWORD, --mailpass=PASSWORD
                        password for mail server
  -b EMAIL, --mailbox=EMAIL
                        account for mail server
</pre>
<p>Исходный код скрипта:</p>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">#! /usr/bin/python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">smtplib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">httplib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">optparse</span> <span style="color: #ff7700;font-weight:bold;">import</span> OptionParser
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">pprint</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">pprint</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> GMailer:
&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>, server, port, login, password, tls = <span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> tls:
            <span style="color: #008000;">self</span>._server = <span style="color: #dc143c;">smtplib</span>.<span style="color: black;">SMTP_SSL</span><span style="color: black;">&#40;</span>server, port<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>._server = <span style="color: #dc143c;">smtplib</span>.<span style="color: black;">SMTP</span><span style="color: black;">&#40;</span>server, port<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>._login = login
        <span style="color: #008000;">self</span>._server.<span style="color: black;">set_debuglevel</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._server.<span style="color: black;">login</span><span style="color: black;">&#40;</span>login, password<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, to, subject, message<span style="color: black;">&#41;</span>:
        msg = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;From: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>To: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Subject: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>%s&quot;</span>
               % <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._login, to, subject, message<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>._server.<span style="color: black;">sendmail</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._login, to, msg<span style="color: black;">&#41;</span> 
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> close<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._server.<span style="color: black;">quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">parser</span> = OptionParser<span style="color: black;">&#40;</span>usage = <span style="color: #483d8b;">&quot;%prog -s http://site.com -n email@site.com&quot;</span>, version=<span style="color: #483d8b;">&quot;%prog 1.0&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-s&quot;</span>, <span style="color: #483d8b;">&quot;--site&quot;</span>, dest=<span style="color: #483d8b;">&quot;site&quot;</span>,<span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;define site for monitoring (url like http://site.com/)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;SITE&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-n&quot;</span>, <span style="color: #483d8b;">&quot;--notify&quot;</span>, dest=<span style="color: #483d8b;">&quot;emails&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;emails for notification (comma separated)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;EMAILS&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-r&quot;</span>, <span style="color: #483d8b;">&quot;--str&quot;</span>, dest=<span style="color: #483d8b;">&quot;sitestr&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;phrase for checking on your site page&quot;</span>, metavar=<span style="color: #483d8b;">&quot;STR&quot;</span>, default = <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-t&quot;</span>, <span style="color: #483d8b;">&quot;--mailtls&quot;</span>, dest=<span style="color: #483d8b;">&quot;tls&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;use secure email connection (True/1, False/0)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;TLS&quot;</span>, default=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-m&quot;</span>, <span style="color: #483d8b;">&quot;--mailserver&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailserver&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;mail server (smtp.gmail.com)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;SERVER&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-p&quot;</span>, <span style="color: #483d8b;">&quot;--mailport&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailport&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;smtp port of mail server (25)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;PORT&quot;</span>, default=<span style="color: #ff4500;">25</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-w&quot;</span>, <span style="color: #483d8b;">&quot;--mailpass&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailpass&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;password for mail server&quot;</span>, metavar=<span style="color: #483d8b;">&quot;PASSWORD&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-b&quot;</span>, <span style="color: #483d8b;">&quot;--mailbox&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailbox&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;account for mail server&quot;</span>, metavar=<span style="color: #483d8b;">&quot;EMAIL&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: black;">&#40;</span>options, args<span style="color: black;">&#41;</span> = <span style="color: #dc143c;">parser</span>.<span style="color: black;">parse_args</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> options.<span style="color: #dc143c;">site</span> <span style="color: #ff7700;font-weight:bold;">and</span> options.<span style="color: black;">emails</span> <span style="color: #ff7700;font-weight:bold;">and</span> options.<span style="color: black;">mailserver</span> <span style="color: #ff7700;font-weight:bold;">and</span> options.<span style="color: black;">mailpass</span>:
    error = <span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    result = <span style="color: #dc143c;">re</span>.<span style="color: black;">search</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^(http|https)://([<span style="color: #000099; font-weight: bold;">\w</span>.-]*)(.*)&quot;</span>, options.<span style="color: #dc143c;">site</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> result.<span style="color: black;">lastindex</span> &lt; <span style="color: #ff4500;">3</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Wrong url: %s&quot;</span> % <span style="color: black;">&#40;</span>options.<span style="color: #dc143c;">site</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        exit<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;https&quot;</span>:
                conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPSConnection</span><span style="color: black;">&#40;</span>result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, timeout=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPConnection</span><span style="color: black;">&#40;</span>result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, timeout=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
            conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;GET&quot;</span>, result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            r1 = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>    
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>r1.<span style="color: black;">status</span> != <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>:
                error = <span style="color: #483d8b;">&quot;host unavailable&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: black;">&#40;</span>options.<span style="color: black;">sitestr</span> != <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: black;">&#40;</span>r1.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">find</span><span style="color: black;">&#40;</span>options.<span style="color: black;">sitestr</span><span style="color: black;">&#41;</span> &lt;= <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
                error = <span style="color: #483d8b;">&quot;wrong content on home&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            error = <span style="color: #483d8b;">&quot;host not found&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> error != <span style="color: #483d8b;">&quot;&quot;</span>:
            mailer = GMailer<span style="color: black;">&#40;</span>options.<span style="color: black;">mailserver</span>, options.<span style="color: black;">mailport</span>, options.<span style="color: #dc143c;">mailbox</span>, options.<span style="color: black;">mailpass</span>, options.<span style="color: black;">tls</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #dc143c;">email</span> <span style="color: #ff7700;font-weight:bold;">in</span> options.<span style="color: black;">emails</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;,&quot;</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> mailer.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">email</span>, <span style="color: #483d8b;">&quot;psycare&quot;</span>, error<span style="color: black;">&#41;</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Report to %s sent&quot;</span> % <span style="color: black;">&#40;</span><span style="color: #dc143c;">email</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            mailer.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;errors sent&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;everything is ok&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;not enough parameters&quot;</span>
&nbsp;</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/programming/site-monitoring/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Примеры успешных Semantic Web проложений</title>
		<link>http://sheremetov.com/links/semantic-web-apps/</link>
		<comments>http://sheremetov.com/links/semantic-web-apps/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 22:09:30 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[ссылки]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[semantic web]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=555</guid>
		<description><![CDATA[Иногда проще один раз увидеть чем сто раз услышать, так и&#160;с&#160;Semantic Web. Речь пойдет о&#160;тех проектах которые встречались мне последнее время, и&#160;реализация и&#160;успех которых стали возможно именно благодаря rdf, owl, sparql и&#160;прочим прелестям семантического веба.

Первый проект о&#160;котором стоит рассказать это freebase.com, своего рода википедия, построенная по&#160;канонам Semantic Web. Сложно даже назвать это проектом,&#160;&#8212; это целая [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда проще один раз увидеть чем сто раз услышать, так и&nbsp;с&nbsp;Semantic Web. Речь пойдет о&nbsp;тех проектах которые встречались мне последнее время, и&nbsp;реализация и&nbsp;успех которых стали возможно именно благодаря rdf, owl, sparql и&nbsp;прочим прелестям семантического веба.</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/02/home.png"><img src="http://sheremetov.com/wp-content/uploads/2010/02/home-300x224.png" alt="home" title="home" width="300" height="224" class="alignnone size-medium wp-image-556" /></a></p>
<p>Первый проект о&nbsp;котором стоит рассказать это <a href="http://www.freebase.com/">freebase.com</a>, своего рода википедия, построенная по&nbsp;канонам Semantic Web. Сложно даже назвать это проектом,&nbsp;&mdash; это целая платформа, позволяющая строить на&nbsp;ней свои приложения, прямо в&nbsp;броузере, используя довольно функциональную IDE:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/02/ide.png"><img src="http://sheremetov.com/wp-content/uploads/2010/02/ide-300x220.png" alt="ide" title="ide" width="300" height="220" class="alignnone size-medium wp-image-557" /></a></p>
<p>Разработчики отказались от&nbsp;использования SPARQL, в&nbsp;пользу более функционального, по&nbsp;их&nbsp;мнению, json-подобного собственного языка запросов. Поэкспериментировать с&nbsp;ним можно прямо в&nbsp;<a href="http://www.freebase.com/app/queryeditor">броузере</a>. А&nbsp;с&nbsp;помощью <a href="http://schemas.freebaseapps.com/">этого приложения</a> можно изучить внутреннюю структуру данных freebase. Есть даже примеры весьма функциональных приложений, например <a href="http://fmdb.freebaseapps.com/">своеобразный навигатор в&nbsp;мире кино</a>:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/02/fmdb.png"><img src="http://sheremetov.com/wp-content/uploads/2010/02/fmdb-300x220.png" alt="fmdb" title="fmdb" width="300" height="220" class="alignnone size-medium wp-image-558" /></a></p>
<p>Насколько я&nbsp;понял, база данных пополняется силами энтузиастов а&nbsp;также, из&nbsp;открытых онтологий. Сам проект имеет открытое API для разработчиков, создатели активно пишут в&nbsp;блоге о&nbsp;планах, технических аспектах и&nbsp;многом другом. В&nbsp;общем проект интересный, всем рекомендую, хотя&nbsp;бы взглянуть.</p>
<p>Второй любопытный проект,&nbsp;&mdash; это <a href="dbpedia.org">dbpedia.org</a>, сообщество энтузиастов, занимающихся структурированием информации из&nbsp;википедии. Он&nbsp;не&nbsp;такой красивый как freebase, и&nbsp;местами вылетают ошибки, но&nbsp;тем не&nbsp;менее, есть в&nbsp;нем своя прелесть, взять хотя&nbsp;бы приложение <a href="http://relfinder.dbpedia.org/">relfinder</a>, флексовое приложение, отображающее связи между сущностями:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/02/relfinder.png"><img src="http://sheremetov.com/wp-content/uploads/2010/02/relfinder-300x223.png" alt="relfinder" title="relfinder" width="300" height="223" class="alignnone size-medium wp-image-559" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/semantic-web-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа Garbage Collector в Flash Player</title>
		<link>http://sheremetov.com/flash/garbage-collector-in-flash-player/</link>
		<comments>http://sheremetov.com/flash/garbage-collector-in-flash-player/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 07:36:16 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=547</guid>
		<description><![CDATA[Это будет короткий пост об особенностях работы GarbageCollector (сборщик мусора), некоторые из которых были для меня новостью. Во-первых давайте напишем следующий код:
&#160;
import flash.display.Sprite;
&#160;
function onFrame&#40;e: Event&#41; &#123;
	trace&#40;System.totalMemory&#41;;
	var test = new Sprite&#40;&#41;;
&#125;
&#160;
addEventListener&#40;Event.ENTER_FRAME, onFrame&#41;
&#160;
Запустив его вы убедитесь что плеер выделяет всё больше и больше памяти для себя, и спустя какое-то время, - начинает освобождать. То есть, память очищается [...]]]></description>
			<content:encoded><![CDATA[<p>Это будет короткий пост об особенностях работы GarbageCollector (сборщик мусора), некоторые из которых были для меня новостью. Во-первых давайте напишем следующий код:</p>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> onFrame<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>: Event<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">System</span>.<span style="color: #006600;">totalMemory</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">var</span> test = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
addEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ENTER_FRAME</span>, onFrame<span style="color: #66cc66;">&#41;</span>
&nbsp;</pre>
<p>Запустив его вы убедитесь что плеер выделяет всё больше и больше памяти для себя, и спустя какое-то время, - начинает освобождать. То есть, память очищается не сразу же, как только на объект все ссылки удалены, а только через какое-то время. Графически это выглядит так:</p>
<p><img src="http://sheremetov.com/wp-content/uploads/2010/02/gc-chart.gif" alt="gc-chart" title="gc-chart" width="600" height="308" class="alignnone size-full wp-image-549" /></p>
<p>Сборку мусора можно запустить принудительно в debug версии плеера так: </p>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">System</span>.<span style="color: #006600;">gc</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;</pre>
<p>А в обычном плеере, можно воспользоваться хаком:</p>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">try</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">LocalConnection</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">connect</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'foo'</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">LocalConnection</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">connect</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'foo'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span> <span style="color: #0066CC;">catch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:<span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Можно сделать несколько выводов:</p>
<ol>
<li>Я не показал этого в коде, но на самом деле память начинала расходоваться только с объектов Sprite. Объекты классов int, Number, Object удалялись сразу же.</li>
<li>Мы не имеем контроля над управлением памятью, поэтому есть смысл делать пул объектов, запрашивая экземпляры нужных классов, по мере надобности, периодически подчищая пул. Таким образом мы по крайней мере будем удерживать количество занимаемой памяти, особенно в случае если большое количество объектов создается-удаляется (а в идеале избегать этого).</li>
<li>За памятью нужно постоянно следить, иначе потом будет очень непросто разобраться в чем именно проблема</li>
</ol>
<p>Более подробно про работу Garbage Collector можно прочитать в <a href="http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html">статье Гранта Скиннера</a>, он же, <a href="http://gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html">пишет про хак</a>, на своем сайте.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/garbage-collector-in-flash-player/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дайджест ссылок №11</title>
		<link>http://sheremetov.com/links/%d0%b4%d0%b0%d0%b9%d0%b4%d0%b6%d0%b5%d1%81%d1%82-%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba-%e2%84%9611/</link>
		<comments>http://sheremetov.com/links/%d0%b4%d0%b0%d0%b9%d0%b4%d0%b6%d0%b5%d1%81%d1%82-%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba-%e2%84%9611/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 19:10:27 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[ссылки]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[mate]]></category>
		<category><![CDATA[мотивация]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=537</guid>
		<description><![CDATA[
увлекательнейшая история про математика, подсмотрел у Constantiner’a
В этом видео (английский, с русскими субтитрами) Ден Пинк, рассказывает о мотивации в духе классических евангелистов. Меня, проняло.
Хорошая статья, полезная тем кто посматривает в сторону flex-разработки на Mate.
Грант Скиннер, в простых словах говорит о том что беспокоится о преждевременной кончине Flash — себе нервы вредить. Не стоит. Делайте то — что любите. Используете то, что подходит больше для решения ваших задач.

]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://moskalyuk.name/2514">увлекательнейшая история про математика</a>, подсмотрел у <a href="http://juick.com/Constantiner/">Constantiner’a</a></li>
<li>В этом <a href="http://www.ted.com/talks/lang/rus/dan_pink_on_motivation.html">видео</a> (английский, с русскими субтитрами) Ден Пинк, рассказывает о мотивации в духе классических евангелистов. Меня, проняло.</li>
<li><a href="http://racer242.blogspot.com/2009/05/mate.html">Хорошая статья</a>, полезная тем кто посматривает в сторону flex-разработки на Mate.</li>
<li>Грант Скиннер, в простых словах <a href="http://www.gskinner.com/blog/archives/2010/02/my_thoughts_on.html">говорит о том что беспокоится о преждевременной кончине Flash — себе нервы вредить</a>. Не стоит. Делайте то — что любите. Используете то, что подходит больше для решения ваших задач.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/%d0%b4%d0%b0%d0%b9%d0%b4%d0%b6%d0%b5%d1%81%d1%82-%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba-%e2%84%9611/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Использование FlexUnit для тестирования асинхронных вызовов</title>
		<link>http://sheremetov.com/flash/flexunit-async/</link>
		<comments>http://sheremetov.com/flash/flexunit-async/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 18:10:42 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[flexunit]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=514</guid>
		<description><![CDATA[Я немного писал уже о важности написания тестов, правда для php программистов, но написанное в равной степени касается любого программирования, если в разработку вовлечены более одного человека, релизы довольно часты и логика приложения не может быть протестирована вручную очень быстро. В  таком случае, мы рано или поздно захотим автоматизировать процесс, собственно об этом и пойдет [...]]]></description>
			<content:encoded><![CDATA[<p>Я немного писал уже о <a href="http://sheremetov.com/oop/test-driven-development/">важности написания тестов</a>, правда для php программистов, но написанное в равной степени касается любого программирования, если в разработку вовлечены более одного человека, релизы довольно часты и логика приложения не может быть протестирована вручную очень быстро. В  таком случае, мы рано или поздно захотим автоматизировать процесс, собственно об этом и пойдет речь. Тестировать приложения написанные на php мы научились, хотя конечно постиигать эту науку можно всю жизнь, но те задачи которые перед нами стояли мы с успехом решаем, благодаря UnitTest'ам, а вот с автоматизированным тестированием Flex/Flash, пока не складывалось. Появилось немного времени и было решено взглянуть на FlexUnit, и вот что из этого вышло.</p>
<p>Поскольку на flash/flex мы чаще всего делаем  интерфейсы, мне в первую очередь было интересно как тестировать асинхронные вызовы, элементы UI, и проч. Я написал небольшой класс, представляющий из себя сильно упрощенную версию конвеера <a href="http://potapenko.com">Жени Потапенко</a>. Вот код двух классов:</p>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// Task.as</span>
&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Task <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _func: <span style="color: #000000; font-weight: bold;">Function</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _time: <span style="color: #0066CC;">int</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _params: <span style="color: #0066CC;">Object</span>;		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Task<span style="color: #66cc66;">&#40;</span>func: <span style="color: #000000; font-weight: bold;">Function</span>, <span style="color: #0066CC;">time</span>: <span style="color: #0066CC;">int</span>, params: <span style="color: #0066CC;">Object</span> = <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			_func = func;
			_time = <span style="color: #0066CC;">time</span>;
			_params = params;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">caller</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0066CC;">caller</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> params<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _params;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">int</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _time;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> func<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #000000; font-weight: bold;">Function</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _func;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// Conveyor.as</span>
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">TimerEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Timer</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Conveyor <span style="color: #66cc66;">&#123;</span> 
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _queue: <span style="color: #0066CC;">Array</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _timer: Timer;
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _paused: <span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">false</span>;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Conveyor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			_queue = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			_timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			_timer.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, onTaskFinished<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span>task:Task<span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_queue.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span>task<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_timer.<span style="color: #0066CC;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>_queue.<span style="color: #0066CC;">length</span> &amp;gt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> task: Task = _queue.<span style="color: #006600;">shift</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span> != <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					task.<span style="color: #006600;">func</span><span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
					task.<span style="color: #006600;">func</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				_timer.<span style="color: #006600;">delay</span> = task.<span style="color: #0066CC;">time</span>;
				_timer.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onTaskFinished<span style="color: #66cc66;">&#40;</span>event: TimerEvent<span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Первое с чего надо начать для тестирования этого кода это TestSuite и TestRunner, который будет его запускать:</p>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// ConveyorTestSuite.as</span>
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #66cc66;">&#91;</span>Suite<span style="color: #66cc66;">&#93;</span>
           <span style="color: #66cc66;">&#91;</span>RunWith<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;org.flexunit.runners.Suite&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConveyorTestSuite <span style="color: #66cc66;">&#123;</span>		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> conveyorTest: ConveyorTest;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> taskTest: TaskTest;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ConveyorTestSuite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Runner.mxml</p>
<pre class="actionscript">&nbsp;
&lt; ?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?&gt;
&lt;mx :Application
    xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span>
    xmlns:flexunit=<span style="color: #ff0000;">&quot;flexunit.flexui.*&quot;</span>
    xmlns:flexUnitUIRunner=<span style="color: #ff0000;">&quot;http://www.adobe.com/2009/flexUnitUIRunner&quot;</span>
    creationComplete=<span style="color: #ff0000;">&quot;creationCompleteHandler(event)&quot;</span>
&gt;
&lt;/mx&gt;&lt;mx :Script&gt;
		&lt; !<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
			<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span>.<span style="color: #006600;">ConveyorTestSuite</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">FlexEvent</span>;
&nbsp;
			<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">listeners</span>.<span style="color: #006600;">UIListener</span>;
			<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">runner</span>.<span style="color: #006600;">FlexUnitCore</span>;
&nbsp;
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> flexUnitCore:FlexUnitCore;
&nbsp;
			protected <span style="color: #000000; font-weight: bold;">function</span> creationCompleteHandler<span style="color: #66cc66;">&#40;</span>event:FlexEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
 				flexUnitCore = <span style="color: #000000; font-weight: bold;">new</span> FlexUnitCore<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
 				flexUnitCore.<span style="color: #0066CC;">addListener</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> UIListener<span style="color: #66cc66;">&#40;</span> testRunner <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
 				flexUnitCore.<span style="color: #006600;">run</span><span style="color: #66cc66;">&#40;</span> ConveyorTestSuite <span style="color: #66cc66;">&#41;</span>;
 			<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>&gt;
	&lt;/mx&gt;
	&lt;flexunituirunner :TestRunnerBase id=<span style="color: #ff0000;">&quot;testRunner&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> /&gt;
&lt; /mx:Application&gt;
&nbsp;</pre>
<p>Обратите внимание на теги метаданных, которыми могут конфигурироваться классы TestSuite и TestCase. Вот полный список, поддерживаемых метатегов:</p>
<ul>
<li>[Suite] - указывает на класс Suite</li>
<li>[Test] - указывает на метод теста, заменяет префикс test для метода. Поддерживает аттрибуты expected, async, order, timeout, ui</li>
<li>[RunWith] - указывает на Runner с которым должен быть запущен TestSuite</li>
<li>[Ignore] - Вместо комментирования метода теста достаточно указать этот метатег</li>
<li>[Before] - заменяет setup() во FlexUnit и позволяет использовать несколько методов. Поддерживает аттрибуты: async, timeout, order, ui.</li>
<li>[After] - заменяет teardown(), поддерживает: async, timeout, order and ui аттрибуты.</li>
<li>[BeforeClass] - позволяет определить метод, вызываемый перед запуском класса теста, поддерживает аттрибут order</li>
<li>[AfterClass] - помечает метод выполняемый, после запуска всех тестов в классе, поддерживает аттрибут order</li>
</ul>
<p>Тест класса Task представляет из себя классический unit-test:</p>
<pre class="actionscript">&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Task</span>;
	<span style="color: #0066CC;">import</span> flexunit.<span style="color: #006600;">framework</span>.<span style="color: #006600;">TestCase</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TaskTest <span style="color: #0066CC;">extends</span> TestCase <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> TaskTest<span style="color: #66cc66;">&#40;</span>methodName:<span style="color: #0066CC;">String</span>=<span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span>methodName<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testNew<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> param:<span style="color: #0066CC;">Object</span> = <span style="color: #66cc66;">&#123;</span>test:<span style="color: #ff0000;">&quot;passed&quot;</span><span style="color: #66cc66;">&#125;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> func:<span style="color: #000000; font-weight: bold;">Function</span> = testNew;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> task: Task = <span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>func, <span style="color: #cc66cc;">100</span>, param<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			assertTrue<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">func</span> == func<span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #0066CC;">time</span>, <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span>, param<span style="color: #66cc66;">&#41;</span>;			
&nbsp;
			task = <span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>func, <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
			assertNull<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span><span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #0066CC;">caller</span>, <span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>А вот класс для тестирования асинхронных вызовов выглядит интереснее:</p>
<pre class="actionscript">&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Conveyor</span>;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Task</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">Event</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">TimerEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Timer</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">asserts</span>.<span style="color: #006600;">assertEquals</span>;
	<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">async</span>.<span style="color: #006600;">Async</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConveyorTest <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> conveyor: Conveyor;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> counter: <span style="color: #0066CC;">int</span>;		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ConveyorTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Before<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> runBeforeEveryTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
		    conveyor = <span style="color: #000000; font-weight: bold;">new</span> Conveyor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		    counter = <span style="color: #cc66cc;">0</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>After<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> runAfterEveryTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			conveyor = <span style="color: #000000; font-weight: bold;">null</span>;
		<span style="color: #66cc66;">&#125;</span>       
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> dummy<span style="color: #66cc66;">&#40;</span>param: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			counter++;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Test<span style="color: #66cc66;">&#40;</span>async,timeout=<span style="color: #ff0000;">&quot;250&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testPlay<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
			conveyor.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>dummy, <span style="color: #cc66cc;">100</span>, <span style="color: #ff0000;">&quot;one&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> timer1: Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			timer1.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, Async.<span style="color: #006600;">asyncHandler</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">this</span>, onAfterFirst, <span style="color: #cc66cc;">120</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			timer1.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			conveyor.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>dummy, <span style="color: #cc66cc;">100</span>, <span style="color: #ff0000;">&quot;two&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;										
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> timer2: Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">150</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			timer2.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, Async.<span style="color: #006600;">asyncHandler</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">this</span>, onAfterSecond, <span style="color: #cc66cc;">220</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			timer2.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			conveyor.<span style="color: #0066CC;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onAfterSecond<span style="color: #66cc66;">&#40;</span>event: Event, params: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #66cc66;">&#125;</span>			
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onAfterFirst<span style="color: #66cc66;">&#40;</span>event: Event, params: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>В этом классе вызовы типа Async.asyncHandler( this, onAfterFirst, 120) возвращают callback, этот вызов в случае если вызов не произойдет в течении 120 миллисекунд, сработает таймаут, и тест будет считаться проваленным.<br />
Надеюсь код достаточно красноречив и понятен. А для тех кто захочет глубже разобраться с фреймворком, я рекомендую прочитать очень хорошую <a href="http://www.insideria.com/2009/05/flashbuilder4-will-support-fle.html">статью о использовании FlexUnit</a>, неисчерпаемым источником информации являются 220 мегабайт кода репозитория проекта, вы легко можете экспотрировать его скачав <a href="http://subversion.tigris.org/files/documents/15/39559/svn-1.4.5-setup.exe">svn</a>, и сделав:</p>
<pre>
svn checkout http://opensource.adobe.com/svn/opensource/flexunit [путь-куда-вы-хотите-экспортировать]
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/flexunit-async/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Алгоритм успеха</title>
		<link>http://sheremetov.com/motivation/%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc-%d1%83%d1%81%d0%bf%d0%b5%d1%85%d0%b0-2/</link>
		<comments>http://sheremetov.com/motivation/%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc-%d1%83%d1%81%d0%bf%d0%b5%d1%85%d0%b0-2/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 23:26:35 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[motivation]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=290</guid>
		<description><![CDATA[The way to get started is to quit talking and begin doing. Walt Disney.
Так уж выходит, что в блоге своем я пишу о вещах очень простых. Несмотря на это, каждая из тем, мною поднятых, была рождена в ходе каких-то обсуждений, споров. Вот и один из недавних споров был связан с насущной проблемой, которую я формулирую [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>The way to get started is to quit talking and begin doing. Walt Disney.</p></blockquote>
<p>Так уж выходит, что в блоге своем я пишу о вещах очень простых. Несмотря на это, каждая из тем, мною поднятых, была рождена в ходе каких-то обсуждений, споров. Вот и один из недавних споров был связан с насущной проблемой, которую я формулирую как: «где взять свой первый миллион», а подведя итоги спора я в очередной раз убедился что достижению разных целей предшествуют одни и те же шаги, можно даже сказать — алгоритм успеха.</p>
<p>Как обычно, в таких разговорах участвуют «теоретики», строя свои теории на личном жизненном опыте, биографиях успешных людей, субъективном видении «проблемы». Итак, одна из вещей, которую я понял, в ходе нашего спора, это — отсутствие «четкой цели». Действительно, при более конкретном рассмотрении, зачастую выясняется что «первый миллион», целью не является, а скорее, люди просто «не против», чтобы он появился. Это очень четко видно по ответам на вопросы: «для чего» и «какие шаги были предприняты». В действительности, и я сам в этом убедился. Осознание того что что-то тебе жизненно необходимо, формирует весь мыслительный процесс, всё существование на достижении конкретной цели. Это известный факт как среди психологов, так и биоэнергетиков. Простой пример из жизни, — многие из моих знакомых «подумывают о машине», купить новую, сменить старую, - не важно. Важно, что в этом состоянии «уютного оцепенения» можно находится довольно долго. И напротив — те кто начинает активно искать «варианты», посещать салоны, «тест-драйвить» машины, находятся к покупке гораздо ближе. Причем это никак не связано с наличием или отсутствием денег, возможностью взять кредит и проч. Это связанно именно с осознанием «близости покупки», эти люди генерируют больше «активности» в этом направлении, с чем, собственно, и связана близость результата. О похожих взаимосвязях, говорится в нашумевшем американском фильме «Секрет». Только никакого секрета тут нет, — тот кто больше прикладывает усилий, и чьи усилия более сконцентрированы и целеустремленны, тот может рассчитывать на результат быстрее. Ведь просто?</p>
<p>Другой момент, о котором хочется поговорить, это две составляющих успеха, которые для простоты я их называю: «матчасть» и «делание». «Матчасть» подразумевает под собой теоретическую основу, анализ чужого опыта, оптимизацию собственного процесса. «Делание» это устойчивое и упорное движение в направлении достижении цели. Для этого очень важно максимально чётко понимать цель, её цену (мало кому понадобится роскошное авто ценой 5ти лет работы без выходных и отпусков). Отсутствие «делания» превращает людей в закостенелых «теоретиков» (яркий пример — профессор экономики с ярко выраженными финансовыми проблемами), отсутствие стремления «учить матчасть», делает работу неэффективной, убивает время и желание, заставляет всё время повторять собственные ошибки.</p>
<p>Самое странное заключается в том что при всей очевидности и простоте этого алгоритма, по моим личным наблюдениям, следуют ему далеко не все, хотя те кто следуют — обязательно достигает результата.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/motivation/%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc-%d1%83%d1%81%d0%bf%d0%b5%d1%85%d0%b0-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Дайджест ссылок №10</title>
		<link>http://sheremetov.com/links/link10/</link>
		<comments>http://sheremetov.com/links/link10/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 23:21:57 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[ссылки]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[автоформат]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=409</guid>
		<description><![CDATA[
список библиотек на AS3 от Adrian Parr
плагин для автоформата флекс кода
статья про "Операциональные преобразования", сути того что происходит с wave в момент редактирования её несколькими пользователями
Доходчивое разъясение того что такое RDF, а также, её перепечатка с незначительными изменениями на хабре.

]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.adrianparr.com/?p=83">список библиотек на AS3</a> от Adrian Parr</li>
<li><a href="http://flexformatter.sourceforge.net">плагин</a> для автоформата флекс кода</li>
<li><a href="http://ru.wikipedia.org/?oldid=19384049">статья про "Операциональные преобразования"</a>, сути того что происходит с wave в момент редактирования её несколькими пользователями</li>
<li><a href="http://xmlhack.ru/texts/06/rdf-quickintro/rdf-quickintro.html">Доходчивое разъясение</a> того что такое RDF, а также, <a href="http://habrahabr.ru/blogs/sw/17946/">её перепечатка</a> с незначительными изменениями на хабре.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/link10/feed/</wfw:commentRss>
		<slash:comments>0</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>-&amp;gt;parse<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>-&amp;gt;getTriples<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>-&amp;gt;getSerializedArray<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> =&amp;gt; <span style="color: #ff0000;">'localhost'</span>,
	<span style="color: #ff0000;">'db_name'</span> =&amp;gt; <span style="color: #ff0000;">'db_name'</span>,
	<span style="color: #ff0000;">'db_user'</span> =&amp;gt; <span style="color: #ff0000;">'user'</span>,
	<span style="color: #ff0000;">'db_pwd'</span> =&amp;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>-&amp;gt;isSetUp<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>-&amp;gt;setUp<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>-&amp;gt;query<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>-&amp;gt;query<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>Мой взгляд на эволюцию в программировании</title>
		<link>http://sheremetov.com/programming/programming-evolution/</link>
		<comments>http://sheremetov.com/programming/programming-evolution/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 00:53:14 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[эволюция]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=440</guid>
		<description><![CDATA[Интересно наблюдать за&#160;тем как развивается индустрия программирования. Некоторые технологии прошли уже несколько витков развития, некоторые, только начинают закручиваться в&#160;спираль. Безусловно, никто не&#160;знает что ждет программистов в&#160;обозримом будущем, но&#160;почему&#160;бы не&#160;поразмышлять немного, опираясь на&#160;историю развития отрасли. Тяжело рассуждать обо всей индустрии целиком, так как она очень разнообразна. Постараемся следить только за&#160;основными вехами и&#160;течениями, в&#160;первую очередь, конечно, о&#160;популярных [...]]]></description>
			<content:encoded><![CDATA[<p>Интересно наблюдать за&nbsp;тем как развивается индустрия программирования. Некоторые технологии прошли уже несколько витков развития, некоторые, только начинают закручиваться в&nbsp;спираль. Безусловно, никто не&nbsp;знает что ждет программистов в&nbsp;обозримом будущем, но&nbsp;почему&nbsp;бы не&nbsp;поразмышлять немного, опираясь на&nbsp;историю развития отрасли. Тяжело рассуждать обо всей индустрии целиком, так как она очень разнообразна. Постараемся следить только за&nbsp;основными вехами и&nbsp;течениями, в&nbsp;первую очередь, конечно, о&nbsp;популярных языках программирования. </p>
<p>Итак, у&nbsp;истоков программирования стояли высокие мужи из&nbsp;академических кругов. Все эти фортраны, форты, самаллтолки, лиспы задали очень высокую планку для программистов. Разработка програм была делом нелегким, из-за несовершенства операционных систем, отсутствия общепринятых стандартов, многообразия платформ. Далее,&nbsp;&mdash; эпоха C.&nbsp;Еще дальше, когда количество кода в&nbsp;приложениях стало лавинообразно увеличиваться, а&nbsp;организовывать разработку команд программистов, стало гораздо сложнее, при том, что порог вхождения необходимо было уменьшать. Постепенно наступала эпоха ООП. Бизнес и&nbsp;конкуренция требовали многократного использования кода и&nbsp;высокой скорости разработки без ущерба качеству. Мало-помалу программные компоненты, библиотеки, модули стали играть очень важную роль, и&nbsp;постепенно особенности языка стали уходить на&nbsp;второй план. При плюс-минус аналогичном синтаксисе все популярные языки были очень похожи. Появились всевозможные средства визуального проектирования и&nbsp;программирования (VB, delphi, java, c#). Производители операционных систем, в&nbsp;свою очередь, пытаясь облегчить жизнь программистам, старались реализовать максимум функционала компонент на&nbsp;уровне системы, сделав софт &laquo;легче&raquo;, &laquo;быстрее&raquo; и&nbsp;по&nbsp;возможности более жестко привязанным к&nbsp;платформе. С&nbsp;другой стороны, программисты, пытаясь облегчить процесс разработки, унифицировать его стали реализовывать всевозможные программные микроплатформы, фреймворки, скрывая за&nbsp;программными абстракциями всевозможные технологии, аппаратные и&nbsp;программные платформы, предоставляя программистам весьма высокий уровень абстракции и&nbsp;позволяя фокусироваться на&nbsp;конкретных бизнес-задачах. </p>
<p>Мы&nbsp;живем в&nbsp;очень интересное время. Похоже, производительность процессоров не&nbsp;будет расти так быстро, как это было на&nbsp;протяжении последних тридцати лет, и&nbsp;программистам придется решать проблемы производительности &laquo;ростом вширь&raquo;. C&nbsp;другой стороны, обилие платформ и языков заставляет абстрагироваться программистов еще больше, в&nbsp;этом направлении появляется еще одно новое (или правильнее было&nbsp;бы сказать, хорошо забытое старое) веяние: dsl (domain specific language), специализированные языки разработанные для решения конкретных задач. Огромным преимуществом dsl, является максимальный фокус на&nbsp;предметной области решаемой задачи и&nbsp;максимально абстрактный подход, при том что конечная платформа зависит лишь от&nbsp;среды интерпретации. В&nbsp;связке с&nbsp;хорошим IDE этот подход позволит предоставить пользователям настолько простой язык, для решения их&nbsp;задач, насколько они сами того захотят (или&nbsp;ли&nbsp;же визуальную среду разработки), а&nbsp;программистам полную свободу по&nbsp;выполнению пользовательских сценариев. Надо сказать что написание dsl внутри языка было популярным уже в&nbsp;60е годы, в&nbsp;среде программистов на&nbsp;лисп, но&nbsp;этот подход настолько опередил время, что не&nbsp;прижился в&nbsp;широких массах программистской среды и&nbsp;только сейчас набирает, как мне кажется, обороты. В&nbsp;принципе, уже сейчас, заметно сильное разделение между программистами &laquo;скриптописателями&raquo; и&nbsp;&laquo;платформостроителями&raquo;, а&nbsp;со&nbsp;временем, по&nbsp;мере того как уровень среднего пользователя подрастет этот разрыв станет еще более очевидным. </p>
<p>Как&nbsp;бы то&nbsp;ни&nbsp;было, уверен, мы&nbsp;еще застанем и&nbsp;увидим эти перемены.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/programming/programming-evolution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Анализируем отчет о килобайтах во флекс приложении</title>
		<link>http://sheremetov.com/flex/size-report-analyse/</link>
		<comments>http://sheremetov.com/flex/size-report-analyse/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 18:12:54 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=430</guid>
		<description><![CDATA[Бывает надо разобраться куда&#160;же уходят сотни килобайт и&#160;без того огромного флекс приложения. Классический способ,&#160;&#8212; сгенерировать репорт добавив ключ компиляции типа &#171;-link-report=report.xml&#187; в&#160;&#171;Menu&#160;&#8212; Project&#160;&#8212; Properties&#160;&#8212; Flex Compiler&#160;&#8212; Additional compiler arguments&#187;. После компиляции имеем огромный XML&#160;вида:
&#160;
&#60;report&#62;
  &#60;scripts&#62;
    &#60;script name=&#34;...\framework.swc(mx/core/EventPriority)&#34; mod=&#34;1201055703673&#34; size=&#34;755&#34; optimizedsize=&#34;400&#34;&#62;
      &#60;def id=&#34;mx.core:EventPriority&#34; /&#62;
&#60;pre id=&#34;Object&#34; /&#62;
  [...]]]></description>
			<content:encoded><![CDATA[<p>Бывает надо разобраться куда&nbsp;же уходят сотни килобайт и&nbsp;без того огромного флекс приложения. Классический способ,&nbsp;&mdash; сгенерировать репорт добавив ключ компиляции типа &laquo;-link-report=report.xml&raquo; в&nbsp;&laquo;Menu&nbsp;&mdash; Project&nbsp;&mdash; Properties&nbsp;&mdash; Flex Compiler&nbsp;&mdash; Additional compiler arguments&raquo;. После компиляции имеем огромный XML&nbsp;вида:</p>
<pre class="xml">&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;report<span style="font-weight: bold; color: black;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;scripts<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;script</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;...\framework.swc(mx/core/EventPriority)&quot;</span> <span style="color: #000066;">mod</span>=<span style="color: #ff0000;">&quot;1201055703673&quot;</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">&quot;755&quot;</span> <span style="color: #000066;">optimizedsize</span>=<span style="color: #ff0000;">&quot;400&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;def</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.core:EventPriority&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;pre</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;Object&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.core:mx_internal&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;AS3&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/script<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;script</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;_plainStyle.as&quot;</span> <span style="color: #000066;">mod</span>=<span style="color: #ff0000;">&quot;9223372036854775807&quot;</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">&quot;798&quot;</span> <span style="color: #000066;">optimizedsize</span>=<span style="color: #ff0000;">&quot;640&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;def</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;_plainStyle&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;pre</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;Object&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.core:IFlexModuleFactory&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.styles:StyleManager&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;AS3&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.styles:CSSStyleDeclaration&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/script<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/scripts<span style="font-weight: bold; color: black;">&gt;</span></span></span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/report<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre>
<p>Анализировать его не очень то и просто. Гугл подсказал несколько вариантов разбора этого XML:</p>
<ol>
<li><a href="http://blog.iconara.net/2007/02/25/visualizing-mxmlcs-link-report/">При помощи XSLT</a></li>
<li>С помощью <a href="http://joeberkovitz.com/blog/2007/04/08/secret-life-of-swfs/">небольшого приложения</a></li>
</ol>
<p>Я предлагаю альтернативный и&nbsp;наглядный способ анализа, при помощи excel:</p>
<ul>
<li>Первое что надо сделать,&nbsp;&mdash; это добавить первой строкой &laquo;< ?xml version="1.0" encoding="UTF-8" ?>&raquo;</li>
<li>Открываем XML</li>
<li>Выбираем в&nbsp;диалоге &laquo;As&nbsp;an&nbsp;XML&nbsp;table&raquo;. Имеем все данные в&nbsp;таблице.</li>
<li>Имело&nbsp;бы смысл сгруппировать модули и&nbsp;посмотреть суммарный размер каждого.</li>
<li>Выделяем интересующие нас данные.</li>
<li>Нажимаем Insert&nbsp;&mdash; Pivot Table (сводная тадлица).</li>
<li>В&nbsp;появившемся окне кликаем чекбокс возле name и&nbsp;перетяиваем optimizedsize в&nbsp;Values. В&nbsp;Value Field Settings меняем функцию с&nbsp;Count (сейчас показывает количество группировок для каждого модуля) на&nbsp;Sum</li>
<li>Сортируем по&nbsp;убыванию размера модулей.</li>
</ul>
<p>Должно получится что-то типа такого:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/01/screen.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/01/screen.gif" alt="screen" title="screen" width="800" height="516" class="alignnone size-full wp-image-431" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flex/size-report-analyse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
