﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:ng="http://newsgator.com/schema/extensions"><channel><title>Technical on NewsGator Online</title><link>http://www.newsgator.com</link><description>Technical on NewsGator Online</description><lastBuildDate>Fri, 26 Jun 2009 10:36:48 GMT</lastBuildDate><ttl>60</ttl><item><title>Pure JavaScript HTML Parser</title><link>http://ejohn.org/blog/pure-javascript-html-parser/</link><description>	&lt;p&gt;Recently I was having a little bit of fun and decided to go about writing a pure JavaScript HTML parser. Some might remember my one project, &lt;a href="http://ejohn.org/blog/bringing-the-browser-to-the-server/"&gt;env.js&lt;/a&gt;, which ported the  native browser JavaScript features to the server-side (powered by &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt;). One thing that was lacking from that project was an HTML parser (it parsed strict XML only).&lt;/p&gt;
	&lt;p&gt;I've been toying with the ability to port env.js to other platforms (Spidermonkey derivatives and the ECMAScript 4 Reference Implementation) and if I were to do so I would need an HTML parser. Because of this fact it became easiest to just write an HTML parser in pure JavaScript.&lt;/p&gt;
	&lt;p&gt;I did some digging to see what people had previously built, but the landscape was pretty bleak. The only one that I could find was one made by &lt;a href="http://erik.eae.net/"&gt;Erik Arvidsson&lt;/a&gt; - a simple &lt;a href="http://erik.eae.net/simplehtmlparser/simplehtmlparser.js"&gt;SAX-style HTML parser&lt;/a&gt;. Considering that this contained only the most basic parsing - and none of the actual, complicated, HTML logic there was still a lot of work left to be done.&lt;/p&gt;
	&lt;p&gt;(I also contemplated porting the &lt;a href="http://code.google.com/p/html5lib/"&gt;HTML 5 parser&lt;/a&gt;, wholesale, but that seemed like a herculean effort.)&lt;/p&gt;
	&lt;p&gt;However, the result is one that I'm quite pleased with. It won't match the compliance of html5lib, nor the speed of a pure XML parser, but it's able to get the job done with little fuss - while still being highly portable.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;htmlparser.js:&lt;/b&gt;&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/files/htmlparser.js"&gt;View htmlparser.js&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/apps/htmlparser/"&gt;Demo&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;&lt;b&gt;4 Libraries in One!&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;There were four pieces of functionality that I wanted to implement with this library:&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;A &lt;a href="http://en.wikipedia.org/wiki/Simple_API_for_XML"&gt;SAX-style&lt;/a&gt; API&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;Handles tag, text, and comments with callbacks. For example, let's say you wanted to implement a simple HTML to XML serialization scheme - you could do so using the following:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-1"&gt;
	&lt;div&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; results = &lt;span style="color: #3366CC;"&gt;""&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;HTMLParser&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;p id=test&amp;gt;hello &amp;lt;i&amp;gt;world"&lt;/span&gt;, &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; start: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; tag, attrs, unary &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; results += &lt;span style="color: #3366CC;"&gt;"&amp;lt;"&lt;/span&gt; + tag;&lt;/p&gt;
	&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; i = &lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;; i &amp;lt; attrs.&lt;span style="color: #006600;"&gt;length&lt;/span&gt;; i++ &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; results += &lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt; + attrs&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;i&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;name&lt;/span&gt; + &lt;span style="color: #3366CC;"&gt;'=&amp;quot;'&lt;/span&gt; + attrs&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;i&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;escaped&lt;/span&gt; + &lt;span style="color: #3366CC;"&gt;'&amp;quot;'&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;&amp;nbsp; &amp;nbsp; results += &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;unary ? &lt;span style="color: #3366CC;"&gt;"/"&lt;/span&gt; : &lt;span style="color: #3366CC;"&gt;""&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; + &lt;span style="color: #3366CC;"&gt;"&amp;gt;"&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; end: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; tag &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; results += &lt;span style="color: #3366CC;"&gt;"&amp;lt;/"&lt;/span&gt; + tag + &lt;span style="color: #3366CC;"&gt;"&amp;gt;"&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; chars: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; text &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; results += text;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; comment: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; text &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; results += &lt;span style="color: #3366CC;"&gt;"&amp;lt;!--"&lt;/span&gt; + text + &lt;span style="color: #3366CC;"&gt;"--&amp;gt;"&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;results == &lt;span style="color: #3366CC;"&gt;'&amp;lt;p id=&amp;quot;test&amp;quot;&amp;gt;hello &amp;lt;i&amp;gt;world&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&amp;quot; &lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;XML Serializer&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;Now, there's no need to worry about implementing the above, since it's included directly in the library, as well. Just feed in HTML and it spits back an XML string.&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-2"&gt;
	&lt;div&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; results = HTMLtoXML&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;p&amp;gt;Data: &amp;lt;input disabled&amp;gt;"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
results == &lt;span style="color: #3366CC;"&gt;"&amp;lt;p&amp;gt;Data: &amp;lt;input disabled="&lt;/span&gt;disabled&lt;span style="color: #3366CC;"&gt;"/&amp;gt;&amp;lt;/p&amp;gt;"&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;DOM Builder&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;If you're using the HTML parser to inject into an existing DOM document (or within an existing DOM element) then htmlparser.js provides a simple method for handling that:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-3"&gt;
	&lt;div&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// The following is appended into the document body&lt;/span&gt;&lt;br /&gt;
HTMLtoDOM&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;p&amp;gt;Hello &amp;lt;b&amp;gt;World"&lt;/span&gt;, document&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// The follow is appended into the specified element&lt;/span&gt;&lt;br /&gt;
HTMLtoDOM&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;p&amp;gt;Hello &amp;lt;b&amp;gt;World"&lt;/span&gt;, document.&lt;span style="color: #006600;"&gt;getElementById&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"test"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;DOM Document Creator&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;This is a more-advanced version of the DOM builder - it includes logic for handling the overall structure of a web page, returning a new DOM document.&lt;/p&gt;
	&lt;p&gt;A couple points are enforced by this method:&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;There will always be a html, head, body, and title element.&lt;/li&gt;
	&lt;li&gt;There will only be one html, head, body, and title element (if the user specifies more, then will be moved to the appropriate locations and merged).&lt;/li&gt;
	&lt;li&gt;link and base elements are forced into the head.&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;You would use the method like so:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-4"&gt;
	&lt;div&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; dom = HTMLtoDOM&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;p&amp;gt;Data: &amp;lt;input disabled&amp;gt;"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
dom.&lt;span style="color: #006600;"&gt;getElementsByTagName&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"body"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;length&lt;/span&gt; == &lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;br /&gt;
dom.&lt;span style="color: #006600;"&gt;getElementsByTagName&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"p"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;length&lt;/span&gt; == &lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;hr/&gt;
	&lt;p&gt;While this library doesn't cover the full gamut of possible weirdness that HTML provides, it does handle a lot of the most obvious stuff. All of the following are accounted for:&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;Unclosed Tags:&lt;br /&gt;
&lt;div class="syntax_hilite"&gt;
&lt;div id="js-5"&gt;
	&lt;div&gt;HTMLtoXML&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Hello"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; == &lt;span style="color: #3366CC;"&gt;'&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Hello&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
	&lt;li&gt;Empty Elements:&lt;br /&gt;
&lt;div class="syntax_hilite"&gt;
&lt;div id="js-6"&gt;
	&lt;div&gt;HTMLtoXML&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;img src=test.jpg&amp;gt;"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; == &lt;span style="color: #3366CC;"&gt;'&amp;lt;img src=&amp;quot;test.jpg&amp;quot;/&amp;gt;'&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
	&lt;li&gt;Block vs. Inline Elements:&lt;br /&gt;
&lt;div class="syntax_hilite"&gt;
&lt;div id="js-7"&gt;
	&lt;div&gt;HTMLtoXML&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;b&amp;gt;Hello &amp;lt;p&amp;gt;John"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; == &lt;span style="color: #3366CC;"&gt;'&amp;lt;b&amp;gt;Hello &amp;lt;/b&amp;gt;&amp;lt;p&amp;gt;John&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
	&lt;li&gt;Self-closing Elements:&lt;br /&gt;
&lt;div class="syntax_hilite"&gt;
&lt;div id="js-8"&gt;
	&lt;div&gt;HTMLtoXML&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;p&amp;gt;Hello&amp;lt;p&amp;gt;World"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; == &lt;span style="color: #3366CC;"&gt;'&amp;lt;p&amp;gt;Hello&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;World&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
	&lt;li&gt;Attributes Without Values:&lt;br /&gt;
&lt;div class="syntax_hilite"&gt;
&lt;div id="js-9"&gt;
	&lt;div&gt;HTMLtoXML&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&amp;lt;input disabled&amp;gt;"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; == &lt;span style="color: #3366CC;"&gt;'&amp;lt;input disabled=&amp;quot;disabled&amp;quot;/&amp;gt;'&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; It does &lt;b&gt;not&lt;/b&gt; take into account where in the document an element should exist. Right now you can put block elements in a head or th inside a p and it'll happily accept them. It's not entirely clear how the logic should work for those, but it's something that I'm open to exploring.&lt;/p&gt;
	&lt;p&gt;You can test a lot of this out in the &lt;a href="http://ejohn.org/apps/htmlparser/"&gt;live demo&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;While I doubt this will cover all weird HTML cases - it should handle most of the obvious ones - at least making HTML parsing in JavaScript feasible.
