<?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>Melnaron</title>
	<atom:link href="http://melnaron.net/feed" rel="self" type="application/rss+xml" />
	<link>http://melnaron.net</link>
	<description>Серьёзная веб-разработка</description>
	<lastBuildDate>Wed, 02 Jun 2010 11:23:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Китайские карты в 3D поражают воображение</title>
		<link>http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd</link>
		<comments>http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd#comments</comments>
		<pubDate>Wed, 02 Jun 2010 10:24:03 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Amazing Web]]></category>
		<category><![CDATA[Maps]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=311</guid>
		<description><![CDATA[Недавно в своем Google Reader&#8217;е я наткнулся на интересную запись о том, что китайцы начали рисовать карты своих городов в 3D! Отрисовано уже несколько десятков городов, и, скажу я вам, детализация просто поражает воображение! Прямо SimCity какой-то! Побродить по картам &#8220;вживую&#8221; можно тут: http://sh.o.cn/, http://www.o.cn/, http://gz.o.cn/, http://www.jc08.com/. Если вам нехватает понимания китайских иероглифов, то советую [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно в своем <a href="http://www.google.com/reader/shared/melnaron">Google Reader&#8217;е</a> я наткнулся на <a href="http://mezarkabul.livejournal.com/71582.html">интересную запись</a> о том, что китайцы начали рисовать карты своих городов в 3D! Отрисовано уже несколько десятков городов, и, скажу я вам, детализация просто поражает воображение!</p>

<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-1' title='cn_map (1)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-1-150x150.jpg" class="attachment-thumbnail" alt="cn_map (1)" title="cn_map (1)" /></a>
<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-2' title='cn_map (2)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-2-150x150.jpg" class="attachment-thumbnail" alt="cn_map (2)" title="cn_map (2)" /></a>
<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-3' title='cn_map (3)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-3-150x150.jpg" class="attachment-thumbnail" alt="cn_map (3)" title="cn_map (3)" /></a>
<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-4' title='cn_map (4)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-4-150x150.jpg" class="attachment-thumbnail" alt="cn_map (4)" title="cn_map (4)" /></a>
<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-5' title='cn_map (5)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-5-150x150.jpg" class="attachment-thumbnail" alt="cn_map (5)" title="cn_map (5)" /></a>
<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-6' title='cn_map (6)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-6-150x150.jpg" class="attachment-thumbnail" alt="cn_map (6)" title="cn_map (6)" /></a>
<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-7' title='cn_map (7)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-7-150x150.jpg" class="attachment-thumbnail" alt="cn_map (7)" title="cn_map (7)" /></a>
<a href='http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/attachment/cn_map-8' title='cn_map (8)'><img width="150" height="150" src="http://melnaron.net/wordpress/wp-content/uploads/2010/06/cn_map-8-150x150.jpg" class="attachment-thumbnail" alt="cn_map (8)" title="cn_map (8)" /></a>

<p>Прямо SimCity какой-то!</p>
<p>Побродить по картам &#8220;вживую&#8221; можно тут: <a href="http://sh.o.cn/">http://sh.o.cn/</a>, <a href="http://www.o.cn/">http://www.o.cn/</a>, <a href="http://gz.o.cn/">http://gz.o.cn/</a>, <a href="http://www.jc08.com/">http://www.jc08.com/</a>.</p>
<p>Если вам нехватает понимания китайских иероглифов, то советую вам установить <a href="http://www.google.com/chrome">Google Chrome</a> &#8211; он в автоматическом режиме предлагает перевести страници на ваш язык.</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/web/%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b8%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d1%8b-%d0%b2-3d-%d0%bf%d0%be%d1%80%d0%b0%d0%b6%d0%b0%d1%8e%d1%82-%d0%b2%d0%be%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peer-to-Peer Chat in Flash</title>
		<link>http://melnaron.net/development/peer-to-peer-chat-in-flash</link>
		<comments>http://melnaron.net/development/peer-to-peer-chat-in-flash#comments</comments>
		<pubDate>Sun, 30 May 2010 18:40:45 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[P2P]]></category>
		<category><![CDATA[Stratus]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=261</guid>
		<description><![CDATA[peer-to-peer p2p chat in flash with adobe stratus service]]></description>
			<content:encoded><![CDATA[<p>Этой статьей я хочу открыть новую тему в своем блоге, посвященную разработке на Flash/Flex/ActionScript3. Итак приступим.</p>
<h3>Flash Player 10.0</h3>
<p>Начиная с версии 10.0 во Flash Player появилась очень интересная возможность, которая позволяет устанавливать прямые соединения между плеерами при помощи сервиса <a href="http://labs.adobe.com/technologies/stratus/" target="_blank">Stratus</a>:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">nc = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">NetConnection</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
nc.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>NetStatusEvent.<span style="color: #006600;">NET_STATUS</span>, netStatusHandler<span style="color: #66cc66;">&#41;</span>;<br />
nc.<span style="color: #0066CC;">connect</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'rtmfp://stratus.adobe.com/YOUR_DEVELOPER_KEY_HERE'</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Этот сервис выполняет роль организатора: подключившись к нему ваш клиент получает уникальный Peer ID, зная который, другие такие же как и вы клиенты, могут напрямую подключаться к вашему клиенту и подписываться на данные, которые вы публикуете. </p>
<p>Давайте рассмотрим эту схему более подробно, по шагам:</p>
<ul>
<li>Flash-клиент в вашем браузере соединяется с сервисом <a href="http://labs.adobe.com/technologies/stratus/" target="_blank">Stratus</a></li>
<li>В клиенте создается поток (NetStream), в который начинается публикация какого-то контента</li>
<li>Другие flash-клиенты также соединяются с сервисом <a href="http://labs.adobe.com/technologies/stratus/" target="_blank">Stratus</a></li>
<li>В них создаются потоки, которые подключаются к вашему клиенту по его Peer ID и подписываются на контент от него</li>
</ul>
<p>Это самая простая схема: один клиент публикует контент, а другие подписываются на получение контента.</p>
<p>Но давайте попробуем усложнить эту схему. Что если каждый клиент и публикует и подписывается на потоки всех известных ему клиентов?</p>
<p><span id="more-261"></span></p>
<h3>Чат</h3>
<p>Сейчас я много занимаюсь разработкой приложений для коммуникации. Это и аудио/видео чаты, и обычные текстовые чаты (кто-нибудь помнит мой Mel.Chat?). И в связи с этим я хочу поделиться небольшим примером разработки простого текстового чата, основанного на технологии Peer-to-Peer или P2P. В отличии от старичка Mel.Chat&#8217;а, который основан на постоянной долбежке сервера AJAX-запросами, в этом чате все очень похоже на технологию клиент/сервер. Создаются необходимые соединения, которые просто остаются открыты столько сколько нужно и просто ожидают данные, которые отправляют (публикуют) другие клиенты. Но если с технологией клиент/сервер все более или менее понятно (все клиенты соединяются с одним определенным сервером, и все коммуникации осуществляются путем отправки сообщений на сервер, который в свою очередь отправляет сообщения всем подключенным к нему клиентам), то с P2P у нас так не получится, потому что тут у нас нет какого-то определенного сервера, а каждый отдельный клиент должен быть подписан на всех других участвующих в чате клиентов.</p>
<p>Схема ясна, переходим к практике.</p>
<h3>Сервис регистрации Peer ID</h3>
<p>Во-первых необходимо организовать сервис обмена Peer ID (далее фингерпринт) между клиентами. Это нужно для того, чтобы каждый новый подключившийся клиент мог самостоятельно найти хотябы одного активного в данный момент клиента и установить с ним соединение. Ниже представлен простейший код такого сервиса на PHP &#038; MySQL:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<br />
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'lib/db.php'</span><span style="color: #339933;">;</span><br />
<br />
Db<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'database'</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span>Db<span style="color: #339933;">::</span><span style="color: #004000;">error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_TABLE'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'p2pchat'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$cooldown</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">900</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 15 min</span><br />
<span style="color: #000088;">$limit</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// удаляем все истекшие записи</span><br />
Db<span style="color: #339933;">::</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span>DB_TABLE<span style="color: #339933;">,</span> <span style="color: #0000ff;">'timestamp &lt; '</span><span style="color: #339933;">.</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$time</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$cooldown</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'insert'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'insert'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// выбираем последние обновленные записи для попытки соединения с ними</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$fingerprints</span> <span style="color: #339933;">=</span> Db<span style="color: #339933;">::</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span>DB_TABLE<span style="color: #339933;">,</span> <span style="color: #0000ff;">'fingerprint'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'timestamp DESC'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$limit</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// записываем в базу свой фингерпринт</span><br />
&nbsp; &nbsp; Db<span style="color: #339933;">::</span><span style="color: #004000;">insert</span><span style="color: #009900;">&#40;</span>DB_TABLE<span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fingerprint'</span> <span style="color: #339933;">=&gt;</span> Db<span style="color: #339933;">::</span><span style="color: #004000;">escape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'insert'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'timestamp'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$time</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// отправляем в ответ выбранные записи</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fingerprints</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$fingerprints</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$response</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$fp</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fingerprint'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'update'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'update'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// обновляем свой фингерпринт</span><br />
&nbsp; &nbsp; Db<span style="color: #339933;">::</span><span style="color: #004000;">update</span><span style="color: #009900;">&#40;</span>DB_TABLE<span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'timestamp'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$time</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fingerprint = &quot;'</span><span style="color: #339933;">.</span>Db<span style="color: #339933;">::</span><span style="color: #004000;">escape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'update'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Давайте я немного расскажу о принципе работы этого сервиса (или трекера). После того как ваш flash-клиент установил соединение с сервисом <a href="http://labs.adobe.com/technologies/stratus/">Stratus</a> он отправляет GET-запрос с вашим Peer ID в качестве параметра сервису регистрации фингерпринтов. Ваш фингерпринт сохраняется в базе с текущим временем. Также сервис выбирает из базы несколько последних добавленных/обновленных фингерпринтов и отправляет их в ответ вашему клиенту. Клиент пытается установить соединение с каждым из полученных фингерпринтов:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> loader:URLLoader = <span style="color: #000000; font-weight: bold;">new</span> URLLoader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
loader.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">COMPLETE</span>, <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">log</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Insert fingerprint complete'</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">fps</span>:<span style="color: #0066CC;">Array</span> = <span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">target</span>.<span style="color: #0066CC;">data</span>.<span style="color: #0066CC;">split</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">','</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// перебираем все полученные фингерпринты,</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// и пытаемся с ними соединиться</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">0</span>; i <span style="color: #66cc66;">&lt;</span> <span style="color: #0066CC;">fps</span>.<span style="color: #0066CC;">length</span>; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">fps</span><span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #0066CC;">length</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; initRecvStream<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">fps</span><span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #0066CC;">try</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; loader.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'http://url/to/p2pchatreg.php?insert='</span>+myPeerID<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span> <span style="color: #0066CC;">catch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">error</span>:<span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">log</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Unable to insert my peer id'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>И тут начинается самое интересное&#8230;</p>
<h3>Оповещение о новом участнике</h3>
<p>Так как запрос регистрации возвращает ограниченное количество последних обновленных фингерпринтов, наш клиент не сможет подключиться ко всем участвующим в чате клиентам, но этого и не потребуется, потому что клиенты сами &#8220;рассказывают&#8221; друг другу о подключении новых участников к чату, а также оповещают подключающихся к ним клиентах о своих именах:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">client.<span style="color: #006600;">onPeerConnect</span> = <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>subscriber:<span style="color: #0066CC;">NetStream</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Boolean</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// когда ко мне присоединяется подписчик, проверяем,</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// если это новый подписчик, то оповещаем всех о нем,</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// а также подписываемся на его поток</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span> hasSubscriptionTo<span style="color: #66cc66;">&#40;</span>subscriber.<span style="color: #006600;">farID</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sendStream.<span style="color: #0066CC;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'onBroadcastNewSubscriber'</span>, subscriber.<span style="color: #006600;">farID</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; initRecvStream<span style="color: #66cc66;">&#40;</span>subscriber.<span style="color: #006600;">farID</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// ... и конечно же оповещаем его о своем имени</span><br />
&nbsp; &nbsp; subscriber.<span style="color: #0066CC;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'onPeerNameUpdate'</span>, myPeerID, myName<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;<br />
<span style="color: #66cc66;">&#125;</span>;</div></td></tr></tbody></table></div>
<p>Итак, подключившись хотя бы к одному активному участнику чата или пиру (от англ. peer), тот немедленно проверяет свой список подключенных к нему пиров, и если вашего клиента с его уникальным peer id там еще нет, то он оповещает всех о новом подключенном к конференции клиенте, и все уже связанные друг с другом пиры сами устанавливают соединение с вами. Таким образом образуется самоформирующаяся группа участников конференции (во Flash Player 10.1 всю эту механику берет на себя новый класс NetGroup + GroupSpecifier).</p>
<h3>Актуальность фингерпринтов</h3>
<p>Актуальность активных в данный момент фингерпринтов &#8211; это ключевой момент всего приложения. Чтобы поддерживать актуальность своего фингерпринта каждый активный клиент через определенный промежуток времени отправляет GET-запрос на сервис регистрации фингерпринтов с просьбой обновить время активности своего фингерпринта:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">// запускаем таймер который будет тикать каждые 5 минут (300 секунд)</span><br />
<span style="color: #000000; font-weight: bold;">var</span> timer:Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">300</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
timer.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, <span style="color: #000000; font-weight: bold;">function</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><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> loader:URLLoader = <span style="color: #000000; font-weight: bold;">new</span> URLLoader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; loader.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">COMPLETE</span>, <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">log</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Update fingerprint complete'</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">try</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loader.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'http://url/to/p2pchatreg.php?update='</span>+myPeerID<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span> <span style="color: #0066CC;">catch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">error</span>:<span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">log</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Unable to update my peer id'</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
timer.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Таким образом новые участники конференции всегда получают пачку самых последних активных пиров на данный момент. И подключившись хотя бы к одному активному пиру, тот в свою очередь, оповещает всех о новом участнике.</p>
<h3>Заключение</h3>
<p>В итоге, у нас получается достаточно простой чат, который не использует сервер для передачи сообщений, и поддерживает большое количество клиентов онлайн. Мгновенно отправляет и получает сообщения. К такому чату можно добавить аудио/видео звонки и передачу файлов (аля Skype). Основными требованиями для работы такого чата являются наличие установленного Flash Player 10.0+ и разрешенный UDP-траффик.</p>
<p>В следующей статье я расскажу об использовании более удобных средств для организации групп при помощи классов NetGroup и GroupSpecifier из FlashPlayer 10.1.</p>
<p>Если вы хотите быть в курсе моих новых публикаций о flash и peer-to-peer, то не стесняйтесь и подписывайтесь на <a href="http://melnaron.net/feed" target="_blank">RSS-ленту моего блога</a> или <a href="http://twitter.com/Melnaron" target="_blank">следите за мной в Twitter</a>.</p>
<p><a href="http://melnaron.net/flash/p2pchat/" target="_blank"><strong>Живой пример P2PChat</strong></a> &#8211; Чтобы опробовать чат откройте его в 2х или более окнах браузера, расположите их рядом друг с другом и попробуйте что-нибудь написать.</p>
<p><a href="http://melnaron.net/files/P2PChat.zip"><strong>Скачать исходные коды P2PChat</strong></a> &#8211; Для Flash Builder 4 + Flex SDK 4. Для работы со Стратусом вам необходимо получить &#8220;stratus developer key&#8221; зайдя на страницу <a href="http://labs.adobe.com/technologies/stratus/">Stratus</a> и перейдя по ссылке &#8220;Signup for a Stratus beta developer key&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/development/peer-to-peer-chat-in-flash/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MEL.Chat: Теперь с MySQL!</title>
		<link>http://melnaron.net/projects/melchat-%d1%82%d0%b5%d0%bf%d0%b5%d1%80%d1%8c-%d1%81-mysql</link>
		<comments>http://melnaron.net/projects/melchat-%d1%82%d0%b5%d0%bf%d0%b5%d1%80%d1%8c-%d1%81-mysql#comments</comments>
		<pubDate>Sun, 22 Feb 2009 17:55:33 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[mel.chat]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=166</guid>
		<description><![CDATA[Итак, как я и обещал, выкладываю новую бета-версию чата, теперь с поддержкой СУБД MySQL. Скачать MEL.Chat 2.0b3 А теперь немного об установке и настройке серверной части. Для начала откройте файл server/cfg.php и отредактируйте данные для подключения к MySQL-серверу. Затем запустите скрипт server/setup.php для создания необходимых таблиц в БД. Вот и все, что нужно сделать. Далее [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, как я и обещал, выкладываю новую бета-версию чата, теперь с поддержкой СУБД MySQL.</p>
<p><a href="http://melchat.googlecode.com/files/mel.chat_2.0b3.zip">Скачать MEL.Chat 2.0b3</a></p>
<p>А теперь немного об установке и настройке серверной части. Для начала откройте файл server/cfg.php и отредактируйте данные для подключения к MySQL-серверу. Затем запустите скрипт server/setup.php для создания необходимых таблиц в БД. Вот и все, что нужно сделать. Далее заходим в чат под любым никнеймом и регистрируемся как администратор с помощью команды /reg [ваш_пароль].</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/projects/melchat-%d1%82%d0%b5%d0%bf%d0%b5%d1%80%d1%8c-%d1%81-mysql/feed</wfw:commentRss>
		<slash:comments>120</slash:comments>
		</item>
		<item>
		<title>Бета-версия чата доступна для скачивания!</title>
		<link>http://melnaron.net/projects/%d0%b1%d0%b5%d1%82%d0%b0-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d1%8f-%d1%87%d0%b0%d1%82%d0%b0-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%81%d0%ba%d0%b0%d1%87%d0%b8%d0%b2%d0%b0</link>
		<comments>http://melnaron.net/projects/%d0%b1%d0%b5%d1%82%d0%b0-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d1%8f-%d1%87%d0%b0%d1%82%d0%b0-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%81%d0%ba%d0%b0%d1%87%d0%b8%d0%b2%d0%b0#comments</comments>
		<pubDate>Fri, 16 Jan 2009 19:52:10 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[chat]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=162</guid>
		<description><![CDATA[Хочу сообщить всем кто ждет новую версию чата, что бета-версия стала доступна для скачивания. В этой версии доступны все команды которые пока были запланированы для управления чатом &#8220;из командной строки&#8221;. А теперь перейдем к самому интересному, а именно к скачиванию и установке&#8230; Для начала скачайте архив с чатом. Распакуйте его и залейте содержимое к себе [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу сообщить всем кто ждет новую версию чата, что бета-версия стала доступна для скачивания. В этой версии доступны все команды которые пока были запланированы для управления чатом &#8220;из командной строки&#8221;. А теперь перейдем к самому интересному, а именно к скачиванию и установке&#8230;<span id="more-162"></span></p>
<p>Для начала скачайте <a href="http://melchat.googlecode.com/files/mel.chat_2.0b2.zip">архив с чатом</a>. Распакуйте его и залейте содержимое к себе на сервер. Требования к серверу такие: PHP 5.2+ и SQLite 2+. Далее откройте чат в браузере и зайдите под вашим ником (пароль вводить не надо &#8211; у вас его еще нет). Если все прошло успешно и вы вошли в чат &#8211; используйте команду <strong>/reg &lt;ваш пароль&gt;</strong> для того, чтобы зарегистрироваться как администратор (имейте ввиду, что первый зарегистрированный в чате пользователь автоматически становится администратором). Теперь вы администратор и вам доступны все команды, которые можно посмотреть используя команду <strong>/help</strong>.</p>
<p>Для начала я думаю достаточно. Позже я напишу более подробную и развернутую инструкцию, а пока, если возникнут вопросы &#8211; задавайте их тут, в комментариях!</p>
<p>Важно! Все для всех замеченных ошибок или неточностей пожалуйста заводите записи в баг-трекере на <a href="http://code.google.com/p/melchat/issues/" target="_blank">этой странице</a>.</p>
<p>P.S. Прошу прощения за то, что на сайте какое-то время глючил плагин и выдавал черный экран с крутилкой!</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/projects/%d0%b1%d0%b5%d1%82%d0%b0-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d1%8f-%d1%87%d0%b0%d1%82%d0%b0-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%81%d0%ba%d0%b0%d1%87%d0%b8%d0%b2%d0%b0/feed</wfw:commentRss>
		<slash:comments>61</slash:comments>
		</item>
		<item>
		<title>MEL.Chat 2.0 &#8211; Бета-тест!</title>
		<link>http://melnaron.net/projects/melchat-20-%d0%b1%d0%b5%d1%82%d0%b0-%d1%82%d0%b5%d1%81%d1%82</link>
		<comments>http://melnaron.net/projects/melchat-20-%d0%b1%d0%b5%d1%82%d0%b0-%d1%82%d0%b5%d1%81%d1%82#comments</comments>
		<pubDate>Thu, 18 Sep 2008 15:10:14 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[mel.chat]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=47</guid>
		<description><![CDATA[Итак, бета-тест открыт! Проверьте ваши почтовые ящики на наличие приглашения! Прошу всех кто будет тестировать чат оставлять свои отзывы или замечания в комментариях к этому посту!]]></description>
			<content:encoded><![CDATA[<p>Итак, бета-тест открыт! Проверьте ваши почтовые ящики на наличие приглашения! Прошу всех кто будет тестировать чат оставлять свои отзывы или замечания в комментариях к этому посту!</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/projects/melchat-20-%d0%b1%d0%b5%d1%82%d0%b0-%d1%82%d0%b5%d1%81%d1%82/feed</wfw:commentRss>
		<slash:comments>67</slash:comments>
		</item>
		<item>
		<title>MEL.Chat 2.0 &#8211; Уже совсем скоро!</title>
		<link>http://melnaron.net/projects/melchat-20-%d1%83%d0%b6%d0%b5-%d1%81%d0%be%d0%b2%d1%81%d0%b5%d0%bc-%d1%81%d0%ba%d0%be%d1%80%d0%be</link>
		<comments>http://melnaron.net/projects/melchat-20-%d1%83%d0%b6%d0%b5-%d1%81%d0%be%d0%b2%d1%81%d0%b5%d0%bc-%d1%81%d0%ba%d0%be%d1%80%d0%be#comments</comments>
		<pubDate>Tue, 26 Aug 2008 17:23:15 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[mel.chat]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=45</guid>
		<description><![CDATA[Приветствую всех кто ждет новую версию MEL.Chat&#8217;а! Итак, на данный момент разработка достигла стадии бета-версии, и мне необходима ваша помощь в тестировании чата в &#8220;боевых&#8221; условиях. Чтобы принять участие в бета-тесте, вам необходимо перейти на страницу регистрации, ссылка на которую приведена ниже, и ввести адрес электронной почты и имя пользователя. Регистрация будет открыта некоторое время, [...]]]></description>
			<content:encoded><![CDATA[<p>Приветствую всех кто ждет новую версию MEL.Chat&#8217;а! Итак, на данный момент разработка достигла стадии бета-версии, и мне необходима ваша помощь в тестировании чата в &#8220;боевых&#8221; условиях. Чтобы принять участие в бета-тесте, вам необходимо перейти на страницу регистрации, ссылка на которую приведена ниже, и ввести адрес электронной почты и имя пользователя. Регистрация будет открыта некоторое время, спустя которое будет запущен сам бета-тест. Как только это произойдет &#8211; вы получите приглашение со всей необходимой для тестирования информацией.</p>
<h1 style="text-align: center;"><a href="http://melnaron.net/chat-beta/">Регистрация на бета-тест!</a></h1>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/projects/melchat-20-%d1%83%d0%b6%d0%b5-%d1%81%d0%be%d0%b2%d1%81%d0%b5%d0%bc-%d1%81%d0%ba%d0%be%d1%80%d0%be/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Вызов JavaScript-функции по ее названию</title>
		<link>http://melnaron.net/development/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-javascript-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8-%d0%bf%d0%be-%d0%b5%d0%b5-%d0%bd%d0%b0%d0%b7%d0%b2%d0%b0%d0%bd%d0%b8%d1%8e</link>
		<comments>http://melnaron.net/development/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-javascript-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8-%d0%bf%d0%be-%d0%b5%d0%b5-%d0%bd%d0%b0%d0%b7%d0%b2%d0%b0%d0%bd%d0%b8%d1%8e#comments</comments>
		<pubDate>Tue, 10 Jun 2008 16:35:53 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=44</guid>
		<description><![CDATA[Иногда в JavaScript&#8217;е бывает необходимо выполнить функцию зная только ее название, и это название содержится в строке, например вот так: 1var funcName = 'someFunc'; Перед мной стояла такая задача: в AIR-приложении нужно было выполнять функции, названия которых приходят с AJAX-ответом. Sandbox AIR&#8217;а в следствии ограничений безопасности не позволяет выполнять функции при помощи eval&#8217;а. Так что, [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда в JavaScript&#8217;е бывает необходимо выполнить функцию зная только ее название, и это название содержится в строке, например вот так:</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> funcName <span style="color: #339933;">=</span> <span style="color: #3366CC;">'someFunc'</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Перед мной стояла такая задача: в AIR-приложении нужно было выполнять функции, названия которых приходят с AJAX-ответом. Sandbox AIR&#8217;а в следствии ограничений безопасности не позволяет выполнять функции при помощи eval&#8217;а. Так что, ограничения стояли такие: не использовать функции eval() и setTimeout()/setInterval().<br />
<span id="more-44"></span><br />
Немного по-google-в я нашел множество вопросов о том как это сделать, но к сожалению без ответов. И решение не заставило себя долго ждать. Итак, идея моя была в следующем: все функции, которые предполагается вызывать таким образом, нужно собрать в одном массиве (объекте), и вызывать их обращаясь к ним как к элементам ассоциативного массива. Вот такое решение получилось в итоге:</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">// собираем нужные функции в массиве</span><br />
<span style="color: #003366; font-weight: bold;">var</span> actions <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; someFunc<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>params<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
<br />
&nbsp; &nbsp; goodFunc<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>params<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// это название функции допустим переданное в ответе на AJAX-запрос</span><br />
<span style="color: #003366; font-weight: bold;">var</span> funcName <span style="color: #339933;">=</span> <span style="color: #3366CC;">'someFunc'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// а это параметры функции переданные все в том же ответе</span><br />
<span style="color: #003366; font-weight: bold;">var</span> funcParams <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>title<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Test Title&quot;</span><span style="color: #339933;">,</span> content<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Test Content&quot;</span><span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// вызываем функцию</span><br />
actions<span style="color: #009900;">&#91;</span>funcName<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>funcParams<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Если кто-то ищет решение этой задачи, то надеюсь мой небольшой хинт вам в этом поможет!</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/development/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-javascript-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8-%d0%bf%d0%be-%d0%b5%d0%b5-%d0%bd%d0%b0%d0%b7%d0%b2%d0%b0%d0%bd%d0%b8%d1%8e/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MEL.Chat: Немного подробностей о новой версии</title>
		<link>http://melnaron.net/projects/melchat-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d1%81%d1%82%d0%b5%d0%b9-%d0%be-%d0%bd%d0%be%d0%b2%d0%be%d0%b9-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%b8</link>
		<comments>http://melnaron.net/projects/melchat-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d1%81%d1%82%d0%b5%d0%b9-%d0%be-%d0%bd%d0%be%d0%b2%d0%be%d0%b9-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%b8#comments</comments>
		<pubDate>Mon, 02 Jun 2008 13:01:06 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[mel.chat]]></category>

		<guid isPermaLink="false">http://melnaron.net/?p=33</guid>
		<description><![CDATA[Пока новая версия чата постепенно двигается к релизу я хочу опубликовать по поводу нее некоторую информацию. Итак, &#8220;вкусности&#8221; новой версии: Технология AJAX+Comet, благодаря которой теперь нету постоянных х-секундных запросов к серверу. С помощью этой связки потребление траффика во время длительного нахождения в чате снижено в 100 раз. А также это дает возможность мгновенно передавать отправленные [...]]]></description>
			<content:encoded><![CDATA[<p>Пока новая версия чата постепенно двигается к релизу я хочу опубликовать по поводу нее некоторую информацию. Итак, &#8220;вкусности&#8221; новой версии:</p>
<ul>
<li>Технология AJAX+Comet, благодаря которой теперь нету постоянных х-секундных запросов к серверу. С помощью этой связки потребление траффика во время длительного нахождения в чате снижено в 100 раз. А также это дает возможность мгновенно передавать отправленные сообщения в чаты пользователей.</li>
<li>Вход в чат без регистрации. Нужно только ввести свой псевдоним и нажать кнопку.</li>
<li>Улучшенное звуковое сопровождение. При каждом событии, будь то новое сообщение, новый шепот или же ошибка соединения, чат воспроизводит различные хорошо-запоминающиеся звуки.</li>
<li>Возможность зарегистрировать свой псевдоним с помощью команды &#8220;/reg пароль&#8221;.</li>
<li>Разнообразные команды для управления чатом.</li>
<li>Пользователи разного уровня доступа: от гостя до администратора.</li>
<li>Возможность вставлять в сообщения графические смайлики.</li>
<li>А также многое другое&#8230;</li>
</ul>
<p>Также вы можете посмотреть некоторые скриншоты новой версии чата<span id="more-33"></span>:</p>
<p style="text-align: center;"><a rel="lightbox-melchat-1" title="Диалог входа в чат." href="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_1.png"><img class="aligncenter size-thumbnail wp-image-39" src="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_1-150x150.png" alt="" width="150" height="150" /></a><a rel="lightbox-melchat-1" title="Список пользователей онлайн." href="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_2.png"><img class="aligncenter size-thumbnail wp-image-40" src="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_2-150x150.png" alt="" width="150" height="150" /></a><a rel="lightbox-melchat-1" title="Выбор статуса." href="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_3.png"><img class="aligncenter size-thumbnail wp-image-41" src="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_3-150x150.png" alt="" width="150" height="150" /></a><a rel="lightbox-melchat-1" title="Управление и дополнительные функции чата." href="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_4.png"><img class="aligncenter size-thumbnail wp-image-42" src="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_4-150x150.png" alt="" width="150" height="150" /></a><a rel="lightbox-melchat-1" title="Всплывающая панель со смайликами." href="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_5.png"><img class="aligncenter size-thumbnail wp-image-43" src="http://melnaron.net/wordpress/wp-content/uploads/2008/06/melchat_5-150x150.png" alt="" width="150" height="150" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/projects/melchat-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d1%81%d1%82%d0%b5%d0%b9-%d0%be-%d0%bd%d0%be%d0%b2%d0%be%d0%b9-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%b8/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Переезжаю на WordPress&#8230;</title>
		<link>http://melnaron.net/uncategorized/%d0%bf%d0%b5%d1%80%d0%b5%d0%b5%d0%b7%d0%b6%d0%b0%d1%8e-%d0%bd%d0%b0-wordpress</link>
		<comments>http://melnaron.net/uncategorized/%d0%bf%d0%b5%d1%80%d0%b5%d0%b5%d0%b7%d0%b6%d0%b0%d1%8e-%d0%bd%d0%b0-wordpress#comments</comments>
		<pubDate>Wed, 30 Apr 2008 12:31:42 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://melnaron.net/wordpress/?p=32</guid>
		<description><![CDATA[Зачем изобретать велосипед? Вот и я о том же. Зачем тратить кучу времени, чтобы написать свою CMS, когда итак есть куча отличных движков для сайтов? А это время лучше потратить на что-то более полезное и нужное. Сейчас я постепенно переношу весь контент (благо его не очень много) на WordPress. К сожалению скорее всего много комментариев [...]]]></description>
			<content:encoded><![CDATA[<p>Зачем изобретать велосипед? Вот и я о том же. Зачем тратить кучу времени, чтобы написать свою CMS, когда итак есть куча отличных движков для сайтов? А это время лучше потратить на что-то более полезное и нужное.</p>
<p>Сейчас я постепенно переношу весь контент (благо его не очень много) на WordPress. К сожалению скорее всего много комментариев будет удалено, а оставшиеся комментарии (самые информативные) я постараюсь перенести.</p>
<p>Хочу также сообщить немного информации по поводу новой версии MEL.Chat&#8217;a: Движок чата уже переписан и теперь использует технологию <a href="http://en.wikipedia.org/wiki/Comet_%28programming%29">Comet (Long polling)</a> по полной программе. Также я отказался от использования AJAX-библиотеки XAJAX. В связи с этим траффик потребляемый чатом уменьшен в 100 (!) раз. Помимо этого добавлены статусы пользователей, множество команд, разнообразные звуковые эффекты. Немного изменен дизайн чата. Улучшена система входа в чат (не требуется регистрация). Теперь достаточно ввести свой псевдоним и нажать кнопку и вы тут же попадаете в чат. И еще многое другое. Возможно в ближайшее время я выложу бета-версию для тестирования.</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/uncategorized/%d0%bf%d0%b5%d1%80%d0%b5%d0%b5%d0%b7%d0%b6%d0%b0%d1%8e-%d0%bd%d0%b0-wordpress/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MEL.Sound: Обновление 1.2.2</title>
		<link>http://melnaron.net/projects/melsound-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-122</link>
		<comments>http://melnaron.net/projects/melsound-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-122#comments</comments>
		<pubDate>Sat, 23 Feb 2008 10:32:10 +0000</pubDate>
		<dc:creator>Melnaron</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mel.sound]]></category>
		<category><![CDATA[sound]]></category>

		<guid isPermaLink="false">http://melnaron.net/wordpress/?p=31</guid>
		<description><![CDATA[Обновился проект MEL.Sound. Изменения: jQuery версии 1.2.3 (последняя на данный момент); Исправлен баг, когда анимация повторялась несколько раз при быстром, многократном включении/отключении звуков; Картинки для анимации включения/отключения звуков были слиты в одну; В браузерах Firefox и Opera анимация включения/отключения звуков теперь всегда отображается в середине окна, вне зависимости от скролла; Скачать новую версию можно со [...]]]></description>
			<content:encoded><![CDATA[<p>Обновился проект MEL.Sound. Изменения:</p>
<ul>
<li>jQuery версии 1.2.3 (последняя на данный момент);</li>
<li>Исправлен баг, когда анимация повторялась несколько раз при быстром, многократном включении/отключении звуков;</li>
<li>Картинки для анимации включения/отключения звуков были слиты в одну;</li>
<li>В браузерах Firefox и Opera анимация включения/отключения звуков теперь всегда отображается в середине окна, вне зависимости от скролла;</li>
</ul>
<p>Скачать новую версию можно со <a href="/projects/melsound">страницы проекта</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://melnaron.net/projects/melsound-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-122/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
