<?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>Ajax Bestiary &#187; Tools</title>
	<atom:link href="http://www.ajaxbestiary.com/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxbestiary.com</link>
	<description>AJAX Development, News, Techniques &#38; More</description>
	<lastBuildDate>Wed, 01 Feb 2012 12:46:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Remote console for mobile web diagnosis</title>
		<link>http://www.ajaxbestiary.com/2012/01/20/remote-console-for-mobile-web-diagnosis/</link>
		<comments>http://www.ajaxbestiary.com/2012/01/20/remote-console-for-mobile-web-diagnosis/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 12:00:45 +0000</pubDate>
		<dc:creator>Dave Mahon</dc:creator>
				<category><![CDATA[Misc Toolkits]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=655</guid>
		<description><![CDATA[Remy Sharp has developed a tool for remotely debugging web pages. This works using code injection, so be very sure to keep it out of production environments. However, when you need to diagnosis issues remotely, say, because it&#8217;s on a mobile device, with limited console support, or because a client is reporting problems that you [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p><a href="http://twitter.com/rem">Remy Sharp</a> has developed a tool for <a href="http://jsconsole.com/">remotely debugging</a> web pages. This works using code injection, so be very sure to keep it out of production environments. However, when you need to diagnosis issues remotely, say, because it&#8217;s on a mobile device, with limited console support, or because a client is reporting problems that you can&#8217;t repeat locally.</p>
<p>Implementing this is a snap!</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">:</span>listen</pre></div></div>

<p></code></p>
<p>This returns an UUID which you will need to insert into the page markup:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="html4script" style="font-family:monospace;">&lt;script src=&quot;http://jsconsole.com/remote.js?FAE031CD-74A0-46D3-AE36-757BAB262BEA&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre></div></div>

<p></code></p>
<p>From then on, calls to <code>console.log()</code> will return their output to your listening machine.</p>
<p>The really handy library has one more trick up its sleeve. You can specify the UUID to which you will listen.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">:</span>listen FAE031CD<span style="color: #339933;">-</span>74A0<span style="color: #339933;">-</span>46D3<span style="color: #339933;">-</span>AE36<span style="color: #339933;">-</span>757BAB262BEA</pre></div></div>

<p></code></p>
<p>When the remote device loads the debugging module, you&#8217;ll see something like this in your console:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">:</span>listen FAE031CD<span style="color: #339933;">-</span>74A0<span style="color: #339933;">-</span>46D3<span style="color: #339933;">-</span>AE36<span style="color: #339933;">-</span>757BAB262BEA
Creating connection...
<span style="color: #660066;">Connected</span> to <span style="color: #3366CC;">&quot;FAE031CD-74A0-46D3-AE36-757BAB262BEA&quot;</span>
Connection established <span style="color: #000066; font-weight: bold;">with</span> Mozilla<span style="color: #339933;">/</span><span style="color: #CC0000;">5.0</span> <span style="color: #009900;">&#40;</span>Macintosh<span style="color: #339933;">;</span> U<span style="color: #339933;">;</span> Intel Mac OS X <span style="color: #CC0000;">10.6</span><span style="color: #339933;">;</span> en<span style="color: #339933;">-</span>GB<span style="color: #339933;">;</span> rv<span style="color: #339933;">:</span>1.9.2.8<span style="color: #009900;">&#41;</span> Gecko<span style="color: #339933;">/</span><span style="color: #CC0000;">20100722</span> Firefox<span style="color: #339933;">/</span>3.6.8</pre></div></div>

<p></code></p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2012/01/20/remote-console-for-mobile-web-diagnosis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The sound of music is silence and sometimes a click</title>
		<link>http://www.ajaxbestiary.com/2012/01/09/the-sound-of-music-is-silence-and-sometimes-a-click/</link>
		<comments>http://www.ajaxbestiary.com/2012/01/09/the-sound-of-music-is-silence-and-sometimes-a-click/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 12:00:08 +0000</pubDate>
		<dc:creator>Dave Mahon</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Misc Toolkits]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[audio data]]></category>
		<category><![CDATA[audio data api]]></category>
		<category><![CDATA[audiolet]]></category>
		<category><![CDATA[audiolib]]></category>
		<category><![CDATA[multimedia]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[soundmanager]]></category>
		<category><![CDATA[soundmanager2]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[web audio]]></category>
		<category><![CDATA[webaudio api]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=598</guid>
		<description><![CDATA[HTML5 begat the AUDIO tag. Now that we have it, what do we do with it? And how do we accommodate older browsers? Unfortunately, there are two incompatible standards and the W3C Audio Working Group &#34;has not decided upon a specification&#34;. The Web Audio API works on recent builds of Chrome and Safari. The API [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>HTML5 begat the AUDIO tag. Now that we have it, what do we do with it? And how do we accommodate older browsers?</p>
<p>Unfortunately, there are two incompatible standards and the W3C Audio Working Group &quot;<a href="http://www.w3.org/2011/audio/wiki/PubStatus">has not decided upon a specification</a>&quot;.</p>
<p>The <a href="http://www.html5rocks.com/en/tutorials/webaudio/intro/">Web Audio API</a> works on recent builds of Chrome and Safari. The API includes complex filters and allows developers to roll <a href="http://chromium.googlecode.com/svn/trunk/samples/audio/index.html">drum machines and visualizations</a>. It&#8217;s active by default on Chrome 16, but not on Safari 5. Worse, Safari 5 reports that it is supported, but won&#8217;t run the samples to which I have linked. Adding insult to injury, it&#8217;s also slow and can randomly introduce skips and clicks.</p>
<p>Mozilla introduced the <a href="https://wiki.mozilla.org/Audio_Data_API">Audio Data API</a>, but it only works in Firefox 4 and above. It&#8217;s also a very low level API and requires <a href="https://wiki.mozilla.org/Audio_Data_API#JavaScript_Audio_Libraries">intermediate libraries</a> to be truly useful for non-developer apps, of which there are a number. Like Google&#8217;s Web Audio, it&#8217;s slow and can randomly introduce skips and clicks.</p>
<p>Since these two technologies encompass only about half of web traffic, we clearly need fallback mechanisms.</p>
<p>There is <a href="http://www.schillmania.com/projects/soundmanager2/">SoundManager2</a> which uses both HTMl5 and Flash 8 or 9+ to bridge platforms. It relies on MP3/AAC/OGG/WAV sample files and supports panning, sampling and &#8211; most valuable &#8211; event support. Events like <code>whileplaying</code> and <code>onposition</code> make it easy to sync your audio and video. Beyond equalization, volume and start/stop positions, however, you can&#8217;t do much to filter the sound output.</p>
<p>You might also try <a href="https://github.com/oampo/Audiolet">Audiolet</a>, which lets you generate your own waveforms in browser, giving you a full range of freedom, but it&#8217;s going to sound like 8-bit audio unless you use samples. (Hint: try combining it with MUSIC.js to make the most of that 8-bit arcade sound)</p>
<p>Then there is <a href="http://audiolibjs.org/">audiolib.js</a>, which goes even lower than Audiolet and can operate server-side. It allows you to both manipulate and <em>generate</em> audio samples in PCM format, which it can then save for future use.</p>
<p>Audiolet starts quickly and is half the size of SoundManager2, but can click and skip, especially when the browser is scrolling or otherwise pre-occupied. SoundManager2 can bog down when playing too many sounds at once. Try activating +follow and then moving your mouse quickly over its <a href="http://www.schillmania.com/projects/soundmanager2/demo/christmas-lights/">Smashing Christmas Lights demo</a> to see this in action.</p>
<p>Audiolib is extremely low level, but for generating short realistic  waveforms, it is effective and fast, both client-side and server. Sadly, in Firefox 9 on my Mac, <a href="http://audiolibjs.org/examples/bells.html">this example</a> only plays the first bell while Safari 5 and Opera 11.6 played nothing at all. Chrome 16 played it correctly. However, when I had the page open in 3 browsers simultaneously, even though only one was generating noise, the load was causing skipping and clicking in Chrome. Your audio could easily suffer if the end user&#8217;s computer is otherwise busy.</p>
<p>In short, there is no good solution yet that is widely supported <em>and</em> flexible <em>and</em> performant, even within modern browsers.</p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2012/01/09/the-sound-of-music-is-silence-and-sometimes-a-click/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The digits of MUSIC.js</title>
		<link>http://www.ajaxbestiary.com/2012/01/06/the-digits-of-music-js/</link>
		<comments>http://www.ajaxbestiary.com/2012/01/06/the-digits-of-music-js/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 12:00:00 +0000</pubDate>
		<dc:creator>Dave Mahon</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[frequency]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[mathematics]]></category>
		<category><![CDATA[music]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=595</guid>
		<description><![CDATA[Remember the glory days of 8-bit audio? Games today feature fully scored soundtracks records in dozens of high quality MP3&#8242;s, but as late as the 90&#8242;s, music was 8-bit frequency manipulation. MUSIC.js is Greg Jopa&#8217;s library for taking notation and calculating its corresponding frequency. This can then be fed to audio generation libraries like audiolet.js [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Remember the glory days of 8-bit audio? Games today feature fully scored soundtracks records in dozens of high quality MP3&#8242;s, but as late as the 90&#8242;s, music was 8-bit frequency manipulation.</p>
<p><a href="http://www.gregjopa.com/2011/05/calculate-note-frequencies-in-javascript-with-music-js/">MUSIC.js</a> is Greg Jopa&#8217;s library for taking <a href="http://www.ajaxbestiary.com/2012/01/05/the-look-of-music/">notation</a> and calculating its corresponding frequency. This can then be fed to audio generation libraries like audiolet.js to generate the sound.</p>
<p>Implementation is very simple. Take his sample of A from the fourth octave. Two lines is all it takes:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> n <span style="color: #339933;">=</span> Note.<span style="color: #660066;">fromLatin</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'A4'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> freq <span style="color: #339933;">=</span> n.<span style="color: #660066;">frequency</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// returns 440</span></pre></div></div>

<p></code></p>
<p>Intervals are similarly straightforward:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> c <span style="color: #339933;">=</span> Note.<span style="color: #660066;">fromLatin</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'C3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// by semitone</span>
<span style="color: #003366; font-weight: bold;">var</span> wholeStep <span style="color: #339933;">=</span> Interval.<span style="color: #660066;">fromSemitones</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> c.<span style="color: #660066;">add</span><span style="color: #009900;">&#40;</span>wholeStep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>d.<span style="color: #660066;">latin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// &quot;D&quot;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// by interval name</span>
<span style="color: #003366; font-weight: bold;">var</span> g <span style="color: #339933;">=</span> c.<span style="color: #660066;">add</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fifth'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>g.<span style="color: #660066;">latin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// &quot;G&quot;</span></pre></div></div>

<p></code></p>
<p>It even calculates chords and scales. Note that all of these calculations are uncached, so you will want to optimize your loops.</p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2012/01/06/the-digits-of-music-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bring HTML5 and ECMAScript 5 to a browser near you</title>
		<link>http://www.ajaxbestiary.com/2011/12/30/bring-html5-and-ecmascript-5-to-a-browser-near-you/</link>
		<comments>http://www.ajaxbestiary.com/2011/12/30/bring-html5-and-ecmascript-5-to-a-browser-near-you/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 12:00:40 +0000</pubDate>
		<dc:creator>Dave Mahon</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Javascript Frameworks]]></category>
		<category><![CDATA[Misc Toolkits]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ie]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=565</guid>
		<description><![CDATA[Unless you develop in-house sites for companies that have standardized on a very modern browser, you&#8217;re stuck developing sites for IE8 and even IE7. (Heaven help you if you&#8217;re still developing for IE6). How then do you access some of the powerful features of ECMAScript or the contextual tags of HTML5 without having to write [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Unless you develop in-house sites for companies that have standardized on a very modern browser, you&#8217;re stuck developing sites for IE8 and even IE7. (Heaven help you if you&#8217;re still developing for <a href="http://www.ie6countdown.com/">IE6</a>).</p>
<p>How then do you access some of the powerful features of <a href="http://kangax.github.com/es5-compat-table/">ECMAScript</a> or the contextual tags of HTML5 without having to write layer upon layer of fallbacks?</p>
<p>Your fellow JavaScript developers have produced shims to emulate <em>most</em> of this functionality, even in environments where <a href="http://www.ajaxbestiary.com/2011/06/03/strategically-retreating-to-chrome-frame/">Chrome Frame</a> isn&#8217;t viable.</p>
<p>The <a href="http://code.google.com/p/html5shiv/">html5shiv project</a> is still under active development. It not only adds support for HTML5 contextual tags, it sets their default styling and makes them print in IE8 and below. Naturally, their canvas element is not going to have the behaviors you see in other browsers, but at least you can get away with a single set of markup and fewer CSS rules.</p>
<p>The <a href="https://github.com/kriskowal/es5-shim#readme">es5-shim project</a> is also under active development. It alters prototypes of <a href="http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/">native objects</a>, so I wouldn&#8217;t combine it with prototype.js. This library also has the benefit of being well documented &#8211; including what <a href="https://github.com/kriskowal/es5-shim/blob/master/README.md">does and does not differ</a> from the specification. Heed the cautions from Kris Kowal, its author, though:</p>
<blockquote><p>&#8220;As closely as possible to ES5&#8243; is not very close. Many of these shims are intended only to allow code to be written to ES5 without causing run-time errors in older engines. In many cases, this means that these shims cause many ES5 methods to silently fail. Decide carefully whether this is what you want.</p></blockquote>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2011/12/30/bring-html5-and-ecmascript-5-to-a-browser-near-you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strategically Retreating to Chrome Frame</title>
		<link>http://www.ajaxbestiary.com/2011/06/03/strategically-retreating-to-chrome-frame/</link>
		<comments>http://www.ajaxbestiary.com/2011/06/03/strategically-retreating-to-chrome-frame/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 11:05:16 +0000</pubDate>
		<dc:creator>Don Albrecht</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[Chrome frame]]></category>
		<category><![CDATA[legacy support]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/2011/06/02/strategically-retreating-to-chrome-frame/</guid>
		<description><![CDATA[About a month ago, I found myself In a terrible debugging situation. A web app that I had carefully QA&#8217;d in both an IE 8 and IE9 environment was receiving a slew of bug requests from users. Some of these we&#8217;d expected. The use of several minor CSS3 tweaks meant that the visual experience was [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>About a month ago, I found myself In a terrible debugging situation.  A web app that I had carefully QA&#8217;d in both an IE 8 and IE9 environment was receiving a slew of bug requests from users.  Some of these we&#8217;d expected.  The use of several minor CSS3 tweaks meant that the visual experience was intentionally degraded in IE, but many of these we hadn&#8217;t.</p>
<p>Script timeout errors popped up randomly throughout the enterprise.<br />
IE 666 users complained and I wasn&#8217;t allowed to take appropriate action.<br />
Layout quirks surfaced.</p>
<p>Even more troubling was the discovery of radically different layout interpretations between builds of IE 8.  My testing had proved inadequate because minor build number differences were interpreting the css in radically different ways.  Since the app had managed to make it into production with these issues, and fully repairing all of them looked to be a slog I didn&#8217;t have the temporal luxury of pursuing; I punted.  I threw up conditional comments to repair the issues that were preventing casual browsing.  Then I hid the login box for IE users; replacing it instead with a Chrome Frame install prompt.</p>
<p>The results were immediate.  My complaint volume dropped astoundingly.  More importantly, the number of unresolved Scorchers went to zero.  At the same time, no one complained about needing to install Chrome Frame.  I had a few issues with insufficient permissions, and a few lingering CSS tweaks that needed rolled out, but the ease of the fix really was astounding.</p>
<p>I&#8217;ve since retrofitted most of my production apps and web servers to take advantage of my users newly capable Microsoft Browsers and plan on making the strategic retreat a deployment strategy for many new projects.  While I don&#8217;t plan on abandoning support for IE, I look forward to minimizing its impact on project risk.</p>
<p>Note:  This post was updated on 2011.6.16 due to a mistake in my account.</p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2011/06/03/strategically-retreating-to-chrome-frame/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Notes On My First Few Days With Hype</title>
		<link>http://www.ajaxbestiary.com/2011/06/02/notes-on-my-first-few-days-with-hype/</link>
		<comments>http://www.ajaxbestiary.com/2011/06/02/notes-on-my-first-few-days-with-hype/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 10:39:35 +0000</pubDate>
		<dc:creator>Don Albrecht</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Hype]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=407</guid>
		<description><![CDATA[For those of you not aware, Hype is a new OSX app for building interactive HTML5 in a Timeline / WYSIWYG interface. It&#8217;s not the first product in the space (Sencha Animator), it&#8217;s the first well publicized version 1.0 I&#8217;ve come across.  It&#8217;s also pretty reasonably priced at 29.99 a seat. First the good points: [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>For those of you not aware,<a href="http://tumultco.com/hype/"> Hype is a new OSX app for building interactive HTML5 in a Timeline / WYSIWYG interface.</a></p>
<p>It&#8217;s not the first product in the space (<a href="http://www.sencha.com/products/animator/demos/">Sencha Animator</a>), it&#8217;s the first well publicized version 1.0 I&#8217;ve come across.  It&#8217;s also pretty reasonably priced at 29.99 a seat.</p>
<h3>First the good points:</h3>
<ul>
<li><strong>Ease of use</strong>: This is definitely a pretty straightforward tool in this regard.</li>
<li><strong>Interoperability:</strong> The Hype API and ability to execute arbitrary javascript inside the page DOM make this a great option for extending the capabilities of an existing web app.  I&#8217;d obviously like it to be richer, but it&#8217;s a decent compromise for a rev 1 product.</li>
<li><strong>OS integration:</strong> For those of us on OSX, the drag and drop support  and polished UI are incredibly nice.</li>
</ul>
<h3>So what needs improvement:</h3>
<ul>
<li><strong>Animation along a path with key frames</strong>:  I realize this isn&#8217;t as embodied in css3 transforms as other options, but <a href="http://developer.yahoo.com/yui/examples/animation/control.html">YUI Animation</a> and Sencha Animator do it, so It&#8217;s demonstrably possible.</li>
<li><strong>Dynamic Sprite creation:</strong> The fact we can play arbitrary timelines from javascript is nice, but I would like to be able to add timelines to the frame.</li>
<li><strong>Direct Sprite manipulation:</strong> Changing sprite colors or the text in a block might be useful.</li>
</ul>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2011/06/02/notes-on-my-first-few-days-with-hype/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Date.js  My New Favorite Javascript Date Library</title>
		<link>http://www.ajaxbestiary.com/2010/06/19/date-js-my-new-favorite-javascript-date-library/</link>
		<comments>http://www.ajaxbestiary.com/2010/06/19/date-js-my-new-favorite-javascript-date-library/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 13:43:32 +0000</pubDate>
		<dc:creator>Don Albrecht</dc:creator>
				<category><![CDATA[Link]]></category>
		<category><![CDATA[Misc Toolkits]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Date]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Resource]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/2010/06/19/date-js-my-new-favorite-javascript-date-library/</guid>
		<description><![CDATA[Earlier this week, I discovered that Safari doesn’t support dates in ISO 8601 UTC combined format:&#160; “2010-06-19T03:11Z”.&#160; This was a problem as my production system was delivering me a json file with dates in this format and my project was simply a new UI for the existing server.&#160; A quick round of googling found DateJS [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Earlier this week, I discovered that Safari doesn’t support dates in ISO 8601 UTC combined format:&#160; “2010-06-19T03:11Z”.&#160; This was a problem as my production system was delivering me a json file with dates in this format and my project was simply a new UI for the existing server.&#160; A quick round of googling found <a href="http://www.datejs.com/">DateJS</a> a powerful chainable Date extension that enables both unified parsing and mask based date rendering.&#160; I’d only played with it for a few minutes before I was completely hooked on it.&#160; Just look at what it can do.</p>
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #008000">// What date is next thursday?</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> Date.today().next().thursday();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span> <span style="color: #008000">// Add 3 days to Today</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span> Date.today().add(3).days();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span> <span style="color: #008000">// Is today Friday?</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span> Date.today().<span style="color: #0000ff">is</span>().friday();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span> <span style="color: #008000">// Number fun</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span> (3).days().ago();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span> <span style="color: #008000">// 6 months from now</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span> <span style="color: #0000ff">var</span> n = 6;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span> n.months().fromNow();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16">  16:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum17">  17:</span> <span style="color: #008000">// Set to 8:30 AM on the 15th day of the month</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum18">  18:</span> Date.today().set({ day: 15, hour: 8, minute: 30 });</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum19">  19:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum20">  20:</span> <span style="color: #008000">// Convert text into Date</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum21">  21:</span> Date.parse(<span style="color: #006080">'today'</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum22">  22:</span> Date.parse(<span style="color: #006080">'t + 5 d'</span>); <span style="color: #008000">// today + 5 days</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum23">  23:</span> Date.parse(<span style="color: #006080">'next thursday'</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum24">  24:</span> Date.parse(<span style="color: #006080">'February 20th 1973'</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum25">  25:</span> Date.parse(<span style="color: #006080">'Thu, 1 July 2004 22:30:00'</span>);</pre>
<p><!--CRLF--></div>
</div>
<p><font color="#333333">And Yes It supports ISO 8601 UTC combined format!.</font></p>
<p>A quick replacement of my existing date toolkit in the project and my bugs were fixed.</p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2010/06/19/date-js-my-new-favorite-javascript-date-library/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Converting Between Wiki Markup &amp; HTML with Prototype</title>
		<link>http://www.ajaxbestiary.com/2008/12/18/converting-between-wiki-markup-html-with-prototype/</link>
		<comments>http://www.ajaxbestiary.com/2008/12/18/converting-between-wiki-markup-html-with-prototype/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 15:00:07 +0000</pubDate>
		<dc:creator>Don Albrecht</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Conversion]]></category>
		<category><![CDATA[Wiki]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=334</guid>
		<description><![CDATA[Wiki&#8217;s are amazing and powerful tools, unfortunately their dependence on specialized markup creates a huge barrier to their general adoption in many organizations.  This is a first step at building a wysiwyg editor for wiki markup.  While I will be focussing on the syntax unique to the popular MediaWiki platform, these techniques should be applicable [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Wiki&#8217;s are amazing and powerful tools, unfortunately their dependence on specialized markup creates a huge barrier to their general adoption in many organizations.  This is a first step at building a wysiwyg editor for wiki markup.  While I will be focussing on the syntax unique to the popular MediaWiki platform, these techniques should be applicable to any wiki system.</p>
<p>The general flow of the converter is as follows:</p>
<ol>
<li>Converter is passed the root node of an html fragment to translate.</li>
<li>Converter recurses through each of the child nodes and converts them.</li>
<li>Root node tag is replaced with wiki markup.</li>
</ol>
<p>There&#8217;s really only 2 key components involved in this first pass. A converter object and the recursive method.</p>
<h3>The Converter Object</h3>
<p>The converter object is little more than a collection of name value pairs.  The name corresponds to an html tag.  The value is a Prototype template to use in the direct replacement of the given node. By convention we&#8217;ll write all of the tag names for the converter object in lower case.<br />
<code><br />
var Converter = {<br />
strong: new Template("'''#{body}'''"),<br />
b:  new Template("'''#{body}'''"),<br />
em: new Template("''#{body}''"),<br />
i:  new Template("''#{body}''"),<br />
h1: new Template('=#{body}='),<br />
h2: new Template('===#{body}=='),</code><br />
h3: new Template(&#8216;===#{body}===&#8217;),<br />
h4: new Template(&#8216;====#{body}====&#8217;),<br />
h5: new Template(&#8216;=====#{body}=====&#8217;),<br />
h6: new Template(&#8216;======#{body}======&#8217;)  }</p>
<h3>The Converter Function</h3>
<p>The Converter function always performs 2 checks before attempting to convert a given node.  First it ensures that the node is in fact a node and not a stray function from the Prototype enhanced object.  Next it verifies that a converter exists for the tag.  The toLowerCase() on the tagName is necessary due to the inconsistent behavior browsers demonstrate with this attribute.  While all browsers return the variable in all caps for traditional html, they are not reliable about returning lower case values for xhtml markup.</p>
<p><code>function convertToWiki( textNode ){<br />
//make sure textNode isn't a function on the object<br />
if( typeof textNode != 'function'){</code></p>
<p><code>//provide a way to stop execution on select sub trees<br />
if( !textNode.hasClassName( 'stop')){<br />
$(textNode).childElements().each( convertToWiki );<br />
}</code></p>
<p><code>//make sure a converter exists for the given tag<br />
if( liteConverter[ textNode.tagName.toLowerCase() ] ){</code></p>
<p><code> </code></p>
<p><code>//replace the text node with a converted version of itself<br />
textNode.replace(	liteConverter[textNode.tagName.toLowerCase()]<br />
.evaluate({body:textNode.innerHTML}));<br />
} } }</code></p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2008/12/18/converting-between-wiki-markup-html-with-prototype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simplify Your Workflow with GuiMags</title>
		<link>http://www.ajaxbestiary.com/2008/04/11/simplify-your-workflow-with-guimags/</link>
		<comments>http://www.ajaxbestiary.com/2008/04/11/simplify-your-workflow-with-guimags/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 00:24:05 +0000</pubDate>
		<dc:creator>Don Albrecht</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=320</guid>
		<description><![CDATA[Let&#8217;s face it, prototyping and mock-ups are a pain in the rear. I&#8217;m always looking for ways to streamline the early phases of the design process. Today I found one that is simply brilliant. Meet GUIMags: Simple, whiteboard magnets of common UI components. Now you can do mockups on the whiteboard with high fidelity symbols [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p><a href="http://www.ajaxbestiary.com/wp-content/uploads/2008/04/guimags.jpg"><img class="alignleft size-full wp-image-321" style="float:left; margin-right: 1.5em;" title="guimags" src="http://www.ajaxbestiary.com/wp-content/uploads/2008/04/guimags.jpg" alt="" width="236" height="288" /></a></p>
<p>Let&#8217;s face it, prototyping and mock-ups are a pain in the rear.  I&#8217;m always looking for ways to streamline the early phases of the design process.  Today I found one that is simply brilliant.</p>
<p>Meet GUIMags:  Simple, whiteboard magnets of common UI components.</p>
<p>Now you can do mockups on the whiteboard with high fidelity symbols that photograph well.  Instead of sketching out the entire design for each iteration, you can simply rearrange elements and erase / rewrite labels as  you collaboratively work through a design.  When you&#8217;re done.  You can simply take a picture of the whiteboard and start coding your mockup.</p>
<p>You can find GuiMags here:</p>
<p><a href="http://www.guimags.com/index.php">http://www.guimags.com/index.php</a></p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2008/04/11/simplify-your-workflow-with-guimags/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Expand your debugging aresnal with pi.debugger</title>
		<link>http://www.ajaxbestiary.com/2008/04/08/expand-your-debugging-aresnal-with-pidebugger/</link>
		<comments>http://www.ajaxbestiary.com/2008/04/08/expand-your-debugging-aresnal-with-pidebugger/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 15:28:10 +0000</pubDate>
		<dc:creator>Don Albrecht</dc:creator>
				<category><![CDATA[Misc Toolkits]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[Firebug]]></category>

		<guid isPermaLink="false">http://www.ajaxbestiary.com/?p=317</guid>
		<description><![CDATA[pi.debugger is a new debug console that acts as a graceful counterpart to firebug.  I&#8217;ve  and Firebug is an awesome tool for debugging, hands down.  Unfortunately, it is Firefox specific and has to be installed on the clients machine. Firebug lite is great, but it is extremely limited and provides little more than a logging [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p><a href="http://www.ajaxbestiary.com/wp-content/uploads/2008/04/pidebugger.png"><img class="alignnone size-full wp-image-318" title="pidebugger" src="http://www.ajaxbestiary.com/wp-content/uploads/2008/04/pidebugger.png" alt="" width="500" height="151" /></a></p>
<p>pi.debugger is a new debug console that acts as a graceful counterpart to firebug.  I&#8217;ve  and Firebug is an awesome tool for debugging, hands down.  Unfortunately, it is Firefox specific and has to be installed on the clients machine.</p>
<p>Firebug lite is great, but it is extremely limited and provides little more than a logging console.  pi.debugger sits somewhere in between.  It&#8217;s not as full featured as firebug, but it does provide the ever useful evaluation console as well as a DOM browser.</p>
<p>Check it out here:</p>
<p><a href="http://code.google.com/p/pi-js/">http://code.google.com/p/pi-js/</a></p>
<p>And test drive it here:</p>
<p><a href="http://kodfabrik.com/app/pi.debugger/">http://kodfabrik.com/app/pi.debugger/</a></p>
<p><img src="http://www.ajaxbestiary.com/?voyeur=1"></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxbestiary.com/2008/04/08/expand-your-debugging-aresnal-with-pidebugger/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