&lt;/p&gt;
		&lt;img src="http://ejohn.org/apps/rss/?from=rss&amp;id=5587" style="width:0px;height:0px;"/&gt;&lt;img src="http://feeds.feedburner.com/~r/JohnResig/~4/283946631" height="1" width="1"/&gt;</description><pubDate>Mon, 05 May 2008 08:50:45 GMT</pubDate><guid isPermaLink="false">http://ejohn.org/blog/pure-javascript-html-parser/</guid><comments>http://ejohn.org/blog/pure-javascript-html-parser/#comments</comments><author>John Resig</author><source url="http://feeds.feedburner.com/JohnResig">John Resig</source><ng:postId>4871572799</ng:postId><ng:feedId>147422</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>FancyUpload: Swiff meets Ajax</title><link>http://feeds.feedburner.com/~r/ajaxian/~3/279393892/fancyupload-swiff-meets-ajax</link><description>	&lt;p&gt;&lt;a href="http://digitarald.de/project/fancyupload/"&gt;&lt;img src="http://ajaxian.com/wp-content/images/fancyupload.png" alt="FancyUpload" border="0" width="478" height="241"/&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;Harald Kirschner has created a new version of &lt;a href="http://digitarald.de/project/fancyupload/"&gt;FancyUpload&lt;/a&gt; "a file-input replacement which features an unobtrusive, multiple-file selection menu and queued upload with an animated progress bar."&lt;/p&gt;
	&lt;p&gt;A good example is the &lt;a href="http://digitarald.de/project/fancyupload/2-0/showcase/photoqueue/"&gt;Queued Photo Uploader&lt;/a&gt; which is coded by:&lt;/p&gt;
	&lt;div class="igBar"&gt;&lt;a href="javascript:showCodeTxt('javascript-2');"&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
	&lt;div class="syntax_hilite"&gt;&lt;span style="color:#000000; font-weight:bold;"&gt;JAVASCRIPT:&lt;/span&gt;&lt;br /&gt;
&lt;div id="javascript-2"&gt;
	&lt;div class="javascript"&gt;
&lt;ol&gt;
&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; swiffy = &lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; FancyUpload2&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;$&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-status'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;, $&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-list'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;, &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #3366CC;"&gt;'url'&lt;/span&gt;: $&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'form-demo'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;action&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #3366CC;"&gt;'fieldName'&lt;/span&gt;: &lt;span style="color: #3366CC;"&gt;'photoupload'&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #3366CC;"&gt;'path'&lt;/span&gt;: &lt;span style="color: #3366CC;"&gt;'../../source/Swiff.Uploader.swf'&lt;/span&gt;,&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #3366CC;"&gt;'onLoad'&lt;/span&gt;: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-status'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;removeClass&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'hide'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-fallback'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;destroy&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #009900; font-style: italic;"&gt;/**&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #009900; font-style: italic;"&gt; * Various interactions&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #009900; font-style: italic;"&gt; */&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;$&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-browse-all'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addEvent&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'click'&lt;/span&gt;, &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; swiffy.&lt;span style="color: #006600;"&gt;browse&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;$&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-browse-images'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addEvent&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'click'&lt;/span&gt;, &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; swiffy.&lt;span style="color: #006600;"&gt;browse&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'Images (*.jpg, *.jpeg, *.gif, *.png)'&lt;/span&gt;: &lt;span style="color: #3366CC;"&gt;'*.jpg; *.jpeg; *.gif; *.png'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;$&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-clear'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addEvent&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'click'&lt;/span&gt;, &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; swiffy.&lt;span style="color: #006600;"&gt;removeFile&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;$&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'demo-upload'&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addEvent&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'click'&lt;/span&gt;, &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; swiffy.&lt;span style="color: #006600;"&gt;upload&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=u74FgG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=u74FgG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=YtrmBG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=YtrmBG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=gqfs0g"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=gqfs0g" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 28 Apr 2008 13:37:17 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/fancyupload-swiff-meets-ajax</guid><comments>http://ajaxian.com/archives/fancyupload-swiff-meets-ajax#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>4826726236</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Aptana Cloud: Develop on your desktop, sync out to the cloud</title><link>http://feeds.feedburner.com/~r/ajaxian/~3/279602022/aptana-cloud-develop-on-your-desktop-sync-out-to-the-cloud</link><description>	&lt;p&gt;&lt;a href="http://aptana.com/cloud"&gt;&lt;img src="http://www.aptana.com/system/files/images/cloud_logo_large_0.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;Aptana have &lt;a href="http://www.eweek.com/c/a/Application-Development/Aptana-to-Launch-Cloud-Platform/"&gt;announced their cloud platform initiative&lt;/a&gt;, Aptana Cloud.&lt;/p&gt;
	&lt;blockquote&gt;&lt;p&gt;
Aptana Cloud plugs right into your IDE to provide instant deployment, smart synchronization, and seamless migration as you scale. Aptana Cloud is ideal for developers who use scripting languages to create Ajax, Facebook, mySpace and all other sorts of Web applications.
&lt;/p&gt;&lt;/blockquote&gt;
	&lt;p&gt;The key is that this isn&amp;#8217;t a infrastructure play, which they clearly point out:&lt;/p&gt;
	&lt;blockquote&gt;&lt;p&gt;
Aptana Cloud is architected to complement Cloud infrastructure providers like Amazon, Google, Joyent and others. To get started we&amp;#8217;ve selected Joyent who serves up some of the largest of all Facebook apps.
&lt;/p&gt;&lt;/blockquote&gt;
	&lt;p&gt;This shows that their platform is designed to go meta, allowing you to deploy to various clouds in the future.&lt;/p&gt;
	&lt;p&gt;I think that the number one meme from Web 2.0 Expo last week was the &amp;#8220;cloud&amp;#8221;, coming off of the excitement of Google App Engine. With Aptana Cloud we will see sophisticated tools to make us productive in the cloud. I am very excited to see that it won&amp;#8217;t be too long until developers will be able to build an application, hit DEPLOY, and be done. This is a huge win.&lt;/p&gt;
	&lt;p&gt;For developers:&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;IDE plug-in integrates Cloud development, deployment and management life-cycles right into Aptana Studio in either its standalone or Eclipse based editions&lt;/li&gt;
	&lt;li&gt;Instant deployment of projects to Cloud&lt;/li&gt;
	&lt;li&gt;One click sync your project to the Cloud, or provide fine grained sync control too&lt;/li&gt;
	&lt;li&gt;Integrated service management consoles&lt;/li&gt;
	&lt;li&gt;Configure desired memory size and disk size&lt;/li&gt;
	&lt;li&gt;Develop and instantly preview remote files right inside your Studio desktop environment&lt;/li&gt;
	&lt;li&gt;Subversion source control.&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;As Ajax developers, the vision of Jaxer in the cloud is very interesting too. The entire application using JavaScript, and deployed up into the cloud, all through the nice IDE.&lt;/p&gt;
	&lt;p&gt;I was also pleased to read that not only Ruby on Rails, but Python is on the docket. After developing Django applications and playing with Google App Engine, I would love to be able to use Studio for Python code too. Not that &lt;a href="http://steve-yegge.blogspot.com/2008/04/xemacs-is-dead-long-live-xemacs.html"&gt;Emacs (X or GNU) isn&amp;#8217;t great, Steve!&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;Darryl Taft wrote:&lt;/p&gt;
	&lt;blockquote&gt;&lt;p&gt;
Aptana adds extra value via IDE integration, deployment automation and active monitoring and notification services, Hakman said. “It&amp;#8217;s like the ease and simplicity between iTunes on your desktop and its connectivity to services on the Web,” he said.&lt;/p&gt;
	&lt;p&gt;For developers, the IDE plug-in integrates cloud development, deployment and management lifecycles right into Aptana Studio in either its standalone or Eclipse-based editions, Hakman said. &amp;#8220;The ability to deploy stuff to the cloud from Eclipse is part of this as well.&amp;#8221;&lt;/p&gt;
	&lt;p&gt;Other developer features include instant deployment of projects to the cloud; one click can sync your project to the cloud or provide fine-grained sync control; the technology features integrated cloud services management, enables users to provision their cloud right from Aptana Studio, configure desired memory size and disk size, develop and instantly preview remote files right inside the Studio desktop environment, and includes Subversion Source Control.
&lt;/p&gt;&lt;/blockquote&gt;
	&lt;p&gt;Can&amp;#8217;t wait go get an invite. If you want one too, &lt;a href="http://survey.constantcontact.com/survey/a07e2abgqrhffkgzt7x/start"&gt;request an account&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;Also, Aptana Studio just passed 1,5 million downloads. Impressive.
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=pogDCG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=pogDCG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=anCK2G"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=anCK2G" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=pPGsIg"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=pPGsIg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 28 Apr 2008 19:41:13 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/aptana-cloud-develop-on-your-desktop-sync-out-to-the-cloud</guid><comments>http://ajaxian.com/archives/aptana-cloud-develop-on-your-desktop-sync-out-to-the-cloud#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>4828756286</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Ajax Accessibility</title><link>http://ejohn.org/blog/ajax-accessibility/</link><description>	&lt;p&gt;A common concern of most Ajax applications has been around their resulting accessibility. While, arguably, it's possible to design some form of a usable web page without the use of JavaScript it should be possible - with the additional scripting information - to provide a better experience to users. It's at this point that the &lt;a href="http://www.w3.org/TR/wai-aria/"&gt;ARIA&lt;/a&gt; specification comes into play. A large set of interaction is defined within it which is able to help web applications communicate directly to a screen reader in an effective manner.&lt;/p&gt;
	&lt;p&gt;To get a feel for what this interaction looks like, take the example of &lt;a href="http://www.w3.org/TR/wai-aria/#liveregions"&gt;ARIA Live Regions&lt;/a&gt; (&lt;a href="http://developer.mozilla.org/en/docs/AJAX:WAI_ARIA_Live_Regions"&gt;more info&lt;/a&gt;). With this functionality it would be possible to keep a live-updated list of users and allow the screen reader to keep up-to-date.&lt;/p&gt;
	&lt;p&gt;Observe the following ARIA-marked-up HTML:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="html-1"&gt;
	&lt;div&gt;&lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/b.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Active Users:&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;p&lt;/span&gt;&lt;/a&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;"users-desc"&lt;/span&gt;&lt;a href="http://december.com/html/4/element/.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;A list of the currently-connected users.&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/ol.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;ol&lt;/span&gt;&lt;/a&gt; aria-live=&lt;span style="color: #ff0000;"&gt;"polite"&lt;/span&gt; aria-relevant=&lt;span style="color: #ff0000;"&gt;"additions removals"&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; aria-describedby=&lt;span style="color: #ff0000;"&gt;"users-desc"&lt;/span&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;"users"&lt;/span&gt;&lt;a href="http://december.com/html/4/element/.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/li.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;John&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/li.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Mary&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/li.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Ted&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/li.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Jane&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;A couple settings are used to make this piece of HTML particularly interactive to the screen reader (the actual JavaScript that will update this list is left out - but needless to say nothing, in particular, is needed beyond simple DOM insertion and removal).&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://developer.mozilla.org/en/docs/AJAX:WAI_ARIA_Live_Regions#aria-live.3DPOLITENESS_SETTING"&gt;aria-live="polite"&lt;/a&gt; How polite the live area is (as in, how likely is it to butt in to what the user is currently listening to/interacting with). The default is 'polite' - in that it waits until all forms of user interaction have been completed before describing the updates to the user.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://developer.mozilla.org/en/docs/AJAX:WAI_ARIA_Live_Regions#aria-relevant.3D.5BLIST_OF_CHANGES.5D"&gt;aria-relevant="additions removals"&lt;/a&gt; Only notify the user about new node additions and removals. Since we wish to provide the user with a live list of users we can expect them to be both transitioning online and offline - this will give us the appropriate level of updates to make this possible.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://developer.mozilla.org/en/docs/AJAX:WAI_ARIA_Live_Regions#aria-describedby.3D.5BIDLIST.5D"&gt;aria-describedby="users-desc"&lt;/a&gt; A pointer to the element that describes the contents of the live area. If the user&lt;br /&gt;
