<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8445457995709570547</atom:id><lastBuildDate>Sun, 11 Jul 2010 18:25:21 +0000</lastBuildDate><title>codeBlogZ</title><description>Javadcript: интересные статьи, ссылки на полезные материалы, личный опыт.</description><link>http://www.codeblogz.ru/</link><managingEditor>noreply@blogger.com (Сергей | codeBlogZ)</managingEditor><generator>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/codeblogz" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="codeblogz" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">codeblogz</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/codeblogz" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcodeblogz" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fcodeblogz" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fcodeblogz" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-4894049770832271939</guid><pubDate>Sun, 11 Jul 2010 18:19:00 +0000</pubDate><atom:updated>2010-07-11T21:19:06.407+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bada SDK</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><title>OpenCV и bada SDK: декодирование изображений</title><description>Стоит задача: воспользоваться функциями библиотеки компьютерного зрения в приложениях под bada SDK. Скажу, что над этой задачей я бился где-то с недельку, и прямо сейчас кайфую от достигнутого результата :) Приятное ощущение для программиста, не правда ли?!&lt;br /&gt;
&lt;br /&gt;
Так вот. Я раскрою детали своего решения, чтобы обломать вам вашу возможность тоже заполучить такой кайф :) Не обессудьте ;)&lt;br /&gt;
&lt;br /&gt;
Для начала нам надо &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;разобраться, что нужно для решения задачи. Подразумевается, что вы уже установили bada SDK и имеете некоторый опыт общения с ней, чтобы я тут не заострял внимание на мелочах. Дальше, нужна сама библиотека OpenCV. Ее можно скачать &lt;a href="http://sourceforge.net/projects/opencvlibrary/files/opencv-win/"&gt;отсюда&lt;/a&gt;. Качаете архив с исходниками (никаких *-win32-vs2008.zip).&lt;br /&gt;
&lt;blockquote&gt;Все ниже изложенное будет касаться версии 2.1.0&lt;/blockquote&gt;Скачивать исходники нужно для того, чтобы получить бинарники, заточенные под платформу bada. &lt;strong&gt;Это важный момент!&lt;/strong&gt; О том, как получить такие бинарники, написан &lt;a href="http://www.codeblogz.ru/2010/07/opencv-mingw.html"&gt;отдельный пост&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Когда бинарники получены (*.lib и *.dll), делаем следующее: либы нужны для линковки и их прописываем в свойствах проекта (&lt;em&gt;Project &amp;gt; Properties &amp;gt; C/C++ Build &amp;gt; Settings &amp;gt; вкладка Tool Settings &amp;gt; bada C++ Linker &amp;gt; Libraries&lt;/em&gt;). DLL-ки должны быть доступны через переменную среды PATH.&lt;br /&gt;
&lt;blockquote&gt;Если при запуске, симулятор вылетает в самом начале без каких-либо ошибок — 99% вероятность того, что проблема именно в недоступности DLL. Этот совет стоил мне нескольких дней мытарств.&lt;/blockquote&gt;Не забудьте также, в свойствах проекта (&lt;em&gt;Project &amp;gt; Properties &amp;gt; C/C++ Build &amp;gt; Settings &amp;gt; вкладка Tool Settings &amp;gt; bada C++ Compiler &amp;gt; Directories&lt;/em&gt;), указать путь до инклудов рассматриваемой библиотеки.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово к работе. Дальше я поведаю о том, как работать с изображениями в среде bada. Следующий кусочек кода, несмотря на его простоту, дался мне большим количеством экспериментов.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="cpp" name="code"&gt;#include &amp;lt;cv.h&amp;gt;
void TestingOpenCV()&amp;nbsp;
{
 String path(L"/Home/test.jpg");
 Image image;
 image.Construct();

 Bitmap *pBitmap = image.DecodeN(path, BITMAP_PIXEL_FORMAT_RGB565);

 BufferInfo bufferInfo;
 result r = pBitmap-&amp;gt;Lock(bufferInfo);
 if (r == E_SUCCESS) {
  Decode(bufferInfo);
  pBitmap-&amp;gt;Unlock();
 }
}
&lt;/pre&gt;По коду, мы декодируем изображение в битмап. bada SDK поддерживает три формата, RGB565 среди которых наиболее удобоваримый. Чтобы работать с пикселями напрямую, необходимо вызвать Lock() и получить буфер данных. Далее идет функция конвертации в формат OpenCV.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="cpp" name="code"&gt;void Decode(BufferInfo&amp;amp; bufferInfo)&amp;nbsp;
{
 cv::Mat mat(bufferInfo.height, bufferInfo.width, CV_8UC2, bufferInfo.pPixels);
 cv::Mat image;

 cv::cvtColor(mat, image, CV_BGR5652BGR);

 // continue working with *image* - native OpenCV format
}
&lt;/pre&gt;&lt;br /&gt;
Обратите внимание, что мы имитируем двухканальный 8-битный формат, хотя на самом деле изображение 16-битное и с 3 каналами. &lt;strong&gt;В этом вся магия!&lt;/strong&gt; Ну, а дальше выполняем преобразование в обычный формат RGB and keep going! Переменная &lt;em&gt;image&lt;/em&gt; — решение поставленной задачи.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-4894049770832271939?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=JWBuBjFK-uU:ir_PzffFPG4:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=JWBuBjFK-uU:ir_PzffFPG4:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/JWBuBjFK-uU" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/07/opencv-bada-sdk.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-9111389920622143602</guid><pubDate>Sun, 11 Jul 2010 18:18:00 +0000</pubDate><atom:updated>2010-07-11T21:18:01.855+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><title>Сборка OpenCV средствами MinGW</title><description>В этой статье хотелось бы раскрыть нюансы сборки данной библиотеки. В моем случае эта процедура оказалась нетривиальной, с большим количеством граблей. Как известно, для последних версий OpenCV (на данный момент это 2.0 и больше) используется make-конфигуратор &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt;. Далее я расскажу об этапах сборки и как с этим конфигуратором справиться. Прошу под кат.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Итак, что нам нужно.&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Исходники OpenCV под Windows. У меня они находятся в D:/libs/OpenCV-2.1.0/&lt;/li&gt;
&lt;li&gt;MinGW компилятор, заточенный под bada. У меня — D:\bada\1.0.0b3\Tools\Toolchains\Win32\bin. Вместо него, видимо, можно использовать обычный g++, если не требуется кросс-компиляция.&lt;/li&gt;
&lt;li&gt;Сам MinGW и его инклуды: D:/MinGW/includes&lt;/li&gt;
&lt;li&gt;CMake 2.6+&lt;/li&gt;
&lt;li&gt;Bash — намного удобнее виндового cmd.exe. Идет вместе с TortoiseGit. Установите, не пожалеете.&lt;/li&gt;
&lt;/ol&gt;Когда это все установлено, запускаем CMake-GUI. В первом поле ввода &lt;i&gt;"Where is the source code"&lt;/i&gt; указываем путь к распакованным исходникам OpenCV. Во втором поле ввода указываем каталог, где бы нам хотелось разместить файлы настроек проекта. Указываем любое понравившееся (см. рис 1).&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_v4FkjOpnH0g/TDoByw7yoaI/AAAAAAAACVI/TQamJmJdKPw/s1600/1-folders.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="140" src="http://2.bp.blogspot.com/_v4FkjOpnH0g/TDoByw7yoaI/AAAAAAAACVI/TQamJmJdKPw/s320/1-folders.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Рис. 1 — Указываем каталоги&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Нажимаем кнопку Configure. Если выскочил вопрос &lt;i&gt;"Build directory does not exist, &amp;nbsp;should I create it?"&lt;/i&gt;, соглашаемся. Потом. Должен открыться диалог, который предлагает выбрать средства компиляции. Можно выбрать в качестве IDE MS Visual Studio, на выходе получим проект для работы с библиотекой OpenCV под Виндой. У нас же стоит задача собрать библиотеку средствами MinGW.&lt;br /&gt;
&lt;blockquote&gt;Вся эта затея не будет казаться странной, если я скажу зачем она. Бинарники в стандартной поставке идут с оптимизацией и использованием SSE, что в моем случае недопустимо из-за того, что я использую их для своего проекта под Samsung Wave. Этот телефон, как ни странно, не поддерживает инструкции SSE, из-за чего некоторые функции библиотеки невозможно использовать. Это заставило меня пересобрать OpenCV.&lt;/blockquote&gt;Итак, в выпадающем меню выбираем &lt;i&gt;"MinGW Makefiles"&lt;/i&gt;, а также переключаем чекбокс на &lt;i&gt;"Specify native compilers"&lt;/i&gt;. Повторюсь, мне это нужно для того, чтобы использовать компилятор из поставки bada SDK. Нажимаем Finish.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_v4FkjOpnH0g/TDoCURRepoI/AAAAAAAACVM/1QzW-6oiaN8/s1600/2-native+compilers.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="110" src="http://3.bp.blogspot.com/_v4FkjOpnH0g/TDoCURRepoI/AAAAAAAACVM/1QzW-6oiaN8/s400/2-native+compilers.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Рис. 2 — Указываем пути к компилятору&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Далее наверняка выскочит Error. Вот тут и начинаются танцы с дудками :) Чтобы четко понять, что от нас хотят, переключаемся на &lt;i&gt;Advanced View&lt;/i&gt; (сверху над списком).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_v4FkjOpnH0g/TDoDR_RVjLI/AAAAAAAACVQ/0wuYB153i2s/s1600/3-advanced+view.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="60" src="http://1.bp.blogspot.com/_v4FkjOpnH0g/TDoDR_RVjLI/AAAAAAAACVQ/0wuYB153i2s/s400/3-advanced+view.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
В таблице будут строчки, подсвеченные красным. С ними и надо разобраться. Исправляем вручную прежде всего те, в значении которых есть слова NOTFOUND, избирательно. Выставляем их. Нажимаем опять кнопку &lt;i&gt;Configure&lt;/i&gt;. И так до тех пор, пока внизу в логах не появится строчка &lt;i&gt;"Configuring done"&lt;/i&gt;. Теперь еще раз проверяем все параметры и нажимаем в последний раз &lt;i&gt;Configure&lt;/i&gt;, а потом &lt;i&gt;Generate&lt;/i&gt;.&lt;br /&gt;
&lt;blockquote&gt;Насчет параметров. Моей целью было снять галочки напротив USE_SSE, USE_SSE2.&amp;nbsp;&lt;/blockquote&gt;С такими параметрами я выполнял компиляцию.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_v4FkjOpnH0g/TDoKCItfSZI/AAAAAAAACVU/i9iy08wbxNI/s1600/4-customization.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="184" src="http://3.bp.blogspot.com/_v4FkjOpnH0g/TDoKCItfSZI/AAAAAAAACVU/i9iy08wbxNI/s320/4-customization.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_v4FkjOpnH0g/TDoKCzOlC_I/AAAAAAAACVY/4M5gAssgkes/s1600/5-customization.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://2.bp.blogspot.com/_v4FkjOpnH0g/TDoKCzOlC_I/AAAAAAAACVY/4M5gAssgkes/s320/5-customization.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_v4FkjOpnH0g/TDoKDm2QwXI/AAAAAAAACVc/rdRl_lyfVvo/s1600/6-customization.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="94" src="http://3.bp.blogspot.com/_v4FkjOpnH0g/TDoKDm2QwXI/AAAAAAAACVc/rdRl_lyfVvo/s320/6-customization.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Возможно, потом придется внести поправки. Достаточно просто загрузить CMake-GUI, все настройки восстановятся.&lt;br /&gt;
&lt;br /&gt;
Теперь переходим к нашему каталогу, в котором находится сгенерированный проект (/build-mingw). Переходим в консоль и выполяем команду &lt;i&gt;cs-make.&lt;/i&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;cs-make — платформо-специфический make под bada. Для обычных случаев, используйте make.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;
Если в ходе компиляции возникают ошибки (а они будут), то с ними нужно разобраться самостоятельно. Универсального совета не дам, действуйте по обстоятельствам: где-то надо добавить опцию компилятора (например, путь поиска инклудов), где-то ручками подправить исходники.&lt;br /&gt;
&lt;br /&gt;
В конечном итоге, вы должны получить все необходимые бинарники. Если что-то упустил или по ходу возникли какие-то вопросы — спрашивайте в комментариях, постараюсь помочь чем могу.&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-9111389920622143602?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=qF2mnkk_chc:S9Ej6iQXxcM:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=qF2mnkk_chc:S9Ej6iQXxcM:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/qF2mnkk_chc" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/07/opencv-mingw.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_v4FkjOpnH0g/TDoByw7yoaI/AAAAAAAACVI/TQamJmJdKPw/s72-c/1-folders.png" height="72" width="72" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-4740384715172078523</guid><pubDate>Thu, 08 Jul 2010 19:53:00 +0000</pubDate><atom:updated>2010-07-11T21:25:21.874+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><title>OpenCV под bada OS</title><description>Проверено — работает :) Стоит обратить внимание, что OpenCV ниже версии 2.0 вызывает крэши приложений, запущенных как из под симулятора, так и с телефона. Почему — мне выяснить не удалось.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Обновлено через несколько дней.&amp;nbsp;&lt;/strong&gt;Проблема заключалась в том, что в системной переменной PATH не был прописан путь до файлов dll этой библиотеки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Важное замечание!&lt;/b&gt; Для того, чтобы иметь возможность слинковаться со статическими либками, расположенными в каталоге /lib, надо переименовать их в *.lib. Почему разработчики использовали расширение .dll мне не понятно.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Кстати!&lt;/b&gt; Вот удивительно, не думал, что вернусь к использованию OpenCV, да и вообще, — к программированию на плюсах. Планирую (если опять не забью на блог) что-нибудь полезное по этому поводу выложить. Может даже видеотуториал. Посмотрим...&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-4740384715172078523?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=gZCFG9zuLeg:AUX_pTfSRTg:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=gZCFG9zuLeg:AUX_pTfSRTg:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/gZCFG9zuLeg" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/07/opencv-bada-os.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-5857600921291228321</guid><pubDate>Thu, 08 Jul 2010 09:43:00 +0000</pubDate><atom:updated>2010-07-08T12:43:44.873+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C++</category><title>The chosen operation is not enabled</title><description>На такое вот сообщение нарвался в &lt;i&gt;Eclipse CDT&lt;/i&gt; при попытке установить точку останова в исходном коде. Это означало, что breakpoint-ами нельзя будет воспользоваться. Как от этого излечиться гугль не подсказал, но в результате долгих танцев с бубнами мне удалось их задействовать.&lt;br /&gt;
&lt;br /&gt;
Если вы попали в такую же беду, надо в меню &lt;i&gt;Run &amp;gt; Brealpoint Types&lt;/i&gt; поставить галку напротив &lt;i&gt;C/C++ Breakpoints&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;P.S. К слову, я занимаюсь программированием под bada OS, а в частности, под свой Samsung Wave. Если разрожусь на мысли, то в скором поделюсь своими впечатлениями.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-5857600921291228321?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=b5noNOrVwXM:BOo5RjZWj0E:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=b5noNOrVwXM:BOo5RjZWj0E:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/b5noNOrVwXM" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/07/chosen-operation-is-not-enabled.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-5560188631093263102</guid><pubDate>Mon, 05 Apr 2010 07:44:00 +0000</pubDate><atom:updated>2010-04-05T10:44:17.609+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">CSS</category><category domain="http://www.blogger.com/atom/ns#">Links</category><title>JavaScript Library for Querying CSS</title><description>Спешу поделиться одной очень классной тулзой &lt;strong&gt;CSSUtilities&lt;/strong&gt; — библиотекой, которая работает со стилями CSS. Она может определять правила CSS, которые применены к данному элементу и, отдельно, унаследованные от родителей. Заостряю ваше внимание, что мы получаем не нормализованные значения, а каскады стилей, то есть те, которые можно встретить в любом девелоперском тулбаре (Firebug, Dragonfly и др.). Судя по документу, у нее еще очень много практических возможностей...&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Узнал по наводке &lt;a href="http://www.sitepoint.com/blogs/2010/04/05/a-specialized-javascript-library-for-querying-css/"&gt;этой статьи&lt;/a&gt;.&lt;br /&gt;
Страница с презентацией возможностей — &lt;a href="http://www.brothercake.com/scripts/cssutilities/"&gt;тыц&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Для сведения: сжатая бибиотека занимает около 40Кб.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-5560188631093263102?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=7Im6I4CD1aM:-YB87t3Xv3Y:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=7Im6I4CD1aM:-YB87t3Xv3Y:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/7Im6I4CD1aM" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/04/javascript-library-for-querying-css.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-6861739826624259278</guid><pubDate>Thu, 11 Mar 2010 19:02:00 +0000</pubDate><atom:updated>2010-03-11T21:02:06.850+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Links</category><title>Браузерный JavaScript и стандарты</title><description>Разработчики из Гугла выкатили в онлайн инструмент &lt;a href="http://sputnik.googlelabs.com/"&gt;Sputnik&lt;/a&gt; для функционального тестирования браузеров (он и &lt;a href="http://kangax.github.com/sputniktests-webrunner/"&gt;раньше существовал&lt;/a&gt;, но только как неофициальное решение). Тесты, а их более пяти тысяч, проверяют, насколько хорошо движок соответствует спецификации ECMA-262, 3rd edition. На данный момент, лучше всех это удается сделать Opera 10.50 — всего 78 ошибок против 463 у аутсайдера IE8.&lt;br /&gt;
&lt;br /&gt;
Так что, если потребуется проверить код на "правильность", стоит обращаться к Опере. Кстати говоря, в свете последних заявлений о ее (его?) быстроте, этот результат показывает, что норвежские разработчики отлично поработали над созданием нового движка Carakan.&lt;br /&gt;
&lt;br /&gt;
Сравните, какая ситуация &lt;a href="http://perfectionkills.com/sputniktests-web-runner/"&gt;была полгода назад&lt;/a&gt; и &lt;a href="http://sputnik.googlelabs.com/compare"&gt;ныне&lt;/a&gt;.&lt;br /&gt;
&lt;a href="http://blog.chromium.org/2010/03/does-your-browser-behave.html"&gt;Новость в блоге Chromium&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-6861739826624259278?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=oTfBcFu13qs:lwWwV5FlEeY:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=oTfBcFu13qs:lwWwV5FlEeY:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/oTfBcFu13qs" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/03/javascript_11.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-2759852507441673697</guid><pubDate>Tue, 09 Mar 2010 20:38:00 +0000</pubDate><atom:updated>2010-03-09T22:38:06.053+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Links</category><title>Минимизация HTML кода</title><description>В полку инструментов веб-программирования прибыло — оптимизатор кода, выполняющий такие операции, как удаление ненужных пробельных символов, различного рода комментариев (в скриптах и в HTML), кавычек в определении атрибутов, устаревших и неиспользуемых/необязательных атрибутов и их значений, и другое.&lt;br /&gt;
&lt;br /&gt;
Скажу я вам, серьезный даже слишком жесткий оптимизатор вышел. Он пока в активной разработке, на него не стоит серьезно полагаться.&lt;br /&gt;
&lt;br /&gt;
Собственно, сам инструмент располагается здесь: &lt;a href="http://kangax.github.com/html-minifier/"&gt;HTML Minifier&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Но, если верить &lt;a href="http://webo.in/articles/habrahabr/112-minify-combine-javascript-troubles/"&gt;статье по оптимизации JS&lt;/a&gt;, "сжатие JavaScript-файлов даст нам всего лишь 5-7% уменьшение размера относительно обычного gzip, который можно использовать везде". Так что, стоит ли овчинка выделки...&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-2759852507441673697?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=r5XS9mv1VhQ:H1nYP-uTKlk:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=r5XS9mv1VhQ:H1nYP-uTKlk:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/r5XS9mv1VhQ" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/03/html.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-2797931548017537600</guid><pubDate>Tue, 09 Mar 2010 12:40:00 +0000</pubDate><atom:updated>2010-03-09T14:40:47.035+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Watir</category><title>[Javascript, Watir] Функциональное тестирование</title><description>Моя &lt;a href="http://github.com/severality/pss_vk_windows"&gt;оконная реализация&lt;/a&gt; — отличный полигон для знакомства с различными техниками программирования. В этой статье я хочу рассказать про функциональное тестирование. Оно мне пригодится в свете того, что я &lt;a href="http://www.codeblogz.ru/2010/03/javascript.html"&gt;собираюсь сделать&lt;/a&gt;. Я хочу быть уверенным, что мои изменения не будут вести к регрессии (к появлению ошибок в отлаженных участках кода). О плюсах тестирования вы и сами знаете — с ним лучше, чем без.&lt;br /&gt;
&lt;br /&gt;
Хочу заострить ваше внимание, что буду проводить не модульное (юнит-) тестирование, а функциональное. Согласно википедии, таким образом проверяются функции приложения, а не отдельных его модулей.&lt;br /&gt;
&lt;br /&gt;
Средство для тестирования я выбрал нестандартное — не Selenium, а &lt;a href="http://watir.com/"&gt;Watir&lt;/a&gt;. Кстати, есть еще &lt;a href="http://sahi.co.in/w/"&gt;Sahi&lt;/a&gt;, но с ним разберусь в следующий раз (&lt;a href="http://en.wikipedia.org/wiki/Comparison_of_Web_Testing_tools"&gt;сравнительная таблица&lt;/a&gt;). Я остановился на Watir, потому что он мне нравится :) Во-первых, в качестве скриптового языка используется Ruby (классный язык), во-вторых, с ним проще начать работать, чем с Selenium (не въехал я в него).&lt;br /&gt;
&lt;br /&gt;
Установка Watir. Проследуйте по &lt;a href="http://watir.com/installation/"&gt;ссылке с инструкциями&lt;/a&gt;. Вам надо поставить Руби (лучше всего версии 1.8), а потом и нужные пакеты через &lt;code&gt;gem install watir&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь давайте проверим Watir в работе на простом примере. Напишем тест, смысл которого открыть поиск гугла и найти статьи этого блога.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="ruby" name="code"&gt;require 'rubygems'
require 'watir'   # the controller
require 'test/unit' 

