<?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>uxebu » blog &#187; development tools</title>
	<atom:link href="http://uxebu.com/category/development-tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://uxebu.com/blog</link>
	<description></description>
	<lastBuildDate>Mon, 23 Apr 2012 19:10:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Improve your product: Make better tutorials</title>
		<link>http://uxebu.com/blog/2012/01/11/tutorials/</link>
		<comments>http://uxebu.com/blog/2012/01/11/tutorials/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 20:00:55 +0000</pubDate>
		<dc:creator>David Pfahler &#38; Stephan Bönnemann</dc:creator>
				<category><![CDATA[development tools]]></category>

		<guid isPermaLink="false">http://uxebu.com/blog/?p=2238</guid>
		<description><![CDATA[This is a guest post by David Pfahler and Stephan Bönnemann of keeplook.in. Total reading time: 3:57min (based on Alex) When you try to learn a new programming language or work with a new framework for the first time you&#8217;re likely to google something along the lines of &#8220;How to &#8230;&#8221; or &#8220;framework X tutorial&#8221;. [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is a guest post by David Pfahler and Stephan Bönnemann of <a href="http://keeplook.in" title="keeplook.in">keeplook.in</a>.</em></p>
<p><strong>Total reading time: 3:57min (based on <a href="http://uxebu.com/blog/wp-content/uploads/2012/01/Improve-your-product_-Make-better-tutorials.mp3">Alex</a>)</strong></p>
<p>When you try to learn a new programming language or work with a new framework for the first time you&#8217;re likely to google something along the lines of &#8220;How to &#8230;&#8221; or &#8220;framework X tutorial&#8221;. As a developer you might also be the one writing how-to articles for your own creations. If you&#8217;re interested in turning your 569-page long, textbook-style manual in to a golden asset of yours, please read on.</p>
<p><span id="more-2238"></span></p>
<p>Your 20th century, worn out screencast series isn&#8217;t that fancy either&#8230;</p>
<p>Some users just get started with programming or using a framework (or whatever your product might be). Not everybody is a pro. For the rest of us tutorials are a low-barrier entry to your creation.<br />
Furthermore, thinking about tutorials early on will force you to avoid complexity. For example, if you can&#8217;t explain a concept in simple terms, you should probably think about it again. By putting yourself in the shoes of your prospective customer you help yourself to create a better product in the end.</p>
<h2>So how should an amazing tutorial look?</h2>
<p>The idea behind most tutorials is to show the reader a step by step protocol of how you, the developer, would do it. However, what the user really wants is to learn, not to watch the presenter using his evil vim skills to confuse the overwhelmed newbie who is busy trying to get off the ground. One would learn way faster if she was live coding and seeing the results as she writes the code herself.<br />
I&#8217;d love to see more editors in the browser used for this purpose. For example, the <a href="http://www.codecademy.com/">codecademy</a> uses an in browser editor and console to teach programming to beginners.</p>
<p><a href="http://uxebu.com/blog/wp-content/uploads/2012/01/codecademy.png"><img src="http://uxebu.com/blog/wp-content/uploads/2012/01/codecademy-300x190.png" alt="Codecademy Screenshot" title="Codecademy" width="300" height="190" class="aligncenter size-medium wp-image-2255" /></a></p>
<h2>How to use multi media the right way</h2>
<p>Screencasts are a popular tool when it comes to tutorials. However, they are not interactive, so the user can only watch but not try for herself unless she pauses the video and switches to a text editor, checks the results and repeats. Also, you can&#8217;t copy and paste from a screencast. We can do better.<br />
Video can transport emotions. So I think it should be used for just that. How about a short introduction to the topic one is about to tackle? Just ten seconds of someone talking to you &#8220;face-to-face&#8221; make the whole experience more personal. Audio can do a great job at communicating a lot of content without requiring a lot of screen estate. Carrying on with the last example, the person who gives the introduction should also be the speaker of the tutorial. Additionally, text can help with copy &amp; paste issues, hyperlinking to other resources such as the documentation, etc.</p>
<h2>Positive feedback loops vs. frustration</h2>
<p>Most tutorials that I encountered where quite frustrating. The reason being that there was no positive feedback loop supporting my will to learn more. For example, I never knew how long it will take to complete a certain tutorial. This sometimes leads to me not even starting because it gives me a psychological excuse.</p>
<blockquote><p><em>&#8220;I probably won&#8217;t be able to complete it before lunch, anyways.&#8221;</em></p>
<p>vs.</p>
<p><em>&#8220;Ah nice! This is going to be done before lunch.&#8221;</em></p></blockquote>
<p>So, in your tutorials please tell the user how much time she has to invest. As this forces you to think about the structure and length of your lessons, your whole tutorial will benefit.</p>
<p>The <a href="http://www.khanacademy.org/">khan academy</a> does a great job at keeping its students motivated with occasional achievement badges. People want to be rewarded when they take the effort to learn something new. Tutorials are a tool for just that. So please treat it like learning. Progress can be rewarded constantly for example with points or a virtual currency that one earns. I think we can learn a lot from games in regard to how they keep people engaged.</p>
<p><a href="http://uxebu.com/blog/wp-content/uploads/2012/01/khan.png"><img src="http://uxebu.com/blog/wp-content/uploads/2012/01/khan-300x99.png" alt="Khan Academy Screenshot" title="Khan Academy" width="300" height="99" class="aligncenter size-medium wp-image-2256" /></a></p>
<p>If you have some good examples, please let me know in the comments.</p>
<h2>Summary</h2>
<p>In the end the user is the reason for your creation, product or project. Thinking about your tutorials early on is a good way to ensure you&#8217;re producing something of value. Because your users are the ones who will ask you questions about your project, will buy your products (if they are for sale), submit pull-requests and talk about your creation in public, a great set of tutorials will benefit you the most.</p>
<p><strong>tl;dr</strong><br />
Don&#8217;t spend your budget on a social media campaign run by an evil marketing firm. Spend it on your tutorials. It&#8217;s the best marketing there is.</p>
<p><strong>Resources:</strong><br />
<a href="http://www.codecademy.com"><strong>codecademy</strong></a>: Nice editor in the browser. Positive feedback loop.<br />
<a href="http://www.khanacademy.org"><strong>khan academy</strong></a>: Eleborate achievement system. Also, nice for improving your general knowledge.<br />
<a href="http://learn.knockoutjs.com"><strong>knockoutJS</strong></a>: Editor in the browser, progress saved in localStorage and it can fix your code.<br />
<a href="http://tryhaskell.org/"><strong>Try Haskell</strong></a>: Interactive console for learning/trying Haskell.<br />
<a href="http://layerstyles.org/"><strong>Layer Styles</strong></a>: Play around with the parameters and get an intuitive feeling for the css behind it. That&#8217;s the power of live editing.</p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2012/01/11/tutorials/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://uxebu.com/blog/wp-content/uploads/2012/01/Improve-your-product_-Make-better-tutorials.mp3" length="1900391" type="audio/mpeg" />
		</item>
		<item>
		<title>EmbedJS 0.2 and AMD</title>
		<link>http://uxebu.com/blog/2011/10/17/embedjs-0-2-and-amd/</link>
		<comments>http://uxebu.com/blog/2011/10/17/embedjs-0-2-and-amd/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 15:43:16 +0000</pubDate>
		<dc:creator>Jens Arps</dc:creator>
				<category><![CDATA[development tools]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[html5apps]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[embedjs]]></category>

		<guid isPermaLink="false">http://uxebu.com/blog/?p=1843</guid>
		<description><![CDATA[During JSConf.eu, we released EmbedJS 0.2. That release was mainly about a fundamental architectural change: the move to the AMD pattern for our features. Let me explain why we decided to do this, why we think this is a big step forward and what this means for the user. Modules AMD stands for &#8220;Asynchronous Module [...]]]></description>
			<content:encoded><![CDATA[<p>During JSConf.eu, we released EmbedJS 0.2. That release was mainly about a fundamental architectural change: the move to the AMD pattern for our features. Let me explain why we decided to do this, why we think this is a big step forward and what this means for the user.<br />
<span id="more-1843"></span></p>
<h2>Modules</h2>
<p>AMD stands for &#8220;Asynchronous Module Definition&#8221;. So, what are modules? I&#8217;ll quote the definition from the <a href="http://wiki.commonjs.org/wiki/Modules/1.1" target="_blank">CommonJS Module specification</a>, as it describes it very well:</p>
<blockquote><p>This specification addresses how modules should be written in order to be interoperable among a class of module systems that can be both client and server side, secure or insecure, implemented today or supported by future systems with syntax extensions. These modules are offered privacy of their top scope, facility for importing singleton objects from other modules, and exporting their own API.</p></blockquote>
<p>So, modules are isolated parts of code that live in their own scope and are kind of self-contained. Well, that is pretty much how we see the individual Features in EmbedJS – we made our feature implementations as small as possible and reduced dependencies as much as possible. Many of EmbedJS&#8217; features are also browser-independent, so why not make it possible to use some of the tools in a non-browser environment?</p>
<p>(If you want to learn more on modules and why we need them, I recommend <a href="http://twitter.com/briancavalier" target="_blank">@briancavalier</a>&#8216;s <a href="http://briancavalier.com/presentations/pgh-js-amd-10-2011/" target="_blank">presentation on modules</a>.)</p>
<h2>Features in EmbedJS</h2>
<p>So far, I didn&#8217;t really explain what I mean with &#8220;Features&#8221;, so let me do another quote, this time from the <a href="http://uxebu.github.com/embedjs/" target="_blank">Project Page</a>:</p>
<blockquote><p>EmbedJS uses the concept of features: Functionalities are split up into features, as fine-grained as possible, and each feature might have multiple implementations.</p></blockquote>
<p>Our Features are kinda small and contain only few methods, sometimes even just one. The asyc-promise feature, for example, will get you Promises, and the transport-jsonp feature will get you a method for pull in data via jsonp – and that&#8217;s it.  If multiple methods are contained within one feature, this is because they are too closely related to each other to split them up, like the html-class feature, which contains the <code class="codecolorer text mac-classic"><span class="text">addClass</span></code>, <code class="codecolorer text mac-classic"><span class="text">removeClass</span></code>, <code class="codecolorer text mac-classic"><span class="text">toggleClass</span></code> and <code class="codecolorer text mac-classic"><span class="text">hasClass</span></code> methods.</p>
<h2>AMD vs CommonJS Modules 1.1</h2>
<p>Now that we knew modules were the way to go, there was another, quite important question to solve: There are two common patterns for modules, so which one do we want to apply? One pattern is described in the above mentioned CommonJS Wiki, the other pattern is described in the <a href="https://github.com/amdjs/amdjs-api/wiki/AMD" target="_blank">AMD wiki</a>.</p>
<p>Well, there have been <a href="http://tagneto.blogspot.com/2011/04/on-inventing-js-module-formats-and.html" target="_blank">some</a> <a href="http://unscriptable.com/index.php/2011/09/30/amd-versus-cjs-whats-the-best-format/" target="_blank">blog</a> <a href="http://blog.millermedeiros.com/2011/09/amd-is-better-for-the-web-than-commonjs-modules/" target="_blank">posts</a> lately that compare the pros and cons of each of them, so I don&#8217;t want to repeat all of this – but I&#8217;m hiving a similar tendency towards AMD. Besides this, there was another big reason to go with AMD: Remember, EmbedJS is based on the <a href="http://dojotoolkit.org/" target="_blank">Dojo Toolkit</a>, and it&#8217;s a <a href="http://dojofoundation.org/" target="_blank">Dojo Foundation Project</a> – and we hope that the efforts that went into making EmbedJS might flow back into the Dojo Toolkit one day. And as the Dojo Toolkit uses the AMD approach, the decision was quickly made to do so as well.</p>
<h2>Implications for EmbedJS</h2>
<p>There are several huge benefits for EmbedJS in using the AMD approach. The most noteworthy surely is the ease-of-use for developers. In your code, when you find you want an EmbedJS method, you <a href="http://uxebu.github.com/embedjs/docs/" target="_blank">look up the feature name</a> that provides this method, add it to the require statement and there you go. Man, easy.</p>
<p>A second important thing is that EmbedJS now plays really nice with AMD based projects. In fact, you could see EmbedJS now as a collection of small useful modules, that can be easily integrated – and also easily extended.</p>
<p>The third major benefit is that we can now get rid of all the custom tools we built around EmbedJS – you can load features with any AMD loader (though we use and recommend RequireJS) and build it with any AMD optimizer/builder (we recommend r.js).</p>
<p>Let&#8217;s have an extra word on</p>
<p><strong>Building</strong></p>
<p>It was always possible with EmbedJS to create a custom build that would contain only the features you wanted/needed in your project. But, you had to use our build tool that we created. And learning &amp; using Yet-Another-Build-Tool™ is always… well, let&#8217;s just say it would be cool to avoid it (and, not to forget, so is maintaining it). We did a lot to improve that, we created a GUI that allowed you to just &#8220;click together&#8221; the features you wanted, and we worked on a dynamic loader that would ease development. But still, the situation was far from ideal, and people just ended up going for our ready-made &#8220;kitchensink&#8221; builds that contained <em>all</em> of the features.</p>
<p>Now, we still provide those ready-made builds that contain only the implementations for a given platform (and are stripped of require/define calls), but I really hope that using the AMD approach and using an AMD optimizer to deploy will become the more adopted style.</p>
<h2>Q: Cross-target? A: The Feature Plugin</h2>
<p>One goal of EmbedJS is to allow for easy cross-device development. We got rid of run-time branching but instead went for an approach that held the different implementations for a given feature in separate files, so that one only has to deploy the actually needed code to a given device – and not all the alternate implementations, that sit useless in the device&#8217;s memory and never get used. We needed to achieve that with &#8220;in-house&#8221; means provided by the AMD approach. Lucky us, there&#8217;s the concept of <a href="https://github.com/amdjs/amdjs-api/wiki/Loader-Plugins" target="_blank">loader-plugins</a>, and so I created a <a href="https://github.com/jensarps/AMD-feature" target="_blank">feature-plugin for AMD loaders</a>. The idea is simple yet effective: You create an implementation map that maps a feature name to an implementation, and if there are multiple implementations, you supply tests that tells the plugin which feature to use.</p>
<p>When you&#8217;re ready to deploy, you have two choices: I f you really don&#8217;t know on what target your code is going to end up, you can use the dynamic implementation map containing the tests for the optimizer, and you&#8217;ll get a build that contains all of the available implementations. Then, during runtime, the feature plugin will run the tests and load the specific implementation. But, if you <em>do</em> know what target your code will run on, you provide a specific implementation map that doesn&#8217;t contain tests but directly maps to the according implementations, and you will only have those in your built file.</p>
<h2>Synopsis</h2>
<p>AMD is exactly what we needed to make EmbedJS more what we want it to be – an easy to use JavaScript toolbox that is especially handy for cross-target scenarios such as cross-platform mobile development. So, please don&#8217;t hesitate and check it out on Github, read the project page and check out the examples!</p>
<p>&nbsp;</p>
<p><strong>Resources / Further Reading</strong></p>
<ul>
<li><a href="https://github.com/uxebu/embedjs" target="_blank">EmbedJS on GitHub</a></li>
<li><a href="http://uxebu.github.com/embedjs/" target="_blank">EmbedJS Project Page</a></li>
<li><a href="http://uxebu.github.com/embedjs/docs/" target="_blank">EmbedJS API Docs</a></li>
<li><a href="https://github.com/jensarps/AMD-feature" target="_blank">AMD-Feature plugin</a></li>
<li><a href="https://github.com/amdjs/amdjs-api/wiki" target="_blank">AMD Wiki</a></li>
<li><a href="http://wiki.commonjs.org/wiki/CommonJS" target="_blank">CommonJS Wiki</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2011/10/17/embedjs-0-2-and-amd/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>My console.log() strategy</title>
		<link>http://uxebu.com/blog/2011/09/02/my-console-log-strategy/</link>
		<comments>http://uxebu.com/blog/2011/09/02/my-console-log-strategy/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 10:00:36 +0000</pubDate>
		<dc:creator>Wolfram Kriesing</dc:creator>
				<category><![CDATA[development tools]]></category>
		<category><![CDATA[frontend engineering]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[console.log]]></category>

		<guid isPermaLink="false">http://uxebu.com/blog/?p=1723</guid>
		<description><![CDATA[This time I feel like sharing my (maybe) strange looking console.log() strategy, but I find it very effective, read on to learn why. If I can&#8217;t debug, for whatever reason and have to fall back to console.log()s you normally see my code looking like this: 123456789console.log&#40;&#34;i = &#34;, i&#41;; &#160; &#160; if &#40;i==0&#41;&#123; console.log&#40;1&#41;; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>This time I feel like sharing my (maybe) strange looking <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code> strategy, but I find it very effective, read on to learn why.<br />
<span id="more-1723"></span></p>
<p>If I can&#8217;t debug, for whatever reason and have to fall back to <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code>s you normally see my code looking like this:</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;i = &quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">==</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// Do something here</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// Do else </span><br />
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>You can see two things here:</p>
<ul>
<li>the first line prints out a variable&#8217;s value, simple I guess</li>
<li>all <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code>s are not indented at all</li>
</ul>
<p>Let me touch on the &#8220;not indenting&#8221; first.<br />
I don&#8217;t like to indent <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code>s because this just makes the code look ugly, and that is intentional, because <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code> normally just doesn&#8217;t belong in the code. By making the code look ugly I am quickly forced to remove them again, the latest I will stumble on it before committing, because I never commit without looking at the diff.<br />
If I ever forget to remove the <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code> I can be sure that a coworker will be annoyed by it and hopefully either ping me or remove it. But I am trying my best not to forget it :).</p>
<h2>Komodo macro</h2>
<p>Back to the first <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code> you see in the code example up there, that one is actually one keystroke away for me, I have hacked a simple macro in my editor (<a href="http://www.activestate.com/komodo-edit">Komodo Edit</a>) that takes the text I selected and creates a <code class="codecolorer text mac-classic"><span class="text">console.log()</span></code> in the line below throwing out this variable and it&#8217;s value.<br />
This little script looks like this:</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> s <span style="color: #339933;">=</span> ko.<span style="color: #660066;">views</span>.<span style="color: #660066;">manager</span>.<span style="color: #660066;">currentView</span>.<span style="color: #660066;">scimoz</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> t <span style="color: #339933;">=</span> s.<span style="color: #660066;">selText</span><span style="color: #339933;">;</span><br />
komodo.<span style="color: #660066;">doCommand</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cmd_end'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
komodo.<span style="color: #660066;">doCommand</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cmd_newlineBare'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// Only if something was selected put it there.</span><br />
t <span style="color: #339933;">=</span> t <span style="color: #339933;">?</span> <span style="color: #3366CC;">&quot;'&quot;</span><span style="color: #339933;">+</span>t<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot; = ', &quot;</span><span style="color: #339933;">+</span>t<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;arguments&quot;</span><span style="color: #339933;">;</span><br />
s.<span style="color: #660066;">insertText</span><span style="color: #009900;">&#40;</span>s.<span style="color: #660066;">currentPos</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;console.log(&quot;</span><span style="color: #339933;">+</span>t<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;);&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// Set the cursor inside the &quot;()&quot; at the end, so we can add</span><br />
<span style="color: #006600; font-style: italic;">// parameters</span><br />
komodo.<span style="color: #660066;">doCommand</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cmd_end'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
komodo.<span style="color: #660066;">doCommand</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cmd_left'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
komodo.<span style="color: #660066;">doCommand</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cmd_left'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Just create a new macro with it and attach a key-combination to it and logging a variable is just one key stroke away.</p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2011/09/02/my-console-log-strategy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is WAC and how it could help us</title>
		<link>http://uxebu.com/blog/2011/02/24/what-is-wac-and-how-it-could-help-us/</link>
		<comments>http://uxebu.com/blog/2011/02/24/what-is-wac-and-how-it-could-help-us/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 16:53:08 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[development tools]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[frontend engineering]]></category>
		<category><![CDATA[html5apps]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[w3c widgets]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[wac]]></category>

		<guid isPermaLink="false">http://uxebu.com/blog/?p=1402</guid>
		<description><![CDATA[At Mobile World Congress 2011 in Barcelona, @uxebu attended the WAC event to catch up with the future of WAC. WAC, short for Wholesale Applications Community, is a group of global mobile operators. They provide, among other things, a spec for their correspondent web application runtime &#8220;WAC&#8221;. Recently the new WAC 2.0 Spec got out [...]]]></description>
			<content:encoded><![CDATA[<p>
At Mobile World Congress 2011 in Barcelona, @uxebu attended the WAC event to catch up with the future of WAC.<br />
WAC, short for Wholesale Applications Community, is a group of global mobile operators.<br />
They provide, among other things, a spec for their correspondent web application runtime &#8220;WAC&#8221;.
</p>
<p>
Recently the new WAC 2.0 Spec got out and it&#8217;s looking good.<br />
Compared to WAC 1.0, the WAC 2.0 Spec is a shift into the right direction:<br />
Instead of inventing new APIs, WAC 2.0 adheres to web standards like HTML5 and W3C Widget Packaging.
</p>
<p><span id="more-1402"></span></p>
<p>
Let&#8217;s compare the two major spec revisions in that repsect:
</p>
<p>
As said before, the WAC 1.0 Spec described distinct APIs, e.g., for audio, messaging (SMS &#038; email), camera and geo-location.
</p>
<p>
Taking photos, for example, involved assigning a callback to a global value inside the Camera object and invoking Camera&#8217;s captureImage method.
</p>
<p>
There&#8217;s a problem with that: What if two pieces of code both assign their own callback to that shared value?<br />
The one which assigned its callback last will be executed. The first callback is &#8220;dead code&#8221;.<br />
Of course this can be remedied by the app developer, but I believe it&#8217;s the library&#8217;s job to get something as essential as deferred execution right.<br />
All WAC 1.0 APIs use this global callback model and inherit the problem.<br />
There are better, more elegant ways to defer execution (e.g. dojo&#8217;s Deferred or node&#8217;s callback passing &#038; EventEmitter).<br />
And fortunately, WAC 2.0 replaced the old model with a callback passing approach.
</p>
<p>
If everything goes well, what could WAC provide developers with?
</p>
<ol>
<li>An easy way to package web apps &#8220;for home screens &#038; app stores&#8221; by wrapping web apps in native container apps.</li>
<li>An extension of browsers&#8217; capabilities to enable richer web apps. This includes APIs for camera and file access.</li>
<li>In contrast to alternatives WAC has a strong focus on carrier network APIs. This could enable purchase through carrier billing.</li>
<li>A security model to effectively protect user&#8217;s privacy and security.</li>
</ol>
<p>
So go ahead and look at what the new WAC 2.0 has to offer.<br />
I&#8217;m excited to build apps with it once it&#8217;s running on some major platforms!
</p>
<p>
To conclude I&#8217;d like to end this post with my personal opinion on what I believe WAC needs to focus on to succeed:
</p>
<ol>
<li>WAC runtimes have to run at least on iOS, Android and a few other major-marketshare platforms. There&#8217;s no point in developing cross-platform web apps if you ignore major platforms.</li>
<li>WAC&#8217;s marketing &#038; identity need to be more developer-centric. Different top-notch WAC runtimes need to be advertised by WAC. Ideally there would be an official runtime for each platform.</li>
<li>Apps built on top of WAC runtimes have to be compatible to major app stores. For example, imagine a developer is targeting Android and iOS. What if Apple rejected WAC-based apps because of, e.g., a bundled custom WebKit build? I&#8217;m pretty sure no sane developer would consider WAC if that effectively banned their app from ever going into the most profitable app store. And while there will be carrier-operated stores I am not overly confident in that. Human beings simply prefer one familiar store/market on their phone.</li>
<li>Web app developers want their code base functioning consistently across multiple platforms with little or no effort. This implies that different WAC runtimes should strictly respect the specification. If there are implementation differences it&#8217;ll result in multiple code branches in the app code to repair broken implementations. Well, if WAC wants to succeed this must not become an issue for the app developer! Most apps are going to need custom code to support physical device differences. So hey, it will be incredibly helpful if the basic APIs were consistently implemented! Please don&#8217;t screw this up, because I somehow doubt someone would develop a cross-WAC-platform JavaScript framework.</li>
<li>WAC 2.0 runtimes with the above properties should appear very soon. They also need to be advertised in an easy to understand manner.</li>
<li>WAC should stick to W3C specs &#038; drafts for APIs. If an API becomes part of a given platform it should be removed from that platform&#8217;s WAC runtime. Think back to when Google removed Gears support from their own browser to make way for standardized APIs.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2011/02/24/what-is-wac-and-how-it-could-help-us/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Explaining EmbedJS</title>
		<link>http://uxebu.com/blog/2011/01/31/explaining-embedjs/</link>
		<comments>http://uxebu.com/blog/2011/01/31/explaining-embedjs/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 14:02:28 +0000</pubDate>
		<dc:creator>Jens Arps</dc:creator>
				<category><![CDATA[development tools]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[frontend engineering]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[uxebu]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[embedjs]]></category>
		<category><![CDATA[memory usage]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://uxebu.com/blog/?p=1366</guid>
		<description><![CDATA[Last week, we tagged the current state of EmbedJS 0.1. This is a large step for us, and something we have been waiting for and wanting to do for a long time. And with doing so, the need arises to answer a lot of questions – and we better start sooner than later. So, here [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, we tagged the current state of EmbedJS 0.1. This is a large step for us, and something we have been waiting for and wanting to do for a long time. And with doing so, the need arises to answer a lot of questions – and we better start sooner than later. So, here it is, the first part of „Explaining EmbedJS“.</p>
<h2>What is it?</h2>
<p>It‘s a JavaScript Toolkit, especially aimed at embedded devices. Embedded devices, that is phones, tablet devices, TVs, car dashboards and the like. Devices that are capable of running JavaScript. We are sure that this list is going to grow over time – and will hopefully one day also include devices like your fridge. EmbedJS is based on the Dojo Toolkit.<br />
<span id="more-1366"></span></p>
<h2>Why?</h2>
<p>Because the toolkits and frameworks that exist focus on desktop browsers and therefore have a different approach – an approach we didn‘t find that suitable for embedded/mobile development. And the JS frameworks that target mobile devices are flawed, too: either they target only a specific device or platform, or they provide far more than we do need and want.</p>
<p>What we wanted was a toolkit that offered a unified API across different platforms, but with the best implementation that was available for each platform. And we didn‘t want to ship code that implemented a certain feature for, say, an old Blackberry device to an iPhone. Plus, we wanted that API to be small – enough to assist us in our daily work, but not that bloated that we would ship code to a phone that we wouldn‘t need in most of our projects.</p>
<h2>The Dojo Toolkit</h2>
<p>We at uxebu have a strong affinity to the <a href="http://dojotoolkit.org/" target="_blank">Dojo Toolkit</a> – most of us are committers – for a good reason: we believe that it has done many things right, and that it has an excellent code quality. Thus, finding a starting point for our venture to what was later to be EmbedJS was pretty easy: It was the very core of the Dojo Toolkit, dojo._base.</p>
<p>We examined the code and split it into its smallest parts (features, how we call them in EmbedJS). After having the features all nicely separated, we could look for the best implementation for each of the platforms we wanted to support, and put it into a separate file. Then we optimized our code, tweaking here and there, but also using the code from dojo._base as it was, because it already was the best implementation.</p>
<p>And we needed to find means to put all these tiny parts together again, respecting any given dependecies, to create a file that then contained all the feature‘s implementations for a given platform – so the EmbedJS Tools were born, including our highly flexible build system.</p>
<h2>API</h2>
<p>EmbedJS‘ API is a small subset on Dojo‘s API. It provides around 70 methods, from the fields language enhancement (like Array manipulation or JSON), OO (like classes and inheritance), transport (like JSONP or XHR), event system (like connecting to DOM events or methods), DOM manipulation (like style or node creation) and misc things like Promises or pub/sub.</p>
<p>We kept the method signatures intact so that you can import your existing knowledge from working with the Dojo Toolkit to EmbedJS. There are only a few minor changes where we<br />
a) found a new name highly useful, e.g <code class="codecolorer text mac-classic"><span class="text">dojo.io.script.get()</span></code> is <code class="codecolorer text mac-classic"><span class="text">embed.jsonp()</span></code><br />
b) we needed to strip given functionality for the sake of code size.</p>
<p>All methods in EmbedJS are available under the embed namespace as well as under the dojo namespace. I.e. to call the connect method you can use <code class="codecolorer text mac-classic"><span class="text">dojo.connect()</span></code> and <code class="codecolorer text mac-classic"><span class="text">embed.connect()</span></code>.</p>
<p>The full API documentations is <a href="http://embedjs.org/apidocs/dools/app/apidoc/embedjs/" target="_blank">here</a>, though it‘s undergoing some updates right now.</p>
<h2>Summary</h2>
<p>I didn‘t want to dig too deep in the first article on EmbedJS, but I guess you got the point: EmbedJS is a highly optimized Dojo core, and offers you a specialized, optimal build for a given platform. To explain how the build system works, how we manage dependencies, how we separate our features and our implementations and how one can create a project-oriented custom build will need another blog post – but if you are too curious, you are invited to take a look at <a href="https://github.com/uxebu/embedjs" target="_blank">the source code at github</a>; a lot is self-explenatory there. A further source of information is the <a href="http://uxebu.github.com/embedjs/" target="_blank">EmbedJS project page</a>, as well as the <a href="https://github.com/uxebu/embedjs-tools" target="_blank">EmbedJS Tools source</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2011/01/31/explaining-embedjs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>BlackBerry6, WebKit, WebWorks, DevCon10, etc.</title>
		<link>http://uxebu.com/blog/2010/10/25/blackberry6-webkit-webworks-devcon10-etc/</link>
		<comments>http://uxebu.com/blog/2010/10/25/blackberry6-webkit-webworks-devcon10-etc/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 08:59:59 +0000</pubDate>
		<dc:creator>Wolfram Kriesing</dc:creator>
				<category><![CDATA[development tools]]></category>
		<category><![CDATA[frontend engineering]]></category>
		<category><![CDATA[html5apps]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[w3c widgets]]></category>
		<category><![CDATA[blackberry6]]></category>
		<category><![CDATA[embedjs]]></category>
		<category><![CDATA[torch]]></category>

		<guid isPermaLink="false">http://uxebu.com/blog/?p=1311</guid>
		<description><![CDATA[The BlackBerry DevCon 2010 closed it&#8217;s doors a couple of days ago and to put the conclusion first, I have become a new evangelist for the BlackBerry6 platform. It supports W3C widgets, well &#8230; in a way ;). The core message I took away: web technologies have become first class citizens on the new BlackBerry [...]]]></description>
			<content:encoded><![CDATA[<p>The BlackBerry DevCon 2010 closed it&#8217;s doors a couple of days ago and to put the conclusion first, I have become a new evangelist for the BlackBerry6 platform. It supports W3C widgets, well &#8230; in a way ;). The core message I took away: web technologies have become first class citizens on the new BlackBerry platform. And we from uxebu really love this, as you can imagine.<br />
<span id="more-1311"></span></p>
<p><a href="http://hub.uxebu.com:33550/wp-content/uploads/2010/10/embedTests-Torch.jpg" style="float:right; margin:1em;"><img class="size-thumbnail wp-image-1320" title="embedTests-Torch" src="http://hub.uxebu.com:33550/wp-content/uploads/2010/10/embedTests-Torch-150x150.jpg" alt="" width="150" height="150" /></a>First I want to thank RIM for sending us two Torch devices. Right away I navigated to <a href="http://bit.ly/embed-tests">the embedJS tests</a> and I didn&#8217;t expect it differently, the tests passed without any problem, 100% passed tests. Actually I expected the tests to pass lightning fast, the time it took was ok, but not lightning fast, unfortunately. The test suite executed in about 14 seconds, on the iPhone4 it took about 10. To be fair the processor power and the system architectures are completely different and not really comparable, but the user experience counts in the end. We have heard that the RIM guys are hard working on improvements and speeding up the device, there is some cool stuff to come.</p>
<h2>WebKit and WebWorks</h2>
<p>The most impressive and revolutionary thing was definitely that BlackBerry brings an 100 points ACID compliant WebKit and runs W3C widgets using it. So there are by default two ways that are even fun to get content onto this platform. You can write mobile websites expecting an a-grade browser and you can write apps, for the so called WebWorks platform (which are W3C widgets inside). All we want. The browser supports CSS transitions and transforms, not 3D though, since there is no GPU in those devices, but you never know what might come next. There is SVG on it, WebSockets, Canvas and a lot more niceties, I just browsed the objects using <a href="http://bit.ly/object-browser">Object Browser</a>, go try it yourself, on your device.<br />
RIM renamed their widgets that existed already on BlackBerry5 to &#8220;WebWorks&#8221; and they got completely overhauled. The approach RIM went is pretty close to how PhoneGap works. WebWorks basically is a wrapper written in Java (the native language of BlackBerry) which internally instanciates a WebKit view and provides a bridge into JavaScript where the underlying native functionality is written in Java, of course. The cool thing about it is that this code is completely <a href="http://github.com/blackberry/WebWorks">open  source and on github</a>. Unfortunately the build scripts are still not on github, so you would still have to figure out yourself how to use the source from github to package your apps. RIM please push them soon! Currently <a href="http://na.blackberry.com/eng/developers/browserdev/widgetsdk.jsp">the executables</a> are the most comfortable way to build your widget.<br />
Back to the API, since the implementation is open source you can easily extend it and make functionality available into JavaScript which currently is not there. So <a href="http://jsconf.eu/2010/speaker/livingroombindmotion_function.html">Nikolai&#8217;s robotic JavaScript</a> will really become fun and reality on BlackBerry too. Why RIM went this way becomes very obvious when you understand the security concept on BlackBerry. Since all APIs are, in the end, provided by a Java implementation and only &#8220;piped&#8221; into JavaScript all security restrictions apply to the widget just as if it was a native app. That means if you access GPS in your widget (using JavaScript) the Java function will be called and will be secured the same way as if it would have been called from within a pure Java app. Of course this doesn&#8217;t make your widget secure by default, since you are using web technologies you have to take care of writing apps which are not vulnerable by XSS attacs or alike. But it offers really comfortable extendability for this platform and is no workaround to get web technologies onto BlackBerries, I think it&#8217;s a very clever approach, good job RIM.</p>
<h2>Security</h2>
<p><a href="http://hub.uxebu.com:33550/wp-content/uploads/2010/10/PermissionsBlackBerry.jpg" style="float:right; margin:1em;"><img src="http://hub.uxebu.com:33550/wp-content/uploads/2010/10/PermissionsBlackBerry-150x150.jpg" alt="" title="PermissionsBlackBerry" width="150" height="150" class="size-thumbnail wp-image-1321" /></a>Everybody knows the ridiculous installation dialogs on Android which show you the APIs the app wants to access and the final question if you want to allow the app to access this functionality or not. If you say &#8220;no&#8221;, the app won&#8217;t install. That doesn&#8217;t really make me feel that the security concept is very flexible. It&#8217;s not giving the user a lot of control. Working with Opera&#8217;s widget runtimes already for a while I thought of a concept that would allow a lot kore control for the user and make apps hopefully more successful.<br />
I will use a short example to explain it. Imagine a twitter app that you want to install and that has a lot of functionality but on the first install you only want it to be able to go online to read and send tweets. Functionality like GPS, searching my addressbook or taking pictures with the camera are built in into the app. But as long as i don&#8217;t trust the app i don&#8217;t want this functionality enabled. So I turn of access to certain APIs upon installation and enable them just when I feel secure and gained trust in the app or had been told by experts that the app is secure. But this is currently not possible on platforms like Android or iPhone. I talked about this idea and told <a href="http://supportforums.blackberry.com/t5/user/viewprofilepage/user-id/28983">RIM&#8217;s Tim Neil</a> about it, in the hope to meet open ears and confirm that this is a good idea. The answer I got surprised me big time: BlackBerry already has this for a while. We got out our Torch devices to look it up, and yes in the menu under &#8220;Device / Application Management&#8221; you can edit the permissions per app (see picture). Awesome and just right, I love this.<br />
So Opera this was my idea to improve your widget runtime and maybe to jump ahead of the crowd again, I would like it.</p>
<p>Overall the BlackBerry6 platform is very exciting and a lot of thought seem to have gone into it, especially with focus on the web, which is a really good thing. So, I will just step away and try to build the Object Browser as a WebWorks App.</p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2010/10/25/blackberry6-webkit-webworks-devcon10-etc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Developing Widgets for Bada Devices</title>
		<link>http://uxebu.com/blog/2010/03/25/developing-widgets-for-bada-devices/</link>
		<comments>http://uxebu.com/blog/2010/03/25/developing-widgets-for-bada-devices/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 11:06:36 +0000</pubDate>
		<dc:creator>wolfram</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[development tools]]></category>
		<category><![CDATA[frontend engineering]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Tumbles]]></category>
		<category><![CDATA[w3c widgets]]></category>
		<category><![CDATA[bada]]></category>
		<category><![CDATA[widgets]]></category>

		<guid isPermaLink="false">http://uxebu.com/blog/2010/03/25/developing-widgets-for-bada-devices/</guid>
		<description><![CDATA[Developing Widgets for Bada Devices]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.badadev.com/developing-widgets-for-bada-devices/">Developing Widgets for Bada Devices</a></p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2010/03/25/developing-widgets-for-bada-devices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make evaled script more useable in Firebug</title>
		<link>http://uxebu.com/blog/2009/11/10/make-evaled-script-more-useable-in-firebug/</link>
		<comments>http://uxebu.com/blog/2009/11/10/make-evaled-script-more-useable-in-firebug/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 08:41:40 +0000</pubDate>
		<dc:creator>wolfram</dc:creator>
				<category><![CDATA[development tools]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[frontend engineering]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Tumbles]]></category>

		<guid isPermaLink="false">http://blog.uxebu.com/?p=661</guid>
		<description><![CDATA[Make evaled script more useable in Firebug]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/">Make evaled script more useable in Firebug</a></p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2009/11/10/make-evaled-script-more-useable-in-firebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git SVN Workflow</title>
		<link>http://uxebu.com/blog/2009/10/21/git-svn-workflow/</link>
		<comments>http://uxebu.com/blog/2009/10/21/git-svn-workflow/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 15:41:43 +0000</pubDate>
		<dc:creator>wolfram</dc:creator>
				<category><![CDATA[development tools]]></category>
		<category><![CDATA[Tumbles]]></category>

		<guid isPermaLink="false">http://blog.uxebu.com/?p=659</guid>
		<description><![CDATA[Git SVN Workflow]]></description>
			<content:encoded><![CDATA[<p><a href="http://andy.delcambre.com/2008/03/04/git-svn-workflow.html">Git SVN Workflow</a></p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2009/10/21/git-svn-workflow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dojo D.O.H. Unit Testing</title>
		<link>http://uxebu.com/blog/2009/07/21/dojo-doh-unit-testing/</link>
		<comments>http://uxebu.com/blog/2009/07/21/dojo-doh-unit-testing/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 09:32:38 +0000</pubDate>
		<dc:creator>wolfram</dc:creator>
				<category><![CDATA[development tools]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Tumbles]]></category>

		<guid isPermaLink="false">http://blog.uxebu.com/?p=592</guid>
		<description><![CDATA[Dojo D.O.H. Unit Testing]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.medryx.org/2008/06/08/dojo-doh-unit-testing/">Dojo D.O.H. Unit Testing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://uxebu.com/blog/2009/07/21/dojo-doh-unit-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