wishes to know more about what the contents of the field represent this element can be read to them.&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;What's most important about all of this, though, is that ARIA isn't just a pipe dream of functionality: It's implemented, today, in Firefox 2 and even more-so in the upcoming Firefox 3.&lt;/p&gt;
	&lt;p&gt;The &lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt; team &lt;a href="http://googlereader.blogspot.com/2008/03/reader-and-aria-new-way-to-read.html"&gt;recently took advantage of this&lt;/a&gt; and added full ARIA support to their application. It's safe to say that Google Reader is not a trivial application by any stretch, allowing this to demonstrate the feasibility of ARIA within large-scale web application projects.&lt;/p&gt;
	&lt;p&gt;In the course of their implementation they built a tool, &lt;a href="http://code.google.com/p/google-axsjax/"&gt;AxsJAX&lt;/a&gt;, which injects ARIA usability enhancements into many pages using a bookmarklet, greasemonkey, or &lt;a href="http://firevox.clcworld.net/"&gt;Fire Vox&lt;/a&gt; (a Firefox screenreader). They started by seeding a &lt;a href="http://code.google.com/p/google-axsjax/wiki/Showcase"&gt;number of Google applications&lt;/a&gt; with this drop-in accessibility support (along with a few others, including the &lt;a href="http://xkcd.com/"&gt;XKCD&lt;/a&gt; web comic).&lt;/p&gt;
	&lt;p&gt;I continue to be impressed with what can be accomplished with ARIA - and seeing the work that Google has been putting forth by implementing this functionality in their applications has been incredibly enlightening and encouraging.
&lt;/p&gt;
		&lt;img src="http://ejohn.org/apps/rss/?from=rss&amp;id=5583" style="width:0px;height:0px;"/&gt;&lt;img src="http://feeds.feedburner.com/~r/JohnResig/~4/279864523" height="1" width="1"/&gt;</description><pubDate>Tue, 29 Apr 2008 00:35:35 GMT</pubDate><guid isPermaLink="false">http://ejohn.org/blog/ajax-accessibility/</guid><comments>http://ejohn.org/blog/ajax-accessibility/#comments</comments><author>John Resig</author><source url="http://feeds.feedburner.com/JohnResig">John Resig</source><ng:postId>4831412569</ng:postId><ng:feedId>147422</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>One-line batch script to delete empty directories</title><link>http://blogs.msdn.com/oldnewthing/archive/2008/04/17/8399914.aspx</link><description>&lt;P&gt;
&lt;A HREF="http://www.lockergnome.com/nexus/windows/2007/02/20/empty-folder-nuker-v120/"&gt;
You don't need a whole 260KB program to do it&lt;/A&gt;.
This batch file does the trick just fine:
&lt;/P&gt;
&lt;PRE&gt;
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"
&lt;/PRE&gt;
&lt;P&gt;
I call it &lt;CODE&gt;rdempty.cmd&lt;/CODE&gt;.
&lt;/P&gt;
&lt;P&gt;
This is the long-forgotten follow-up to
&lt;A HREF="http://blogs.msdn.com/oldnewthing/archive/2007/05/11/2532913.aspx#2571579"&gt;
Performing an operation in each subdirectory of a directory tree
from batch&lt;/A&gt;.
We're using the same technique as in that article,
but pumping the result through "&lt;CODE&gt;| sort /R&lt;/CODE&gt;"
to reverse the order of the enumeration so we enumerate
the directories bottom-up rather than top-down.
This is important for deleting empty directories
because you have to remove the subdirectories before
you remove the parent.
&lt;/P&gt;
&lt;P&gt;
&lt;B&gt;Disclaimer&lt;/B&gt;:
I doubt anybody actually enjoys working with batch files,
but that doesn't mean that tips on using it more effectively
aren't valid.
If you would rather gouge your eyes out than use the confusing
command prompt batch language,
then you are more than welcome to use
the scripting language of your choice instead.
At no point in this article am I saying that this is the only way
or the best way to do it.
But it's definitely smaller than a 260KB program.
&lt;/P&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8399914" width="1" height="1"&gt;</description><pubDate>Thu, 17 Apr 2008 14:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8399914</guid><comments>http://blogs.msdn.com/oldnewthing/comments/8399914.aspx</comments><author>oldnewthing</author><source url="http://blogs.msdn.com/oldnewthing/rss.xml">The Old New Thing</source><ng:postId>4759162496</ng:postId><ng:feedId>3066</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Classy Query</title><link>http://ejohn.org/blog/classy-query/</link><description>	&lt;p&gt;Over the past two years, seeing hundreds of thousands of people use jQuery, a major point has become apparent: jQuery simply isn't able to scale to handle the development needs of most power users. It lacks the clarity and power functionality that most developers need in order build applications in a collaborative environment.&lt;/p&gt;
	&lt;p&gt;For this reason I've put a lot of work into a new library (which sits on top of jQuery), called:&lt;/p&gt;
	&lt;h1&gt;&lt;img src="http://ejohn.org/files/classy.jpg" style="margin:10px;height:60px;float:left;"/&gt; Classy Query&lt;/h1&gt;
	&lt;p&gt;&lt;b&gt;&lt;a href="http://ejohn.org/files/classy.js"&gt;&amp;raquo; View Source to Classy Query&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br style="clear:both;"/&gt;&lt;/p&gt;
	&lt;p&gt;If one thing has become apparent to me it's that users enjoy working with the typical Class-style of object creation and inheritance. Because of this I've constructed the entirety of Classy Query in an classical manner (you can inherit and override any piece of functionality that you desire).&lt;/p&gt;
	&lt;p&gt;Before we go too far, let's take a look at the type of clearly-defined code that you can now write with Classy Query:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-1"&gt;
	&lt;div&gt;&amp;lt;script src=&lt;span style="color: #3366CC;"&gt;"jquery.js"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&lt;span style="color: #3366CC;"&gt;"classy.js"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery.&lt;span style="color: #006600;"&gt;Events&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addEventListener&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;document, &lt;span style="color: #3366CC;"&gt;"ready"&lt;/span&gt;, &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; jQuery.&lt;span style="color: #006600;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"div"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;forEach&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; jQuery.&lt;span style="color: #006600;"&gt;DOM&lt;/span&gt;.&lt;span style="color: #006600;"&gt;append&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem, &lt;span style="color: #3366CC;"&gt;" &amp;lt;b&amp;gt;More...&amp;lt;/b&amp;gt;"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; jQuery.&lt;span style="color: #006600;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"div b"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;forEach&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; jQuery.&lt;span style="color: #006600;"&gt;Events&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addEventListener&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem, &lt;span style="color: #3366CC;"&gt;"click"&lt;/span&gt;, &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem, event&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; next = jQuery.&lt;span style="color: #006600;"&gt;Traversal&lt;/span&gt;.&lt;span style="color: #006600;"&gt;nextSibling&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; animation = jQuery.&lt;span style="color: #006600;"&gt;Effects&lt;/span&gt;.&lt;span style="color: #006600;"&gt;buildAnimation&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; next, &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;height: &lt;span style="color: #3366CC;"&gt;"toggle"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; amimation.&lt;span style="color: #006600;"&gt;start&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;You can even sub-class functionality, creating your own pieces of encapsulation. All of the class and inheritance functionality is taken care of by the &lt;a href="http://ejohn.org/blog/simple-javascript-inheritance/"&gt;Simple JavaScript Inheritance&lt;/a&gt; code released last week.&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-2"&gt;
	&lt;div&gt;jQuery.&lt;span style="color: #006600;"&gt;DOM&lt;/span&gt;.&lt;span style="color: #006600;"&gt;boldWrapInner&lt;/span&gt; = jQuery.&lt;span style="color: #006600;"&gt;DOM&lt;/span&gt;.&lt;span style="color: #006600;"&gt;wrapInner&lt;/span&gt;.&lt;span style="color: #006600;"&gt;extend&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; attach: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;._super&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem, &lt;span style="color: #3366CC;"&gt;"&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;jQuery.&lt;span style="color: #006600;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"div"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;forEach&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; jQuery.&lt;span style="color: #006600;"&gt;DOM&lt;/span&gt;.&lt;span style="color: #006600;"&gt;boldWrapInner&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;Additionally you can treat pieces of functionality as if they were attachable behaviors, like so:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-3"&gt;
	&lt;div&gt;jQuery.&lt;span style="color: #006600;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"div"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;attach&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; jQuery.&lt;span style="color: #006600;"&gt;DOM&lt;/span&gt;.&lt;span style="color: #006600;"&gt;boldWrapInner&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;There's a number of core features encompassed in Classy Query that really help to transform the traditional jQuery experience into something much more usable.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Class creation&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;The full &lt;a href="http://ejohn.org/blog/simple-javascript-inheritance/"&gt;Simple JavaScript Inheritance&lt;/a&gt; API is included in Classy Query, allowing you to extend and create JavaScript 'classes', like so:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-4"&gt;
	&lt;div&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; Person = jQuery.&lt;span style="color: #006600;"&gt;Class&lt;/span&gt;.&lt;span style="color: #006600;"&gt;create&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; init: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #006600;"&gt;name&lt;/span&gt; = &lt;span style="color: #000066;"&gt;name&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; ClassyDude = Person.&lt;span style="color: #006600;"&gt;extend&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; sipWine: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Has a beautiful bouquet."&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;Inheritance&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;It's possible to inherit from any existing piece of Classy Query functionality, supporting a true 'programming in the large' mindset. You can inherit from, or completely override, existing methods with ease (especially since they're all classes).&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-5"&gt;
	&lt;div&gt;jQuery.&lt;span style="color: #006600;"&gt;Effects&lt;/span&gt;.&lt;span style="color: #006600;"&gt;collapse&lt;/span&gt; = jQuery.&lt;span style="color: #006600;"&gt;Effects&lt;/span&gt;.&lt;span style="color: #006600;"&gt;buildAnimation&lt;/span&gt;.&lt;span style="color: #006600;"&gt;extend&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; attach: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;._super&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem, &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;height: &lt;span style="color: #3366CC;"&gt;"hide"&lt;/span&gt;, width: &lt;span style="color: #3366CC;"&gt;"hide"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;Behaviors&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;Behaviors tend to encapsulate a portion of functionality which is applied against an element (such as making a table sortable or making an item draggable). Classy Query supports a technique to make this particular implementation trivial.&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-6"&gt;
	&lt;div&gt;jQuery.&lt;span style="color: #006600;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"div"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; .&lt;span style="color: #006600;"&gt;attach&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; jQuery.&lt;span style="color: #006600;"&gt;DOM&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addClassName&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"current"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;No more 'this'&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;The 'this' keyword is confusing and frequently misused. To counter this all access to elements (within functions) is done by the first argument, rather than through 'this'.&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-7"&gt;
	&lt;div&gt;jQuery.&lt;span style="color: #006600;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"div"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;forEach&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; jQuery.&lt;span style="color: #006600;"&gt;DOM&lt;/span&gt;.&lt;span style="color: #006600;"&gt;addClassName&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem, &lt;span style="color: #3366CC;"&gt;"current"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;Re-Structuring&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;The hierarchy of jQuery has been completely re-organized. Rather than having a single, flat, interface through which to access all methods functionality has been broken down into individual groupings of methods. These groupings tend to, also, coordinate with the &lt;a href="http://docs.jquery.com/"&gt;jQuery Documentation&lt;/a&gt; for convenience.&lt;/p&gt;
	&lt;p&gt;Additionally, nearly all the method names have been re-named in order to provide a greater level of clarity to developers. Frequently it was found that the concise method names of jQuery provided too much confusion to developers just getting started with the library. The end result is a library that is easier to read and understand for developers.&lt;/p&gt;
	&lt;p&gt;The full list of categories and changed methods can be found in the following table:&lt;/p&gt;
	&lt;table&gt;
	&lt;tr&gt;