class TC_test_suite &amp;lt; Test::Unit::TestCase

 def test_ask_google_for_codeblogz
  puts 'Init browser'
  b = Watir::Browser.new

  puts 'Go to Google Search'
  b.goto("http://www.google.com")

  puts 'Put search query'
  b.text_field(:name, "q").set "watir site:codeblogz.ru"
  
  puts 'Click button to start searching'
  b.button(:name, "btnG").click

  puts 'Check whether codeblogz has post about Watir'
  assert(b.text.include?("www.codeblogz.ru") )
  
  puts 'End of test'
 end
end&lt;/pre&gt;&lt;br /&gt;
Запустите в консоли, и смотрите на "представление" :)&lt;br /&gt;
&lt;br /&gt;
Теперь мне нужно описать тесты, которые будут проверять работоспособность моей оконной реализации. Напомню, какой функционал предоставляет мое решение:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Перемещение окна&lt;/li&gt;
&lt;li&gt;Изменение размеров&lt;/li&gt;
&lt;li&gt;Сворачивание в низ страницы&lt;/li&gt;
&lt;/ul&gt;Открывать браузер, искать поля ввода — это не сложно. Теперь давайте разберемся, как управлять мышой, как "таскать" и "ресайзить" наши веб-окна. Тут без активного интерактива не обойтись, поэтому надо воспользоваться одной dll-кой, которую нужно зарегистрировать в системе. Для Windows это делается через &lt;code&gt;regsvr32 C:\ruby\lib\ruby\gems\1.8\gems\watir-1.6.5\watir\AutoItX3.dll&lt;/code&gt;. И нам открываются новые возможности :) А именно: можно имитировать перемещение курсора, нажатие и удерживание левой кнопки и др.&lt;br /&gt;
&lt;br /&gt;
Но, чтобы таскать окошки, нужно знать их координаты. Координаты можно вычислять через свойства элементов. Без лишней демагогии, привожу код тест-кейса.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="ruby" name="code"&gt;require 'rubygems'
require 'watir'   # the controller
require 'test/unit' 
require 'win32ole'

