<?xml version="1.0" encoding="UTF-8"?>
<rss 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/" version="2.0">

<channel>
	<title>Записки искателей</title>
	
	<link>http://voituk.kiev.ua</link>
	<description>while ( isAlive() ) {doCode(); doFun();}</description>
	<lastBuildDate>Sun, 29 Apr 2012 18:50:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/researchers" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="researchers" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>JavaScript на Диване – мой lightning talk на JSConf</title>
		<link>http://voituk.kiev.ua/2012/02/21/javascript-on-the-sofa-tv/</link>
		<comments>http://voituk.kiev.ua/2012/02/21/javascript-on-the-sofa-tv/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 10:02:01 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=2693</guid>
		<description><![CDATA[Про просьбе организаторов последней JSConf выкладываю свою презентацию и черновик доклада своего lightning talk под названием &#8220;JavaScript на Диване&#8221;. На самом деле черновик мало соответствует тому, что я говорил на самой конференции, потому лучше смотреть видео JavaScript на диване View more presentations from voituk Уверен, что все здесь присутствующие, наверняка написали свою первую строку JavaScript [...]]]></description>
			<content:encoded><![CDATA[<p>Про просьбе организаторов последней <a href="http://jsgroup.com.ua/" target="_blank" rel="nofollow">JSConf</a> выкладываю свою презентацию и черновик доклада своего lightning talk под названием &#8220;JavaScript на Диване&#8221;.<span id="more-2693"></span></p>
<p><em>На самом деле черновик мало соответствует тому, что я говорил на самой конференции, потому лучше смотреть видео</em></p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/5xhqSy_mxA4?rel=0" frameborder="0" allowfullscreen></iframe></p>
<div style="width:595px" id="__ss_11655929"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/voituk/javascript-11655929" title="JavaScript на диване" target="_blank">JavaScript на диване</a></strong> <object id="__sse11655929" width="595" height="497"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jsconf1presentation-120219005900-phpapp02&#038;stripped_title=javascript-11655929&#038;userName=voituk" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"/><embed name="__sse11655929" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jsconf1presentation-120219005900-phpapp02&#038;stripped_title=javascript-11655929&#038;userName=voituk" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="595" height="497"></embed></object>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/voituk" target="_blank">voituk</a> </div>
</p></div>
<p>Уверен, что все здесь присутствующие, наверняка написали свою первую строку JavaScript кода в внутри HTML-тега &lt;script&gt;. И наверняка у многих это случилось если еще не в 90-х, то как минимум в начале 2000-ных.</p>
<p>C тех пор и до недавнего времени JavaScript был “языком для интерактивных Web-страниц”. Тогда же и появился термин DHTML – такой HTML но Dynamic.<br />
Потом, лет так 7-8 назад, появился GMail и вдруг мир обнаружил существование XMLHttpRequest (Вуаля!).<br />
А за одно с ним появились Ajax и профессия Web Frontend Engineer.<br />
Все это счастье жило в браузере – сначала в десктопном, потом, с приходом Nokia WRT  и HTML5 –  в мобильном&#8230;<br />
Параллельно в полу-подпольном режиме существовал JavaScript в качестве скриптового языка внутри разных популярных и не очень приложений: это продукты Adobe, фреймворки для плагинов к Chrome, Opera, Mozilla, Apple Dashboard Widgets и встраеваемый Mozilla Rhino. Также JavaScript можно использовать при программировании интерактивных телефонных AТС (PBX).</p>
<p>В это же проскакивали вообще технологически странные решения поверх JavaScript – такие как например GWT, или тот же WebOS от Palm.</p>
<p>Позже появился серверный JavaScript. Поначалу в виде не выстрелевших поделок вроде фреймворка от Aptana (уже не помню точного названия),  а потом и в виде всем известного Node.js.<br />
(про ASP-код на JavaScript – я пожалуй не буду вспоминать :)</p>
<p>Эти 3 направления: браузер, скрипт-язык и сервер-сайд – это теперешние mainstream направления для JavaScript.</p>
<p>Я бы сейчас хотел еще рассказать про одну область применения JavaScript, которая по моему мнению станет mainstream-ом в течении ближайших пару лет – это телевизоры и разного рода ТВ-приставки (тюнеры, Set-Top-Box-ы). </p>
<p>Тема не очень то и новая, и насколько я знаю, как минимум один из здесь присутствующих с этим уже стыкался.<br />
Началось все с того, что Yahoo создал дефакто стандарт для  виджетов для ТВ – Yahoo TV Widgets.<br />
Их поддержали Samsung и выпустил серию ТВ-устройств, которые сейчас называются SmartTV.<br />
По сути они не сделали ничего особенного –  просто подключили телевизор в интернет и открыли платформу.<br />
Ну и конечно-же они позволили сторонним разработчика писать свои виджеты следуя спецификации Yahoo TV Widgets.<br />
Эффект был потрясающий – пользователи “писали кипятком” от возможности смотреть Youtube, читать Twitter или качать торренты прямо в собственном телевизоре.<br />
К тому же еще и Skype подлил масла в огонь – они сделали версию для ТВ с поддержкой USB web-камер.<br />
Параллельно с этим развивалось IP-телевидение, а вместе с ним и специальные IPTV-приставки для него, называемые Set-Top-Box-ы, которые, окромя основной задачи (показывать ТВ-каналы), предлагали уйму дополнительных интерактивных услуг.<br />
Например мой домашний провайдер позволяет заплатить кредиткой за ТВ+Интернет прямо с экрана телевизора.<br />
Типичным примером такого SetTopBox-ом является Apple TV – кроме телевидения over the internet, это еще и все прелести iTunes в красивой алюминиевой коробочке :)</p>
<p>Так вот возвращаясь к теме нашей сегодняшней встречи, большая часть того что видно зрителю на современном SetTopBox-е (как например окошки, менюшки, индикаторы, переключатели и тд) – это все JavaScript.<br />
Ну если быть откровенным то не просто JavaScript,  но еще и HTML c CSS-ом.<br />
Чаше всего все что вы видите на экране ТВ, и что не является аудио-видео-потоком – это JavaScript. Как то:<br />
 &#8211; Выбор каналов<br />
 &#8211; Регуляторы и индикаторы громкости, эквалайзеры<br />
 &#8211; Программы передач<br />
 &#8211; Интерактивные бегущие строки (a-la погода, курсы валют)<br />
 &#8211; Окошки c настройками самого Set-Top-Box или личного кабинета IPTV-провайдера (например состояние счета абонента)<br />
 &#8211; Интернет-видео: Youtube, Vevo, Vimeo<br />
 &#8211; Video On Demand медиатеки и Pay Per Watch системы<br />
 &#8211; Музыкальные проигрыватели или фото-слайдшоу<br />
 &#8211; Анимации и эффекты а-ля “видео-внутри-видео”<br />
 &#8211; Даже заказ пиццы из ближайшей пиццерии не вставая с дивана.</p>
<p>Все это реализуется на JavaScript.</p>
<p>Выглядит это где-то приблизительно так:</p>
<p>Технически – внутри работает браузер WebKit или Opera версии около 9.5-10, который крутится на микро-линуксе поверх какой-то PowerPC, ARM или аналогичной архитектуры (чтоб не грелся и не жужжал вентиляторами).<br />
Ко встроенному браузеру пригалается набор вне-браузерного JavaScript API для коммуникации с железом SetTopBox-a и иногда еще интерфейсы для управления дополнительными устройствами вроде USB-камеры или WiFi антенны.</p>
<p>Потомy с точки зрения программиста – разработка под телевизор или ТВ-приставку мало чем отличается от разработки под браузер.<br />
Единственно НО, которое нужно постоянно держать в голове – это то, что главный инструмент ввода от пользователя &#8211; это все-таки пульт дистанционного управления, и привычные для ТВ интерфейсы, немного отличаются от того, что мы привыкли видеть в WEB, как по дизайну, так и по паттернам использования :)</p>
<p>Спасибо за внимание.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=AoQ--tnD8LU:Xb54zCn17cg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=AoQ--tnD8LU:Xb54zCn17cg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=AoQ--tnD8LU:Xb54zCn17cg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=AoQ--tnD8LU:Xb54zCn17cg:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2012/02/21/javascript-on-the-sofa-tv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remove inactive MacPorts</title>
		<link>http://voituk.kiev.ua/2011/03/02/remove-inactive-macports/</link>
		<comments>http://voituk.kiev.ua/2011/03/02/remove-inactive-macports/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 10:38:32 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Mac OS X]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=2563</guid>
		<description><![CDATA[Небольшой quick tip для тех кто использует MacPorts у себя на Mac OS X &#8211; очистка неактивных портов: port echo inactive &#124; sed 's/ //g' &#124; xargs port uninstall Обратите внимаение что именно &#8220;port echo&#8221;, а не &#8220;port list&#8221; (почему именно так &#8211; не знаю) Исполнение такой комманды почти вдвое (с 8.3Gb до 4.6Gb) уменьшило [...]]]></description>
			<content:encoded><![CDATA[<p>Небольшой quick tip для тех кто использует MacPorts у себя на Mac OS X &#8211; очистка неактивных портов:</p>
<p><code>port echo inactive | sed 's/ //g' | xargs port uninstall</code></p>
<p>Обратите внимаение что именно &#8220;port echo&#8221;, а не &#8220;port list&#8221; (почему именно так &#8211; не знаю)</p>
<p>Исполнение такой комманды почти вдвое (с 8.3Gb до 4.6Gb) уменьшило место занятое под MacPorts (что в эпоху дороготоящих SSD винчестеров весьма не бесполезно)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=w93mcUnJzNA:0ZEJ2-29YYw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=w93mcUnJzNA:0ZEJ2-29YYw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=w93mcUnJzNA:0ZEJ2-29YYw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=w93mcUnJzNA:0ZEJ2-29YYw:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2011/03/02/remove-inactive-macports/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JSON Lint tool using Node.js</title>
		<link>http://voituk.kiev.ua/2011/02/08/json-lint-tool-using-node-js/</link>
		<comments>http://voituk.kiev.ua/2011/02/08/json-lint-tool-using-node-js/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 20:19:02 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=2423</guid>
		<description><![CDATA[История одной занозы в &#8230; или небольшая заметка о том, как быстро написать что-то полезное на node.js В последнее время много и часто приходится работать с HTTP-REST-JSON  API, в результате чего назрела необходимость в нормальном client tool для этого API. И если на роль полноценного HTTP-REST-клиента претендовать не приходится (первенство тут отдаем старому доброму консольному curl), [...]]]></description>
			<content:encoded><![CDATA[<p><em>История одной занозы в &#8230; или небольшая заметка о том, как быстро написать что-то полезное на node.js</em></p>
<p>В последнее время много и часто приходится работать с HTTP-REST-JSON  API, в результате чего назрела необходимость в нормальном client tool для этого API. И если на роль полноценного HTTP-REST-клиента претендовать не приходится (первенство тут отдаем старому доброму консольному <a href="http://curl.haxx.se/">curl</a>), то вот с &#8220;красивым&#8221; форматированием результата вызова API &#8211; приходилось повозиться.<br />
Порою доходило до того, что ввиду сложности структуры результата, приходилось запускать developers console <a href="http://webkit.org/">WebKit</a>-a, копировать в буфер обмена строку-результат запроса, и выполнять  что-то вроде:</p>
<pre><code lang="js">console.log(/*...long...long...long...string...goes...here..*/)</code></pre>
<p>Во процессе борьбы с таким неудобством, в какой-то момент в недрах сети была найдена утилита jsonlint, которая умела структурировано выводить на экран JSON-обьект (такой себе аналог <a href="http://xmlsoft.org/xmllint.html">xmllint</a>), но и с ней не сложилось &#8211; какие-то ее зависимости категорично отказывались устанавливаться посредством  MacPorts.</p>
<p>Вконце концов было принято решение набросать аналогичный tool самостоятельно.<br />
Среди кандидатов на язык разработки подобной мелочи были Groovy, <a href="http://code.google.com/p/groovypptest/">Groovy++</a>, php и Node.JS).<br />
Ввиду JavaScript-nature поставленной задачи грех было не воспользоваться Node.JS – и выбор оправдал мои ожидания.<br />
Всего 30 минут &#8220;курения&#8221; node.js Manual &amp; Documentation&#8221;, 10 строк кода, и нужнейшая утилита &#8220;в кармане&#8221;.</p>
<p>Исходный код приводить тут не буду – его можно <a href="https://github.com/voituk/Misc/blob/master/nodejs/jsonlint">поглядеть на github</a>, покажу лишь несколько примеров использования полученной мини-утилиты на примере Twitter API (команды вводить unix-консоли):</p>
<p>1. Информации о Twitter-аккаунте конкретного пользователя:<br />
<code>curl -s "http://api.twitter.com/1/users/show/voituk.json" | jsonlint  | less</code></p>
<p>2. Поиск в Twitter:<br />
<code>curl -s "http://search.twitter.com/search.json?q=@voituk" | jsonlint  | less</code></p>
<p>Установить или обновить такую полезную &#8220;тулзу&#8221; можно простой консольной командой:<br />
<code>curl https://github.com/voituk/Misc/raw/master/nodejs/jsonlint &gt; ~/bin/jsonlint &amp;&amp; chmod a+x !#:3</code><br />
<em>(как это сделать на Windows &#8211; не спрашивайте ибо я даже не представляю как установить на Windows сам Node.JS)</em></p>
<p>Вот так вот неожиданно все получилось легко и просто посредством Node.JS.<br />
Критика и пожелания приветствуются в коментариях. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=T-_D9ZXKF4A:aQQBWAyGle0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=T-_D9ZXKF4A:aQQBWAyGle0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=T-_D9ZXKF4A:aQQBWAyGle0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=T-_D9ZXKF4A:aQQBWAyGle0:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2011/02/08/json-lint-tool-using-node-js/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Задачка про 8 шаров</title>
		<link>http://voituk.kiev.ua/2011/01/24/8-balls-google/</link>
		<comments>http://voituk.kiev.ua/2011/01/24/8-balls-google/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 20:31:35 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Задачки]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=2343</guid>
		<description><![CDATA[Нет, не подумайте, блог не умер. Он жив, жил и будет жить. Подтверждением этому являются бурные обсуждения в комментариях к некоторым заметкам. Вот еще одна классическая задачка, которую опять же согласно слухам спрашивают в Google, и совершенно точно когда-то спрашивали в давно сгинувшей (или правильно говорить &#8220;переродившейся в Cogniance?&#8221;) Sonopia. Итак у вас есть 8 [...]]]></description>
			<content:encoded><![CDATA[<p><em>Нет, не подумайте, блог не умер. Он жив, жил и будет жить. Подтверждением этому являются бурные обсуждения в комментариях к некоторым заметкам.</em></p>
<p><img class="alignleft size-full wp-image-2353" title="you have eight balls all of the same size" src="http://voituk.kiev.ua/wp-content/uploads/2011/01/you-have-eight-balls-all-of-the-same-size.jpg" alt="" hspace="10" vspace="10" width="400" height="268" /></p>
<p>Вот еще одна классическая задачка, которую опять же согласно слухам спрашивают в <a href="http://voituk.kiev.ua/category/google/">Google</a>, и совершенно точно когда-то спрашивали в давно сгинувшей (или правильно говорить &#8220;переродившейся в Cogniance?&#8221;) <a href="http://voituk.kiev.ua/?s=sonopia">Sonopia</a>.</p>
<p>Итак у вас есть 8 шаров одинакового размера, при этом 7 из них весят одинаково, а один &#8211; существенно больше.</p>
<p>Задача: используя не более 2х взвешиваний типа &#8220;больше-меньше&#8221;, определить тяжелый шар.</p>
<p><br style="clear: both; float: none;" /></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=Q1AhzNzhciE:oTCyzZt5odM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=Q1AhzNzhciE:oTCyzZt5odM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=Q1AhzNzhciE:oTCyzZt5odM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=Q1AhzNzhciE:oTCyzZt5odM:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2011/01/24/8-balls-google/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>MemcacheDB Quick Benchmarks</title>
		<link>http://voituk.kiev.ua/2010/03/03/memcachedb-quick-benchmarks/</link>
		<comments>http://voituk.kiev.ua/2010/03/03/memcachedb-quick-benchmarks/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 16:43:20 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1923</guid>
		<description><![CDATA[Эта заметка увидела свет в результате небольшого исследования, проведенного мною в процессе работы на оптимизацией проекта www.savevid.com и призвана поделиться моим скромным опытом миграции на key-value базы дынных (БД) . Предистория состоит в том, что в процессе естественной эволюции кода и оптимизации запросов к MySQL RDBMS,  работа с &#8220;центральной&#8221; таблицей всей схемы БД (как несложно [...]]]></description>
			<content:encoded><![CDATA[<p>Эта заметка увидела свет в результате небольшого исследования, проведенного мною в процессе работы на оптимизацией проекта <a href="http://www.savevid.com/">www.savevid.com</a> и призвана поделиться моим скромным опытом миграции на key-value базы дынных (БД) .<span id="more-1923"></span></p>
<p>Предистория состоит в том, что в процессе естественной эволюции кода и оптимизации запросов к MySQL RDBMS,  работа с &#8220;центральной&#8221; таблицей всей схемы БД (как несложно догадаться &#8211; это таблица videos), свелась к простому алгоритму:</p>
<ol>
<li>выбрать сложным запросом из разных таблиц все video_id, удовлетворяющие нужным критериям</li>
<li>по полученному списку video_id, выбрать информацию о видео (aka SELECT &#8230; FROM videos WHERE id IN (&#8230;))</li>
</ol>
<p>Причиной появления подобного use-case стал внушительный размер той самой videos.  А о катастрофичности любых JOIN-ов на большие (10Gb+) InnoDB-таблицы уже было написано немало. Хотя бы на том же <a href="http://www.mysqlperformanceblog.com/">MysqlPerfomanceBlog.com</a>.</p>
<p>Следовательно, если у нас есть выборки из таблицы ТОЛЬКО по primary key – то это первый кандидат на миграцию в key-value RDBMS.  Что мы, собственно, и пытались опробовать.</p>
<p>Среди массы кандидатов (а их оказалось действительно много), для первоначальных проб выбрали MemcacheDB.<br />
Причины весьма прозаичны, и были надиктованы &#8220;путем наименьшего сопротивления&#8221;:</p>
<ul>
<li>В проекте уже активно используется Memcached, клиент которого уже 100% совместим с MemcacheDB.<br />
Следовательно никаких сторонних библиотек &#8220;тянуть&#8221; в проект не нужно</li>
<li>Реализации клиентов для Memcached/MemcacheDB есть почти под все мыслимые и немыслимые платформы и языки программирования. Тут конечно огромное спасибо Бреду Фицпатрику и его Danga.com.</li>
<li>Memcached клиенты предоставляют базовый развномерный (хоть документация  и говорит о weight-based распределении) шардинг. В результате и MemcacheDB это перенял.</li>
<li>В основе backend-a MemcachedDB лежит BerkleyDB &#8211; одна из старейших и надежнейших key-value RDBMS, которая до сих под активно поддерживается Oracle Corp.</li>
<li>BerkleyDB поддерживает репликацию. И что самое приятное &#8211; как синхронную, так полу-синхронную и асинхронную.</li>
<li>Memcached-клиенты поддерживают сжатие данных, что является немаловажым фактором при использовании дорогостоящих SSD-винчестеров.</li>
</ul>
<p>В результате всего вышесказанного был проведен небольшой performance benchmark test.</p>
<p><strong>Железо:</strong></p>
<p>Использовался тестовый сервер 2 x Core2Quad / 16GB of RAM / 4 x 146Gb SAS HDD in RAID10<br />
MySQL: v5.4.2 , InnoDB, innodb_buffer_pool=6Gb, по максимуму оптимизирован для интерсивной записи.<br />
MemcaheDB: 1Gb of RAM, index type &#8211; hash, skip transaction support</p>
<p><strong>Производительность записи</strong><strong>:</strong></p>
<p>Создание 1 000 000  записей.<br />
MySQL: среднее время записи – 5.6 sec / 10k  (5.6 секунд на 10 000 записей)<br />
MemcacheDB: среднее время записи – 4.1 sec / 10k<br />
При включенном transaction support в MemcacheDB – около 7 sec/ 10k</p>
<p>Как видно MySQL не сильно отстает на записи, но при этом предоставляет полноценный ACID.</p>
<p><strong>Производительность чтения:</strong></p>
<p>Из ранее созданного миллиона записей случайным образом выбиралась одна запись по primary key.<br />
MySQL: среднее время чтения – 1.7 sec / 10K<br />
MemcacheDB: среднее время чтения – 0.7 sec / 10K</p>
<p>Т.е. в данном случае MemcacheDB более чем в 2 раза опережает MySQL.<br />
Думаю если заняться тюннингом первого, то можно этот разрыв увеличить  куда существеннее.</p>
<p><strong>Размер данных:</strong></p>
<p>Соотношение размеров файлов с данными (и индексами) получилось 1.5Gb  (MemcacheDB) против 2.3Gb (MySQL), т.е.  в 1.5 раза в пользу MemcacheDB.<br />
Сравнение проводилось без использования сжатия в MemcacheDB и без использования MySQL ROW_FORMAT=COMPRESSED.</p>
<p>Вот такой вот небольшой sidenote вышел. В результате, пока еще мне не совсем понятно нужно ли оно мне или нет.<br />
Если все-таки решеним испольовать MemcacheDB в production environment -  обязательно отпишусь о результатах.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=tBOPV17h1jA:9uzK_88SjAs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=tBOPV17h1jA:9uzK_88SjAs:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=tBOPV17h1jA:9uzK_88SjAs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=tBOPV17h1jA:9uzK_88SjAs:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2010/03/03/memcachedb-quick-benchmarks/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Hello World на Google App Engine</title>
		<link>http://voituk.kiev.ua/2010/02/15/hello-world-google-app-engine/</link>
		<comments>http://voituk.kiev.ua/2010/02/15/hello-world-google-app-engine/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 11:38:49 +0000</pubDate>
		<dc:creator>juriy</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1633</guid>
		<description><![CDATA[Небольшая заметка о том, как создать и разместить свой проект на сервисе Google App Engine. По &#8220;долгу службы&#8221; довелось пощупать интересную технологию, до которой раньше не доходили руки. Думаю, Google App Engine будет интересен не только мне, поэтому начинаю мини-цикл статей о разработке для App Engine.  После того, как вы впервые войдёте в сервис appengine, [...]]]></description>
			<content:encoded><![CDATA[<p>Небольшая заметка о том, как создать и разместить свой проект на сервисе Google App Engine.</p>
<p>По &#8220;долгу службы&#8221; довелось пощупать интересную технологию, до которой раньше не доходили руки. Думаю, Google App Engine будет интересен не только мне, поэтому начинаю мини-цикл статей о разработке для App Engine.  <span id="more-1633"></span></p>
<p>После того, как вы впервые войдёте в сервис appengine, вам нужно будет подтвердить свою &#8220;личность&#8221;. Google вышлет на номер указанного вами телефона SMS с текстом вроде Google App Engine Code: 1234567. Лично мне SMSка дошла меньше чем за минуту (такой способ куда лучше бумажной почты, которую Google использует для Adsense). Такая проверка проводится только для первого создаваемого приложения.</p>
<p>Следующий шаг &#8211; зарегистрировать имя-идентификатор для приложения.</p>
<p>Теперь регистрация окончена, приступаем к разработке. App Engine работает на Java 6 и именно эта платформа является рекомендуемой, хоть и Java 5 тоже поддерживается. Я навскидку не смог придумать, что может пойти не так, если приложение скомпилированное на Java 5 запустить на JVM шестой версии, но Google&#8217;у виднее.</p>
<p>Скачиваем и распаковываем Google App Engine SDK для Java <a href="http://code.google.com/appengine/downloads.html">http://code.google.com/appengine/downloads.html</a>.</p>
<p>Теперь дело за малым &#8211; написать простое приложение и отправить на сервер :-)</p>
<p>Тут Google оставил меня без материала для заметки, поскольку минимальный Hello World уже есть в комплекте SDK. Хранится он в папке demos\new_project_template. Тут есть и build.xml и статический контент, и сервлет и даже пара файлов с конфигурацией для самых распространённых logging API: Log4J и JUL (java.util.logging). Скопировав содержимое в папку, где будет жить ваш проект, вы получите отличный каркасс для начала разработки. Единственное, что нужно теперь сделать &#8211; указать путь к развёрнутому SDK: либо в параметрах при запуске ant либо прямо в build.xml.</p>
<p>Перед тем, как запустить приложение на локальном &#8220;эмуляторе&#8221; appengine, давайте посмотрим, что ещё есть в &#8220;комплекте&#8221;. Кроме стандартного web.xml в WEB-INF лежит файл appengine-web.xml &#8211; дополнительная конфигурация для движка appengine:</p>
<pre><code>&lt;appengine-web-app xmlns="http://appengine.google.com/ns/1.0"&gt;
 &lt;!-- Replace this with your application id
    from http://appengine.google.com --&gt;
 &lt;application&gt;juriytest&lt;/application&gt;
 &lt;version&gt;1&lt;/version&gt;
&lt;/appengine-web-app&gt;
</code></pre>
<p>Как и следует из комментария, в теге application нужно указать id приложения, котрый был зарегистрирован на appengine.</p>
<p>Кроме того в src/META-INF находится файл jdoconfig.xml, который является (неожиданно) конфигурацией для JDO &#8211; persistance механизма, который используется в среде appengine. Сейчас его трогать не будем, пускай живёт, hello world и без него запустится.<br />
В проекте есть файл index.html, как пример статичного контента и HelloAppEngineServlet.java, который является привычным сервлетом без экзотики.</p>
<p>Чтобы запустить приложение локально выполняем ant runserver из корня тестового проекта.<br />
Для того, чтобы &#8220;доставить&#8221; приложение на живую платформу нужно использовать утилиту из SDK: bin\appcfg.cmd</p>
<p>appcfg.cmd update www</p>
<p>www тут &#8211; путь к &#8220;развёрнутому&#8221; проекту. Appengine не поддерживает war файлы, а вместо этого работает с директориями с той же структурой. После того, как build.xml собрал для нас проект в папку www указанной выше командой можно загрузить его на appengine.</p>
<p>Пара полезных моментов и &#8220;граблей&#8221;.</p>
<p>App Engine сохраняет всё что вы напишите в System.out и System.err в логи. При этом e.printStackTrace в логи упорно не попадает. Немного сбивает с толку.</p>
<p>Логи в административном интерфейсе обновляются не моментально, а только через несколько секунд.</p>
<p>Последние грабли стоили жизни моим нервным клеткам. В конфиге appengine указывается версия проекта. Не надейтесь, что если будет указана версия выше текущей развёрнутой, то новая версия заменит старую. Всё обстоит совершенно не так. Новая версия затирает развёрнутую версию с <em>таким же</em> индексом. Затем, пользователь выбирает, какая из версий будет доступна по умолчанию. То есть, я могу развернуть версии 1, 2, 3. После разворачивания версии 3, пользователи видели только версию 1, пока в интерфейсе администратора не будет указана другая.</p>
<p>На этом пока что всё. В следующей заметке опишу, как заставить app engine работать с groovy.</p>
<p>__________<br />
Спонсор заметки: &#8220;Идеал&#8221;, <a href="http://ideal.kiev.ua/">раскрутка сайта</a> в Украине</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=wv786xZuCm0:n16O4fpJOHw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=wv786xZuCm0:n16O4fpJOHw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=wv786xZuCm0:n16O4fpJOHw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=wv786xZuCm0:n16O4fpJOHw:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2010/02/15/hello-world-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Corrected Ukrainian Keyboard Layout For MacBook</title>
		<link>http://voituk.kiev.ua/2010/02/12/corrected-ukrainian-keyboard-layout-for-macbook/</link>
		<comments>http://voituk.kiev.ua/2010/02/12/corrected-ukrainian-keyboard-layout-for-macbook/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 15:06:44 +0000</pubDate>
		<dc:creator>crud</dc:creator>
				<category><![CDATA[Mac OS X]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1663</guid>
		<description><![CDATA[Украинская расскладка клавиатуры (переставленны местами значения клавиш Ы &#8211; И), как в Майрософт ПиСи :) Файлы ниже нужно скопировать в папки /Library/Keyboard Layouts (в этом случае все пользователи ПК будут иметь доступ к этой раскладке) или в /Users/имя_пользователя/Library/Keyboard Layouts (доступ к расскладке будет иметь только указанный юзер). После копирования файла. Заходим в System Preferences -&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Украинская расскладка клавиатуры (переставленны местами значения клавиш Ы &#8211; И), как в Майрософт ПиСи :)<br />
Файлы ниже нужно скопировать в папки <strong>/Library/Keyboard Layouts</strong> (в этом случае все пользователи ПК будут иметь доступ к этой раскладке) или в <strong>/Users/имя_пользователя/Library/Keyboard Layouts</strong> (доступ к расскладке будет иметь только указанный юзер).<br />
После копирования файла. Заходим в <strong>System Preferences -&gt; Language &amp; Text -&gt; Input Sources</strong> находим имя нашей раскладки (в нашем случае это Ukrainian-crud) и &#8220;оптичиваем ее&#8221; заменяя старую Ukrainian.</p>
<p>Загрузить файлы раскладки: <a href="http://voituk.kiev.ua/wp-content/uploads/Ukrainian_crud_remap.icns">Ukrainian_crud_remap.icns</a> и <a href="http://voituk.kiev.ua/wp-content/uploads/Ukrainian_crud_remap.keylayout">Ukrainian_crud_remap.keylayout</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=dIxrfA6a4hg:RHCPWiwpH8E:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=dIxrfA6a4hg:RHCPWiwpH8E:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=dIxrfA6a4hg:RHCPWiwpH8E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=dIxrfA6a4hg:RHCPWiwpH8E:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2010/02/12/corrected-ukrainian-keyboard-layout-for-macbook/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Разминка для хвоста</title>
		<link>http://voituk.kiev.ua/2009/12/02/razminka-dlya-xvosta/</link>
		<comments>http://voituk.kiev.ua/2009/12/02/razminka-dlya-xvosta/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 23:01:49 +0000</pubDate>
		<dc:creator>juriy</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Задачки]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1303</guid>
		<description><![CDATA[Ух, как же давно ничего не писал в блог! Отчасти тому виной твиттер. Я обязательно напишу отдельную заметку об этом &#8220;убийце блогов&#8221;. А сейчас, хочу представить вам пару свеженьких Java задачек. 1. Не изменяя код первго метода сделать так, чтобы программа компилировалась и печатала &#8220;This is right&#8221;. У этой задачки, как минимум, 3 решения. Комментировать [...]]]></description>
			<content:encoded><![CDATA[<p>Ух, как же давно ничего не писал в блог! Отчасти тому виной твиттер. Я обязательно напишу отдельную заметку об этом &#8220;убийце блогов&#8221;. А сейчас, хочу представить вам пару свеженьких Java задачек.<br />
<span id="more-1303"></span><br />
1. Не изменяя код первго метода сделать так, чтобы программа компилировалась и печатала &#8220;This is right&#8221;. У этой задачки, как минимум, 3 решения. Комментировать код первого метода тоже нельзя.</p>
<pre>
public class A {

	public static void main(String[] args) {
		System.out.println("This is wrong");
	}

	public static void main(String[] args) {
		System.out.println("This is right");
	}
}
</pre>
<p>2. Написать стандартный Hello World на Java. При этом нельзя использовать ни одной точки с запятой. Закодированные UTF символы тоже использовать нельзя.</p>
<p>Ответы я опубликую через сутки, а пока что жду комментариев.</p>
<p>P.S. За мной уже закрепилась слава человека, обожающего абсолютно бесполезные, с практической точки зрения, задачи. Я пришел к выводу, что для таких &#8220;упражнений&#8221; слово &#8220;задача&#8221; совсем не подходит. Все привыкли, что &#8220;задачи&#8221; это упражнения, которые развивают какие-то практические навыки. К примеру &#8220;реализовать генератор случайных чисел на Java&#8221; это задачка. А для того, что публикую я, лучше подходит слово &#8220;загадка&#8221;. Так что вот вам свежая &#8220;без окон без дверей полна горница людей&#8221;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=oMx25BhA3lg:Fczfm7BlZXU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=oMx25BhA3lg:Fczfm7BlZXU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=oMx25BhA3lg:Fczfm7BlZXU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=oMx25BhA3lg:Fczfm7BlZXU:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2009/12/02/razminka-dlya-xvosta/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Mac OS X: Usefull tips &amp; hints 2</title>
		<link>http://voituk.kiev.ua/2009/11/18/mac-os-x-usefull-tips-hints-2/</link>
		<comments>http://voituk.kiev.ua/2009/11/18/mac-os-x-usefull-tips-hints-2/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 15:53:35 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Mac OS X]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1087</guid>
		<description><![CDATA[Следующая порция советов по обустройству вашей комфортной жизни в Mac OS X. Первая часть доступна тут. 1. Указать место для складирования ScreenShots (по умолчанию &#8211; ~/Desktop ) (те что создаются системным shortcut-ом Command+Shift+4 &#38; Command+Shift+3) vadim@Voituk:~&#62;defaults write com.apple.screencapture location ~/Pictures/Screenshots vadim@Voituk:~&#62;killall SystemUIServer Аналогично меняется и формат скриншотов (злые языки говорят что поддерживается png, jpg, tiff, [...]]]></description>
			<content:encoded><![CDATA[<p>Следующая порция советов по обустройству вашей комфортной жизни в Mac OS X.<br />
Первая часть <a href="http://voituk.kiev.ua/2009/06/11/usefull-max-os-hints/">доступна тут</a>.</p>
<p>1. Указать место для складирования ScreenShots (по умолчанию &#8211; ~/Desktop )<br />
(те что создаются системным shortcut-ом Command+Shift+4 &amp; Command+Shift+3)</p>
<p>vadim@Voituk:~&gt;defaults write com.apple.screencapture location ~/Pictures/Screenshots<br />
vadim@Voituk:~&gt;killall SystemUIServer</p>
<p>Аналогично меняется и формат скриншотов (злые языки говорят что поддерживается png, jpg, tiff, pdf):</p>
<p>vadim@Voituk:~&gt;defaults write com.apple.screencapture type jpg<br />
vadim@Voituk:~&gt;killall SystemUIServer</p>
<p>2. Иногда при перезагрузке (часто если подключен внешний монитор) пропадает Bluetooth.<br />
Решение сродни &#8220;давайте выйдем и зайдем &#8211; авось заведется&#8221; &#8211; выключаю Мак, отключаю все внешние устройства, вынимаю батарею.<br />
Жду минуты 2-3 и включаю.<br />
Время &#8220;простоя&#8221; использую для протирания ноутбука влажной салфеткой :)</p>
<p>3. Поначалу очень непривычно было, что в column mode Finder, в списках, директории и файлы идут вперемешку.<br />
Частично эту проблему можно решить, нажав Command+J и выбрав &#8220;Arrange by Kind&#8221;.<br />
В результате  директории будут в списке рядом, но не всегда в начале списка.<br />
Окончательно можно решить проблему &#8220;грязным хаком&#8221;: сделать чтоб при сортировке по типу, директория (тип Folder) шла самой первой.</p>
<p>Для этого открываем файл<strong><br />
/System/Library/CoreServices/Finder.app/Contents/Resources/English.lproj/InfoPlist.strings</strong><br />
и сразу за комментарием /* General kind strings */ меняем строку<br />
<strong>&#8220;Folder&#8221; = &#8220;Folder&#8221;;</strong><br />
на<br />
<strong>&#8220;Folder&#8221; = &#8221; Folder&#8221;; </strong><br />
(с пробелом перед буквой &#8220;F&#8221;)</p>
<p>После редактирования перезапускаем &#8220;Finder&#8221;. /me счастлив</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=kpWaNN4VtF8:t1QUI567SH4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=kpWaNN4VtF8:t1QUI567SH4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=kpWaNN4VtF8:t1QUI567SH4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=kpWaNN4VtF8:t1QUI567SH4:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2009/11/18/mac-os-x-usefull-tips-hints-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Useful TODO-list service – GMail Hack</title>
		<link>http://voituk.kiev.ua/2009/11/06/useful-todo-list-service-gmail-hack/</link>
		<comments>http://voituk.kiev.ua/2009/11/06/useful-todo-list-service-gmail-hack/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 09:44:29 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Разное]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1113</guid>
		<description><![CDATA[Самые неотложные дела очень удобно записывать на желтых стикерах, и клеить на монитор. Единственный минус &#8211; через 3-4 месяца они отваливаются. (с) Народная шутка За последние несколько лет я перепробовал порядка 2х десятков разных сервисов для формирования TODO-листов. Больше 2х дней ни одим не пользовался, и во всех случах по одной причине &#8211; о списке [...]]]></description>
			<content:encoded><![CDATA[<blockquote style="text-align:right; font-style:italic; "><p>Самые неотложные дела очень удобно записывать на желтых стикерах, и клеить на монитор.<br />
Единственный минус &#8211; через 3-4 месяца они отваливаются.<br />
(с) Народная шутка</p></blockquote>
<p>За последние несколько лет я перепробовал порядка 2х десятков разных сервисов для формирования TODO-листов. Больше 2х дней ни одим не пользовался, и во всех случах по одной причине &#8211; о списке забывается, если он не находится постояно перед глазами.<br />
Для примера, сегодня я нашел записи полу-годичной (!!!) давности в своем GMail Tasklist :) Тут уже и шутка из эпиграфа статьи превращается совсем не в шутку.<br />
И это GMail, которым я пользуюсь ежедневно! А что уже говорить про всякие &#8220;оторванные&#8221; от рабочего процесса TadaList, TooDoo и им подобные?</p>
<p>В результате уже больше года я вынашиваю идею <span style="text-decoration: line-through;">взять Юру, пива и за вечер налабать</span> реализовать нормальный удобный web-ориентированный TODO-лист, который можно будет спокойно загрузить в sidebar браузера и он всегда будет на виду.</p>
<p>Уже даже начал писать functional overview и requirements specification, и наверное даже через недельку-две уже и приступил бы к реализации, если бы не сегодняшний утренний твит <a href="http://twitter.com/maxua/status/5457812503">Макса Ищенко</a>:</p>
<p><img class="alignnone size-full wp-image-1173" title="sreenshot" src="http://voituk.kiev.ua/wp-content/uploads/2009/11/Picture-56.png" alt="sreenshot" width="572" height="207" /></p>
<p>После чего необходимость реализовывать что-то свое попросту отпало &#8211; все уже <span style="text-decoration: line-through;">украдено</span> изобрели до нас:<br />
Открываем Firefox, создаем новый Bookmark на видимой панели закладок, называем его TODO (ну или по желанию), как URL указываем &#8220;http://mail.google.com/tasks/ig?pli=1&#8243;, ставим галочку &#8220;Load this bookmark in the sidebar&#8221; &#8211; и вуаля!</p>
<p>Получится что-то вроде:</p>
<p><img class="alignnone size-full wp-image-1193" title="Gmail Tasks Screenshot" src="http://voituk.kiev.ua/wp-content/uploads/2009/11/Picture-57.png" alt="Gmail Tasks Screenshot" width="574" height="345" /></p>
<p>Т.е. на 100% то &#8211; что я искал.</p>
<p>Единственное, что смущает &#8211; не придумал как перенести этот sidebar  на правую сторону браузера, но думаю это решаемо.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/researchers?a=hzbRK6vAAlQ:qNv4giJWTTA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/researchers?i=hzbRK6vAAlQ:qNv4giJWTTA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/researchers?a=hzbRK6vAAlQ:qNv4giJWTTA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/researchers?i=hzbRK6vAAlQ:qNv4giJWTTA:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2009/11/06/useful-todo-list-service-gmail-hack/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