&lt;th&gt;jQuery&lt;/th&gt;
	&lt;th&gt;Classy Query&lt;/th&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;jQuery&lt;/td&gt;
	&lt;td&gt;jQuery.querySelectorAll&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;each&lt;/td&gt;
	&lt;td&gt;forEach&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;prepend&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.prepend&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;append&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.append&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;before&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.insertBefore&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;after&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.insertAfter&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;wrap&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.wrap&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;wrapInner&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.wrapInner&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;wrapAll&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.wrapAll&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;clone&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.clone&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;empty&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.empty&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;remove&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.remove&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;replaceWith&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.replaceWith&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;removeAttr&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.removeAttribute&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;addClass&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.addClassName&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;hasClass&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.hasClassName&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;removeClass&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.removeClassName&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;offset&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getOffset&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;text&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getText&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;text&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.setText&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;html&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getHTML&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;html&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.setHTML&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;attr&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getAttribute&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;attr&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.setAttribute&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;val&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getValue&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;val&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.setValue&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;height&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getHeight&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;height&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.setHeight&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;width&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getWidth&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;width&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.setWidth&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;css&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.getCSS&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;css&lt;/td&gt;
	&lt;td&gt;jQuery.DOM.setCSS&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;children&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getChildElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;find&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getDescendantElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;next&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getNextSiblingElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;nextAll&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getAllNextSiblingElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;parent&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getParentElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;parents&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getAncestorElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;prev&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getPreviousSiblingElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;prevAll&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getAllPreviousSiblingElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;siblings&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.getSiblingElements&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;filter&lt;/td&gt;
	&lt;td&gt;jQuery.Traverse.filterSelector&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;bind&lt;/td&gt;
	&lt;td&gt;jQuery.Events.addEventListener&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;unbind&lt;/td&gt;
	&lt;td&gt;jQuery.Events.removeEventListener&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;trigger&lt;/td&gt;
	&lt;td&gt;jQuery.Events.triggerEvent&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;hover&lt;/td&gt;
	&lt;td&gt;jQuery.Events.hover&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;toggle&lt;/td&gt;
	&lt;td&gt;jQuery.Events.toggle&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;show&lt;/td&gt;
	&lt;td&gt;jQuery.Effects.show&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;hide&lt;/td&gt;
	&lt;td&gt;jQuery.Effects.hide&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;toggle&lt;/td&gt;
	&lt;td&gt;jQuery.Effects.toggle&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;animate&lt;/td&gt;
	&lt;td&gt;jQuery.Effects.buildAnimation&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;queue&lt;/td&gt;
	&lt;td&gt;jQuery.Effects.queue&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;dequeue&lt;/td&gt;
	&lt;td&gt;jQuery.Effects.dequeue&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;$.ajax&lt;/td&gt;
	&lt;td&gt;jQuery.Ajax.request&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;load&lt;/td&gt;
	&lt;td&gt;jQuery.Ajax.loadAndInsert&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;ajaxSetup&lt;/td&gt;
	&lt;td&gt;jQuery.Ajax.setup&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;serialize&lt;/td&gt;
	&lt;td&gt;jQuery.Ajax.getSerializedString&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;td&gt;serializeArray&lt;/td&gt;
	&lt;td&gt;jQuery.Ajax.getSerializedArray&lt;/td&gt;
&lt;/tr&gt;
	&lt;/table&gt;
	&lt;p&gt;&lt;b&gt;querySelector and querySelectorAll&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;Finally, rather than having a generic, catch-all, method as jQuery selector functionality is deferred to the new querySelector and querySelectorAll methods. These methods only support pure CSS 1-3 selectors (nothing extra) in an attempt to avoid any unpleasant situations when a browser's native querySelectorAll is implemented.&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-8"&gt;
	&lt;div&gt;jQuery.&lt;span style="color: #006600;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"div"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;forEach&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;elem&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; jQuery.&lt;span style="color: #006600;"&gt;Effect&lt;/span&gt;.&lt;span style="color: #006600;"&gt;hide&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; elem &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;jQuery.&lt;span style="color: #006600;"&gt;Effect&lt;/span&gt;.&lt;span style="color: #006600;"&gt;hide&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; jQuery.&lt;span style="color: #006600;"&gt;querySelector&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"#item"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;hr/&gt;
	&lt;p&gt;&lt;b&gt;&lt;a href="http://ejohn.org/files/classy.js"&gt;&amp;raquo; View Source to Classy Query&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;I hope this particular library will be of use to the general jQuery-using population. I hope we can start to have an open dialog, moving forward, getting everyone to adopt a more standard approach to JavaScript development. There's no reason why we shouldn't be using this tried-and-true approach to application development. It's worked in an untold number of existing applications, it's bound to work here as well. Enjoy.
&lt;/p&gt;
		&lt;img src="http://ejohn.org/apps/rss/?from=rss&amp;id=5567" style="width:0px;height:0px;"/&gt;&lt;img src="http://feeds.feedburner.com/~r/JohnResig/~4/261823773" height="1" width="1"/&gt;</description><pubDate>Tue, 01 Apr 2008 03:26:18 GMT</pubDate><guid isPermaLink="false">http://ejohn.org/blog/classy-query/</guid><comments>http://ejohn.org/blog/classy-query/#comments</comments><author>John Resig</author><source url="http://feeds.feedburner.com/JohnResig">John Resig</source><ng:postId>4652941271</ng:postId><ng:feedId>147422</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>JavaScript running to the server</title><link>http://feeds.feedburner.com/~r/ajaxian/~3/132304056/javascript-running-to-the-server</link><description>	&lt;p&gt;JavaScript continues to get more talk on the server (yes, years after Netscape Enterprise Server!).&lt;/p&gt;
	&lt;p&gt;John Resig spent a weekend hacking in the zone, to &lt;a href="http://ejohn.org/blog/bringing-the-browser-to-the-server/"&gt;bring the browser to the server&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;This resulting environment allows you to do interesting things such as:&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Screen scraping&lt;/b&gt;&lt;/p&gt;
	&lt;div class="igBar"&gt;&lt;a href="javascript:showCodeTxt('javascript-3');"&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
	&lt;div class="syntax_hilite"&gt;&lt;span style="color:#000000; font-weight:bold;"&gt;JAVASCRIPT:&lt;/span&gt;&lt;br /&gt;
&lt;div id="javascript-3"&gt;
	&lt;div class="javascript"&gt;
&lt;ol&gt;
&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;load&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"env.js"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;window.&lt;span style="color: #006600;"&gt;location&lt;/span&gt; = &lt;span style="color: #3366CC;"&gt;"http://alistapart.com/"&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;window.&lt;span style="color: #006600;"&gt;onload&lt;/span&gt; = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;load&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"dist/jquery.js"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;print&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Newest A List Apart Posts:"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;$&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"h4.title"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;each&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #000066;"&gt;print&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;" - "&lt;/span&gt; + &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #006600;"&gt;textContent&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;b&gt;Web Framework&lt;/b&gt;&lt;/p&gt;
	&lt;div class="igBar"&gt;&lt;a href="javascript:showCodeTxt('javascript-4');"&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
	&lt;div class="syntax_hilite"&gt;&lt;span style="color:#000000; font-weight:bold;"&gt;JAVASCRIPT:&lt;/span&gt;&lt;br /&gt;
&lt;div id="javascript-4"&gt;
	&lt;div class="javascript"&gt;