class TC_test_suite &amp;lt; Test::Unit::TestCase

 def test_move_window
  puts 'Init browser'
  b = Watir::IE.attach(:title , /pss_window functional test/)
  b.bring_to_front
  b.maximize

  puts "Find window with title 'Library capabilities'"

  d = b.div(:xpath, "//div[text() = 'Library capabilities']")
  top = d.attribute_value("offsetTop")
  left = d.attribute_value("offsetLeft")
  height = d.attribute_value("clientHeight")
  width = d.attribute_value("clientWidth")

  y = 110 + top + height / 2
  x = 10 + left + width / 2
  puts x, y 
  
  puts "Start mouse manipulations"
  a = WIN32OLE.new("AutoItX3.Control")
  a.mousemove(x,y)
  a.mousedown
  
  a.mousemove(x+50, y+50)
  a.mousemove(x+150, y+50)
  a.mousemove(x+150, y+250)
  a.mouseup
  puts "End"
 end
end&lt;/pre&gt;&lt;br /&gt;
Этот тест имеет множество недостатков:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;не работает, если окно браузера закрыто (я пока не разобрался, как заставить IE открывать локальные файлы без подтверждения);&lt;/li&gt;
&lt;li&gt;не определяет реальные координаты элемента (необходимо реализовать цикл);&lt;/li&gt;
&lt;li&gt;да и вообще, проверяет работу только одной функции - перемещения&lt;/li&gt;
&lt;li&gt;слишком простой, и мало чего проверяет — необходимо написать множество тест-кейсов, чтобы можно было перейти к следующему этапу.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;a href="http://github.com/severality/pss_vk_windows/tree/origin/test"&gt;Начало положено&lt;/a&gt;. Теперь надо подучить Руби и написать более адекватные тесты :) Об этом в &lt;a href="http://www.codeblogz.ru/search/label/Watir"&gt;следующих статьях&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;P.S. Если среди вас есть рубисты, или просто знакомые с Watir — прошу отметиться в комментариях, с какими полезностями вы можете поделиться.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-2797931548017537600?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=N4FtCg82uIc:muzDpXOuiFw:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=N4FtCg82uIc:muzDpXOuiFw:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/N4FtCg82uIc" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/03/javascript-watir.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-1081852705123665002</guid><pubDate>Sat, 06 Mar 2010 20:41:00 +0000</pubDate><atom:updated>2010-03-06T22:41:30.633+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Releases</category><title>[JavaScript] Окошки в браузере</title><description>Закончился конкурс, осталась рабочая реализация. Суть — веб-окошки, которые можно произвольно таскать по странице, изменять их горизонтально-вертикальные размеры, сворачивать и вообще закрывать.&lt;br /&gt;
По прошествии некоторого времени, глядя на код и его недостатки (о коих ниже), я понимаю, что мне еще учиться и учиться джаваскрипту! Все-таки это язык гибких возможностей, и я выбрал не самый удачный способ реализации.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Но на ошибках учатся, без этого никак.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Исходный код можно найти на гитхабе, в открытом доступе: &lt;a href="http://github.com/severality/pss_vk_windows"&gt;github.com/severality/pss_vk_windows&lt;/a&gt;&lt;br /&gt;
Поиграться с конкурсным решением можно здесь: &lt;a href="http://js.codeblogz.ru/windows/index.htm"&gt;js.codeblogz.ru/windows/index.htm&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Текущий релиз будет именоваться гордым 0.1a. То есть вы понимаете, что до полноценного Один-Ноль пока далековато и стремиться к таковому быстро я не обещаю.&lt;br /&gt;
&lt;br /&gt;
Планы:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;изменить архитектуру: сейчас окна строятся по принципу лэйаутов в Java и Qt. Я ставил на гибкость и универсальность. Но зачем это нужно, если в проекте нужен набор из трех окошек. Окна однотипные и со статичными данными. Нет нужды каждый раз при загрузке генерировать окна, если можно просто описать их через язык разметки html (для этого он собственно и нужен) и вешать на них соответствующие обработчики;&lt;/li&gt;
&lt;li&gt;реализовать все на манер ненавязчивого js, чтобы при неработающем у клиента js выводилась рабочая оконная структура;&lt;/li&gt;
&lt;li&gt;уйти от использования проприетарных common.js и rustyle.css&lt;/li&gt;
&lt;li&gt;избавиться от багов :)&lt;/li&gt;
&lt;/ul&gt;На этом все. Обсуждение кода приветствуется, прошу в комментарии.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-1081852705123665002?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=kRzHZDwIr1M:TwAx4tQ_wL0:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=kRzHZDwIr1M:TwAx4tQ_wL0:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/kRzHZDwIr1M" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/03/javascript.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-1916627030857964160</guid><pubDate>Wed, 03 Mar 2010 18:42:00 +0000</pubDate><atom:updated>2010-03-03T20:42:19.615+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Others</category><title>Итоги конкурса</title><description>Вот и результаты конкурса объявили. Я не вошел в призеры. Это огорчает. Думаю, меня сгубила привычка делать все универсально и основательно, хотя можно было победить с работой, которая делает не больше не меньше сказанного, с массой упрощений. Ну и ладно :) Перевернется и на нашей улице грузовик с блекджеком и шлюхами... Ага.&lt;br /&gt;
&lt;br /&gt;
Если кому интересно (&lt;em&gt;отметьтесь в комментариях&lt;/em&gt;), могу выложить в образовательных целях пару статеек того, как проектировать такие работы. По себе знаю, что познавать какую-то область лучше на практических примерах.&lt;br /&gt;
&lt;br /&gt;
В любом случае, как и обещал, после некоторого приведения в порядок, выложу исходники своей реализации на github-е.&lt;br /&gt;
&lt;br /&gt;
А впереди следующий конкурс — виджеты для Оперы. Может там что получится добиться :)&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-1916627030857964160?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=ISZGp7kuyzQ:zwO27v8E4cM:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=ISZGp7kuyzQ:zwO27v8E4cM:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/ISZGp7kuyzQ" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/03/blog-post.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-8831144967133067232</guid><pubDate>Wed, 24 Feb 2010 20:46:00 +0000</pubDate><atom:updated>2010-02-24T22:46:52.304+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Quiz</category><title>Новости с фронтов</title><description>Видели последний тест на JavaScript от Дмитрия Сошникова? &lt;a href="http://javascript.ru/blog/Dmitry-A.-Soshnikov/The-quiz"&gt;Вот он&lt;/a&gt;, подивитесь :) Это взрыв мозга, в целом сложный и в некоторых местах чересчур хитрый! Автору респект. (Даже хочется привести цитату &lt;a href="http://habrahabr.ru/blogs/DIY/82812/#comment_2461290"&gt;одного комментария&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Между тем, давно не ощущал себя студентом: постоянные недосыпы, в голове крутится только одно — как бы это лучше сделать... Это я про &lt;a href="http://www.codeblogz.ru/2010/02/blog-post_17.html"&gt;конкурс&lt;/a&gt;, на который себя же и подбил. Пока до конца не готово, но текущими результатами я доволен. Конкуренцию должен составить! Может даже выложу в опен-сорс. Ждите понедельника (1 марта) — там объявят результаты.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-8831144967133067232?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=F7snkYi4ETw:yZSNsWoI2vg:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=F7snkYi4ETw:yZSNsWoI2vg:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/F7snkYi4ETw" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/02/blog-post_24.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-5219233221908867115</guid><pubDate>Wed, 17 Feb 2010 20:49:00 +0000</pubDate><atom:updated>2010-02-17T22:49:18.580+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Others</category><title>Заработай своим умом</title><description>И не просто заработай, а покажи свои навыки и находчивость, стань лучше сотни других! И получи приз как признание своей ценности :).&lt;br /&gt;
&lt;br /&gt;
Никто не собирается поучаствовать в конкурсе на лучшую разработку? На этой неделе по языку js было объявлено два таких "соревнования":&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The Code-to-win Challenge от Opera — необходимо отличиться в создании оригинального либо всенародно любимого виджета под новый движок браузера. На кону MacBook Pro и HTC HD2. Подробности читайте в &lt;a href="http://habrahabr.ru/company/opera/blog/84489/"&gt;офф. пресс-релизе&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Конкурс на JS от ВКонтакте. Почему бы и нет? Требуется реализовать оконную библиотеку. Подробности&amp;nbsp;&lt;a href="http://vkontakte.ru/pages.php?id=10425826"&gt;читайте в этой теме&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;Вы как хотите, а я рискну! Там и там. Это неоценимый опыт, проверка своих сил может не в экстремальных, но вполне в приближенных к ним условиях, плюс — прекрасная возможность отличиться.&lt;br /&gt;
&lt;br /&gt;
Кто со мной?&lt;br /&gt;
&lt;br /&gt;
P.S. Это мотивационный пост. Не хочу пасовать перед реальной возможностью ;)&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-5219233221908867115?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=_ezdq7Skhss:dVRNzWwUYV8:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=_ezdq7Skhss:dVRNzWwUYV8:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/_ezdq7Skhss" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/02/blog-post_17.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-6149197906771922784</guid><pubDate>Tue, 16 Feb 2010 21:45:00 +0000</pubDate><atom:updated>2010-02-16T23:45:17.215+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Quiz</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Еще одна викторина, но уже с ответами от меня</title><description>Люблю ломать мозг, и на этот раз не буду &lt;a href="http://www.codeblogz.ru/2010/02/javascript.html"&gt;отправлять по ссылкам&lt;/a&gt;, или отвечать &lt;a href="http://deer.org.ua/2010/02/10/2/comments/#2"&gt;комментарием&lt;/a&gt; на чужой пост. Напишу свои размышления, и спрошу ваших комментариев :)&lt;br /&gt;
&lt;br /&gt;
Тест предложен блоггером Nicholas C. Zakas (&lt;a href="http://www.nczonline.net/blog/2010/02/16/my-javascript-quiz/"&gt;оригинал&lt;/a&gt;). Отвечать буду аргументированно, с подглядыванием в консоль (все-таки до гуру расти и расти :) ).&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;Example #1&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var num1 = 5,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;num2 = 10,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;result = num1+++num2;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Questions:&lt;br /&gt;
What is the value of &lt;em&gt;result&lt;/em&gt;?&lt;br /&gt;
What is the value of &lt;em&gt;num1&lt;/em&gt;?&lt;br /&gt;
What is the value of &lt;em&gt;num2&lt;/em&gt;?&lt;/blockquote&gt;&lt;br /&gt;
Судя по множеству плюсов надо решить, используется ли здесь инфиксный (++num2) либо постфиксный (num1++) инкремент. А зависит это от порядка выполнения операций в выражении (точнее, от их приоритета). От этого сильно зависит значение всех трех переменных. Во многих языках инкремент (как и декремент) имеет высший приоритет, нежели сложение (вычитание). Проверка этого обстоятельства в js подтверждает мои предположения.&lt;br /&gt;
&lt;br /&gt;
Ответ: &lt;code&gt;num1==6, num2==10, result==15&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;Example #2&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var x = 5,&lt;br /&gt;
o = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;x: 10,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;doIt: function doIt(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;var x = 20;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;setTimeout(function(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;alert(this.x);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}, 10);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
};&lt;br /&gt;
o.doIt();&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Questions:&lt;br /&gt;
What value is displayed in the alert?&lt;/blockquote&gt;&lt;br /&gt;
Здесь, как по мне, все просто (постоянно с таким сталкиваюсь). Функция, вызываемая по таймауту, выполняется в контексте объекта &lt;code&gt;window&lt;/code&gt;. Поэтому &lt;code&gt;this.x&lt;/code&gt; равнозначно &lt;code&gt;window.x == x == 5&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Ответ: 5&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;Example #3&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var num1 = "10",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;num2 = "9";&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Questions:&lt;br /&gt;
&lt;br /&gt;
What is the value of &lt;code&gt;num1 &amp;lt; num2&lt;/code&gt;?&lt;br /&gt;
What is the value of &lt;code&gt;+num1 &amp;lt; num2&lt;/code&gt;?&lt;br /&gt;
What is the value of &lt;code&gt;num1 + num2&lt;/code&gt;?&lt;br /&gt;
What is the value of &lt;code&gt;+num1 + num2&lt;/code&gt;?&lt;/blockquote&gt;&lt;br /&gt;
С подобной проблемой я тоже сталкивался, когда оказалось, что &lt;code&gt;"10"&amp;nbsp;&amp;lt;&amp;nbsp;"9" // true!&lt;/code&gt;. А дело тут в сравнении строк, а не сравнении чисел. Если оба операнда — строки, то сравнение основывается на стандартном лексикографическом порядке юникодных значений. Если же один из операндов число, то второй операнд (строка) приводится к числу. Поэтому &lt;code&gt;+"10"&amp;nbsp;&amp;lt;&amp;nbsp;"9" // false!&lt;/code&gt;. (Оператор "плюс" приводит строку "10" к соответствующему числу.)&lt;br /&gt;
&lt;br /&gt;
Оператор "+" с операндом строка выполняет конкатенацию как с числом, так и с другой строкой. Поэтому &lt;code&gt;num1 + num2 == "10" + "9" == +num1 + num2 == 10 + "9" == "109"&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;Example #4&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var message = "Hello world!";&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Questions:&lt;br /&gt;
&lt;br /&gt;
What is the value of &lt;code&gt;message.substring(1, 4)&lt;/code&gt;?&lt;br /&gt;
What is the value of &lt;code&gt;message.substr(1,4)&lt;/code&gt;?&lt;/blockquote&gt;&lt;br /&gt;
Стоит различать функции &lt;code&gt;substring&lt;/code&gt;, принимающей в качестве параметров индексы начала и конца, и &lt;code&gt;substr&lt;/code&gt;, принимающей в качестве параметров индекс начала и длину выделяемой строки. Также интересно, что &lt;code&gt;message.substr(-1) == "!"&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Ответ: "ell", "ello".&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;Example #5&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var o = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; x: 8,&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; valueOf: function(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; return this.x + 2;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; toString: function(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; return this.x.toString();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;},&lt;br /&gt;
&amp;nbsp;&amp;nbsp;result = o &amp;lt; "9";&lt;br /&gt;
&lt;br /&gt;
alert(o);&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Questions:&lt;br /&gt;
&lt;br /&gt;
What is the value &lt;code&gt;result&lt;/code&gt;?&lt;br /&gt;
What is the value displayed in the alert?&lt;/blockquote&gt;&lt;br /&gt;
Вся соль в особенностях вызова функций &lt;code&gt;valueOf&lt;/code&gt; и &lt;code&gt;toString&lt;/code&gt;. Где требуется числовое значение, вызывается первая функция, где строковое - вторая. При сравнении (больше/меньше) вызывается сначала &lt;code&gt;valueOf&lt;/code&gt;, а затем &lt;code&gt;toString&lt;/code&gt;, если первая не определена. Функция &lt;code&gt;alert&lt;/code&gt; требует строку в качестве входного параметра.&lt;br /&gt;
&lt;br /&gt;
Ответ: &lt;code&gt;result == false&lt;/code&gt;, "8".&lt;br /&gt;
&lt;br /&gt;
В заключение хочу сказать, что тест оказался простым, но поучительным. А вам как?&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-6149197906771922784?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=NyhprM0cGkE:dvp10SPkwmA:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=NyhprM0cGkE:dvp10SPkwmA:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/NyhprM0cGkE" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/02/blog-post_16.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-4905199350709393071</guid><pubDate>Sat, 13 Feb 2010 12:44:00 +0000</pubDate><atom:updated>2010-02-13T14:44:18.599+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Others</category><title>Неполадки с фидом</title><description>Обнаружил проблемы с каналом RSS, которые благополучно разрешил. Советую переподписаться на фид —&amp;nbsp; &lt;a href="http://feeds2.feedburner.com/codeblogz"&gt;http://feeds2.feedburner.com/codeblogz&lt;/a&gt;. Если вы заподозрили неладное, дайте знать.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-4905199350709393071?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=Ij3vfv-D0Lg:3fHMh4NGWlY:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=Ij3vfv-D0Lg:3fHMh4NGWlY:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/Ij3vfv-D0Lg" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/02/blog-post.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-7102685047038576724</guid><pubDate>Fri, 12 Feb 2010 15:12:00 +0000</pubDate><atom:updated>2010-02-12T17:12:48.548+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Links</category><title>Начинающим изучать Javascript</title><description>Продолжаю публиковать полезные и интересные находки, связанные с js. На этот раз — цифровая книга на английском, которая в доступной манере объясняет основы языка. По полной используются возможности интерактивного обучения: все примеры можно запустить в "консоли" самой книги и наглядно убедится в работе кода. Также есть задания для самостоятельного закрепления материала (с ответами, конечно). Толщину книги оценить трудно, но каждый раздел достаточно подробно расписан. Предназначен новичкам, но и другие могут найти для себя что-нибудь полезное.&lt;br /&gt;
&lt;br /&gt;
Ссылка на книгу: &lt;a href="http://eloquentjavascript.net/index.html"&gt;Eloquent JavaScript&lt;/a&gt; (для &lt;a href="http://eloquentjavascript.net/print.html"&gt;печати&lt;/a&gt; | в &lt;a href="http://eloquentjavascript.net/Eloquent%20JavaScript.zip"&gt;архиве&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Успехов в изучении!&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-7102685047038576724?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=XRKhdANdwpk:wznYtR1kmPI:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=XRKhdANdwpk:wznYtR1kmPI:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/XRKhdANdwpk" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/02/javascript_12.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-7356185102420823797</guid><pubDate>Wed, 10 Feb 2010 20:22:00 +0000</pubDate><atom:updated>2010-02-10T22:22:31.772+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Links</category><title>Статьи про Function (declaration | expression)</title><description>В свете &lt;a href="http://www.codeblogz.ru/2010/02/javascript.html"&gt;предыдущего топика&lt;/a&gt;&amp;nbsp;и, в некотором роде, забавных ответов на одну викторину в статье &lt;a href="http://deer.org.ua/2010/02/10/2/"&gt;JavaScript викторина от perfectionkills.com&lt;/a&gt;, хочу посоветовать следующее чтиво по одной из самых запутанных тем в js:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Functions"&gt;Functions and function scope&lt;/a&gt; на сайте Mozilla Developer Center&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yura.thinkweb2.com/named-function-expressions/"&gt;Named function expressions demystified&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;Предупреждаю, статьи на английском, однако, все доходчиво расписано, с кучей примеров.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-7356185102420823797?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=uZA0_Ww6Hfk:5w9Dv2OIe68:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=uZA0_Ww6Hfk:5w9Dv2OIe68:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/uZA0_Ww6Hfk" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/02/function-declaration-expression.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-541974756890888832</guid><pubDate>Wed, 10 Feb 2010 14:41:00 +0000</pubDate><atom:updated>2010-02-14T21:01:58.676+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Quiz</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Тесты на знание Javascript</title><description>По вебу прокатилось несколько интересных статей на знание тонкостей Javascript:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Вопросы &lt;a href="http://dmitry.baranovskiy.com/post/91403200"&gt;So, you think you know JavaScript?&lt;/a&gt; от Дмитрия Барановского и&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ответы &lt;a href="http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+nczonline+%28NCZOnline+-+The+Official+Web+Site+of+Nicholas+C.+Zakas%29"&gt;Answering Baranovskiy’s JavaScript quiz&lt;/a&gt;&amp;nbsp;от &amp;nbsp;Nicholas C. Zakas&lt;/li&gt;
&lt;li&gt;14 вопросов &lt;a href="http://perfectionkills.com/javascript-quiz/"&gt;Javascript quiz&lt;/a&gt;&amp;nbsp;(хитрый тест, я ответил правильно наполовину)&lt;/li&gt;
&lt;li&gt;и &lt;a href="http://www.google.com/search?q=javascript+quiz"&gt;другие&lt;/a&gt;...&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;Дабы оставить свой след, и дать вам возможность размяться, предлагаю ответить на простой вопрос о простом с виду коде:&lt;br /&gt;
&lt;pre class="javascript" name="code"&gt;function a() {
}
function b() {
  var a=b=1;
  alert(a); // число
  alert(b); // число
}
function c() {
  b();
  alert(a); // функция
  alert(b); // число??
}
c();
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Что выведет этот скрипт и &lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;почему&lt;/span&gt;&lt;/span&gt;?&lt;/b&gt; Ответы принимаются в каментах. В свою очередь скажу, что этот код принес мне уйму неприятностей, и определить место проблемы было сродни квесту.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Обновлено.&lt;/b&gt; Чуть изменил код примера.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-541974756890888832?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=HMlDVdx3UZ0:1nMCoY2Z-RM:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=HMlDVdx3UZ0:1nMCoY2Z-RM:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/HMlDVdx3UZ0" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/02/javascript.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-6847673885131269031</guid><pubDate>Wed, 20 Jan 2010 12:36:00 +0000</pubDate><atom:updated>2010-01-20T14:36:51.047+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Unit-testing</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Тестирование и отладка Javascript</title><description>В продолжение поста &lt;a href="http://www.codeblogz.ru/2010/01/javascript.html"&gt;Тестируем проекты на Javascript&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Попалась на глаза очень интересная книжка (в формате PDF) о том, какие бывают средства тестирования и отладки, как ими пользоваться. В описание вошли &lt;strong&gt;Firebug&lt;/strong&gt;, &lt;strong&gt;Silenium IDE&lt;/strong&gt;, библиотеки &lt;strong&gt;YUI Test&lt;/strong&gt;, &lt;strong&gt;QUnit&lt;/strong&gt;, &lt;strong&gt;FireUnit&lt;/strong&gt;, &lt;strong&gt;jspec&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Кроме того, разжеваны &lt;em&gt;методы наследования в js&lt;/em&gt;, описаны проблемы, связанные с непониманием Javascript, показана техника TDD-разработки, и очень-очень много примеров.&lt;br /&gt;
&lt;br /&gt;
Книга по всей видимости must read. (Я, кстати, ее еще не читал, сознаюсь :) )&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://github.com/roblevintennis/Testing-and-Debugging-JavaScript/raw/master/TDD%20JavaScript.Nov3.2009.pdf"&gt;Книга за ноябрь 2009&lt;/a&gt;&lt;br /&gt;
Последнюю версию всегда можно найти &lt;a href="http://github.com/roblevintennis/Testing-and-Debugging-JavaScript/"&gt;в проекте на GitHub-е&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
P.S. Если вы не в ладах с английским, пользы от такой книги, к сожалению, будет маловато.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-6847673885131269031?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=FEw2YwnZKW8:H3RHLUKGp7Y:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=FEw2YwnZKW8:H3RHLUKGp7Y:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/FEw2YwnZKW8" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/javascript_20.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-4194267406015755887</guid><pubDate>Fri, 15 Jan 2010 11:16:00 +0000</pubDate><atom:updated>2010-01-15T13:28:19.315+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">canvas</category><title>3D-графика средствами Javascript</title><description>&lt;em&gt;Javascript&lt;/em&gt; удивляет. Вобщем-то такую библиотеку должен был кто-то реализовать. И это сделал Dean McNamee. Имя его разработки — &lt;a href="http://github.com/deanm/pre3d/"&gt;Pre3D&lt;/a&gt;. Вот, что пишет сам автор:&lt;br /&gt;
&lt;blockquote&gt;Pre3d is a JavaScript library, which will project a 3d scene into 2d, and draw it to a &amp;lt;canvas&amp;gt; element ...&amp;nbsp;The library is designed to be low-level and direct, there is no retrained or scene graph API.&lt;br /&gt;
&lt;/blockquote&gt;Видно, что библиотека построена по принципу проекции объемного изображения в двумерное с использованием модного нынче тэга canvas. Работает под большинством браузеров (это не касается IE).&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://deanm.github.com/pre3d/"&gt;Сайт проекта и примеры&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://github.com/deanm/pre3d"&gt;Исходники&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Вы знаете о чем-нибудь подобном?&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-4194267406015755887?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=j07-LrVsrAk:v9jt9Ude3pQ:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=j07-LrVsrAk:v9jt9Ude3pQ:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/j07-LrVsrAk" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/3d-javascript.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-8951428372199556045</guid><pubDate>Wed, 13 Jan 2010 22:23:00 +0000</pubDate><atom:updated>2010-01-14T00:23:06.382+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Audio</category><title>JS интерфейс для аудио-плэйера</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_v4FkjOpnH0g/S05FBNHYKFI/AAAAAAAACSw/3VFQSVzSMJs/s1600-h/javascript-audio-player.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="94" src="http://2.bp.blogspot.com/_v4FkjOpnH0g/S05FBNHYKFI/AAAAAAAACSw/3VFQSVzSMJs/s320/javascript-audio-player.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;Еще один камень в огород Flash. На этот раз представляю вашему вниманию библиотеку &lt;strong&gt;JAI (Javascript Audio Interface)&lt;/strong&gt; для построения аудио-интерфейсов на основе тэгов &amp;lt;audio&amp;gt; и &amp;lt;canvas&amp;gt; спецификации HTML5. Библиотека свободная и открытая.&lt;br /&gt;
&lt;br /&gt;
Больше сведений по &lt;a href="http://hyper-metrix.com/misc/jai/"&gt;ссылке проекта JAI&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;P.S.&lt;/strong&gt; &amp;nbsp;Кому интересны эксперименты с аудио в браузере, предлагаю почитать серию статей&amp;nbsp;&lt;a href="http://vocamus.net/dave/?cat=25"&gt;Experiments with audio&lt;/a&gt;&amp;nbsp;блоггера David Humphrey.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-8951428372199556045?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=wcVCYDVKawI:4Na0YuY_WC8:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=wcVCYDVKawI:4Na0YuY_WC8:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/wcVCYDVKawI" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/js.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_v4FkjOpnH0g/S05FBNHYKFI/AAAAAAAACSw/3VFQSVzSMJs/s72-c/javascript-audio-player.jpg" height="72" width="72" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-2355535537237377886</guid><pubDate>Wed, 13 Jan 2010 21:58:00 +0000</pubDate><atom:updated>2010-01-14T10:28:27.321+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Flash</category><title>Проект Gordon и Flash</title><description>Очень забавную вещь реализовал Tobias Schneider — выполнение swf-файлов в среде, реализованной на чистом Javascript. Это значит, что флэшки можно запустить в браузере с отключенным Flash плагином. Если разработка будет поддержана сообществом, то в мире веб-разработок на одну маленькую революцию станет больше. Хотя бы потому, что эти самые swf-ки можно будет запустить на iPhone (уже можно).&lt;br /&gt;
&lt;br /&gt;
На данном этапе Gordon нормально функционирует под браузерами Safari, Chrome (падает) и Firefox. Естественно, поддержка swf пока не полная.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://github.com/tobeytailor/gordon"&gt;Проект&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://paulirish.com/work/gordon/demos/"&gt;Примеры реализации&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://twitter.com/tobeytailor"&gt;Твиттер автора&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-2355535537237377886?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=YYdSDediZH8:Ey74_kwGDR0:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=YYdSDediZH8:Ey74_kwGDR0:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/YYdSDediZH8" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/gordon-flash.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-7934382483605581663</guid><pubDate>Tue, 12 Jan 2010 20:21:00 +0000</pubDate><atom:updated>2010-01-12T22:21:10.036+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">Analyze</category><title>Статический анализатор кода Javascript</title><description>Наткнулся на потенциально интересный инструмент, который для заданного кода рассчитывает его метрику. Называется &lt;a href="http://code.google.com/p/jsmeter/"&gt;jsmeter&lt;/a&gt;. В надежде получить удовольствие от улучшенных показателей, я подсунул в &lt;a href="http://boyopeg.googlepages.com/jsmeter.html"&gt;анализатор&lt;/a&gt;&amp;nbsp;старый и новый код проекта, над которым плотно работаю уже третий месяц. Но обилие непонятных цифр меня крайне смутила. Их значение мне не понятно (в &lt;a href="http://code.google.com/p/jsmeter/wiki/CodeMetrics"&gt;вики&lt;/a&gt;&lt;br /&gt;
очень скупое описание), хотя &lt;a href="http://research.microsoft.com/en-us/projects/jsmeter/jsmeter-overview-dec2009.pptx"&gt;презентация инструмента&lt;/a&gt;&amp;nbsp;их как-то умело и красиво представила... К тому же, подкупает тот факт, что авторами являются разработчики-исследователи из Microsoft. Значит есть в ней какой-то неведомый толк. Но какой?&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Если кто владеет техникой статического анализа кода, не прояснил бы нам суть этой вещицы?&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-7934382483605581663?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=e7bIqgYXmAk:6HcKBhoxQkA:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=e7bIqgYXmAk:6HcKBhoxQkA:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/e7bIqgYXmAk" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/javascript_12.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-8590995970901527886</guid><pubDate>Fri, 08 Jan 2010 16:31:00 +0000</pubDate><atom:updated>2010-01-08T22:55:16.668+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Unit-testing</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Тестируем проекты на Javascript</title><description>Без тестирования собственных продуктов сегодня не обойтись. Я интересуюсь этой темой по насущной проблеме: проект растет большими темпами, но при этом хочется, чтобы добавление нового функционала проходило с минимальными затратами. А получается, что изменив одно, ломается другое. На поиск конфликтов уходит время. С юнит-тестами можно понять, в каком месте сбоит, и, в итоге, быстрее разрешить ситуацию. И не стоит говорить, что само написание тестов уже трата времени. Нет. В дальнейшем только скажешь себе спасибо за уверенность при коммите очередного фикса.&lt;br /&gt;
&lt;br /&gt;
Переходя от философии к теории замечу, что для многих языков уже сложились свои признанные средства тестирования (здесь и далее речь идет о юнит-тестах). Но в отношении JS не все так просто.&lt;br /&gt;
&lt;br /&gt;
Существуют портированные варианты популярных продуктов (например, JsUnit по аналогии с CppUnit), но они не учитывают особенности самого языка. Да и сам язык накладывает на средства свои ограничения. Самое главное — невозможность подгружать файлы. Есть конечно обходные пути, будь то использование тэга &amp;lt;script&amp;gt;, но все-таки это изврат чистой воды. Как выход — использовать небраузерные интерпретаторы яваскрипта. Самый популярный — &lt;a href="http://www.mozilla.org/rhino/"&gt;Mozilla Rhino&lt;/a&gt;. Rhino расширяет функционал языка: импорт файлов, вывод на консоль и др., все что нам требуется.&lt;br /&gt;
&lt;blockquote&gt;Кстати. Вы в курсе, что Rhino поставляется в пакете с Java SE (начиная с 6 версии)? Это позволяет расширять функционал java-решения скриптовыми вставками. Мне от этого не теплее, но факт остается фактом :)&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Но Rhino не панацея. Необходимо использовать толковое средство тестирования. Как оказалось, их существует приличное количество — от самых простых до серьезных. Обзор некоторых из них можно почитать в &lt;a href="http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#JavaScript"&gt;Википедии&lt;/a&gt;&amp;nbsp;или в статье &lt;a href="http://dailyjs.com/2009/12/30/unit-testing/"&gt;JavaScript Unit Testing&lt;/a&gt;&amp;nbsp;блога DailyJS. Именно та статья вывела меня на просто гениальное решение — &lt;a href="http://jspec.info/"&gt;JSpec&lt;/a&gt;.&lt;br /&gt;
&lt;blockquote&gt;JSpec is a minimalistic JavaScript behavior driven development framework, providing simple installation, extremely low learning curve, absolutely no pollution to core prototypes, async request support, and incredibly sexy syntax, tons of matchers and much more.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Как видите, тут вам и BDD, удобство использования, и секси синтаксис. Последнее — это вообще отдельный разговор, потому что синтаксис — чистый DSL (помните &lt;a href="http://www.codeblogz.ru/2010/01/coffeescript-javascript.html"&gt;CoffeeScript&lt;/a&gt;?).&lt;br /&gt;
&lt;br /&gt;
Посмотрите на примеры:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript" name="code"&gt;describe 'ShoppingCart'
  before_each
    cart = new ShoppingCart
  end

  describe 'addProducts'
    it 'should add several products'
      cart.addProduct('cookie')
      cart.addProduct('icecream')
      cart.should.have 2, 'products'
    end
  end

  describe 'checkout'
    it 'should throw an error when checking out with no products'
      -{ cart.clear().checkout() }.should.throw_error EmptyCart
    end
  end
