<?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>Blog &#187; разработка</title>
	<atom:link href="http://karta39.ru/blog/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://karta39.ru/blog</link>
	<description>Разные мысли и идеи :)</description>
	<lastBuildDate>Tue, 21 Feb 2012 08:02:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>typename</title>
		<link>http://karta39.ru/blog/2011/03/06/typename/</link>
		<comments>http://karta39.ru/blog/2011/03/06/typename/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 10:50:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[разработка]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[g++]]></category>
		<category><![CDATA[typename]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=540</guid>
		<description><![CDATA[впервые столкнулся с ключевым словом typename
прочитать что это и зачем можно здесь:
http://alenacpp.blogspot.com/2006/08/typename.html
а я столкнулся при портировании проекта из MS VC++ 2008 под Linux g++ 4.4.5
пример:
template
void function(T1&#38; src, unsigned int n)
{
...
std::map ::iterator I;
...
}
VC++ всем доволен, а вот g++ на эту строчку ругнулся
error: expected ‘;’ before ‘I’
получается компилятор не может понять что от него хотят, т.о. для [...]]]></description>
			<content:encoded><![CDATA[<p>впервые столкнулся с ключевым словом typename<br />
прочитать что это и зачем можно здесь:<br />
<a href="http://alenacpp.blogspot.com/2006/08/typename.html">http://alenacpp.blogspot.com/2006/08/typename.html</a></p>
<p>а я столкнулся при портировании проекта из MS VC++ 2008 под Linux g++ 4.4.5</p>
<p>пример:<br />
<code>template<br />
void function(T1&amp; src, unsigned int n)<br />
{<br />
...<br />
std::map ::iterator I;<br />
...<br />
}</code></p>
<p>VC++ всем доволен, а вот g++ на эту строчку ругнулся<br />
<code>error: expected ‘;’ before ‘I’</code></p>
<p>получается компилятор не может понять что от него хотят, т.о. для исправления ошибки необходимо в начале строчки прописать <strong>typename</strong>:<br />
<code>typename std::map ::iterator I;</code><br />
и всё в шоколаде <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>аналогично решается ошибка в строке:<br />
<code>for(T1::iterator I = src.begin(); I != src.end(); ++I) {</code><br />
добавляем<br />
<code>for(typename T1::iterator I = src.begin(); I != src.end(); ++I) {</code></p>
<p>такие дела.</p>
<p><strong>Вывод:</strong><br />
<strong>typename</strong> нужен для облегчения задачи компилятору при парсинге различных загадочных выражений.<br />
Ключевое слово <strong>typename</strong> позволяет разрешить недоразумения, явно сказав компилятору, где речь идет о типе.</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2011/03/06/typename/","typename")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2011/03/06/typename/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>уроки по OpenCV &#8211; шаг за шагом</title>
		<link>http://karta39.ru/blog/2010/10/04/opencv-step-by-step/</link>
		<comments>http://karta39.ru/blog/2010/10/04/opencv-step-by-step/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 19:21:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[инструменты]]></category>
		<category><![CDATA[исследования]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[OpenCV]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=524</guid>
		<description><![CDATA[
1. OpenCV шаг за шагом. Введение.
2. Установка.
и т.д.
okbm("http://karta39.ru/blog/2010/10/04/opencv-step-by-step/","уроки по OpenCV &#38;#8211; шаг за шагом")]]></description>
			<content:encoded><![CDATA[<p><a href="http://robocraft.ru/tag/OpenCV/"><img src="http://robocraft.ru/files/opencv/opencv-logo-cat.png" /></a><br />
<a href="http://robocraft.ru/blog/computervision/264.html">1. OpenCV шаг за шагом. Введение.</a><br />
<a href="http://robocraft.ru/blog/computervision/265.html">2. Установка.</a><br />
и <a href="http://robocraft.ru/page/opencv/">т.д.</a></p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/10/04/opencv-step-by-step/","уроки по OpenCV &amp;#8211; шаг за шагом")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/10/04/opencv-step-by-step/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Кнопка для трансляции в Twitter, Facebook, vkontakte</title>
		<link>http://karta39.ru/blog/2010/05/27/send-to-twitter-facebook-vkontakte/</link>
		<comments>http://karta39.ru/blog/2010/05/27/send-to-twitter-facebook-vkontakte/#comments</comments>
		<pubDate>Thu, 27 May 2010 07:12:47 +0000</pubDate>
		<dc:creator>noonv</dc:creator>
				<category><![CDATA[разработка]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[vkontakte]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=502</guid>
		<description><![CDATA[function sendToTwitter (obj, sText, sTag){
var sTwit = sText.replace(/(\s)+/g, '+');
var hashTag = '+%23'+sTag;
location.href = 'http://twitter.com/home/?status='+sTwit+hashTag;
return false;
}
function  sendToFacebook (obj, sUrl){
location.href = 'http://www.facebook.com/sharer.php?u='+sUrl;
return false;
}
 function  sendToVkontakte (obj, sUrl){
location.href = 'http://vkontakte.ru/share.php?url='+sUrl;
return false;
}
и, соответственно, html-код:
&#60;a title=&#187;Добавить в Twitter&#187; href=&#187;http://twitter.com/home?status=RT @idea2ru Книга: http://idea2.ru/blog/clever_mind/708.html&#187; target=&#187;_blank&#187; rel=&#187;nofollow&#187;&#62;&#60;/a&#62;
&#60;a title=&#187;Добавить в Facebook&#187;  href=&#187;http://www.facebook.com/sharer.php?u=http://idea2.ru/blog/clever_mind/708.html&#187; target=&#187;blank&#187; rel=&#187;nofollow&#187;&#62;&#60;/a&#62;
&#60;a title=&#187;Добавить в ВКонтакте&#187;  href=&#187;http://vkontakte.ru/share.php?url=http://idea2.ru/blog/clever_mind/708.html&#187; target=&#187;blank&#187; rel=&#187;nofollow&#187;&#62;&#60;/a&#62;
okbm("http://karta39.ru/blog/2010/05/27/send-to-twitter-facebook-vkontakte/","Кнопка для трансляции в Twitter, [...]]]></description>
			<content:encoded><![CDATA[<p><code>function sendToTwitter (obj, sText, sTag){<br />
var sTwit = sText.replace(/(\s)+/g, '+');<br />
var hashTag = '+%23'+sTag;<br />
location.href = 'http://twitter.com/home/?status='+sTwit+hashTag;<br />
return false;<br />
}</code></p>
<p><code>function  sendToFacebook (obj, sUrl){<br />
location.href = 'http://www.facebook.com/sharer.php?u='+sUrl;<br />
return false;<br />
}</code></p>
<p><code> function  sendToVkontakte (obj, sUrl){<br />
location.href = 'http://vkontakte.ru/share.php?url='+sUrl;<br />
return false;<br />
}</code></p>
<p>и, соответственно, html-код:</p>
<p>&lt;a title=&raquo;Добавить в Twitter&raquo; href=&raquo;http://twitter.com/home?status=RT @idea2ru Книга: http://idea2.ru/blog/clever_mind/708.html&raquo; target=&raquo;_blank&raquo; rel=&raquo;nofollow&raquo;&gt;&lt;/a&gt;</p>
<p>&lt;a title=&raquo;Добавить в Facebook&raquo;  href=&raquo;http://www.facebook.com/sharer.php?u=http://idea2.ru/blog/clever_mind/708.html&raquo; target=&raquo;blank&raquo; rel=&raquo;nofollow&raquo;&gt;&lt;/a&gt;</p>
<p>&lt;a title=&raquo;Добавить в ВКонтакте&raquo;  href=&raquo;http://vkontakte.ru/share.php?url=http://idea2.ru/blog/clever_mind/708.html&raquo; target=&raquo;blank&raquo; rel=&raquo;nofollow&raquo;&gt;&lt;/a&gt;</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/05/27/send-to-twitter-facebook-vkontakte/","Кнопка для трансляции в Twitter, Facebook, vkontakte")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/05/27/send-to-twitter-facebook-vkontakte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Кнопка для трансляции в Buzz</title>
		<link>http://karta39.ru/blog/2010/05/27/send-to-buzz/</link>
		<comments>http://karta39.ru/blog/2010/05/27/send-to-buzz/#comments</comments>
		<pubDate>Thu, 27 May 2010 06:44:49 +0000</pubDate>
		<dc:creator>noonv</dc:creator>
				<category><![CDATA[разработка]]></category>
		<category><![CDATA[Buzz]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=497</guid>
		<description><![CDATA[function sendToBuzz(obj, sText, sUrl){
location.href = 'http://www.google.com/reader/link?url='+sUrl+'&#38;title='+sText+'&#38;srcURL='+DIR_WEB_ROOT;
return false;
}
или html-код
&#60;a title=&#187;в Buzz&#187; rel=&#187;nofollow&#187; href=&#187;http://www.google.com/reader/link?url=http://idea2.ru/blog/clever_mind/708.html&#38;amp;title=Книга&#38;amp;srcURL=http://idea2.ru&#187; target=&#187;_blank&#187; onfocus=&#187;blur();&#187;&#62;&#60;img src=&#187;buzz_it.png&#187; alt=&#187;" /&#62;&#60;/a&#62;
okbm("http://karta39.ru/blog/2010/05/27/send-to-buzz/","Кнопка для трансляции в Buzz")]]></description>
			<content:encoded><![CDATA[<p><code>function sendToBuzz(obj, sText, sUrl){<br />
location.href = 'http://www.google.com/reader/link?url='+sUrl+'&amp;title='+sText+'&amp;srcURL='+DIR_WEB_ROOT;<br />
return false;<br />
}</code><br />
или html-код</p>
<p>&lt;a title=&raquo;в Buzz&raquo; rel=&raquo;nofollow&raquo; href=&raquo;http://www.google.com/reader/link?url=http://idea2.ru/blog/clever_mind/708.html&amp;amp;title=Книга&amp;amp;srcURL=http://idea2.ru&raquo; target=&raquo;_blank&raquo; onfocus=&raquo;blur();&raquo;&gt;&lt;img src=&raquo;buzz_it.png&raquo; alt=&raquo;" /&gt;&lt;/a&gt;</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/05/27/send-to-buzz/","Кнопка для трансляции в Buzz")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/05/27/send-to-buzz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GDirections без маркеров</title>
		<link>http://karta39.ru/blog/2010/03/30/gdirection-whithout-markers/</link>
		<comments>http://karta39.ru/blog/2010/03/30/gdirection-whithout-markers/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 14:16:08 +0000</pubDate>
		<dc:creator>noonv</dc:creator>
				<category><![CDATA[разработка]]></category>
		<category><![CDATA[GDirections]]></category>
		<category><![CDATA[getPolyline]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[маркер. GMap]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=490</guid>
		<description><![CDATA[//Don't supply a map to GDirections()
var direction = new GDirections(); 

//Make sure {getPolyline:true} is given to the load function
direction.load("here to there", {getPolyline:true});

GEvent.addListener(direction,
                   "load",
                   function(){ map.addOverlay(direction.getPolyline()); }
);
okbm("http://karta39.ru/blog/2010/03/30/gdirection-whithout-markers/","GDirections без маркеров")]]></description>
			<content:encoded><![CDATA[<pre><code>//Don't supply a map to GDirections()
var direction = new GDirections(); 

//Make sure {getPolyline:true} is given to the load function
direction.load("here to there", {getPolyline:true});

GEvent.addListener(direction,
                   "load",
                   function(){ map.addOverlay(direction.getPolyline()); }
);</code></pre>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/03/30/gdirection-whithout-markers/","GDirections без маркеров")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/03/30/gdirection-whithout-markers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>var_dump на javascript</title>
		<link>http://karta39.ru/blog/2010/03/30/var_dump-on-javascript/</link>
		<comments>http://karta39.ru/blog/2010/03/30/var_dump-on-javascript/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 12:16:33 +0000</pubDate>
		<dc:creator>noonv</dc:creator>
				<category><![CDATA[разработка]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[var_dump]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=482</guid>
		<description><![CDATA[
function var_dump(arr,level) {
var dumped_text = "";
if(!level) level = 0;
//The padding given at the beginning of the line.
var level_padding = "";
for(var j=0;j&#60;level+1;j++) level_padding += "    ";
if(typeof(arr) == 'object') { //Array/Hashes/Objects
for(var item in arr) {
var value = arr[item];
if(typeof(value) == 'object') {
dumped_text += level_padding + "'" + item + "' ...\n";
dumped_text += var_dump(value,level+1);
} else {
dumped_text += level_padding [...]]]></description>
			<content:encoded><![CDATA[<p><code></p>
<div>function var_dump(arr,level) {</div>
<div>var dumped_text = "";</div>
<div>if(!level) level = 0;</div>
<div>//The padding given at the beginning of the line.</div>
<div>var level_padding = "";</div>
<div>for(var j=0;j&lt;level+1;j++) level_padding += "    ";</div>
<div>if(typeof(arr) == 'object') { //Array/Hashes/Objects</div>
<div>for(var item in arr) {</div>
<div>var value = arr[item];</div>
<div>if(typeof(value) == 'object') {</div>
<div>dumped_text += level_padding + "'" + item + "' ...\n";</div>
<div>dumped_text += var_dump(value,level+1);</div>
<div>} else {</div>
<div>dumped_text += level_padding + "'" + item + "' =&gt; \"" + value + "\"\n";</div>
<div>}</div>
<div>}</div>
<div>} else { //Stings/Chars/Numbers etc.</div>
<div>dumped_text = "===&gt;"+arr+"&lt;===("+typeof(arr)+")";</div>
<div>}</div>
<div>return dumped_text;</div>
<div>}</div>
<p></code></p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/03/30/var_dump-on-javascript/","var_dump на javascript")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/03/30/var_dump-on-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Геолокация на JavaScript</title>
		<link>http://karta39.ru/blog/2010/03/04/javascript-geolocation/</link>
		<comments>http://karta39.ru/blog/2010/03/04/javascript-geolocation/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 18:41:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[разработка]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=474</guid>
		<description><![CDATA[Используя javascript geolocation framework можно (после подтверждения со стороны пользователя) приблизительно определить положение пользователя. (IE эту возможность не поддерживает)
читать подробности
okbm("http://karta39.ru/blog/2010/03/04/javascript-geolocation/","Геолокация на JavaScript")]]></description>
			<content:encoded><![CDATA[<p>Используя <a href="http://code.google.com/p/geo-location-javascript/">javascript geolocation framework</a> можно (после подтверждения со стороны пользователя) приблизительно определить положение пользователя. (IE эту возможность не поддерживает)<br />
<a href="http://vremenno.net/js/javascript-geolocation/">читать подробности</a></p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/03/04/javascript-geolocation/","Геолокация на JavaScript")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/03/04/javascript-geolocation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL разница между датами</title>
		<link>http://karta39.ru/blog/2010/03/03/sql-datediff/</link>
		<comments>http://karta39.ru/blog/2010/03/03/sql-datediff/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 16:49:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[разработка]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[дата]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[разница]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=470</guid>
		<description><![CDATA[везде предлагается использовать функцию DATEDIFF()
но когда мне потребовалось высчитать разницу между датами в днях &#8211; у меня это почему-то не вышло 
пришлось изобрести велосипед (аж две штуки):
1. (UNIX_TIMESTAMP(`date2`)-UNIX_TIMESTAMP(`date1`))/86400)
2. (TO_DAYS(`date2`) - TO_DAYS(`date1`))
например, узнать сколько прошло дней от даты `date1`:
(TO_DAYS(NOW()) - TO_DAYS(`date1`))
вот собственно и всё  
okbm("http://karta39.ru/blog/2010/03/03/sql-datediff/","SQL разница между датами")]]></description>
			<content:encoded><![CDATA[<p>везде предлагается использовать функцию DATEDIFF()<br />
но когда мне потребовалось высчитать разницу между датами в днях &#8211; у меня это почему-то не вышло <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
пришлось изобрести велосипед (аж две штуки):<br />
1. <code>(UNIX_TIMESTAMP(`date2`)-UNIX_TIMESTAMP(`date1`))/86400)</code><br />
2. <code>(TO_DAYS(`date2`) - TO_DAYS(`date1`))</code></p>
<p>например, узнать сколько прошло дней от даты `date1`:<br />
<code>(TO_DAYS(NOW()) - TO_DAYS(`date1`))</code></p>
<p>вот собственно и всё <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/03/03/sql-datediff/","SQL разница между датами")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/03/03/sql-datediff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LiveStreet и Arduino/CraftDuino</title>
		<link>http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/</link>
		<comments>http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 08:47:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[идеи]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[CraftDuino]]></category>
		<category><![CDATA[livestreet]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[блог]]></category>
		<category><![CDATA[идея]]></category>
		<category><![CDATA[модуль]]></category>
		<category><![CDATA[плата]]></category>
		<category><![CDATA[управлять]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=465</guid>
		<description><![CDATA[
Здесь я уже писал, как ардуина может читать RSS-ленту. Используя тот же принцип можно сделать следующий шаг и научить ардуину вести свой блог 

Научить Arduino/CraftDuino вести свои заметки не составило большого труда, но я уже не смог остановиться и написал небольшой модуль для LiveStreet, который не только сохраняет данные от Arduino/CraftDuino, но и позволяет через [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://idea2.ru/files/lsarduino/DSC01297-.jpg"/><br />
<a href="http://robocraft.ru/blog/arduino/104.html">Здесь</a> я уже писал, как ардуина может читать RSS-ленту. Используя тот же принцип можно сделать следующий шаг и научить ардуину вести свой блог <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
<span id="more-465"></span><br />
Научить Arduino/CraftDuino вести свои заметки не составило большого труда, но я уже не смог остановиться и написал <a href="http://idea2.ru/files/lsarduino/lsarduino.zip">небольшой модуль</a> для LiveStreet, который не только сохраняет данные от Arduino/CraftDuino, но и позволяет через сайт управлять своей платой <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<cut></p>
<p>Вот как это работает:<br />
<img src="http://idea2.ru/files/lsarduino/1-.png"/><br />
плата Arduino/CraftDuino подключается к ПК через USB-шнурок.<br />
На ПК работает скрипт на питоне (lsarduino.py), который через определённые промежутки времени опрашивает плату и высылает данные в БД сайта.<br />
POST-запрос на -=сайт=-/include/ajax/lsarduino_add_note.php</p>
<p>Плата может возвращать всё что угодно &#8211; <a href="http://www.robocraft.ru/blog/projects/26.html">влажность</a> земли в горшке с цветком, освещённость вашей комнаты, температуру воды в аквариуме&#8230; нафантазировать можно всё что угодно <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>На стороне сайта так же можно добавить задания для платы, которые потом выгружаются в виде xml-ки.<br />
xml-ка генерируется по адресу -=сайт=-/lsarduino/actions<br />
вида<br />
<code><?xml version="1.0" encoding="utf-8"?><br />
<actions><br />
	<action><br />
		<id>14</id><br />
		<userid>1</userid><br />
		<todo>1</todo><br />
		<todotext>test</todotext><br />
		<tododate>2009-11-10 11:37:42</tododate><br />
		<todostatus>1</todostatus><br />
	</action><br />
</actions></code></p>
<p>xml загружается питоновским скриптом на ПК, парсится и через USB-шнурок задания передаются на плату, которая их выполняет.</p>
<p>В примере модуля &#8211; плата просто зажигает и гасит светодиод, но через соответствующую развязку может управлять <a href="http://ukrduino.blogspot.com">кофейником</a>, светом, моторчиком робота&#8230; опять же &#8211; фантазиям предела нет <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>В данной версии задание &#8211; это число от 1 до 9<br />
в примере:<br />
	1 &#8211; зажечь светодиод<br />
	2 &#8211; погасить светодиод</p>
<p>для работы из-под питона с последовательным портом потребуется библиотека<br />
<a href="http://pyserial.sourceforge.net">pySerial</a></p>
<p>для работы pySerial под ОС Windows понадобится ещё библиотека<br />
<a href="http://starship.python.net/crew/mhammond/win32/Downloads.html">pyWin32</a> </p>
<p>у меня всё прекрасно работало на Python 2.5.1 <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>в скрипте нужно настроить номер COM-порта Вашей платы:<br />
SERIAL_PORT = &#8216;COM18&#8242;</p>
<p>адрес сайта для работы, логин и пароль учётной записи<br />
USER_LS_SITE_NOTE = &#8216;http://ВАШСАЙТ.ru/include/ajax/lsarduino_add_note.php&#8217;<br />
USER_LS_SITE_ACTION = &#8216;http://ВАШСАЙТ.ru/include/ajax/lsarduino_set_status.php&#8217;<br />
XML_TODO = &#8216;http://ВАШСАЙТ.ru/lsarduino/actions&#8217;<br />
USER_LOGIN = &#8216;ВАШ_ЛОГИН&#8217;<br />
USER_PASS = &#8216;ВАШ_ПАРОЛЬ&#8217;</p>
<p>что делает lsarduino.py:<br />
смотрим main() и видим там только бесконечный цикл, в котором</p>
<p>сначала получаются данные от платы<br />
- для этого ей посылается байт &laquo;0&#8243; на что плата может вернуть данные или просто сказать &laquo;Hello <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &raquo;</p>
<p>, а затем считывается xml-ка с заданиями для платы<br />
Получив задание, скрипт изменяет его статус на сайте с &laquo;Новый&raquo; на &laquo;Загружен&raquo; и записывает это число в COM-порт.<br />
Ардуина считывает число с порта и в операторе<br />
<code>switch( r )<br />
    {<br />
      case 0:<br />
        Serial.println("Hello <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ");<br />
        break;<br />
      case 1:<br />
        digitalWrite(ledPin, HIGH);   // sets the LED on<br />
        Serial.println("3");<br />
      break;<br />
      case 2:<br />
         digitalWrite(ledPin, LOW);    // sets the LED off<br />
        Serial.println("3");<br />
      break;<br />
      default:<br />
        Serial.println("4");<br />
      break;<br />
    }</code><br />
производит необходимые действия.<br />
Как видите, ардуина так же отвечает в COM-порт о выполнении задания &laquo;3&#8243; &#8211; &laquo;Выполнен&raquo;<br />
Питоновский скрипт считывает ответ от платы и записывает его в статус задания на сайте</p>
<p>варианты статуса задания:<br />
	(&#8216;1&#8242;, &#8216;Новый&#8217;),<br />
	(&#8216;2&#8242;, &#8216;Загружен&#8217;),<br />
	(&#8216;3&#8242;, &#8216;Выполнен&#8217;),<br />
	(&#8216;4&#8242;, &#8216;Отклонён&#8217;),<br />
	(&#8216;5&#8242;, &#8216;Не выполнен&#8217;),<br />
	(&#8216;6&#8242;, &#8216;Отменён&#8217;);</p>
<p>Вот и всё <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://idea2.ru/files/lsarduino/lsarduino.zip">Скачать модуль</a>. (распространяется бесплатно при условии сохранения копирайтов <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><u>Примечания:</u></p>
<p>! Обратите внимание: при работе на плате должен быть снят джампер автосброса (AutoReset), чтобы плата не перегружалась каждый раз при открытии COM-порта !</p>
<p>Для большей надёжности – лучше не использовать в питоновском  скрипте бесконечный цикл – лучше просто прописать вызов соответствующих функций и периодически вызывать скрипт через cron или планировщик задач (или nncron).<br />
Для этого в архиве есть файл lsarduino-nocycle.py</p>
<p>сообщения и задания прошлых недель удаляются из базы, но если Вы хотите их оставить &#8211; просто закомментируйте строчки:</p>
<p><code>$this->DeleteOldNotes();<br />
$this->DeleteOldTodo();</code><br />
в конце функции CreateTables()<br />
файла classes\modules\lsarduino\mapper\LsArduino.mapper.class.php</p>
<p>Как теперь можно развить эту идею?  Да как угодно – взять за основу этот модуль или сделать свой модуль для того же wordpress-а и дать возможность вашему дому, цветку, коту, etc. Вести свой блог вместе с Вами!</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/","LiveStreet и Arduino/CraftDuino")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Идеальный Интерфейс &#8211; Круг друзей :)</title>
		<link>http://karta39.ru/blog/2010/01/17/iface-friends/</link>
		<comments>http://karta39.ru/blog/2010/01/17/iface-friends/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 07:57:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[идеи]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[iFace]]></category>
		<category><![CDATA[livestreet]]></category>
		<category><![CDATA[moowheel]]></category>
		<category><![CDATA[дерево]]></category>
		<category><![CDATA[друг]]></category>
		<category><![CDATA[идеальный]]></category>
		<category><![CDATA[идея]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[круг]]></category>
		<category><![CDATA[модуль]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=459</guid>
		<description><![CDATA[
Нам всем не хватает идеальности и я решил восполнить это факт маленьким модулем  
Пока он делает только одно &#8211; отображает круг друзей в профиле пользователя.
Надеюсь это только начало!  
Установка
1. соответствующим образом скопировать файлы
теперь вы можете зайти на
ttp://ваш_сайт/iface
ввести логин пользователя, нажать &#171;Пуск!&#187; и получить круг его друзей  
чтобы этот круг отображался в профиле [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://livestreet.ru/uploads/images/4/8/f/e/934/21dae09b73.png" alt="" /><br />
Нам всем не хватает <a href="http://idea2.ru/blog/design/558.html">идеальности</a> и я решил восполнить это факт маленьким модулем <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Пока он делает только одно &#8211; отображает круг друзей в профиле пользователя.<br />
Надеюсь это только начало! <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-459"></span></p>
<p><strong>Установка</strong><br />
1. соответствующим образом скопировать файлы</p>
<p>теперь вы можете зайти на<br />
ttp://ваш_сайт/iface<br />
ввести логин пользователя, нажать &laquo;Пуск!&raquo; и получить круг его друзей <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>чтобы этот круг отображался в профиле -<br />
заменить оригинальный templates/skin/new/actions/ActionProfile/whois.tpl на тот, что в архиве.</p>
<p>Надеюсь на сохранение копирайтов <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Рабочий пример можно посмотреть на <a href="http://idea2.ru/profile/noonv">http://idea2.ru/profile/noonv</a></p>
<p>Предложения и заявки на добавление дополнительных фишечек приветствуются <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Модуль можно скачать <a href="http://idea2.ru/files/iface/iFace.zip">здесь</a> <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Как вы, наверное, догадались &#8211; для отображения используется библиотека <a href="http://www.unwieldy.net/projects/moowheel/">moowheel</a><br />
В будущем, конечно, хочется отображать настоящее дерево друзей, чтобы посмотреть все &laquo;шесть рукопожатий&raquo; <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Для этого нужно раскурить <a href="http://jsviz.org">jsviz</a> и попытаться сделать что-то вроде <a href="http://kylescholz.com/projects/speaking/tae2006/music/#B000YXMMAE">этого</a> %)<br />
Ага! да я спалил идею <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  К чему бы это? А всё просто &#8211; я очень надеюсь, что в комментариях все поделятся своими взглядами на идеальный интерфейс <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
В свою очередь обещаю, что самые интересные постараюсь реализовать и включить в этот бесплатный модуль <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Успехов!</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/01/17/iface-friends/","Идеальный Интерфейс &amp;#8211; Круг друзей :)")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/01/17/iface-friends/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.404 seconds -->