&lt;ol&gt;
&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;window.&lt;span style="color: #006600;"&gt;onload&lt;/span&gt; = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &lt;span style="color: #000066;"&gt;print&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Content-type: text/html&lt;span style="color: #000099; font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; location.&lt;span style="color: #006600;"&gt;href&lt;/span&gt; == &lt;span style="color: #3366CC;"&gt;"/"&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;show_home&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &lt;span style="color: #000066;"&gt;print&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; document.&lt;span style="color: #006600;"&gt;innerHTML&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; show_home&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; document.&lt;span style="color: #006600;"&gt;load&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"index.html"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; document.&lt;span style="color: #006600;"&gt;getElementById&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"time"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;innerHTML&lt;/span&gt; = &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; Date&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;toString&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;Tom Insam and Ash Berlin also created &lt;a href="http://jerakeen.org/blog/2007/07/server-side-javascript-under-apache/"&gt;mod_js&lt;/a&gt;, which is a very simple JS embed. Others pointed out &lt;a href="http://www.wxjavascript.net/mod_wxjs/index.html"&gt;mod_wxjs&lt;/a&gt;, &lt;a href="http://www.haxe.org/"&gt;haxe&lt;/a&gt;, and the like.&lt;/p&gt;
	&lt;p&gt;The beat goes on.
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=NESxFdzW"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=NESxFdzW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=EmyDkLyu"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=EmyDkLyu" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=pejsA1qI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=pejsA1qI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 10 Jul 2007 14:24:33 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/javascript-running-to-the-server</guid><comments>http://ajaxian.com/archives/javascript-running-to-the-server#comments</comments><author>Dion Almaer</author><source url="http://ajaxian.com/archives/javascript-running-to-the-server">Ajaxian » Front Page</source><ng:postId>2980542087</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>A JavaScript Module Pattern</title><link>http://ajaxian.com/archives/a-javascript-module-pattern</link><description>	&lt;p&gt;Eric Miraglia, of Yahoo!, has documented his explanation of what Douglas Crockford calls the &lt;a href="http://yuiblog.com/blog/2007/06/12/module-pattern/"&gt;JavaScript Module pattern&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;Eric discusses the steps:&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;Create a namespace object: If you’re using YUI, you can use the YAHOO.namespace() method&lt;/li&gt;
	&lt;li&gt;Assign the return value of an anonymous function to your namespace object&lt;/li&gt;
	&lt;li&gt;Add “private” methods and variables in the anonymous function prior to the return statement&lt;/li&gt;
	&lt;li&gt;Do something useful with the pattern&lt;/li&gt;
	&lt;/ul&gt;
	&lt;div class="igBar"&gt;&lt;a href="javascript:showCodeTxt('javascript-4');"&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
	&lt;div class="syntax_hilite"&gt;&lt;span style="color:#000000; font-weight:bold;"&gt;JAVASCRIPT:&lt;/span&gt;&lt;br /&gt;
&lt;div id="javascript-4"&gt;
	&lt;div class="javascript"&gt;
&lt;ol&gt;
&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;YAHOO.&lt;span style="color: #006600;"&gt;myProject&lt;/span&gt;.&lt;span style="color: #006600;"&gt;myModule&lt;/span&gt; = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;//&amp;quot;private&amp;quot; variables:&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; myPrivateVar = &lt;span style="color: #3366CC;"&gt;"I can be accessed only from within YAHOO.myProject.myModule."&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;//&amp;quot;private&amp;quot; method:&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; myPrivateMethod = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; YAHOO.&lt;span style="color: #006600;"&gt;log&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"I can be accessed only from within YAHOO.myProject.myModule"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt;&amp;nbsp; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; myPublicProperty: &lt;span style="color: #3366CC;"&gt;"I'm accessible as YAHOO.myProject.myModule.myPublicProperty."&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; myPublicMethod: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; YAHOO.&lt;span style="color: #006600;"&gt;log&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"I'm accessible as YAHOO.myProject.myModule.myPublicMethod."&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;//Within myProject, I can access &amp;quot;private&amp;quot; vars and methods:&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; YAHOO.&lt;span style="color: #006600;"&gt;log&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;myPrivateVar&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; YAHOO.&lt;span style="color: #006600;"&gt;log&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;myPrivateMethod&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;//The native scope of myPublicMethod is myProject; we can&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;//access public members using &amp;quot;this&amp;quot;:&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; YAHOO.&lt;span style="color: #006600;"&gt;log&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #006600;"&gt;myPublicProperty&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #009900; font-style: italic;"&gt;// the parens here cause the anonymous function to execute and return&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;Note that this technique is very generic, and you can do the same thing with other frameworks, or without any frameworks!
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=V5XoCDXh"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=V5XoCDXh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=CWzTD7Ty"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=CWzTD7Ty" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=31w5qqlX"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=31w5qqlX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=cdX9SbVd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=cdX9SbVd" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 13 Jun 2007 11:01:07 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/a-javascript-module-pattern</guid><comments>http://ajaxian.com/archives/a-javascript-module-pattern#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>2781624771</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Javascript LRU Cache</title><link>http://ajaxian.com/archives/javascript-lru-cache</link><description>	&lt;p&gt;Monsur Hossain has created a simple &lt;a href="http://www.monsur.com/projects/jscache/"&gt;Javascript LRU Cache&lt;/a&gt;:&lt;/p&gt;
	&lt;blockquote&gt;&lt;p&gt;
It is loosely based on ASP.NET's Cache, and includes many caching options such as absolute expiration, sliding expiration, cache priority, and a callback function. It can be used to cache data locally in the user's browser, saving a server roundtrip in AJAX heavy applications.
&lt;/p&gt;&lt;/blockquote&gt;
	&lt;p&gt;&lt;b&gt;Usage&lt;/b&gt;&lt;/p&gt;
	&lt;div class="igBar"&gt;&lt;a href="javascript:showCodeTxt('javascript-10');"&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
	&lt;div class="syntax_hilite"&gt;&lt;span style="color:#000000; font-weight:bold;"&gt;JAVASCRIPT:&lt;/span&gt;&lt;br /&gt;
&lt;div id="javascript-10"&gt;
	&lt;div class="javascript"&gt;
&lt;ol&gt;
&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; cache = &lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; Cache&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;cache.&lt;span style="color: #006600;"&gt;setItem&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"A"&lt;/span&gt;, &lt;span style="color: #3366CC;"&gt;"1"&lt;/span&gt;, &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;expirationAbsolute: &lt;span style="color: #003366; font-weight: bold;"&gt;null&lt;/span&gt;,&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; expirationSliding: &lt;span style="color:#800000;"&gt;60&lt;/span&gt;,&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; priority: CachePriority.&lt;span style="color: #006600;"&gt;High&lt;/span&gt;,&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback: &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;k, v&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color: #000066;"&gt;alert&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'removed '&lt;/span&gt; + k&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;cache.&lt;span style="color: #006600;"&gt;getItem&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"A"&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;cache.&lt;span style="color: #006600;"&gt;clear&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#006600; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=JLoOMkpc"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=JLoOMkpc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=O1eS2jC8"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=O1eS2jC8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=sY5VxRzn"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=sY5VxRzn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=l9fIZ8kl"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=l9fIZ8kl" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 30 May 2007 12:49:11 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/javascript-lru-cache</guid><comments>http://ajaxian.com/archives/javascript-lru-cache#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>2685008201</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Implementing a syntax-higlighting JavaScript editor in JavaScript</title><link>http://ajaxian.com/archives/implementing-a-syntax-higlighting-javascript-editor-in-javascript</link><description>	&lt;p&gt;Marijn Haverbeke has not only been able to &lt;a href="http://marijn.haverbeke.nl/highlight/index.html"&gt;create&lt;/a&gt; a syntax-highlighting JavaScript editor in JavaScript, but he has written up &lt;a href="http://marijn.haverbeke.nl/highlight/story.html"&gt;the story of the brutal odyssey to the dark side of the DOM tree&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;The story is a great romp through the never-never-land of JavaScript, DOM, and browser "quirks". It is well worth a read to find out about fun with selection, designMode, parsing, and much much more.&lt;/p&gt;
	&lt;p&gt;A huge kudos to Marijn.&lt;/p&gt;
	&lt;p&gt;&lt;a href="http://marijn.haverbeke.nl/highlight/index.html"&gt;&lt;img src="http://ajaxian.com/wp-content/images/jssyntaxeditor.png" alt="JS Syntax Editor" border="0" width="535" height="370"/&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;(via &lt;a href="http://dean.edwards.name/"&gt;Dean&lt;/a&gt;)
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=xCMMMGS9"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=xCMMMGS9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=GU1mAcRy"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=GU1mAcRy" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=3UXKmi25"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=3UXKmi25" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=mfyYyeH7"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=mfyYyeH7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Fri, 25 May 2007 17:40:30 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/implementing-a-syntax-higlighting-javascript-editor-in-javascript</guid><comments>http://ajaxian.com/archives/implementing-a-syntax-higlighting-javascript-editor-in-javascript#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>2655102181</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Dtrace Firefox to get inside the black box</title><link>http://ajaxian.com/archives/dtrace-firefox-to-get-inside-the-black-box</link><description>	&lt;p&gt;John Rice gave a presentation at JavaOne on &lt;a href="http://blogs.sun.com/jmr/entry/adding_dtrace_probes_to_mozilla"&gt;using Dtrace to instrument Firefox&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;The JavaScript VM has long been a black box. We long for monitoring tools that give us access to the runtime as we are used to on the JVM or CLR. We may get there with Silverlight in the future.&lt;/p&gt;
	&lt;p&gt;Adding Dtrace to Mozilla &lt;a href="http://blogs.sun.com/brendan/entry/dtrace_meets_javascript"&gt;is far from new&lt;/a&gt;, and although it isn't an easy tweak, enables you to look deep into the innards of the JavaScript engine.&lt;/p&gt;
	&lt;blockquote&gt;&lt;p&gt;
___ OVERLAP TIMES: ___                                     ______ ELAPSED _____&lt;br /&gt;
FILE                     FUNCTION                 COUNT    AVG(us)      SUM(us)&lt;br /&gt;
clock.html               getSeconds                  12          8          104&lt;br /&gt;
clock.html               padZero                     36          7          275&lt;br /&gt;
clock.html               getMinutes                  12         45          548&lt;br /&gt;
clock.html               getElementById              12         53          640&lt;br /&gt;
clock.html               getHours                    12         59          714&lt;br /&gt;
clock.html               setTimeout                  12         67          807&lt;br /&gt;
clock.html               startTime                   12       1219        14637
&lt;/p&gt;&lt;/blockquote&gt;