end&lt;/pre&gt;&lt;br /&gt;
Как говорится, inspired by Ruby. Точнее, это аналог RSpec для Руби. Мало того, этот инструмент может быть установлен как гем. Это позволяет работать с ним не только в браузере, но и в консоли. Чтобы приступить, нужно совсем немного:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;sudo gem install jspec
jspec init myproject
cd myproject
jspec run --rhino
&lt;/pre&gt;&lt;br /&gt;
Rhino устанавливается автоматически. Вместо последней строчки, можно использовать более общую команду &lt;code&gt;jspec&lt;/code&gt;. Она позволяет в фоне следить за изменениями, и отправлять сообщения через Growl (фича для пользователей MacOS).&lt;br /&gt;
&lt;blockquote&gt;&amp;nbsp;Хочу вас сразу предупредить, что JSpec некорректно работает с Руби 1.91 — используйте 1.86. И да, так как сам автор не пользуется виндоподобными операционными системами, то существуют некоторые проблемы с отображением в консоли &lt;code&gt;cmd&lt;/code&gt;. Чтобы это исправить, надо заменить функцию &lt;code&gt;color&lt;/code&gt;.&lt;br /&gt;
&lt;/blockquote&gt;Если вас заинтересовал JSpec, то прошу на официальную страницу за дальнейшими разъяснениями.&lt;br /&gt;
&lt;br /&gt;
Мне нравится в нем а) синтаксис, б) удобство, в) простота. А больше и ничего не надо :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://jspec.info/"&gt;Официальная страница JSpec&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://gist.github.com/147831"&gt;Пример использования&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-8590995970901527886?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=7zcBPwGDC4M:Et2fDvg68OI:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=7zcBPwGDC4M:Et2fDvg68OI:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/7zcBPwGDC4M" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/javascript.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-8415585235029064085</guid><pubDate>Wed, 06 Jan 2010 20:16:00 +0000</pubDate><atom:updated>2010-01-06T22:16:11.443+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Playground для вашего кода (JS + HTML + CSS)</title><description>&lt;a href="http://jsfiddle.net/"&gt;jsFiddle&lt;/a&gt; — шелл для работы с великой тройкой. Теперь можно устраивать свои пляски с бубном (&lt;em&gt;ну как еще перевести playground&lt;/em&gt;): удобный редактор, который поможет разобраться c поставленной задачей при заданных условиях. Можно подгрузить популярные библиотеки (jQuery, MooTools, YUI и др.). Со своими наработками можно поделиться с друзьями, сохранив их по короткой ссылке.&lt;br /&gt;
&lt;br /&gt;
Альфа-версия оправдывает многие недоработки (мне кажется, или AJAX'ом тут совсем не пахнет?). Но идея неплохая, да.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-8415585235029064085?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=IdFiD964ugU:YaUDXrDk62Q:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=IdFiD964ugU:YaUDXrDk62Q:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/IdFiD964ugU" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/playground-js-html-css.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8445457995709570547.post-7662692219418560720</guid><pubDate>Tue, 05 Jan 2010 21:03:00 +0000</pubDate><atom:updated>2010-01-05T23:03:55.570+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Смехаради</category><title>Когда John Resig просматривает элемент, он видит голые электроны</title><description>Это и другое можно почитать в статье &lt;a href="http://benalman.com/news/2009/12/john-resig-javascripts-chuck-norris/"&gt;&amp;nbsp;John Resig: JavaScript's Chuck Norris&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #999999;"&gt;P.S. Кто не в курсе, Джон — автор jQuery.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2008-2010 © &lt;a href='http://www.codeblogz.ru/'&gt;www.codeblogz.ru&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8445457995709570547-7662692219418560720?l=www.codeblogz.ru' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/codeblogz?a=XEWb0eMWSeI:r_bJdoAKJ2U:wQU9SIlotaI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/codeblogz?i=XEWb0eMWSeI:r_bJdoAKJ2U:wQU9SIlotaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/codeblogz/~4/XEWb0eMWSeI" height="1" width="1"/&gt;</description><link>http://www.codeblogz.ru/2010/01/john-resig.html</link><author>noreply@blogger.com (Сергей | codeBlogZ)</author></item></channel></rss>
