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

<channel>
	<title>Записки искателей &#187; JavaScript/Ajax</title>
	<atom:link href="http://voituk.kiev.ua/category/ajax/feed/" rel="self" type="application/rss+xml" />
	<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>
		<item>
		<title>JavaScript на Диване &#8211; мой 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>
]]></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>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>
]]></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>Code WTF: JavaScript HTML entities</title>
		<link>http://voituk.kiev.ua/2009/07/02/javascript-html-entities/</link>
		<comments>http://voituk.kiev.ua/2009/07/02/javascript-html-entities/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 08:49:43 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[JavaScript/Ajax]]></category>
		<category><![CDATA[Юмор]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1075</guid>
		<description><![CDATA[Извините за &#8220;неформат&#8221; для данного блога, но не смог удержаться. Вот так вот мой &#8220;юннат&#8221; реализует замену html-entities на JavaScript: function properHtmlFromText(text){ while (text.search(/\&#60;/) != -1) text = text.replace(/\&#60;/, '&#38;lt;'); while (text.search(/\&#38;/) != -1) text = text.replace(/\&#38;/, '&#38;amp;'); while (text.search(/\r/) != -1) text = text.replace(/\r/, ''); while (text.search(/\n/) != -1) text = text.replace(/\n/, '&#60;br /&#62;'); [...]]]></description>
			<content:encoded><![CDATA[<p>Извините за &#8220;неформат&#8221; для данного блога, но не смог удержаться.<br />
Вот так вот мой &#8220;юннат&#8221; реализует замену html-entities на JavaScript:</p>
<pre><code>
function properHtmlFromText(text){
	while (text.search(/\&lt;/) != -1)
		text = text.replace(/\&lt;/, '&amp;lt;');
	while (text.search(/\&amp;/) != -1)
		text = text.replace(/\&amp;/, '&amp;amp;');
	while (text.search(/\r/) != -1)
		text = text.replace(/\r/, '');
	while (text.search(/\n/) != -1)
		text = text.replace(/\n/, '&lt;br /&gt;');
	return text;
}
</code></pre>
<p>Как увидел &#8211; плакал&#8230;<br />
Наверное все-таки будем возобновлять ежедневные code-review&#8230;</p>
<p>P.S. В комментариях предлагаю поделиться &#8220;правильным&#8221; решением :)</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2009/07/02/javascript-html-entities/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>JavaScript applet loader.</title>
		<link>http://voituk.kiev.ua/2009/02/06/javascript-applet-loader/</link>
		<comments>http://voituk.kiev.ua/2009/02/06/javascript-applet-loader/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 11:50:09 +0000</pubDate>
		<dc:creator>juriy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=958</guid>
		<description><![CDATA[У каждого разработчика есть свои маленькие &#8220;заморочки&#8221; по поводу того как должно выглядеть приложение. Одна из моих любимых: пользователь должен знать минимум о том, как работает приложение и на каких технологиях оно построено. Взять, к примеру, Flash. Загружается тихонько в окне браузера, крутит пользователю картинки или видео и до тех пор, пока пользователь не начнет [...]]]></description>
			<content:encoded><![CDATA[<p>У каждого разработчика есть свои маленькие &#8220;заморочки&#8221; по поводу того как должно выглядеть приложение. Одна из моих любимых: пользователь должен знать минимум о том, как работает приложение и на каких технологиях оно построено. Взять, к примеру, Flash. Загружается тихонько в окне браузера, крутит пользователю картинки или видео и до тех пор, пока пользователь не начнет по нему кликать правой кнопкой, не признаЕтся кто он такой.</p>
<p>С другой стороны Java. Вот тебе пользователь раз логотип при загрузке апплета, да побольше, побольше, а если ты вдруг забыл про то, что работаешь с великой и могучей Java, мы тебе иконку в трей кинем, чтобы он тебе оттуда напоминал что пора качать новую версию.<br />
Вобщем, вы мою позицию поняли.</p>
<p>Недавно я задался вопросом, как организовать загрузку апплета на странице так, чтобы пользователь не увидел экрана загрузки. Вместо него я бы хотел, к примеру, разместить логотип и progress bar (не настоящий, а просто картинку, которая показывает, что процесс идет). Второе обязательное требование: чтобы приложение отображалось, как только GUI прорисован. Мы не хотим заставлять пользователя ждать лишнее время.<br />
<span id="more-958"></span><br />
Перечитав комментарии <a href="http://voituk.kiev.ua/2008/05/28/java-deployment-toolkit/">http://voituk.kiev.ua/2008/05/28/java-deployment-toolkit/</a> я решил не использовать стандартный JavaScript от Sun. Я воспользовался альтернативой &#8211; скриптом из классного, но не очень известного проекта <a href="http://www.interactivepulp.com/pulpcore/">PulpCore</a>. Этому проекту можно было бы посвятить отдельную заметку, отличная разработка заслуживающая более пристального внимания. После небольшой &#8220;доводки напильником&#8221; вышло отличное решение, которое я протестировал на тех браузерах, что были у меня под рукой. </p>
<p>Кроме &#8220;сокрытия&#8221; экрана загрузки, скрипт умеет определять версию JRE (как и аналог от Sun), делать &#8220;отложенную загрузку&#8221;: апплет загружается после того, как пользователь нажмет на кнопку. </p>
<p>Принцип работы скрипта прост: он определяет браузер и версию Java плагина, генерирует текст HTML элемента, который загружает апплет и отображает сплеш-скрин поверх него. Пользователь видит &#8220;правильный&#8221; сплеш, а не стандартный экран загрузки Java. Если же версия Java не подходит, отображается сообщение предлагающее пользователю решить эту проблему.</p>
<p>Когда апплет полностью загрузился и готов к тому чтобы предстать перед пользователем во всей красе, он (апплет) вызывает через LiveConnect функцию, которая убирает экран загрузки. Вуаля. Если LiveConnect по какой-то причине не сработал, сплеш автоматически исчезнет после таймаута.</p>
<p>Вот пример кода, который отобразит апплет на странице:</p>
<pre><code>
	&lt;script type="text/javascript"&gt;&lt;!--
		pulpcore_width = 500;
		pulpcore_height = 300;
		pulpcore_archive = "applet-17.jar";
		pulpcore_class = "TestApplet.class";
	//-->
	&lt;/script&gt; 

	&lt;div id="game"&gt;
		&lt;script type="text/javascript" src="loader.js">&lt;/script&gt;
		&lt;noscript>&lt;p&gt;To play, enable JavaScript from the Options or Preferences menu.&lt;/p&gt;&lt;/noscript&gt;
	&lt;/div&gt;
</code></pre>
<p>Примеры скрипта в действии можно посмотреть на сайте проекта <a href="http://www.interactivepulp.com/pulpcore/bubblemark/">PulpCore</a>.</p>
<p>Вот так, просто и надежно мы оставляем пользователей в блаженном неведении, какая именно платформа делает работу. Жаль иконку из трея так же просто убрать не выйдет.</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2009/02/06/javascript-applet-loader/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Костыли для апплетов</title>
		<link>http://voituk.kiev.ua/2008/09/09/applet-behind-firewall/</link>
		<comments>http://voituk.kiev.ua/2008/09/09/applet-behind-firewall/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 07:54:41 +0000</pubDate>
		<dc:creator>juriy</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=635</guid>
		<description><![CDATA[Вам приходилось слышать в адрес апплетов выражение: &#8220;dead man walking&#8221;? Апплеты &#8211; часть Java платформы, задуманная, как мощнейшее средство, позволяющее проинтегрировать Java прямо в web страницу, практически полностью теряющее свои достоинства из-за тонн ограничений, которые на них возложены. Последние несколько дней я бился над вопросом: как заставить апплет &#8220;выглянуть в мир&#8221;, за параноидальным прокси моего [...]]]></description>
			<content:encoded><![CDATA[<p>Вам приходилось слышать в адрес апплетов выражение: &#8220;dead man walking&#8221;? Апплеты &#8211; часть Java платформы, задуманная, как мощнейшее средство, позволяющее проинтегрировать Java прямо в web страницу, практически полностью теряющее свои достоинства из-за тонн ограничений, которые на них возложены.<br />
Последние несколько дней я бился над вопросом: как заставить апплет &#8220;выглянуть в мир&#8221;, за параноидальным прокси моего офиса.<br />
<span id="more-635"></span></p>
<p>[UPDATED]<br />
<em>Проблему, вроде бы, решил. Удивительная штука. Проблема возникала при использовании HTTP Client из Commons. Обычный URLConnection работает отлично. Ладно уж, решение, описанное ниже можно изпользовать для более интересных задач.</em></p>
<p>Основное разочарование, которое меня ожидало: вопреки настройкам Java Plugin упорно не хотел использовать настройки прокси из браузера и нахально ломился напрямую (естественно, получая по рукам).<br />
Вторая проблема, даже если дать пользователю возможность самостоятельно ввести настройки прокси (что далеко не каждый типичный пользователь сможет сделать), необходимо также &#8220;попросить&#8221; пользователя ввести логин-пароль для авторизации. Зачастую пароль совпадает с паролем XP-account&#8217;а пользователя, а эту информацию даже очень дружественному апплету даст не каждый.</p>
<p>Решение, которое я нашел, это &#8220;костыли&#8221; для апплета. Если апплету так тяжело послать примитивный HTTP запрос на хост, с которого он сам загружен, надо поручить эту работу тому, кто с ней нормально справляется: браузеру. Ведь ajax запросы учитывают все настройки прокси, а при помощи LiveConnect из JavaScript можно вызывать публичные методы апплета.<br />
<em>На самом деле, и из апплета можно вызывать функции JavaScript, но по заверениям форумчан эта функциональность иногда не работает.</em></p>
<p>Самое простое решение, которое я смог придумать: JavaScript периодически опрашивает апплет: не хочет ли тот послать какой-нибудь запрос. Текст запроса апплет возвращает в некотором публичном методе. Если запрос не пустой, JavaScript посылает асинхронный запрос к серверу (Ajax), передавая текст запроса из апплета прямо на сервер. Когда от сервера приходит ответ, JavaScript передает его назад апплету. Таким образом, JavaScript с Ajax запросами выступает в качестве шины для асинхронного обмена сообщениями.</p>
<p>Вот код JavaScript&#8217;а:</p>
<pre><code>// Every 5 seconds poll applet for request
var executer = new PeriodicalExecuter(poll, 5);

// That's the method that actually polls applet
function poll() {
	var applet = document.getElementById('tstapp');

	// get() is a public method of applet
	var request = applet.get();

	// If there's some request from applet - send it to server
	if (request.length &gt; 0)
		sendRequest('http://someserver.org/script.php', request);
}

// I use prototype.js to do all Ajax-related stuff for me
function sendRequest(url, data) {
		var myAjax = new Ajax.Request(
		url,
		{method: 'post', parameters: data, onComplete: ajaxResponse}
	);
}

// This is a callback method invoked when response from
// server is ready. Just passes result to applet
function ajaxResponse(originalRequest) {
	passResponse(originalRequest.responseText);
}

// Pass response back to applet
function passResponse(resp) {
	var applet = document.getElementById('tstapp');
	applet.put(resp);
}</code></pre>
<p>Апплет тоже довольно примитивный:</p>
<pre><code>public class TestApp3 extends JApplet {

	private JTextField textField;

	public void init() {
		textField = new JTextField();
		textField.setText("nothing yet");
		add(textField);
	}

	public String get() {
		return "request text";
	}

	public void put(String response) {
		textField.setText(response);
	}
}</code></pre>
<p>Естественно, для использования этого способа в реальном мире, необходимо сделать несколько дополнений. К примеру, корректно обработать ситуацию, когда апплет не успевает загрузиться за первые 5 секунд жизни страницы.</p>
<p>Я еще не опробовал этот метод на реальном проекте, но выглядит конструкция вполне жизнеспособно. Я протестировал связь JavaScript/апплет под FF, IE и Safari (спасибо Farcaller и его MacOS) везде работает нормально.</p>
<p>Как всегда оказалось, что идея связать Ajax и апплет пришла не мне первому в голову. Вот <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=158598">ссылочка на демку</a>, которая использует эту связку для сохранения данных страницы на клиенте.</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/09/09/applet-behind-firewall/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Аналог jQuery.ready() в Prototype.js</title>
		<link>http://voituk.kiev.ua/2008/06/10/jquery-ready-in-prototype/</link>
		<comments>http://voituk.kiev.ua/2008/06/10/jquery-ready-in-prototype/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 21:55:47 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=498</guid>
		<description><![CDATA[Недавно впервые удалось попробовать использовать JavaScript-библиотеку jQuery. Из того, что понравилось сразу &#8211; это возможность выполнять JavaScript-код не по событию полной загрузки страницы (window.onLoad), а сразу после загрузки и инициализации DOM-дерева. Т.е. можно уже выполнять манипуляции с DOM-деревом не дожидаясь загрузки стилей, изображений и остальных медиа-компонентов. В jQuery реализуется это 2-мя способами: $(document).ready(function(){...}) и в [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно впервые удалось попробовать использовать JavaScript-библиотеку jQuery.</p>
<p>Из того, что понравилось сразу &#8211; это возможность выполнять JavaScript-код не по событию полной загрузки страницы (window.onLoad), а сразу после загрузки и инициализации DOM-дерева. Т.е. можно уже выполнять манипуляции с DOM-деревом не дожидаясь загрузки стилей, изображений и остальных медиа-компонентов.</p>
<p>В jQuery реализуется это 2-мя способами:</p>
<pre><code class="javascript">$(document).ready(function(){...})</code></pre>
<p>и в сокращенной нотации</p>
<pre><code class="javascript">$((function(){...})</code></pre>
<p>Но так как я являюсь давним пользователем prototype.js  &#8211; сразу же захотелось такую же возможность и в нем. Как оказалось в версии 1.6 она уже есть, и использовать её можно таким образом:</p>
<pre><code class="javascript">document.observe('dom:loaded', function(){ ... })</code></pre>
<p>или</p>
<pre><code class="javascript">Event.observe(document, 'dom:loaded', function(){ ... })</code></pre>
<p>Работоспособность проверял на Prototype 1.6.0.2 в Firefox3, Internet Explorer 6 и Safari (Win+Mac).</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/06/10/jquery-ready-in-prototype/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Java Deployment Toolkit</title>
		<link>http://voituk.kiev.ua/2008/05/28/java-deployment-toolkit/</link>
		<comments>http://voituk.kiev.ua/2008/05/28/java-deployment-toolkit/#comments</comments>
		<pubDate>Wed, 28 May 2008 08:55:01 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=494</guid>
		<description><![CDATA[Вместе с выходом беты Java Development Kit 6u10, Sun анонсировали и выход вспомогательной, но IMHO очень полезной JavaScript-библиотеки  Java Deployment Toolkit. Назначение библиотеки &#8211; сделать развертывание и запуск Java-приложений в среде Web (апплетов, WebStart-приложений) более простой и комфортной. При этом библиотека берет на себя задачи по определению установленных JRE, проверки соответствия их версий минимальным требуемым [...]]]></description>
			<content:encoded><![CDATA[<p>Вместе с выходом беты Java Development Kit 6u10, Sun анонсировали и выход вспомогательной, но IMHO очень полезной JavaScript-библиотеки  <a rel="nofollow" href="http://java.sun.com/javase/downloads/ea/6u10/deploymentToolkit.jsp">Java Deployment Toolkit</a>.</p>
<p>Назначение библиотеки &#8211; сделать развертывание и запуск Java-приложений в среде Web (апплетов, WebStart-приложений) более простой и комфортной.<br />
При этом библиотека берет на себя задачи по определению установленных JRE, проверки соответствия их версий минимальным требуемым приложением, установке обновлений (если необходимо) и конечно же кроссбраузерного добавления обьектов на страницу.<br />
Получается такой себе аналог SWFObject для Java.</p>
<p>Использовать Java Deployment Toolkit  очень просто &#8211; достаточно подключить на web-страницу единственный JavaScript-файл:<br />
[javascript]&lt;script src=&#8221;http://java.com/js/deployJava.js&#8221;&gt;&lt;/script&gt;[/javascript]</p>
<p>Пример добавления аплета на страницу будет выглядеть так:</p>
<pre><code class="js">deployJava.runApplet({codebase:"http://voituk.kiev.ua/demo/",
  archive:"TumbleItemProject.jar", code:"components/TumbleItem.class",
  width:"600", Height:"95"},
{maxwidth:120, nimgs:17, offset:-57, img:"images/tumble"}, "1.5")</code></pre>
<p>где первый параметр метода runApplet() &#8211; параметры тэга &lt;APPLET&gt;,<br />
второй &#8211; параметры, передаваемые самому апплету (значения &lt;PARAM&gt;),<br />
третий &#8211; минимальная версия JRE необходимая для запуска апплета.</p>
<p>Что  по cути отличается от использования старого доброго тега &lt;APPLET&gt; только формой нотации (JSON вместо HTML).</p>
<p>При этом, при попытке зайти на страницу с апплетом с помощью браузера, без установленного (или с устаревшим) Java Plugin, будет предложено установить последнюю версию оного.</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/05/28/java-deployment-toolkit/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Новые эксперименты от Google</title>
		<link>http://voituk.kiev.ua/2008/02/11/google-expiremental/</link>
		<comments>http://voituk.kiev.ua/2008/02/11/google-expiremental/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 14:11:33 +0000</pubDate>
		<dc:creator>Артем Волхонский</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/2008/02/11/google-expiremental/</guid>
		<description><![CDATA[Пользуясь в очередной раз поиском наткнулся на один линк который до этого или не замечал или его попросту небыло. Дословно линк называется &#8220;Попробуйте воспользоваться экспериментальной версией поиска Google&#8220;. Как я мог пропустить такой заманчивый линк :) Кто не хочет немного заглянуть в будущее и узнать как будет выглядеть гугль? Вообщем полез разбираться и забыл в [...]]]></description>
			<content:encoded><![CDATA[<p>Пользуясь в очередной раз поиском наткнулся на один линк который до этого или не замечал или его попросту небыло.  Дословно линк называется &#8220;<a href="http://www.google.com/experimental/">Попробуйте воспользоваться экспериментальной версией поиска Google</a>&#8220;. Как я мог пропустить такой заманчивый линк :) Кто не хочет немного заглянуть в будущее и узнать как будет выглядеть гугль? Вообщем полез разбираться и забыл в итоге что вообще искал на гугле, но не пожалел.</p>
<p>Итак, сам линк выводится в результатах поиска в самом низу возле нижней строки поиска, нажимаем и попадаем на страничку http://www.google.com.ua/experimental/<br />
Суть проекта в чем. Можно принять участие в разработке новых фишек на гугле. Среди тех которые в разработке есть очень много интересных, по крайней мере для меня, но думаю каждый найдет что-то и для себя, то чего ему очень нехватало все это время. Полный перечень приводить не буду, зайдите сами гляньте, как говорится лучше один раз увидеть.</p>
<p>Например &#8220;Keyword suggestions&#8221;. Позволяет увидеть результаты поиска по мере набора.<br />
Или &#8220;Keyboard shortcuts&#8221; из названия понятно что за фишка. Она позволяет пользоваться горячими клавишами. Должен заметить очень удобно :).<br />
Ajax рулит вообщем.  Одно огорчило некоторые фишки у меня не работали и одновременно можно попробовать только одну, но это все еще в разработке поэтому жаловаться грех.<br />
Советую всем присоединиться, тем более можно выставить свою оценку для каждой фишки и тем самым почувствовать себя участником грандиозного проекта :)</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/02/11/google-expiremental/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>5 простых инструментов сложных Web-интерфейсов</title>
		<link>http://voituk.kiev.ua/2007/11/23/5-prototype-based-controls/</link>
		<comments>http://voituk.kiev.ua/2007/11/23/5-prototype-based-controls/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 22:41: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/2007/11/23/5-prototype-based-controls/</guid>
		<description><![CDATA[Около 2х месяцев назад мне поручили разработать систему сбора и первичного анализа данных о поведении пользователей определенных ресурсов. Само собой стал вопрос о визуализации этих данных и отчетов, построенных по ним. Для построения полноценного современного web-интерфейса были выбран набор библиотек и компонентов, которым хочу с вами и поделиться. 0. Основа. Prototype.js &#8211; библиотека, существенно упрощающая [...]]]></description>
			<content:encoded><![CDATA[<p>Около 2х месяцев назад мне поручили разработать систему сбора и первичного анализа данных о поведении пользователей определенных ресурсов.<br />
Само собой стал вопрос о визуализации этих данных и отчетов, построенных по ним.</p>
<p>Для построения полноценного современного web-интерфейса были выбран набор библиотек и компонентов, которым хочу с вами и поделиться.<span id="more-309"></span></p>
<p><strong>0. Основа.</strong><br />
<a href="http://prototypejs.org/">Prototype.js</a> &#8211; библиотека, существенно упрощающая JavaScript-разработку.<br />
Этот выбор был больше идиологическим, чем практическим, поскольку я знаком с этой библиотекой намного лучше чем с другими.<br />
Ипользование prototype.js, как основы, а также нежелание &#8220;тянуть в проект все подряд&#8221;, накладывают такие ограничения на выбор других компонентов интерфейса &#8211; он должен быть создан на основе prototype.js, в противном случае должен не конфликтовать с нею.<br />
И конечно же такой компонент должен легко принимать вид, соответствующий корпоративному стилю и утверржденному дизайну.</p>
<p><strong>1. Таблицы</strong>. Для отображения и манипулированияи табличными данными выбрал <a href="http://www.millstream.com.au/view/code/tablekit/">TableKit</a>, отличная библиотека, достойная наивысшей оценки.<br />
Очень немаловажным является то, что её использование не требует написания серверного кода &#8211; а это в свою очередь позволяет легко и быстро внедрить её в уже существующий проект.<br />
В принципе толком и выбирать было не из чего, да больше ничего и нужно &#8211; тут и сортировка с автоопределением типа содержимого, и изменение размера, и встроенное редактирование значений с возможностью реализовать свой редактор значения, &#8211; все как во &#8220;взрослых&#8221; и платных ASP.NET компонентах.<br />
<a href="http://www.millstream.com.au/upload/code/tablekit/">Просмотреть демо</a></p>
<p><strong>2. Выбор дат</strong><br />
Какое же приложение по анализу без выбора интервалов дат?<br />
После достаточно длительного блуждания по сети выбор пал на <a href="http://www.eulerian.com/en/opensource/datepicker-prototype-scriptaculous">DatePicker от Eulerian Technologies</a>. Также как и TableKit, он легко интегрируется в существующий проект без замены серверного кода.<br />
Единственное что прийшлось модифицировать, так это убрать визуальные эффекты (а вместе с ним и зависимость от script.aculo.us), и добавить русскоязычную версию.</p>
<p>Скачать версию с <a href="http://voituk.kiev.ua/wp-content/uploads/2007/11/datepicker.js">поддержкой русского языка можно здесь</a>.</p>
<p><em>К сожалению в дальнейшем, в проекте прийшлось заменить DatePicker на &#8220;более привычный господам менеджерам&#8221; набор select-box-ов, но тут же DatePicker не виноват:)</em></p>
<p>Если по каким-то причинам DatePicker и вам не пришелся по душе, то стоит обратить внимаение на <a href="http://scal.fieldguidetoprogrammers.com/">Scal</a> но IMHO он ещё достаточно &#8220;сырой&#8221;.<br />
В идеале хотелось бы элемент управления аналогичный том, который используется в Google Analitics.</p>
<p><strong>3. Графики и диаграммы</strong> &#8211; тоже немаловажная часть любой визуализации<br />
Тут также неоспоримым лидером является <a href="http://solutoire.com/plotr/">Plotr</a> &#8211; наверное единственный charting framework на базе prototype.<br />
Если же требуется повышенная переносимость и поддержка относительно древними браузерами, то стоит обратить внимание на, основанный на технологии Flash, <a href="http://www.fusioncharts.com/free/LiveDemos.asp">Fusion Charts</a> фреймворк.<a href="http://solutoire.com/plotr/"><br />
</a></p>
<p><strong>4. Индикатор прогресса</strong> &#8211; также достаточно часто применяется для планирования и анализа.<br />
Из того что удалось &#8220;нагуглить&#8221; самый приятный &#8220;взгляду и коду&#8221; &#8211; это <a href="http://www.webappers.com/progressBar/">WebAppers Progress Bar</a></p>
<p><strong>5. Вспомогательные интерфейсные элементы</strong> &#8211; к ним я отнес небольшие и часто несложные вспомогательные интерфейсные элементы.<br />
Базовый набор предоставляет самый известный  (особенно среди пользователей Ruby On Rails) основанный на prototype.js фреймворк <a href="http://script.aculo.us/">script.aculo.us</a> &#8211; это инструменты перестаскивания, сортировок, автодополнения, подсказок, inplace-редактирования, меню и тд.</p>
<p>Конечно же данная заметка не претендует на полноценный обзор prototype-based решений для построения интерфейсов, потому хотелось бы услышать об опыте использования других &#8220;связок&#8221;,  основанных на prototype либо аналогах.</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2007/11/23/5-prototype-based-controls/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Простой widget для блога с помощью Google Feed API</title>
		<link>http://voituk.kiev.ua/2007/10/03/google-rss-api-based-widget/</link>
		<comments>http://voituk.kiev.ua/2007/10/03/google-rss-api-based-widget/#comments</comments>
		<pubDate>Wed, 03 Oct 2007 16:19:15 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript/Ajax]]></category>

		<guid isPermaLink="false">http://dev.voituk.kiev.ua/2007/10/03/google-rss-api-based-widget/</guid>
		<description><![CDATA[Покажу на небольшом примере каким образом можно с помощью Google Feed API быстро написать widget &#8220;Последние статьи&#8221; к своему сайту/блогу. RSS или Atom по сути является XML-форматом достаточно простой структуры, потому разбор такого документа средствами встроенного в баузер JavaScript ничего сложного из себя не представляет. Сложнее приходится с загрузкой RSS feed-а ввиду того, что загружать [...]]]></description>
			<content:encoded><![CDATA[<p>Покажу на небольшом примере каким образом можно с помощью Google Feed API быстро написать widget &#8220;Последние статьи&#8221; к своему сайту/блогу.</p>
<p>RSS или Atom по сути является XML-форматом достаточно простой структуры, потому разбор такого документа средствами встроенного в баузер JavaScript ничего сложного из себя не представляет.<br />
Сложнее приходится с загрузкой RSS feed-а ввиду того, что загружать данные посредством Ajax можно только с того домена, с которого был загружен сам JavaScript скрипт.<br />
Вот тут на помощь приходит <a href="http://code.google.com/apis/ajaxfeeds/">Google Feed API</a> -с его помощью из JavaScript на странице можно получить доступ к любому RSS-потоку, проиндексированному Google Feedfetcher <em>(эдакий Google Bot только для RSS)</em>, а ввиду повального использования Google Reader &#8211; можно смело утверждать что таким образом доступен любой RSS-фид.<span id="more-270"></span></p>
<p>Для того, чтоб использовать Google Feed API на своем сайте необходимо <a href="http://code.google.com/apis/ajaxfeeds/signup.html">получить API KEY</a>.<br />
После получения API KEY дописываем в &lt;head&gt; блок нашей страницы такой код:<br />
[html]
<pre>&lt;script src="lastpost.js" type="text/javascript"&gt;&lt;/script&gt;
      &lt;script type="text/javascript"&gt;
      google.load("feeds", "1")
      google.setOnLoadCallback(function() {
        showLastPostWidget('lastpost_id', "http://voituk.kiev.ua/feed/", 10)
      });
&lt;/script&gt;</pre>
<p>[/html]<br />
В том месте, где нужно вывести последние статьи с блога дописываем:<br />
[html]
<pre>&lt;div id="lastpost_id"&gt;Loading...&lt;/div&gt;</pre>
<p>[/html]<br />
Осталось разобраться что же делает функия lastpost.js и функция showLastPostWidget:<br />
[js]
<pre>function showLastPostWidget(id, url, count) {
       var feed = new google.feeds.Feed(url)
       feed.setNumEntries(count)
       feed.includeHistoricalEntries()
       feed.load(function(res) {
         if (res.error) return;
         var container = document.getElementById(id);
         container.innerHTML = '';
         if (!container) return;
         for (var i = 0; i &lt;res.feed.entries.length; i++) {
           var entry = res.feed.entries[i]
           var a = document.createElement("a")
           a.href=entry.link
           a.appendChild(document.createTextNode(entry.title))
           var div = document.createElement("div")
           div.appendChild(a)
           container.appendChild(div)
        }
      })
     }
</pre>
<p>[/js]<br />
Как видно из кода она загружает последние count feed-ов из указанного url, и добавляет их внутрь контейнера, id которого указывается первым параметром.</p>
<p>Все просто, понятно &#8211; и ни строчки серверного кода.</p>
<p>Стоит только добавить что внешний вид блока последних заметок легко регулируется стилями.<br />
Например:<br />
[css]#lastpost_id div {<br />
margin: 1px;<br />
background-color: #EBEBEB;<br />
}[/css]</p>
<p>Этот widget приведен скорее как демострация возможностей Google FEED API, но и в таком виде ничего не мешает использовать его на своем сайте/блоге.</p>
<p>Действующий пример можно увидеть <a href="http://voituk.kiev.ua/widgets/lastpost.html">здесь</a> или на этом сайте в правой колонке.</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2007/10/03/google-rss-api-based-widget/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