&lt;div class="feedflare"&gt;&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=Ex067i8b"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=Ex067i8b" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=NCvVUGIG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=NCvVUGIG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=Pf2t9CjU"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=Pf2t9CjU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=ZnaZVp8i"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=ZnaZVp8i" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;</description><pubDate>Tue, 15 May 2007 13:26:25 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/dtrace-firefox-to-get-inside-the-black-box</guid><comments>http://ajaxian.com/archives/dtrace-firefox-to-get-inside-the-black-box#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>2585467857</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>jscsscomp: JavaScript and CSS files compressor</title><link>http://ajaxian.com/archives/jscsscomp-javascript-and-css-files-compressor</link><description>	&lt;p&gt;We love to play with the plumbing don't we. &lt;a href="http://code.google.com/p/jscsscomp/"&gt;jscsscomp&lt;/a&gt; is the latest compressor that uses &lt;a href="http://joliclic.free.fr/php/javascript-packer/en/" rel="nofollow"&gt;Nicolas Martin PHP version&lt;/a&gt; of the &lt;a href="http://dean.edwards.name/packer/" rel="nofollow"&gt;Dean Edwards JavaScript Compressor&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;With a swish of mod_rewrite:&lt;/p&gt;
	&lt;blockquote&gt;&lt;p&gt;
RewriteEngine on&lt;/p&gt;
	&lt;p&gt;RewriteCond %{REQUEST_FILENAME} -f&lt;br /&gt;
RewriteRule ^(.*\.)(js|css)$ jscsscomp/jscsscomp.php?q=$1$2 [L,NC]
&lt;/p&gt;&lt;/blockquote&gt;
	&lt;p&gt;you can get your JavaScript like this:&lt;/p&gt;
	&lt;div class="igBar"&gt;&lt;a href="javascript:showCodeTxt('html-2');"&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
	&lt;div class="syntax_hilite"&gt;&lt;span style="color:#000000; font-weight:bold;"&gt;HTML:&lt;/span&gt;&lt;br /&gt;
&lt;div id="html-2"&gt;
	&lt;div class="html"&gt;
&lt;ol&gt;
&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/script.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;script&lt;/span&gt;&lt;/a&gt; &lt;span style="color: #000066;"&gt;src&lt;/span&gt; = &lt;span style="color: #ff0000;"&gt;"/jscsscomp/yahoo.js, dom.js, event.js, effects/dragdrop.js, slider.js"&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;

&lt;div class="feedflare"&gt;&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=zAazWlIF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=zAazWlIF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=MGWsWDNL"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=MGWsWDNL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=gjWRYu2z"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=gjWRYu2z" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=93KxMB1q"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=93KxMB1q" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;</description><pubDate>Thu, 26 Apr 2007 12:58:54 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/jscsscomp-javascript-and-css-files-compressor</guid><comments>http://ajaxian.com/archives/jscsscomp-javascript-and-css-files-compressor#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>2479081181</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Digital Web Magazine - Seven JavaScript Techniques You Should Be Using Today</title><link>http://www.digital-web.com/articles/seven_javascript_techniques/</link><description>    &lt;p&gt;&lt;a href="http://www.digital-web.com/articles/seven_javascript_techniques/"&gt;&lt;img src="http://images.del.icio.us/static/img/thumbnails/7/0/1/ddc446b296846c72bd993c2ec89a7.png" width="90" height="68" /&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;span&gt;
        &lt;a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.digital-web.com%2Farticles%2Fseven_javascript_techniques%2F&amp;amp;title=Digital%20Web%20Magazine%20-%20Seven%20JavaScript%20Techniques%20You%20Should%20Be%20Using%20Today&amp;amp;copyuser=gleddy&amp;amp;copytags=javascript%2Bprogramming%2Btips%2Bdevelopment%2Bscripting&amp;amp;jump=yes&amp;amp;partner=delrss&amp;amp;src=feed_newsgator" rel="nofollow" title="add this bookmark to your collection at del.icio.us"&gt;&lt;img src="http://images.del.icio.us/static/img/delicious.small.gif" alt="del.icio.us" width="10" height="10" border="0" /&gt;&amp;nbsp;bookmark&amp;nbsp;this&amp;nbsp;on&amp;nbsp;del.icio.us&lt;/a&gt;
        -
        first posted 
        by &lt;a title="visit gleddy's bookmarks at del.icio.us" href="http://del.icio.us/gleddy"&gt;gleddy&lt;/a&gt;
        to
            &lt;a rel="tag" title="view all bookmarks tagged 'javascript' at del.icio.us" href="http://del.icio.us/tag/javascript"&gt;javascript&lt;/a&gt;
            &lt;a rel="tag" title="view all bookmarks tagged 'programming' at del.icio.us" href="http://del.icio.us/tag/programming"&gt;programming&lt;/a&gt;
            &lt;a rel="tag" title="view all bookmarks tagged 'tips' at del.icio.us" href="http://del.icio.us/tag/tips"&gt;tips&lt;/a&gt;
            &lt;a rel="tag" title="view all bookmarks tagged 'development' at del.icio.us" href="http://del.icio.us/tag/development"&gt;development&lt;/a&gt;
            &lt;a rel="tag" title="view all bookmarks tagged 'scripting' at del.icio.us" href="http://del.icio.us/tag/scripting"&gt;scripting&lt;/a&gt;
            - &lt;a rel="self" title="view more details on this bookmark at del.icio.us" href="http://del.icio.us/url/680d3ed9179d8cb32b042a008cd0abd0"&gt;more&amp;nbsp;about&amp;nbsp;this&amp;nbsp;bookmark...&lt;/a&gt;
    &lt;/span&gt;
</description><pubDate>Tue, 24 Apr 2007 11:30:00 GMT</pubDate><guid isPermaLink="false">http://www.digital-web.com/articles/seven_javascript_techniques/</guid><author>gleddy</author><source url="http://feeds.delicious.com/v2/rss/">Delicious hotlist</source><ng:postId>2465934839</ng:postId><ng:feedId>6168</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>JSLT: A JavaScript alternative to XSLT</title><link>http://ajaxian.com/archives/jslt-a-javascript-alternative-to-xslt</link><description>	&lt;p&gt;Rik Arends has created &lt;a href="http://www.rikarends.com/jslt-alternative-to-xslt"&gt;JSLT&lt;/a&gt;, a pure JavaScript replacement for XSLT.&lt;/p&gt;
	&lt;blockquote&gt;&lt;p&gt;
JSLT is a browser based templating language like XSLT, but instead of&lt;br /&gt;
using XML to encode the template logic, it uses normal Javascript with a&lt;br /&gt;
few extensions. You can transform XML with it or just template with&lt;br /&gt;
javascript variables. The JSLT processor parses the template using&lt;br /&gt;
a recursive tokenizing parser and generates javascript code for fast&lt;br /&gt;
dynamic (re-)execution. The general structure is:&lt;br /&gt;
template[js]template{inline-xpath}[js]template. All code is available&lt;br /&gt;
under the LGPL license.
&lt;/p&gt;&lt;/blockquote&gt;
	&lt;p&gt;You can visit a &lt;a href="http://www.rikarends.com/source/jslt_example.html"&gt;real-time example page&lt;/a&gt; that recompiles on each keystroke.&lt;/p&gt;
	&lt;p&gt;If you almost liked XSLT, and like JavaScript, maybe JSLT is for you.&lt;/p&gt;
	&lt;p&gt;&lt;img src="http://www.rikarends.com/media/jslt_compare.gif" border="0" /&gt;
&lt;/p&gt;

&lt;div class="feedflare"&gt;&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=7IWuidHL"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=7IWuidHL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=6SzUFYnz"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=6SzUFYnz" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=zPbkICZF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=zPbkICZF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=VdARu7F4"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=VdARu7F4" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;</description><pubDate>Wed, 11 Apr 2007 11:34:48 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/jslt-a-javascript-alternative-to-xslt</guid><comments>http://ajaxian.com/archives/jslt-a-javascript-alternative-to-xslt#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>2393819462</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>ZParse: Self-definable Javascript Templating</title><link>http://ajaxian.com/archives/zparse-self-definable-javascript-templating</link><description>	&lt;p&gt;&lt;a href="http://ballz.ababa.net/raid_ox/"&gt;ZParse&lt;/a&gt; is a multi-purpose, extensible, self-defineable Javascript template parsing system created by Rizqi Ahmad.&lt;/p&gt;
	&lt;p&gt;What does this mean? ZParse lets you define your templating rules. It acts like a preprocessor that parse strings that contain defined delimiters and tags and parse it to a javascript function. It is similar to TrimPath JavaScript Template, but differs in that instead of defining the syntax inside the script it allows you to create and define the syntax yourself as you need.&lt;/p&gt;
	&lt;div class="igBar"&gt;&lt;a href="javascript:showCodeTxt('html-2');"&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
	&lt;div class="syntax_hilite"&gt;&lt;span style="color:#000000; font-weight:bold;"&gt;HTML:&lt;/span&gt;&lt;br /&gt;
&lt;div id="html-2"&gt;
	&lt;div class="html"&gt;
&lt;ol&gt;
&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #009900;"&gt;&amp;lt;% var &lt;span style="color: #000066;"&gt;name&lt;/span&gt; = &lt;span style="color: #ff0000;"&gt;"Solid Snake"&lt;/span&gt;, address = &lt;span style="color: #ff0000;"&gt;"somewhere"&lt;/span&gt;; %&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;div&lt;/span&gt;&lt;/a&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;"card"&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;/a&gt;:if &lt;span style="color: #000066;"&gt;name&lt;/span&gt; &amp;amp;&amp;amp; address:&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;name: ${name} &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;address: ${address} &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;/a&gt;:/if:&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;/a&gt;:elseif &lt;span style="color: #000066;"&gt;name&lt;/span&gt;:&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;a href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;name: ${name} &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;/a&gt;:/elseif:&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;/a&gt;:else:&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; no card loaded.&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;/a&gt;:/else:&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-weight: bold;color:#26536A;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
	&lt;li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"&gt;
&lt;div style="color:#000000; font-family: 'Courier New', Courier, monospace; font-weight: normal;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;If you wish you had yacc or bison in your next project, give it a whirl!
&lt;/p&gt;

&lt;div class="feedflare"&gt;&lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=G6kgcDTO"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=G6kgcDTO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=Up5UmODK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=Up5UmODK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=Ojfl0Kil"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=Ojfl0Kil" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ajaxian?a=WO68Yige"&gt;&lt;img src="http://feeds.feedburner.com/~f/ajaxian?i=WO68Yige" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;</description><pubDate>Mon, 09 Apr 2007 10:40:46 GMT</pubDate><guid isPermaLink="false">http://ajaxian.com/archives/zparse-self-definable-javascript-templating</guid><comments>http://ajaxian.com/archives/zparse-self-definable-javascript-templating#comments</comments><author>Dion Almaer</author><source url="http://feeds.feedburner.com/ajaxian">Ajaxian » Front Page</source><ng:postId>2382006496</ng:postId><ng:feedId>110133</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Operating System Configuration Setting for SQL Server 2005</title><link>http://GlennBerrySQLPerformance.spaces.live.com/Blog/cns!45041418ECCAA960!326.entry</link><description>&lt;div&gt;&lt;p&gt;One operating system level configuration setting that most DBAs and SysAdmins overlook is the Server Optimization tab under File and Printer Sharing for Microsoft Networks Properties (shown below).&lt;/p&gt; &lt;p&gt;SQL Server 2005 needs high network throughput with minimal memory devoted to file caching so that more memory is available to SQL Server 2005. The default setting when you install Windows Server 2003 Standard or above is &amp;quot;Maximize data throughput for file sharing&amp;quot;. For both SQL Server 2005 and for &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e465827e-a822-4c64-b04a-5fcfbcbcbf4f.mspx?mfr=true"&gt;IIS 6.0&lt;/a&gt; (a database server and web server, respectively), you should change this to &amp;quot;&lt;a href="http://technet2.microsoft.com/WindowsServer/en/library/efa621bd-a031-4461-9e72-59197a7507b61033.mspx?mfr=true"&gt;Maximize data throughput for network applications&lt;/a&gt;&amp;quot; (like you see below). &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://tk3.storage.msn.com/x1pb4lnKEHD-4DOPfaqQaoP6ynhpH4zUq5GQX3oHTjfB-fizJ5VZQT6tt0Zs3y_-M28KNTJaJy45URWYHC1PT0joaDwjIcaTMYIs9BrQU75QWFoW2oC_WSm7zqLTtnc3VAVpa1IsozgaBTBnjd5fgv-kg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=480 src="http://tk3.storage.msn.com/x1pb4lnKEHD-4DOPfaqQaoP6ynhpH4zUq5GQX3oHTjfB-cDOZXs6nOJ6q4nQMokuL_sd-MTEsBOZ6ED5XzgXv2GETjY9tMWQV-tl5HCbbPzqz1b3WCNfFKVzMt1KsWEziltKdSWTou0fgc8RY1PtY5lKw" width=432 border=0&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Technorati Tag: &lt;a href="http://technorati.com/tag/sqlserver"&gt;SQL Server&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?space=glennberrysqlperformance&amp;page=RSS%3a+Operating+System+Configuration+Setting+for+SQL+Server+2005&amp;referrer=" width=1 height=1 border=0 alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=88469&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=glennberrysqlperformance.spaces.live.com&amp;amp;GT1=GlennBerrySQLPerformance%3b1033"&gt;</description><pubDate>Thu, 04 Jan 2007 16:23:53 GMT</pubDate><guid isPermaLink="false">http://GlennBerrySQLPerformance.spaces.live.com/Blog/cns!45041418ECCAA960!326.entry</guid><comments>http://GlennBerrySQLPerformance.spaces.live.com/Blog/cns!45041418ECCAA960!326.entry#comment</comments><source url="http://cid-45041418eccaa960.users.api.live.net/Users(4973121985808345440)/Main?$format=rss20">Glenn Berry's SQL Server Performance</source><ng:postId>1898556408</ng:postId><ng:feedId>859096</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>It's Never Been Built Before</title><link>http://www.codinghorror.com/blog/archives/000727.html</link><description>&lt;p&gt;
In &lt;a href="http://www.codinghorror.com/blog/archives/000725.html"&gt;Microsoft Project and the Gantt Waterfall&lt;/a&gt;, many commenters wondered &lt;b&gt;why software projects can't be treated like any other construction or engineering project&lt;/b&gt;:
&lt;p&gt;
&lt;blockquote&gt;
I am not sure why it is so difficult to estimate software development? Is it a mystery, magic, is there a man behind the curtain that every project depends on?
&lt;p&gt;
I mean it's simple, come on! It's like a designer and general contractor coming over and estimating how long it will take to remodel your kitchen. 
&lt;/blockquote&gt;
&lt;p&gt;
But software projects truly aren't like other engineering projects. I don't say this out of a sense of entitlement, or out of some misguided attempt to obtain special treatment for software developers. I say it because &lt;b&gt;the only kind of software we ever build is unproven, experimental software.&lt;/b&gt; Sam Guckenheimer &lt;a href="http://www.awprofessional.com/articles/article.asp?p=468589&amp;rl=1"&gt;explains&lt;/a&gt;:
&lt;p&gt;
&lt;blockquote&gt;
To overcome the gap, you must recognize that &lt;b&gt;software engineering is not like other engineering.&lt;/b&gt; When you build a bridge, road, or house, for example, you can safely study hundreds of very similar examples. Indeed, most of the time, economics dictate that you build the current one almost exactly like the last to take the risk out of the project.
&lt;p&gt;
With software, if someone has built a system just like you need, or close to what you need, then chances are you can license it commercially (or even find it as freeware). No sane business is going to spend money on building software that it can buy more economically. With thousands of software products available for commercial license, it is almost always cheaper to buy. Because the decision to build software must be based on sound return on investment and risk analysis, the software projects that get built will almost invariably be those that are not available commercially. 
&lt;p&gt;
This business context has a profound effect on the nature of software projects. It means that software projects that are easy and low risk, because theyve been done before, dont get funded. &lt;b&gt;The only new software development projects undertaken are those that havent been done before or those whose predecessors are not publicly available. This business reality, more than any other factor, is what makes software development so hard and risky, which makes attention to process so important.&lt;/b&gt;
&lt;/blockquote&gt;
&lt;p&gt;
One kitchen remodelling project is much like another, and the next airplane you build will be nearly identical to the last five airplanes you built. Sure, there are some variables, some tweaks to the process over time, but it's a glorified &lt;a href="http://www.codinghorror.com/blog/archives/000695.html"&gt;factory assembly line&lt;/a&gt;. In software development, if you're repeating the same project over and over, you won't have a job for very long. At least not on this continent. If all you need is a stock airplane, &lt;i&gt;you buy one&lt;/i&gt;. &lt;b&gt;We're paid to build high-risk, experimental airplanes.&lt;/b&gt;
&lt;p&gt;
&lt;a href="http://www.sprucegoose.org/aircraft_artifacts/exhibits.html"&gt;&lt;img alt="The Spruce Goose" src="http://www.codinghorror.com/blog/images/spruce-goose.jpg" width="450" height="269" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;
The appropriately named happy-go-lucky left this comment on &lt;a href="http://www.codinghorror.com/blog/archives/000725.html#comments"&gt;the same post&lt;/a&gt; which explains the distinction quite succinctly:
&lt;p&gt;
&lt;blockquote&gt;
The problem originates in the fact that "Software Project" shares the word "project" with "engineering project" or "construction project."
&lt;p&gt;
"Ah-ha!" our hapless software managers cry, as they roll-out the money for a copy of MS Project. And the software developers cry all the way 'til the end of the "project."
&lt;p&gt;
Software invention is just that. It has more in common with Mr. Edison's Menlo Park laboratory than the local hi-rise construction site. 
&lt;p&gt;
Of course, there are far fewer variables on a work site than in software invention. Gravity remains the same, elements don't change and concrete has known properties. Things aren't that stable when operating systems, hardware, software and business processes come together in "the perfect speculation."
&lt;/blockquote&gt;
&lt;p&gt;
In software engineering projects, you aren't subject to God's rules. &lt;a href="http://www.codinghorror.com/blog/archives/000298.html"&gt;You get to play God: define, build, and control an entire universe in a box&lt;/a&gt;. It's a process of invention and evolution, not an assembly line. Can software development be managed? Sure. But it's a mistake to try managing it the same way you'd manage a kitchen remodel.
&lt;p&gt;</description><pubDate>Fri, 17 Nov 2006 07:59:59 GMT</pubDate><guid isPermaLink="false">http://www.codinghorror.com/blog/archives/000727.html</guid><source url="http://feeds.feedburner.com/codinghorror/">Coding Horror</source><ng:postId>1681853910</ng:postId><ng:feedId>284135</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>The Last Responsible Moment</title><link>http://www.codinghorror.com/blog/archives/000705.html</link><description>&lt;p&gt;
In &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321150783/codinghorror-20"&gt;Lean Software Development: An Agile Toolkit&lt;/a&gt;, Mary and Tom Poppendieck describe a counter-intuitive technique for making better decisions:
&lt;p&gt;
&lt;blockquote&gt;
Concurrent software development means starting development when only partial requirements are known and developing in short iterations that provide the feedback that causes the system to emerge. Concurrent development makes it possible to &lt;b&gt;delay commitment until the last responsible moment, that is, the moment at which failing to make a decision eliminates an important alternative.&lt;/b&gt; If commitments are delayed beyond the last responsible moment, then decisions are made by default, which is generally not a good approach to making decisions.
&lt;/blockquote&gt;
&lt;p&gt;
Paradoxically, it's possible to make better decisions by &lt;i&gt;not deciding&lt;/i&gt;. I'm a world class procrastinator, so what's to stop me from reading this as carte blanche? Why do today what I can put off until tomorrow?
&lt;p&gt;
Making decisions at the Last Responsible Moment isn't procrastination; it's &lt;a href="http://www.codinghorror.com/blog/archives/000237.html"&gt;inspired laziness&lt;/a&gt;. It's a solid, fundamental risk avoidance strategy. &lt;b&gt;Decisions made too early in a project are hugely risky.&lt;/b&gt; Early decisions often result in work that has to be thrown away. Even worse, those early decisions can have crippling and unavoidable consequences for the entire future of the project.
&lt;p&gt;
Early in a project, you should make as few binding decisions as you can get away with. This doesn't mean you stop working, of course-- you adapt to the highly variable nature of software development. Often, &lt;a href="http://www.codinghorror.com/blog/archives/000373.html"&gt;having the guts to say "I don't know"&lt;/a&gt; is your best decision. Immediately followed by "..but we're working on it."
&lt;p&gt;
Jeremy Miller participated in a TDD panel with Mary Poppendieck last year, and he logically &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/01/18/136648.aspx"&gt;connects the dots&lt;/a&gt; between the Last Responsible Moment and &lt;a href="http://www.codinghorror.com/blog/archives/000111.html"&gt;YAGNI&lt;/a&gt;:
&lt;p&gt;
&lt;blockquote&gt;
&lt;b&gt;The key is to make decisions as late as you can responsibly wait because that is the point at which you have the most information on which to base the decision.&lt;/b&gt;  In software design it means you forgo creating generalized solutions or class structures until you know that theyre justified or necessary.  
&lt;/blockquote&gt;
&lt;p&gt;
I think there's a natural human tendency to build or buy things in anticipation of future needs, however unlikely. Isn't that the &lt;a href="http://www.scouting.org/"&gt;Boy Scout&lt;/a&gt; motto-- &lt;a href="http://www.scouting.org/factsheets/02-503a.html"&gt;Be Prepared?&lt;/a&gt;
&lt;p&gt;
&lt;img alt="Boy Scout Logo" src="http://www.codinghorror.com/blog/images/boyscoutlogo.gif" width="200" height="214" border="0" /&gt;
&lt;p&gt;
As a former Scout myself, I think we should resist our natural tendency to prepare too far in advance. My workshop is chock full of unused tools I thought I &lt;i&gt;might&lt;/i&gt; need. Why do I have this air compressor? When was the last time I used my wet/dry vac? Have I &lt;i&gt;ever&lt;/i&gt; used that metric socket set? It's a complete waste of money and garage space. Plus all the time I spent agonizing over the selection of these tools I don't use. I've adopted the Last Responsible Moment approach for my workshop. I force myself to only buy tools that I've used before, or tools that I have a very specific need for on a project I'm about to start. 
&lt;p&gt;
Be prepared. But for tomorrow, not next year. Deciding too late is dangerous, but deciding too early in the rapidly changing world of software development is arguably even &lt;i&gt;more&lt;/i&gt; dangerous. Let the principle of Last Responsible Moment be your guide. 
&lt;p&gt;</description><pubDate>Wed, 18 Oct 2006 07:59:59 GMT</pubDate><guid isPermaLink="false">http://www.codinghorror.com/blog/archives/000705.html</guid><source url="http://feeds.feedburner.com/codinghorror/">Coding Horror</source><ng:postId>1556837596</ng:postId><ng:feedId>284135</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>The True Cost of .NET Exceptions -- Solution</title><link>http://blogs.msdn.com/ricom/archive/2006/09/25/771142.aspx</link><description>&lt;p&gt;Well, once again my elite readers have made a solution posting by me nearly redundant.&amp;nbsp; There were many good viewpoints in response to &lt;a href="http://blogs.msdn.com/ricom/archive/2006/09/14/754661.aspx"&gt;my article&lt;/a&gt; including some especially excellent comments that were spot on.&lt;/p&gt; &lt;p&gt;Now there are several things worth saying, but I think perhaps the most important one, in my opinion, was hit on directly by Ian Griffiths and James Curran.&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Ian: "Presumably throwing an exception causes the CPU to fetch code and data it would otherwise not have executed..."&lt;/p&gt; &lt;p&gt;James: "I think what &lt;a href="http://yoda.arachsys.com/csharp/exceptions.html"&gt;Jon's article&lt;/a&gt; is overlooking is that his timing is done in isolation..."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And these&amp;nbsp;are crucial observations that I talked about in a &lt;a href="http://blogs.msdn.com/ricom/archive/2004/02/17/74659.aspx"&gt;previous article&lt;/a&gt; (see the section called "Fear the Interference" at the end).&amp;nbsp; In this particular case we're doing nothing but throwing exceptions.&amp;nbsp; So naturally all the code associated with the throw path is in the cache, all the data for resolving the locations of the catch blocks is in the cache, etc. etc.&amp;nbsp; Basically what we have here is much closer to a measurement of the &lt;em&gt;minimum&lt;/em&gt; an exception could possibly cost than a &lt;em&gt;typical&lt;/em&gt; cost.&amp;nbsp;&amp;nbsp; Fair enough, minimum cost is useful too, but it is sort of an understatement by definition.&lt;/p&gt; &lt;p&gt;I've mentioned some of the additional costs but let me make a list that's somewhat more complete.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;In a normal situation you can expect additional cache misses due to the thrown exception accessing resident data that is not normally in the cache&lt;/li&gt; &lt;li&gt;In a normal situation you can expect additional &lt;strong&gt;page faults &lt;/strong&gt;due to the thrown exception accessing &lt;strong&gt;non&lt;/strong&gt;-resident code and data, not normally in your workingset&lt;/li&gt; &lt;ul&gt; &lt;li&gt;noteably throwing the exception will require the CLR to find the location of the finally and catch blocks based on the current IP and the return IP of every frame until the exception is handled plus the filter block (if any, VB can have one)&lt;/li&gt; &lt;li&gt;additional construction cost and name resolution in order to create the frames for diagnostic purposes, including reading of metadata etc.&lt;/li&gt; &lt;li&gt;both of the above items typically access "cold" code and data hence hard page faults are probable if you have memory pressure at all&lt;/li&gt; &lt;ul&gt; &lt;li&gt;we try to put code and data that is used infrequently far from data that is used frequently to improve locality, this works against you if you force the cold to be hot.&lt;/li&gt; &lt;li&gt;the cost of the hard page faults, if any,&amp;nbsp;will dwarf everything else&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;li&gt;Typical catch situations are significantly deeper than the test case therefore the above effects would tend to be magnified (increasing the likelihood of page faults)&lt;/li&gt; &lt;li&gt;Finally blocks have to be run anyway so their cost isn't really "exceptional" however whatever code is in the filter blocks (if present) and catch block is subject to the same issues as the above&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Some people thought the ring transition cost was important, in my opinion it isn't especially and it is at least somewhat accounted for in the test as written (except to the same extent that everything else is cheaper because the whole test fits comfortably in L2).&amp;nbsp; I'm not sure there even is a ring transition for a thrown exception in fact, although some kernel32 code runs, I think everything that needs to be done can be done in user mode.&amp;nbsp; But in any case that cost would be included.&lt;/p&gt; &lt;p&gt;Generally, microbenchmarks are designed to hide certain costs and magnify others.&amp;nbsp; This is not a bad thing, the trick is to make sure you know what you're getting.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Is the metric the one of interest to you?&lt;/li&gt; &lt;li&gt;Is the workload representative?&lt;/li&gt; &lt;li&gt;Is the environment representative?&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Just those three quick checks will get you far.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=771142" width="1" height="1"&gt;</description><pubDate>Mon, 25 Sep 2006 17:58:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:771142</guid><comments>http://blogs.msdn.com/ricom/comments/771142.aspx</comments><author>ricom</author><source url="http://blogs.msdn.com/ricom/rss.xml">Rico Mariani's Performance Tidbits</source><ng:postId>1460998810</ng:postId><ng:feedId>3821</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item><item><title>Hello PLINQ</title><link>http://www.bluebytesoftware.com/blog/PermaLink,guid,81ca9c00-b43e-4860-b96b-4fd2bd735c9f.aspx</link><description>
        &lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;
      LINQ coaxes developers into writing declarative queries that specify &lt;em&gt;what &lt;/em&gt;is
      to be computed instead of &lt;em&gt;how &lt;/em&gt;to compute the results. This is in
      contrast to the lion's share of imperative programs written today, which are huge
      rat nests of for-loops, switch statements, and function calls. The result of this
      new direction? Computationally intensive filters, projections, reductions, sorts,
      and joins can be evaluated in parallel... transparently... with little-to-no extra
      input from the developer. The more data the better.
   &lt;/p&gt;
        &lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;
      If you buy the hypothesis--still unproven--that developers will write large swaths
      of code using LINQ, then by inference, they will now also be writing large swaths
      of implicitly data parallel code. This, my friends, is very good for taking advantage
      of multi-core processors.
   &lt;/p&gt;
        &lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;
      If you want to get a little glimpse of what I've been spending my time working on,
      check out these (brief) stories about Parallel LINQ (aka PLINQ), a parallel query
      execution engine for LINQ:
   &lt;/p&gt;
        &lt;ul xmlns="http://www.w3.org/1999/xhtml"&gt;
          &lt;li&gt;
            &lt;a href="http://www.eweek.com/article2/0,1895,2009167,00.asp"&gt;Microsoft's PLinq to
         Speed Program Execution&lt;/a&gt; (eWeek) 
      &lt;/li&gt;
          &lt;li&gt;
            &lt;a href="http://weblog.infoworld.com/techwatch/archives/007678.html"&gt;MS eyes multicore
         technology&lt;/a&gt; (InfoWorld)&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;
      We've spent many, many months now cranking out a fully functional prototype. The numbers
      were impressive enough to catch the eye of some key people around the company. And
      the rest is history... (well, not quite yet...)
   &lt;/p&gt;
        &lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;
      I'll no doubt be disclosing more about this in the coming weeks.
   &lt;/p&gt;
        &lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;
      (Note: I am in no way committing to any sort of product or release timeframe. This
      technology is quite early in the lifecycle, and, while unlikely, might never
      actually make the light of day... Label this puppy as "research" for now.)
   &lt;/p&gt;
        &lt;img width="0" height="0" src="http://www.bluebytesoftware.com/blog/aggbug.ashx?id=81ca9c00-b43e-4860-b96b-4fd2bd735c9f" xmlns="http://www.w3.org/1999/xhtml" /&gt;
      </description><pubDate>Wed, 13 Sep 2006 11:48:33 GMT</pubDate><guid isPermaLink="false">http://www.bluebytesoftware.com/blog/PermaLink,guid,81ca9c00-b43e-4860-b96b-4fd2bd735c9f.aspx</guid><comments>http://www.bluebytesoftware.com/blog/CommentView,guid,81ca9c00-b43e-4860-b96b-4fd2bd735c9f.aspx</comments><author>joe@bluebytesoftware.com</author><source url="http://www.bluebytesoftware.com/blog/SyndicationService.asmx/GetRss">Generalities &amp; Details: Adventures in the High-tech Underbelly</source><ng:postId>1410812977</ng:postId><ng:feedId>5141</ng:feedId><ng:folderId>1081181</ng:folderId><ng:folder ng:id="1081181" ng:flagState="0" ng:annotation="" /></item></channel></rss>