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

<channel>
	<title>A Modest Construct &#187; javascript</title>
	<atom:link href="http://heliologue.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://heliologue.com</link>
	<description>Let joy be unconfined. Let there be dancing in the streets, drinking in the saloons, and necking in the parlor.</description>
	<lastBuildDate>Sun, 29 Apr 2012 15:33:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Yet more Javascript benchmarks</title>
		<link>http://heliologue.com/2009/06/21/yet-more-javascript-benchmarks/</link>
		<comments>http://heliologue.com/2009/06/21/yet-more-javascript-benchmarks/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 06:36:06 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=3846</guid>
		<description><![CDATA[Every so often, it&#8217;s nice to take a look at the state of Javascript performance among the various browsers. Though misleading, it&#8217;s become something of a truism that &#8220;browser performance&#8221; is just a nice euphemism for &#8220;Javascript performance,&#8221; since any website doing anything interesting is basically leveraging Javascript to do it. What&#8217;s come up since [...]]]></description>
			<content:encoded><![CDATA[<p>Every so often, it&#8217;s nice to take a look at the state of Javascript performance among the various browsers.  Though misleading, it&#8217;s become something of a truism that &#8220;browser performance&#8221; is just a nice euphemism for &#8220;Javascript performance,&#8221; since any website doing anything interesting is basically leveraging Javascript to do it.</p>
<p>What&#8217;s come up since the last time I did any sort of Javascript <a href="http://heliologue.com/2008/01/15/sunspider/">performance comparison</a>?  Well, Google Chrome and its JS engine (&#8220;V8&#8243;), for one.  Also, something of a new era in Javascript handling that attempts to optimize how browsers handle it by converting it to bytecode (or, in the case of JavaScriptCore/Squirrelfish Extreme/Nitro, directly to native machine code).  In addition, there&#8217;s been some new benchmarks arrive on the scene, which allows us to tease out bias from any particular one.</p>
<p>It&#8217;s amazing, really, to compare these numbers against the linked benchmark from a mere 1.5 years ago.  Opera went from being the top of the heap with 9.5 to being a lazy 3rd or 4th place.  And Chrome, of course, decimated the competition (so far).  Read on for the testing methodology and the results.</p>
<p><span id="more-3846"></span></p>
<h3>The tests</h3>
<p>I chose four different benchmarks, three of which are entirely Javascript and one of which is <em>mostly</em> Javascript.</p>
<ol>
<li><a href="http://dromaeo.com/">Dromaeo</a> is a large, comprehensive benchmark that optionally incorporates some of the <em>other</em> benchmarks we&#8217;re looking at today.  It was created by the Mozilla Corporation.  It offers several test suites, but the one used here was the <a href="http://dromaeo.com/?dromaeo">Dromaeo subset of tests</a></li>
<li><a href="http://www2.webkit.org/perf/sunspider-0.9/sunspider.html">SunSpider</a> is a benchmark created by the folks behind WebKit.  It quickly became and remains one of the most popular and venerated Javascript benchmarks available.</li>
<li><a href="http://code.google.com/apis/v8/benchmarks.html">V8 Benchmark</a> is a benchmark application designed by Google to test its V8 Javascript engine.  It&#8217;s actually a very short and simple benchmark that <em>fantastically</em> favors Google&#8217;s browser (and Safari).</li>
<li><a href="http://service.futuremark.com/peacekeeper/index.action">Peacekeeper</a> is a new browser benchmark by FutureMark.  It&#8217;s supposed to test not just Javascript performance, but some rendering performance as well.  As you will notice below, the numbers seem a little funny, as it appears to favor Safari (WebKit + Nitro) by a significant margin</li>
</ol>
<h3>The Hardware</h3>
<p>All tests were run in Safe Mode (where applicable;  meaning that no additional plugins or widgets were loaded) on the following hardware:</p>
<ul>
<li>Intel Core2 Quad @ 2.4GHz</li>
<li>4GB RAM</li>
<li>Windows 7 build 7229, x64 Ultimate Edition</li>
</ul>
<h3>The Data</h3>
<p>What follows is the raw data table.  Jump <a href="#conclusion">down</a> for the summary.</p>
<table class="sortable zebra">
<caption>
		Javascript Benchmark Results<br />
	</caption>
<thead>
<tr>
<th scope="col">
				Browser
			</th>
<th scope="col">
				Dromaeo <br />
				(higher is better)
			</th>
<th scope="col">
				SunSpider <br />
				(lower is better)
			</th>
<th scope="col">
				V8 <br />
				(higher is better)
			</th>
<th scope="col">
				Peacekeeper <br />
				(higher is better)
			</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">
				Firefox 3.0.11
			</th>
<td>
				43.21 runs/s
			</td>
<td>
				3106.0 ms
			</td>
<td>
				240
			</td>
<td>
				1207
			</td>
</tr>
<tr>
<th scope="row">
				Firefox 3.5rc2
			</th>
<td>
				51.03
			</td>
<td>
				2652.8
			</td>
<td>
				283
			</td>
<td>
				1785
			</td>
</tr>
<tr>
<th scope="row">
				IE 8.0.7229.0
			</th>
<td>
				*
			</td>
<td>
				5176.0
			</td>
<td>
				96.5
			</td>
<td>
				829
			</td>
</tr>
<tr>
<th scope="row">
				Chrome 2.0.178.0
			</th>
<td>
				303.92
			</td>
<td>
				829.6
			</td>
<td>
				3214
			</td>
<td>
				2900
			</td>
</tr>
<tr>
<th scope="row">
				Chrome 3.0.189.0
			</th>
<td>
				<b>303.14</b>
			</td>
<td>
				<b>793.6</b>
			</td>
<td>
				<b>3290</b>
			</td>
<td>
				2968
			</td>
</tr>
<tr>
<th scope="row">
				Opera 9.64
			</th>
<td>
				29.55
			</td>
<td>
				3859.4
			</td>
<td>
				218
			</td>
<td>
				1406
			</td>
</tr>
<tr>
<th scope="row">
				Opera 10.00b1
			</th>
<td>
				71.23
			</td>
<td>
				3177.2
			</td>
<td>
				244
			</td>
<td>
				2019
			</td>
</tr>
<tr>
<th scope="row">
				Safari 4.0 (530.17)
			</th>
<td>
				221.73
			</td>
<td>
				801.2
			</td>
<td>
				2258
			</td>
<td>
				<b>3238</b>
			</td>
</tr>
<tr>
<th scope="row">
				Arora 0.7.1
			</th>
<td>
				88.85
			</td>
<td>
				2209.4
			</td>
<td>
				595
			</td>
<td>
				2344
			</td>
</tr>
</tbody>
</table>
<h3 id="conclusion">The Conclusion</h3>
<p>So what does this data tell us?</p>
<p>For starters, it means that the much-vaunted but long-developed Tracemonkey javascript engine in Firefox 3.5 is <em>already</em> a distant third-place player, if not fourth-place.  Chrome&#8217;s V8 engine outperforms it by no less than a factor of 2 on just about every test.  In fact, Chrome 3 on Windows 7 is the fastest browser available, period.  Now, Chrome is a very simplistic browser (not even a print preview) and it remains to be seen if its competitive edge in terms of rendering and javascript speed will hold true when it&#8217;s got other things to worry about (i.e. plugins).</p>
<p>Safari 4 is a combination of the WebKit rendering engine (like Chrome) and JavaScriptCore, which is the umbrella project name for WebKit javascript engine.  While the SquirrelFish engine in Safari 3.1 was fast (doing the JIT bytecode compiling that Firefox 3.5 is doing now&#8230;), the new SquirrelFish Extreme engine actually compiles to native machine code.  It pulls respectable performance across all tests, usually ranking just behind Chrome&#8230;. with the notable exception of the Peacekeeper benchmark, where it takes the lead score.  Unfortunately for Safari, its greatest accomplish with version 4 is only managing to <em>not</em> look completely horrible on other platforms, so needless to say it isn&#8217;t going to be a contender for the Win32 crown anytime soon.</p>
<p>How far Opera has fallen from grace.  Whereas a couple of years ago it sported the fastest rendering, some of the greatest features, and a great javascript stack, it was quickly eclipsed by the flurry of development happening in other browsers recently.  The beta of version 10.00 improves javascript performance significantly, although Opera&#8217;s own efforts toward bytecode-based javascript handling aren&#8217;t scheduled to land until well after 10.00.  </p>
<p>Internet Explorer is, well, still Internet Explorer.  While version 8 is a remarkable improvement over version 7, just as 7 was a spectacular improvement over 6, it is still the last shriveled pickle at the bottom of the jar, limping by in each and every benchmark.  Microsoft, in their latest FUD to paint IE8 as a <i>wunder</i>-browser, correctly point out that javascript speed isn&#8217;t everything, but both benchmark and simple user testing are enough to point out that Microsoft&#8217;s browser team is working hard just to stay in the race;  they&#8217;re not gaining ground at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2009/06/21/yet-more-javascript-benchmarks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using YUI compressor in a web project</title>
		<link>http://heliologue.com/2008/09/22/using-yui-compressor-in-a-web-project/</link>
		<comments>http://heliologue.com/2008/09/22/using-yui-compressor-in-a-web-project/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 23:35:42 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=2692</guid>
		<description><![CDATA[Last year, I moved our small programming department from using JDeveloper and editing shared files directly on a network drive to using Netbeans 6.x and a proper version control system (Subversion). After the initial learning curve, this has all been going swimmingly. I merged my first development branch into the trunk yesterday, and this branch [...]]]></description>
			<content:encoded><![CDATA[<p>Last year, I moved our small programming department from using JDeveloper and editing shared files directly on a network drive to using Netbeans 6.x and a proper version control system (Subversion).</p>
<p>After the initial learning curve, this has all been going swimmingly.  I merged my first development branch into the trunk yesterday, and this branch just so happens to dovetail nicely into the whole point of this post, which is the <a href="http://developer.yahoo.com/yui/compressor/">YUI compressor</a>, an open-source javascript and CSS minification tool developed by Yahoo&#8217;s <abbr title="Yahoo User Interface">YUI</abbr> team.</p>
<p><span id="more-2692"></span></p>
<h3>The Problem</h3>
<p>To understand quickly why one should minify production client-side code, consider only that with the upward trend of size in javascript libraries (and the necessary files for such libraries), it&#8217;s possibly to be downloading a <em>lot</em> of client-side code in a typical web application, especially as its scope grows.</p>
<p>For a long time, I was using <a href="http://dean.edwards.name/packer/">Dean Edward&#8217;s Packer</a>, as was everyone, because its Base62 encoding produced the very lowest file size.  However, what should have been obvious to everyone is that <code>eval(bunch_of_stuff_goes_here)</code> is making the browser do a lot more work, and this is a problem on dinosaurs like IE6.  </p>
<p>To make matters worse, the nature of such encoding also meant that for servers which tried to compress outgoing content like javascript (either with zlib or gzip), the compression ratio suffered.  Just look at this table that Julien Lecomte posted last August.</p>
<table class="sortable rowstyle-even">
<caption>Javascript compression</caption>
<thead>
<tr>
<th class="sortable-text">File</th>
<th class="sortable-numeric">File size (bytes)</th>
<th class="sortable-numeric">Gzipped file size (bytes)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Original jQuery libraries</td>
<td>62,885</td>
<td>19,758</td>
</tr>
<tr>
<td>jQuery minified with <a href="http://www.crockford.com/javascript/jsmin.html">JSMin</a></td>
<td>36,391</td>
<td>11,541</td>
</tr>
<tr>
<td>jQuery minified with Packer</td>
<td>21,557</td>
<td>11,119</td>
</tr>
<tr>
<td>jQuery minified with the YUI compressor</td>
<td>31,822</td>
<td>10,818</td>
</tr>
</tbody>
</table>
<p>I said to myself, &#8220;Hey, we use a lot of this stuff, and we still support a lot of users with slow computers and slow browsers.&#8221;  So, I moved our project from a Packer-based compression to a YUI-based compression, and turned on server-side GZIP compression for javascript files.  The only problem was that I was storing the javascript files already minified, and simply pasted them into a large a couple of large global <code>.js</code> files.  I had to keep a separate source directory, along with any customizations.</p>
<p>This got to be a pain in the ass, as you might well expect, and so when it occurred to me that I might be able to use the YUI library at build-time in our Netbeans project, I immediately sprung into action.</p>
<p>This was around April, and one night while attending <a href="http://heliologue.com/2008/04/13/anaheim-and-other-larks/">Sungard Summit</a> in Anaheim.  I did the initial work to get our Netbeans project into a state that could use the YUI compressor at build-time, creating separate source file directories and breaking our massive javascript file into modules;  I did the same with our CSS, splitting it up based on what it decorated.</p>
<p>There are a few tutorials about using the YUI library.  <a href="http://blog.gomilko.com/2007/11/29/yui-compression-tool-as-ant-task/">Some of them</a> involve adding the YUI library to Ant&#8217;s classpath (didn&#8217;t want to go down this route); <a href="http://www.henke.ws/machblog/index.cfm?event=showEntry&#038;entryId=8A5CAB53-19B9-BA51-EECADB57919F9714">a lot of them</a> involve invoking the library as an external executable during the build process, which is messy.</p>
<p>The solution I finally settled on was <a href="http://code.google.com/p/javaflight-code/">yui-compressor-ant-task</a>, a small library that allows Ant to use YUI as a build task.  By adding this library and the YUI compressor library to our common libraries folder, and enabling them at build only (and not for deploying in the web archive), it makes using the compressor pretty easy.</p>
<p>Here&#8217;s part of our <code>build.xml</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!--</span>
<span style="color: #808080; font-style: italic;">   * minify will concatenate all of our non-TinyMCE javascripts and stylesheets</span>
<span style="color: #808080; font-style: italic;">   * then use the YUI compressor library to compress them</span>
<span style="color: #808080; font-style: italic;">   --&gt;</span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;minify&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
       <span style="color: #808080; font-style: italic;">&lt;!--${libs} is path to the downloaded jars --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span></span>
<span style="color: #009900;">           <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;yui-compressor.jar&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${file.reference.yuicompressor.jar}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span></span>
<span style="color: #009900;">           <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;yui-compressor-ant-task.jar&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${file.reference.yui-compressor-ant-task.jar}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;path</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;task.classpath&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pathelement</span> <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${yui-compressor.jar}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pathelement</span> <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${yui-compressor-ant-task.jar}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
       <span style="color: #808080; font-style: italic;">&lt;!-- yui-compressor task definition --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;taskdef</span></span>
<span style="color: #009900;">           <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;yui-compressor&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">classname</span>=<span style="color: #ff0000;">&quot;net.noha.tools.ant.yuicompressor.tasks.YuiCompressorTask&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;classpath</span> <span style="color: #000066;">refid</span>=<span style="color: #ff0000;">&quot;task.classpath&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/taskdef<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
       <span style="color: #808080; font-style: italic;">&lt;!-- concatenation of javascript --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Building global javascript&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;concat</span> <span style="color: #000066;">destfile</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/js/global.js&quot;</span> <span style="color: #000066;">force</span>=<span style="color: #ff0000;">&quot;no&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
           <span style="color: #808080; font-style: italic;">&lt;!-- explicitly order js concat because ordering matters here --&gt;</span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.bgiframe.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.hoverIntent.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/ui.core.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/ui.autocomplete.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/ui.datepicker.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/ui.tabs.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/tablesort.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/customsort.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.blockUI.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.form.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.ifixpng.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.superfish.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.cluetip.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.scrollTo.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.jqModal.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/validation.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/js/jquery.timeentry.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/concat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
       <span style="color: #808080; font-style: italic;">&lt;!-- concatenation of cascading stylesheets --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Building global cascading stylesheets&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;concat</span> <span style="color: #000066;">destfile</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/css/global.css&quot;</span> <span style="color: #000066;">force</span>=<span style="color: #ff0000;">&quot;no&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/base.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/superfish.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/announcements.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/myvt.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/forms.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/cluetip.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>   
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/tables.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/ui.tabs.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/ui.datepicker.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/ui.autocomplete.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/linkspan.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/stepMenu.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/print.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;web/common/css/youHaveMessages.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/concat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
       <span style="color: #808080; font-style: italic;">&lt;!-- invoke compressor --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;yui-compressor</span> <span style="color: #000066;">warn</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">charset</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> <span style="color: #000066;">fromdir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${build.dir}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;web/common/js/global.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;web/common/css/global.css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/yui-compressor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
   <span style="color: #808080; font-style: italic;">&lt;!--</span>
<span style="color: #808080; font-style: italic;">   * purge-src takes our compressed files, moves them to the base /common dir</span>
<span style="color: #808080; font-style: italic;">   * and deletes the source js and css dirs from the build dir</span>
<span style="color: #808080; font-style: italic;">   --&gt;</span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;purge-src&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;minify&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Purging javascript and stylesheet sources&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/js/global-min.js&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/global.js&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/css/global-min.css&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/global.css&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;delete</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;delete</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${build.dir}/web/common/css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>What you see there is essentially four steps.</p>
<ol>
<li>Concatenate all the constituent source files into a <code>global.js</code> and a <code>global.css</code></li>
<li>Compress both of these files, which creates <code>global-min.js</code> and <code>global-min.css</code> (default behavior)</li>
<li>Move these files out of the source directories and into the root of the common web directory as <code>global.js</code> and <code>global.css</code></li>
<li>Delete the source directories in our build folder so they don&#8217;t get deployed with the web archive</li>
</ol>
<p>Because certain browsers (IE) break without explicit ordering, we unfortunately can&#8217;t just use &#8220;*.js&#8221; and &#8220;*.css&#8221; in our concatenation step, but having to explicitly list our components in the build file certainly isn&#8217;t the end of the world.  The nice thing is that the Ant task will even print out handy statistics on just how much you&#8217;ve been able to compress the files down.  In our case, we have about 441.8KB of common Javascript and CSS in our source code that, by the time it gets sent to the user, has been minified and/or gzipped to about 89KB.</p>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/09/22/using-yui-compressor-in-a-web-project/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Creating an admissions dashboard</title>
		<link>http://heliologue.com/2008/09/11/creating-an-admissions-dashboard/</link>
		<comments>http://heliologue.com/2008/09/11/creating-an-admissions-dashboard/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 19:02:16 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=2354</guid>
		<description><![CDATA[This entry pertains to work done in the context of my employment. Please remember, however, that any opinions expressed on this blog do not necessarily reflect those of my employer or co-workers. The Problem Admissions needed help. They had been moved from their former product, Exeter, to Banner&#8217;s native admissions module. But Banner&#8217;s interface stinks, [...]]]></description>
			<content:encoded><![CDATA[<p class="alert">
This entry pertains to work done in the context of my employment.  Please remember, however, that any opinions expressed on this blog do not necessarily reflect those of my employer or co-workers.
</p>
<h3>The Problem</h3>
<p>Admissions needed help.  They had been moved from their former product, Exeter, to Banner&#8217;s native admissions module.  But Banner&#8217;s interface stinks, and there was no decent way for counselors to do, well, anything.  They relied on daily reports run out of an Excel pivot table by the executive directory of admissions, and therefore they lived on paper.  The counselors needed a better way to get their work done and stay on top (figuratively speaking) of their recruits.</p>
<p>Enter my department.  It fell to us, after some discussion, to build a tool that would be initial for undergraduate counselors, to let them slice and dice their data as needed.  After a pilot run, it will gradually be expanded to include graduate and transfer admissions, as well as reporting tools for directors and and other muckity-mucks.</p>
<p><span id="more-2354"></span></p>
<p>The current iteration is 4808 lines of code, for both the views and the comment submissions servlet.  Most of it was written by me, though some was reused code, and the initial servlet skeleton was written by my boss.</p>
<div class="gallery">
<h4 class="gallery">Admissions Dashboard</h4>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_01.png" title="Parameter page, loading recruiter list via AJAX" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_01_thumb.png" alt="Parameter page, loading recruiter list via AJAX" /></a></p>
<div class="gallery-hidden" id="admissionsdashboard">
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_02.png" title="Parameter page, using the high school autocomplete" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_02_thumb.png" alt="Parameter page, using the high school autocomplete" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_03.png" title="The table view" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_03_thumb.png" alt="The table view" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_04.png" title="Base detail view" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_04_thumb.png" alt="Base detail view" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_05.png" title="Checklist detail view" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_05_thumb.png" alt="Checklist detail view" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_06.png" title="Comments" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_06_thumb.png" alt="Comments" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_07.png" title="Mailings" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_07_thumb.png" alt="Mailings" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_08.png" title="Contacts" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_08_thumb.png" alt="Contacts" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_09.png" title="Entering a comment (with date widget)" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_09_thumb.png" alt="Entering a comment (with date widget)" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_10.png" title="Financial Aid summary" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_10_thumb.png" alt="Financial Aid summary" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_11.png" title="Student Bill" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_11_thumb.png" alt="Student Bill" /></a></p>
<p><a href="http://heliologue.com/img/albums/admissions_dashboard/dashboard_12.png" title="Student schedule" rel="lightbox[admissionsdashboard]"><img src="http://heliologue.com/img/albums/admissions_dashboard/dashboard_11_thumb.png" alt="Student schedule" /></a></p>
</div>
<p><a class="showImages" rel="admissionsdashboard">toggle thumbnails</a>
</div>
<h3>Setting Parameters</h3>
<p>The first thing an admissions counselor sees is a parameter page.  There are a number of options to choose from:</p>
<ul>
<li>Term (can be multiple)</li>
<li>Population selection (e.g. active applicants, active but non-applied recruits, enrolled applicants, etc)</li>
<li>Student level (can be multiple)</li>
<li>Recruiter (signed-in counselors will be auto-selected (can be multiple)</li>
<li>High School (can be multiple)</li>
</ul>
<p>Selecting from term or student level repopulates the possible recruiter list with only applicable options.  Selecting &#8220;Undergraduate&#8221; applicants will necessarily filter out (or should filter out) graduate admissions counselors so they&#8217;re no longer an option.</p>
<p>Perhaps the toughest engineering challenge here was high schools.  We currently have ≈10&#8217;000 high schools in our database, and will likely have a lot more soon.  Loading all those into a multiple select box would make the page huge, and likely overload some underpowered browsers.  My solution?  Autocomplete.  Using a simple JSP fragment and the <a href="http://docs.jquery.com/UI/Autocomplete">Autocomplete</a> plugin for jQuery, I was able to make a simple autosearch/complete behavior;  selecting an item drops it into a list below the input box.</p>
<p>The odd thing about the plugin was that it didn&#8217;t end up being very flexible about the format of returned data.  I had figured it would ask you to specify a data type and do your own parsing.  It seems, though, that it only wanted one format:  pipe-delimited data, with newlines between records.  After wrestling with it for a while, I finally got it to work, but I really would have rather just returned XML and done some simple parsing.</p>
<h3>The Table View</h3>
<p>Once the parameters are chosen, the user gets a very complex table (the specifications were given to us by the Admissions department).</p>
<ul>
<li>Name</li>
<li>Term (if >1 chosen)</li>
<li>High School (if >1 chosen or none specified)</li>
<li>Intended major (code display; full description on hover)</li>
<li>Application decision (e.g. accepted, denied, etc) (code display; full description on hover)</li>
<li>Student type (e.g. new freshman, transfer, etc)</li>
<li>Athlete indicator</li>
<li>Registered indicator</li>
<li>Application status
<ul>
<li>Green:  complete, no pending items</li>
<li>Yellow:  complete, but pending items which don&#8217;t affect admission</li>
<li>Red:  incomplete: pending items affect admission</li>
<li>None (has no application;  is only a recruit)</li>
</ul>
</li>
<li>Financial Aid
<ul>
<li>Green:  all items complete, and aid is packaged</li>
<li>Yellow:  all items complete, but aid is not yet packaged</li>
<li>Red:  outstanding items; aid cannot be packaged</li>
<li>None (has no financial aid)</li>
</ul>
</li>
<li>Date of application</li>
<li>Composite admissions score</li>
<li>Date of last comment (usually a contact with applicant)</li>
<li>Visited campus indicator (is not currently used)</li>
</ul>
<p>The recruiter can export this table as an Excel document for easy printing and carrying;  otherwise, clicking on a recruit/applicant&#8217;s name will bring up a detail screen, which is divided into several sections.</p>
<h3>The Detail View</h3>
<h4>Basic</h4>
<p>I call it basic, but this is really the most detailed tab of this entire view.</p>
<ul>
<li><strong>Application-related Items</strong>
<ul>
<li>Entry Term</li>
<li>Source</li>
<li>Major</li>
<li>Admissions Counselor</li>
<li>Application Status</li>
</ul>
</li>
<li><strong>Biographical Items</strong>
<ul>
<li>Banner ID</li>
<li>PIN (for helping with portal access)</li>
<li>Last Portal login</li>
<li>Student Type</li>
<li>Advisor (email link)</li>
<li>Residence (dorm icon for on-campus, car icon for commuter)</li>
<li>College (Education, Arts &#038; Science, etc)</li>
<li>Date of Birth</li>
<li>Phone Number(s) (shows primary; expands to show others)</li>
<li>Email Address(es) (shows primary; expands to show others)</li>
<li>Address</li>
</ul>
</li>
<li><strong>Holds</strong> (is only shown when there are holds on the student&#8217;s account)
<ul>
<li>Hold Type</li>
<li>List of items which this hold prevents</li>
</ul>
</li>
<li><strong>Education</strong>
<ul>
<li>High School (for undergrad and transfer)
<ul>
<li>Name of high school</li>
<li>Graduation Date</li>
<li>GPA</li>
<li>Class rank</li>
<li>ACT composite score</li>
</ul>
</li>
<li>College (for graduate and transfer)
<ul>
<li>Name of college</li>
<li>Dates of attendance</li>
<li>GPA transferred</li>
</ul>
</li>
</ul>
</li>
<li><strong>Athletics</strong> (list of sports/activities)</li>
</ul>
<h4>Checklist</h4>
<p>The checklist is a simple table displaying pending and completed items necessary for admission.  The applicant sees the exact same table when they sign into the portal, so now the counselor can see what the applicant sees.</p>
<h4>Mailings/Contacts/Comment</h4>
<p>This is a tripartite screen.  The first and most important section is &#8220;Comments,&#8221; which is a sort of chronicle of counselors contacts with the applicant or the applicant&#8217;s parents.  This screen is especially nasty using the native Banner interface, and so the object was not only to make the viewing nice, but also allow for the deletion, editing, and creation of comments.</p>
<p>Contacts and mailings are merely for records of correspondence the applicant or recruit has received, aggregated from several places.</p>
<h4>Financial Aid</h4>
<p>This screen gives detail of all awarded financial aid, as well as both completed and outstanding documents.  This, too, is almost exactly what the applicant will see when signed into his or her portal.  </p>
<h4>Bill</h4>
<p>This screen, which details charges and payments for the student, is once again a replica of screens available to the applicant when logged in.   These screens are mostly to provide parity for support with applicants who have questions about financial aid, bills, or schedules.</p>
<h4>Schedule</h4>
<p>Once an applicant is accepted, and registers for class, this schedule tab will be filled out.  It is a slight modification of the student&#8217;s schedule, which is displayed to them upon portal sign-in.   Advisor see a similar view, since this is a module we reuse in several different portions of the web app.</p>
<h3>The Big Finish</h3>
<p>There are always bugs.  I realize, just before going live, that the <abbr title="abbreviation">abbr</abbr> tag that I used so heavily in the tabular view isn&#8217;t natively supported by Internet Explorer 6.</p>
<p>Luckily, good old <a href="http://dean.edwards.name/my/abbr-cadabra.html">Dean Edwards</a> notes that for some reason, prefixing the namespace to the <code>&lt;abbr&gt;</code> tag makes the damn thing suddenly work, and it&#8217;s still valid XHTML!  Crisis averted.</p>
<p>As with most of our web application, we make heavy use of <a href="http://jquery.com">jQuery</a>. Specifically for this application, we make use of the UI Tabs plugin, the UI Autocomplete plugin, and jQuery&#8217;s native AJAX functionality.  We also use the <a href="http://www.frequency-decoder.com/2006/09/16/unobtrusive-table-sort-script-revisited">Unobtrusive Tablesort Script</a> from Frequency Decoder, which has much better performance than jQuery equivalents.</p>
<p>As I said, this is only a first try at a first stage, but we&#8217;re pretty happy with the progress, and the admissions folks seem to be as well, so we&#8217;re doing <em>something</em> right.</p>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/09/11/creating-an-admissions-dashboard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript performance is about to get turbo-charged</title>
		<link>http://heliologue.com/2008/08/24/javascript-performance-is-about-to-get-turbo-charged/</link>
		<comments>http://heliologue.com/2008/08/24/javascript-performance-is-about-to-get-turbo-charged/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 03:38:41 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Webkit]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=2305</guid>
		<description><![CDATA[I personally think the friendly rivalry between the open-source Webkit engine (which powers Safari, among other things) and Mozilla (the Gecko engine, actually) is one of the best things to happen to browser development in years. The constant one-upsmanship can only lead to better browsers. Well, Internet Explorer will constantly be the limiting factor, but [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/img/tech/ie_tango.png" class="right" alt="Internet Explorer" /></p>
<p><img src="/img/tech/firefox_tango.png" class="right clear" alt="Firefox" /></p>
<p><img src="/img/tech/safari.png" class="right clear" alt="Safari" /></p>
<p>I personally think the friendly rivalry between the open-source <a href="http://webkit.org">Webkit</a> engine (which powers Safari, among other things) and <a href="http://webkit.org">Mozilla</a> (the Gecko engine, actually) is one of the best things to happen to browser development in years.  The constant one-upsmanship can only lead to better browsers.  Well, Internet Explorer will constantly be the limiting factor, but we can dream, can&#8217;t we?</p>
<p>The latest thing to hit browser source repos is javascript engine improvement based on something called &#8220;trace trees&#8221;:  essentially, javascript gets translated into native bytecode.  The Webkit engine <a href="http://webkit.org/blog/189/announcing-squirrelfish/">made the announcement</a> a few months ago, with code codenamed &#8220;Squirrelfish,&#8221; promising massive improvements.  That article&#8217;s also got a pretty good writeup.</p>
<p>Open Source being what it is, it was only a matter of time before Mozilla announced their own version of a trace-tree-based javascript engine.  John Resig has a <a href="http://ejohn.org/blog/tracemonkey/">good writeup</a>, as done <a href="http://weblogs.mozillazine.org/roadmap/archives/2008/08/tracemonkey_javascript_lightsp.html">Brendan Eich</a>.</p>
<p><span id="more-2305"></span></p>
<p>So, disregarding for a moment all talk of trace trees and JIT, what the hell does this all mean?  <a href="http://heliologue.com/2008/01/15/sunspider/">I am entirely in agreement with Jeff Atwood</a> about the importance of javascript in the contemporary web.  Whether you&#8217;re using rich sites like Netflix or GMail, or you&#8217;re working with Flash files, or you&#8217;re getting into the RIA arena with Flex or similar technologies, you&#8217;re essentially relying on javascript and javascript engines to get anything done.  Good HTML specs get the browsing experience much of the way there, but a truly compelling web technology relies on client-side scripting.  Even in the last 3 or 4 years, javascript has gone from superfluous UI tricks to the heart and soul of the user&#8217;s end of a web experience.  It&#8217;s a bit unfortunate, really, since javascript (properly &#8220;ECMAScript&#8221;) is an old technology that&#8217;s single-threaded and doesn&#8217;t scale very well.  That browser-makers have managed to squeeze this much performance out of it is a testament to geek creativity.</p>
<p>There&#8217;s been a lot of reason to switch away from Internet Explorer in the last few years.  Microsoft made big steps with IE7 to improvement performance, rendering quality, and security, but Internet Explorer is still the bastard child of the browser world, dog-ass slow compared to its brethren.  If the difference between user experience in the javascript-heavy web becomes so great that a Webkit browser or a Gecko browser or Opera provides an entirely different level of satisfaction, then maybe we&#8217;ll finally see a real shift in browser usage.</p>
<p>Mozilla, particularly, is posed to reap some real reward.  These JIT trace tree improvements will start showing up in 3.1 (I think), and much more so with the new Tamarin engine schedule for Firefox 4.  The only viable Webkit browser in Windows, meanwhile, is Safari, which looks and feels alien in Windows, as Apple has a strange insistence upon keep the OSX look, regardless of platform.  I don&#8217;t know offhand the market slice that Safari for Windows occupies, but it must be infinitesimally small, even compared to Safari on Mac.  Firefox, then, is the <em>only truly compelling browser</em> on the Windows platform to take advantage of this right now.  </p>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/08/24/javascript-performance-is-about-to-get-turbo-charged/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Blockquote metadata extractor 1.2</title>
		<link>http://heliologue.com/2008/06/16/blockquote-metadata-extractor-12/</link>
		<comments>http://heliologue.com/2008/06/16/blockquote-metadata-extractor-12/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 20:59:20 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[aside]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=2075</guid>
		<description><![CDATA[My little blockquote title&#124;cite extractor for jQuery has been updated just slightly when it appeared to have funny results. It may have to do with the element.attr() changes introduced in jQuery 1.2.6. It&#8217;s not a particularly disastrous bug or anything, but I&#8217;ve altered the code to check string lengths instead of looking checking for null. [...]]]></description>
			<content:encoded><![CDATA[<p>My little blockquote <code>title|cite</code> extractor for jQuery has been updated just slightly when it appeared to have funny results.  It may have to do with the <code>element.attr()</code> changes introduced in jQuery 1.2.6.</p>
<p>It&#8217;s not a particularly disastrous bug or anything, but I&#8217;ve altered the code to check string lengths instead of looking checking for <code>null</code>.</p>
<p><a href="http://heliologue.com/projects/blockquote-metadata-extractor/">Get it here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/06/16/blockquote-metadata-extractor-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript engines in 32-bit and 64-bit browsers</title>
		<link>http://heliologue.com/2008/03/23/javascript-engines-in-32-bit-and-64-bit-browsers/</link>
		<comments>http://heliologue.com/2008/03/23/javascript-engines-in-32-bit-and-64-bit-browsers/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 01:07:19 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=2017</guid>
		<description><![CDATA[I recently performed some cursory Javascript benchmarks with the new version of Firefox and Safari; curious about performance, I decided to do some testing of 32-bit browsers against their 64-bit counterparts. On Windows Vista x64, the only two browsers so available to me are Internet Explorer 7 and a recent nightly build of Firefox 3. [...]]]></description>
			<content:encoded><![CDATA[<p>I recently performed some cursory Javascript benchmarks with the new version of <a href="http://heliologue.com/2008/03/19/firefox-30b4-vs-20012-javascript-benchmark/">Firefox</a> and <a href="http://heliologue.com/2008/03/18/safari-304-vs-31-javascript-benchmarks/">Safari</a>;  curious about performance, I decided to do some testing of 32-bit browsers against their 64-bit counterparts.  On Windows Vista x64, the only two browsers so available to me are Internet Explorer 7 and a recent nightly build of Firefox 3.  The 64-bit comes from the Mozilla x86-64 project, specifically the <a href="http://www.mozilla-x86-64.com/firefox/firefox-3.0b5pre.en-US.win64.installer.20080321.exe">build from 21 March 2008</a>.  The 32-bit build is a proper nightly from the same date from the <a href="ftp://ftp.mozilla.org/pub/firefox/nightly/2008/03/2008-03-21-06-trunk">official Mozilla FTP</a>.</p>
<p>My hypothesis, before performing the tests, was that the 64-bit compilation would have little or no effect on the Javascript engine performance.  It&#8217;s so difficult to optimize Javascript rendering, which is inherently single-threaded, and it seems likely to only benefit from a faster CPU clock than bigger memory registers.  Afterward, I felt vindicated:  Internet Explorer is likely the best test, and the difference was not statistically significant.  In Firefox&#8217;s case, the 64-bit build was actually significantly <em>worse</em>, though this could easily be due to some other factor I have not taken into account; I have assumed that the source was compiled on the same date.  See below for more details.</p>
<p><span id="more-2017"></span></p>
<h3>The Data Tables</h3>
<table class="sortable rowstyle-even">
<caption>Internet Explorer 7.0.6.001.18000 32-bit and 64-bit comparison</caption>
<thead>
<tr>
<th class="sortable-text">Benchmark</th>
<th class="sortable-numeric">32-bit (ms)</th>
<th class="sortable-numeric">64-bit (ms)</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Total</th>
<th>21972.4</th>
<th>19955.4</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>3d: cube</td>
<td>346.6</td>
<td>262.0</td>
</tr>
<tr>
<td>3d: morph</td>
<td>415.2</td>
<td>311.8</td>
</tr>
<tr>
<td>3d: raytrace</td>
<td>471.2</td>
<td>364.8</td>
</tr>
<tr>
<td>access: binary-trees</td>
<td>443.0</td>
<td>321.2</td>
</tr>
<tr>
<td>access: fannkuch</td>
<td>739.4</td>
<td>586.6</td>
</tr>
<tr>
<td>access: nbody</td>
<td>346.4</td>
<td>258.6</td>
</tr>
<tr>
<td>access: nsieve</td>
<td>305.8</td>
<td>284.2</td>
</tr>
<tr>
<td>bitops: 3bit-bits-in-byte</td>
<td>409.0</td>
<td>290.0</td>
</tr>
<tr>
<td>bitops: bits-in-byte</td>
<td>405.4</td>
<td>290.0</td>
</tr>
<tr>
<td>bitops: bitwise-and</td>
<td>446.2</td>
<td>284.0</td>
</tr>
<tr>
<td>bitops: nsieve-bits</td>
<td>349.4</td>
<td>290.0</td>
</tr>
<tr>
<td>control: recursive</td>
<td>493.0</td>
<td>349.4</td>
</tr>
<tr>
<td>crypto: aes</td>
<td>374.2</td>
<td>296.4</td>
</tr>
<tr>
<td>crypto: md5</td>
<td>330.8</td>
<td>243.2</td>
</tr>
<tr>
<td>crypto: sha1</td>
<td>346.4</td>
<td>246.6</td>
</tr>
<tr>
<td>date: format-tofte</td>
<td>433.6</td>
<td>315.0</td>
</tr>
<tr>
<td>date: format-xparb</td>
<td>440.0</td>
<td>349.6</td>
</tr>
<tr>
<td>math: cordic</td>
<td>465.0</td>
<td>340.0</td>
</tr>
<tr>
<td>math: partial-sums</td>
<td>327.6</td>
<td>228.0</td>
</tr>
<tr>
<td>math: spectral-norm</td>
<td>393.4</td>
<td>277.6</td>
</tr>
<tr>
<td>regexp: dna</td>
<td>387.0</td>
<td>302.6</td>
</tr>
<tr>
<td>string: base64</td>
<td>7298.0</td>
<td>8527.2</td>
</tr>
<tr>
<td>string: fasta</td>
<td>464.6</td>
<td>334.2</td>
</tr>
<tr>
<td>string: tagcloud</td>
<td>1391.4</td>
<td>1145.0</td>
</tr>
<tr>
<td>string: unpack-code</td>
<td>461.8</td>
<td>346.6</td>
</tr>
<tr>
<td>string: validate-input</td>
<td>3688.0</td>
<td>3110.8</td>
</tr>
</tbody>
</table>
<table class="sortable rowstyle-even">
<caption>Firefox 3.0b5pre (20080321 nightly) 32-bit and 64-bit comparison</caption>
<thead>
<tr>
<th class="sortable-text">Benchmark</th>
<th class="sortable-numeric">32-bit (ms)</th>
<th class="sortable-numeric">64-bit (ms)</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Total</th>
<th>3750.2</th>
<th>7421.4</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>3d: cube</td>
<td>147.2</td>
<td>312.6</td>
</tr>
<tr>
<td>3d: morph</td>
<td>137.8</td>
<td>230.8</td>
</tr>
<tr>
<td>3d: raytrace</td>
<td>147.8</td>
<td>264.4</td>
</tr>
<tr>
<td>access: binary-trees</td>
<td>60.6</td>
<td>126.6</td>
</tr>
<tr>
<td>access: fannkuch</td>
<td>261.6</td>
<td>540.6</td>
</tr>
<tr>
<td>access: nbody</td>
<td>173.2</td>
<td>282.8</td>
</tr>
<tr>
<td>access: nsieve</td>
<td>103.4</td>
<td>185.0</td>
</tr>
<tr>
<td>bitops: 3bit-bits-in-byte</td>
<td>85.6</td>
<td>213.6</td>
</tr>
<tr>
<td>bitops: bits-in-byte</td>
<td>123.0</td>
<td>271.0</td>
</tr>
<tr>
<td>bitops: bitwise-and</td>
<td>136.4</td>
<td>246.2</td>
</tr>
<tr>
<td>bitops: nsieve-bits</td>
<td>148.6</td>
<td>310.0</td>
</tr>
<tr>
<td>control: recursive</td>
<td>57.0</td>
<td>140.8</td>
</tr>
<tr>
<td>crypto: aes</td>
<td>105.0</td>
<td>195.0</td>
</tr>
<tr>
<td>crypto: md5</td>
<td>78.4</td>
<td>175.2</td>
</tr>
<tr>
<td>crypto: sha1</td>
<td>88.0</td>
<td>163.6</td>
</tr>
<tr>
<td>date: format-tofte</td>
<td>202.2</td>
<td>406.4</td>
</tr>
<tr>
<td>date: format-xparb</td>
<td>129.2</td>
<td>258.2</td>
</tr>
<tr>
<td>math: cordic</td>
<td>186.2</td>
<td>367.4</td>
</tr>
<tr>
<td>math: partial-sums</td>
<td>149.2</td>
<td>257.2</td>
</tr>
<tr>
<td>math: spectral-norm</td>
<td>96.8</td>
<td>194.2</td>
</tr>
<tr>
<td>regexp: dna</td>
<td>255.6</td>
<td>652.8</td>
</tr>
<tr>
<td>string: base64</td>
<td>119.2</td>
<td>220.6</td>
</tr>
<tr>
<td>string: fasta</td>
<td>205.2</td>
<td>388.8</td>
</tr>
<tr>
<td>string: tagcloud</td>
<td>152.2</td>
<td>294.8</td>
</tr>
<tr>
<td>string: unpack-code</td>
<td>272.8</td>
<td>489.4</td>
</tr>
<tr>
<td>string: validate-input</td>
<td>128.0</td>
<td>233.4</td>
</tr>
</tbody>
</table>
<h3>The Raw Data</h3>
<pre>
Internet Explorer x86 7.0.6001.18000
============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  21972.4ms +/- 6.2%
--------------------------------------------

  3d:                    1233.0ms +/- 1.1%
    cube:                 346.6ms +/- 4.7%
    morph:                415.2ms +/- 2.7%
    raytrace:             471.2ms +/- 1.9%

  access:                1834.6ms +/- 2.5%
    binary-trees:         443.0ms +/- 3.9%
    fannkuch:             739.4ms +/- 1.5%
    nbody:                346.4ms +/- 7.3%
    nsieve:               305.8ms +/- 5.8%

  bitops:                1610.0ms +/- 3.7%
    3bit-bits-in-byte:    409.0ms +/- 2.0%
    bits-in-byte:         405.4ms +/- 4.8%
    bitwise-and:          446.2ms +/- 5.0%
    nsieve-bits:          349.4ms +/- 6.3%

  controlflow:            493.0ms +/- 2.2%
    recursive:            493.0ms +/- 2.2%

  crypto:                1051.4ms +/- 4.6%
    aes:                  374.2ms +/- 5.2%
    md5:                  330.8ms +/- 4.9%
    sha1:                 346.4ms +/- 6.2%

  date:                   873.6ms +/- 2.3%
    format-tofte:         433.6ms +/- 2.0%
    format-xparb:         440.0ms +/- 3.7%

  math:                  1186.0ms +/- 1.6%
    cordic:               465.0ms +/- 4.6%
    partial-sums:         327.6ms +/- 0.2%
    spectral-norm:        393.4ms +/- 4.1%

  regexp:                 387.0ms +/- 4.2%
    dna:                  387.0ms +/- 4.2%

  string:               13303.8ms +/- 10.4%
    base64:              7298.0ms +/- 6.8%
    fasta:                464.6ms +/- 3.5%
    tagcloud:            1391.4ms +/- 4.0%
    unpack-code:          461.8ms +/- 3.7%
    validate-input:      3688.0ms +/- 25.4%

Internet Explorer x64
============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  19955.4ms +/- 1.2%
--------------------------------------------

  3d:                     938.6ms +/- 2.3%
    cube:                 262.0ms +/- 6.2%
    morph:                311.8ms +/- 6.3%
    raytrace:             364.8ms +/- 2.9%

  access:                1450.6ms +/- 2.8%
    binary-trees:         321.2ms +/- 3.3%
    fannkuch:             586.6ms +/- 3.7%
    nbody:                258.6ms +/- 6.6%
    nsieve:               284.2ms +/- 3.1%

  bitops:                1154.0ms +/- 1.7%
    3bit-bits-in-byte:    290.0ms +/- 3.7%
    bits-in-byte:         290.0ms +/- 7.6%
    bitwise-and:          284.0ms +/- 5.8%
    nsieve-bits:          290.0ms +/- 6.0%

  controlflow:            349.4ms +/- 3.0%
    recursive:            349.4ms +/- 3.0%

  crypto:                 786.2ms +/- 2.8%
    aes:                  296.4ms +/- 4.6%
    md5:                  243.2ms +/- 7.1%
    sha1:                 246.6ms +/- 10.3%

  date:                   664.6ms +/- 6.0%
    format-tofte:         315.0ms +/- 11.6%
    format-xparb:         349.6ms +/- 3.1%

  math:                   845.6ms +/- 2.5%
    cordic:               340.0ms +/- 2.5%
    partial-sums:         228.0ms +/- 4.5%
    spectral-norm:        277.6ms +/- 6.0%

  regexp:                 302.6ms +/- 3.5%
    dna:                  302.6ms +/- 3.5%

  string:               13463.8ms +/- 1.4%
    base64:              8527.2ms +/- 0.9%
    fasta:                334.2ms +/- 5.2%
    tagcloud:            1145.0ms +/- 2.6%
    unpack-code:          346.6ms +/- 6.2%
    validate-input:      3110.8ms +/- 2.4%

Firefox x86 Firefox 3.0b5pre (20080322 nightly)
============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                 3750.2ms +/- 1.4%
--------------------------------------------

  3d:                   432.8ms +/- 9.8%
    cube:               147.2ms +/- 17.4%
    morph:              137.8ms +/- 1.2%
    raytrace:           147.8ms +/- 22.7%

  access:               598.8ms +/- 2.1%
    binary-trees:        60.6ms +/- 5.5%
    fannkuch:           261.6ms +/- 1.7%
    nbody:              173.2ms +/- 6.0%
    nsieve:             103.4ms +/- 1.4%

  bitops:               493.6ms +/- 5.4%
    3bit-bits-in-byte:   85.6ms +/- 2.2%
    bits-in-byte:       123.0ms +/- 6.4%
    bitwise-and:        136.4ms +/- 11.9%
    nsieve-bits:        148.6ms +/- 9.2%

  controlflow:           57.0ms +/- 3.1%
    recursive:           57.0ms +/- 3.1%

  crypto:               271.4ms +/- 7.3%
    aes:                105.0ms +/- 19.4%
    md5:                 78.4ms +/- 3.8%
    sha1:                88.0ms +/- 2.0%

  date:                 331.4ms +/- 12.3%
    format-tofte:       202.2ms +/- 16.2%
    format-xparb:       129.2ms +/- 8.3%

  math:                 432.2ms +/- 3.9%
    cordic:             186.2ms +/- 7.6%
    partial-sums:       149.2ms +/- 7.0%
    spectral-norm:       96.8ms +/- 1.4%

  regexp:               255.6ms +/- 8.3%
    dna:                255.6ms +/- 8.3%

  string:               877.4ms +/- 4.7%
    base64:             119.2ms +/- 6.0%
    fasta:              205.2ms +/- 10.4%
    tagcloud:           152.2ms +/- 6.2%
    unpack-code:        272.8ms +/- 4.1%
    validate-input:     128.0ms +/- 10.3%

Firefox x64
============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  7421.4ms +/- 1.2%
--------------------------------------------

  3d:                    807.8ms +/- 2.0%
    cube:                312.6ms +/- 3.5%
    morph:               230.8ms +/- 7.8%
    raytrace:            264.4ms +/- 6.5%

  access:               1135.0ms +/- 1.9%
    binary-trees:        126.6ms +/- 11.7%
    fannkuch:            540.6ms +/- 2.3%
    nbody:               282.8ms +/- 2.9%
    nsieve:              185.0ms +/- 10.4%

  bitops:               1040.8ms +/- 2.3%
    3bit-bits-in-byte:   213.6ms +/- 5.8%
    bits-in-byte:        271.0ms +/- 4.5%
    bitwise-and:         246.2ms +/- 6.8%
    nsieve-bits:         310.0ms +/- 6.1%

  controlflow:           140.8ms +/- 6.6%
    recursive:           140.8ms +/- 6.6%

  crypto:                533.8ms +/- 4.3%
    aes:                 195.0ms +/- 5.8%
    md5:                 175.2ms +/- 11.5%
    sha1:                163.6ms +/- 3.5%

  date:                  664.6ms +/- 4.5%
    format-tofte:        406.4ms +/- 4.6%
    format-xparb:        258.2ms +/- 6.3%

  math:                  818.8ms +/- 3.8%
    cordic:              367.4ms +/- 3.2%
    partial-sums:        257.2ms +/- 10.5%
    spectral-norm:       194.2ms +/- 4.9%

  regexp:                652.8ms +/- 2.7%
    dna:                 652.8ms +/- 2.7%

  string:               1627.0ms +/- 3.1%
    base64:              220.6ms +/- 4.7%
    fasta:               388.8ms +/- 4.4%
    tagcloud:            294.8ms +/- 5.2%
    unpack-code:         489.4ms +/- 2.9%
    validate-input:      233.4ms +/- 11.1%
</pre>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/03/23/javascript-engines-in-32-bit-and-64-bit-browsers/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Safari 3.04 vs 3.1 Javascript benchmarks</title>
		<link>http://heliologue.com/2008/03/18/safari-304-vs-31-javascript-benchmarks/</link>
		<comments>http://heliologue.com/2008/03/18/safari-304-vs-31-javascript-benchmarks/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 21:23:08 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Webkit]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=2011</guid>
		<description><![CDATA[Safari 3.1 has been released, bringing with it all the latest and great Webkit code. Even though the UI still sucks (at least on Windows; ever hear of native GUIs, Apple?) I decided to benchmark the Javascript performance of the new Safari against its more immediate predecessor, 3.04. This testing was done on a Windows [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/img/tech/safari.png" alt="Safari" class="right" /></p>
<p>Safari 3.1 has been released, bringing with it all the latest and great <a href="http://webkit.org">Webkit</a> code.  Even though the UI still sucks (at least on Windows;  ever hear of native GUIs, Apple?)</p>
<p>I decided to benchmark the Javascript performance of the new Safari against its more immediate predecessor, 3.04.  This testing was done on a Windows XP SP2 installation;  a HP workstation with a Pentium 4 and 2GB of RAM.</p>
<p>As you can see in the table below, the JS engine has improved considerably since the last build, cutting the total time by more than half.</p>
<p><span id="more-2011"></span></p>
<table class="sortable rowstyle-even">
<caption>Safari 3.04 vs. 3.1</caption>
<thead>
<tr>
<th class="sortable-text" scope="col">Benchmark</th>
<th class="sortable-numeric" scope="col">Safari 3.1 (ms)</th>
<th class="sortable-numeric" scope="col">Safari 3.04 (ms)</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Total</th>
<th>5865.4</th>
<th>13525.2</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>3d: cube</td>
<td>218.6</td>
<td>478.0</td>
</tr>
<tr>
<td>3d: morph</td>
<td>197.0</td>
<td>818.6</td>
</tr>
<tr>
<td>3d: raytrace</td>
<td>287.4</td>
<td>537.8</td>
</tr>
<tr>
<td>access: binary-trees</td>
<td>106.4</td>
<td>212.6</td>
</tr>
<tr>
<td>access: fannkuch</td>
<td>446.8</td>
<td>977.8</td>
</tr>
<tr>
<td>access: nbody</td>
<td>256.4</td>
<td>581.4</td>
</tr>
<tr>
<td>access: nsieve</td>
<td>134.2</td>
<td>584.0</td>
</tr>
<tr>
<td>bitops: 3bit-bits-in-byte</td>
<td>128.0</td>
<td>515.8</td>
</tr>
<tr>
<td>bitops: bits-in-byte</td>
<td>156.2</td>
<td>537.4</td>
</tr>
<tr>
<td>bitops: bitwise-and</td>
<td>212.4</td>
<td>450.0</td>
</tr>
<tr>
<td>bitops: nsieve-bits</td>
<td>162.6</td>
<td>819.0</td>
</tr>
<tr>
<td>control: recursive</td>
<td>146.8</td>
<td>315.2</td>
</tr>
<tr>
<td>crypto: aes</td>
<td>175.2</td>
<td>337.6</td>
</tr>
<tr>
<td>crypto: md5</td>
<td>128.4</td>
<td>475.0</td>
</tr>
<tr>
<td>crypto: sha1</td>
<td>156.0</td>
<td>518.6</td>
</tr>
<tr>
<td>date: format-tofte</td>
<td>262.6</td>
<td>390.6</td>
</tr>
<tr>
<td>date: format-xparb</td>
<td>415.6</td>
<td>672.0</td>
</tr>
<tr>
<td>math: cordic</td>
<td>271.8</td>
<td>847.0</td>
</tr>
<tr>
<td>math: partial-sums</td>
<td>287.4</td>
<td>387.6</td>
</tr>
<tr>
<td>math: spectral-norm</td>
<td>165.6</td>
<td>365.6</td>
</tr>
<tr>
<td>regexp: dna</td>
<td>334.6</td>
<td>531.2</td>
</tr>
<tr>
<td>string: base64</td>
<td>190.4</td>
<td>453.2</td>
</tr>
<tr>
<td>string: fasta</td>
<td>290.6</td>
<td>628.2</td>
</tr>
<tr>
<td>string: tagcloud</td>
<td>203.2</td>
<td>340.8</td>
</tr>
<tr>
<td>string: unpack-code</td>
<td>234.2</td>
<td>312.6</td>
</tr>
<tr>
<td>string: validate-input</td>
<td>297.0</td>
<td>437.6</td>
</tr>
</table>
<p>Here&#8217;s the raw data, if you so desire it.</p>
<pre>
Safari 3.04

============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                 13525.2ms +/- 0.6%
--------------------------------------------

  3d:                   1834.4ms +/- 4.8%
    cube:                478.0ms +/- 5.5%
    morph:               818.6ms +/- 8.8%
    raytrace:            537.8ms +/- 6.1%

  access:               2355.8ms +/- 2.1%
    binary-trees:        212.6ms +/- 17.9%
    fannkuch:            977.8ms +/- 1.1%
    nbody:               581.4ms +/- 4.4%
    nsieve:              584.0ms +/- 6.0%

  bitops:               2322.2ms +/- 2.4%
    3bit-bits-in-byte:   515.8ms +/- 2.7%
    bits-in-byte:        537.4ms +/- 5.4%
    bitwise-and:         450.0ms +/- 7.1%
    nsieve-bits:         819.0ms +/- 3.1%

  controlflow:           315.2ms +/- 12.5%
    recursive:           315.2ms +/- 12.5%

  crypto:               1331.2ms +/- 2.2%
    aes:                 337.6ms +/- 8.8%
    md5:                 475.0ms +/- 6.3%
    sha1:                518.6ms +/- 3.2%

  date:                 1062.6ms +/- 5.1%
    format-tofte:        390.6ms +/- 7.0%
    format-xparb:        672.0ms +/- 5.4%

  math:                 1600.2ms +/- 3.3%
    cordic:              847.0ms +/- 3.0%
    partial-sums:        387.6ms +/- 4.2%
    spectral-norm:       365.6ms +/- 9.8%

  regexp:                531.2ms +/- 5.8%
    dna:                 531.2ms +/- 5.8%

  string:               2172.4ms +/- 3.1%
    base64:              453.2ms +/- 6.2%
    fasta:               628.2ms +/- 5.1%
    tagcloud:            340.8ms +/- 11.7%
    unpack-code:         312.6ms +/- 10.7%
    validate-input:      437.6ms +/- 5.4%

Safari 3.1
============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  5865.4ms +/- 1.8%
--------------------------------------------

  3d:                    703.0ms +/- 11.3%
    cube:                218.6ms +/- 15.4%
    morph:               197.0ms +/- 22.7%
    raytrace:            287.4ms +/- 10.1%

  access:                943.8ms +/- 7.0%
    binary-trees:        106.4ms +/- 19.8%
    fannkuch:            446.8ms +/- 10.0%
    nbody:               256.4ms +/- 4.2%
    nsieve:              134.2ms +/- 12.8%

  bitops:                659.2ms +/- 4.4%
    3bit-bits-in-byte:   128.0ms +/- 6.5%
    bits-in-byte:        156.2ms +/- 15.3%
    bitwise-and:         212.4ms +/- 13.8%
    nsieve-bits:         162.6ms +/- 16.1%

  controlflow:           146.8ms +/- 17.9%
    recursive:           146.8ms +/- 17.9%

  crypto:                459.6ms +/- 11.7%
    aes:                 175.2ms +/- 21.4%
    md5:                 128.4ms +/- 16.3%
    sha1:                156.0ms +/- 15.1%

  date:                  678.2ms +/- 4.4%
    format-tofte:        262.6ms +/- 12.1%
    format-xparb:        415.6ms +/- 7.1%

  math:                  724.8ms +/- 7.0%
    cordic:              271.8ms +/- 10.7%
    partial-sums:        287.4ms +/- 9.0%
    spectral-norm:       165.6ms +/- 17.7%

  regexp:                334.6ms +/- 7.7%
    dna:                 334.6ms +/- 7.7%

  string:               1215.4ms +/- 4.5%
    base64:              190.4ms +/- 13.3%
    fasta:               290.6ms +/- 8.9%
    tagcloud:            203.2ms +/- 13.4%
    unpack-code:         234.2ms +/- 10.2%
    validate-input:      297.0ms +/- 9.1%
</pre>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/03/18/safari-304-vs-31-javascript-benchmarks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SunSpider</title>
		<link>http://heliologue.com/2008/01/15/sunspider/</link>
		<comments>http://heliologue.com/2008/01/15/sunspider/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 03:49:53 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://heliologue.com/blog/2008/01/15/sunspider/</guid>
		<description><![CDATA[Last December, I read Jeff Atwood&#8217;s write-up about SunSpider, a new Javascript benchmark created by the makers of WebKit/KHTML. The world of Javascript is an interesting one right now; it seems like most major browsers are on the eve of a major new release, many with new (&#38; improved JS engines). With WebKit&#8217;s porting to [...]]]></description>
			<content:encoded><![CDATA[<p>Last December, I read Jeff Atwood&#8217;s <a href="http://www.codinghorror.com/blog/archives/001023.html">write-up</a> about <a href="http://webkit.org/blog/152/announcing-sunspider-09/">SunSpider</a>, a new Javascript benchmark created by the makers of WebKit/KHTML. </p>
<p>The world of Javascript is an interesting one right now;  it seems like most major browsers are on the eve of a major new release, many with new (&amp; improved JS engines).  With WebKit&#8217;s porting to Windows in Safari (and eventually Konqueror, I imagine), yet another player has thrown his hat into the arena.  Javascript is, as Jeff rightly says, the <i>lingua franca</i> of the web:  <em>everything</em> is javascript-[based|dependent] today, and rich interfaces are now the norm, rather than a pleasant surprise.</p>
<p>As a web applications developer, I&#8217;ve banged by head against javascript and various and sundry browser implementations at work, and worried about performances, both now and in the future.  Standardizing on a common library (cf. <a href="http://jquery.com">jQuery</a>) helps, although the performance or functionality of jQuery plugins don&#8217;t always match those of home-grown counterparts.  For instance, Brian McAllister&#8217;s <a href="http://www.frequency-decoder.com/2006/09/16/unobtrusive-table-sort-script-revisited">Unobtrusive Table Sort Script</a> far outpaces the popular <a href="http://tablesorter.com">TableSorter</a> script for jQuery.  I ended up implementing the latter at work, simply because of the sheer size of tables we render, and the relative slow speed of many of ours users&#8217; browsers.</p>
<p><span id="more-1956"></span></p>
<p>Due to time constraints, I hadn&#8217;t gotten around to performing my own benchmark until today.  I don&#8217;t have any fancy (or controversial) graphs like Jeff, but here&#8217;s the data anyway, followed by the raw result text.  The first table is high-level summaries listing only the sum times for groups of test.  The second table lists all the tests.</p>
<p>Somewhat to my surprise, the much-touted improvements to Firefox 3&#8242;s javascript engine weren&#8217;t consistent across the board.  In some cases, it performed worse than 2.0.0.11.  The clear winner was Opera&#8217;s upcoming 9.5 release (codenamed &#8216;Kestrel&#8217;), followed closely by Apple&#8217;s port of the WebKit engine.  With respect to the latter, it&#8217;s clear that the WebKit/KHTML engine is a good one, though I look forward to an inevitable Konqueror port, since Safari on Windows is just about the ugliest interface I&#8217;ve ever seen.</p>
<h3>The Results</h3>
<table class="sortable rowstyle-even">
<caption>
                SunSpider 0.9 benchmarks by Group<br />
            </caption>
<thead>
<tr>
<th scope="col">
                        Benchmark
                    </th>
<th scope="col" class="sortable-numeric">
                        Firefox 2.0.0.11
                    </th>
<th scope="col" class="sortable-numeric">
                        Firefox 3.0.0 b2
                    </th>
<th scope="col" class="sortable-numeric">
                        Opera 9.5 b1
                    </th>
<th scope="col" class="sortable-numeric">
                        Safari 3.04
                    </th>
<th scope="col" class="sortable-numeric">
                        Internet Explorer 7.0
                    </th>
</tr>
</thead>
<tfoot>
<tr>
<td>
                    Total
                </td>
<td>
                    14032.0
                </td>
<td>
                    11195.2
                </td>
<td>
                    6501.0
                </td>
<td>
                    8583.4
                </td>
<td>
                    26676.8
                </td>
</tr>
<tbody>
<tr>
<td>
                        3d
                    </td>
<td>
                        1909.0
                    </td>
<td>
                        1821.2
                    </td>
<td>
                        572.0
                    </td>
<td>
                        1184.4
                    </td>
<td>
                        1212.8
                    </td>
</tr>
<tr>
<td>
                        access
                    </td>
<td>
                        1275.0
                    </td>
<td>
                        1632.4
                    </td>
<td>
                        775.4
                    </td>
<td>
                        1668.2
                    </td>
<td>
                        1731.6
                    </td>
</tr>
<tr>
<td>
                        bitops
                    </td>
<td>
                        3340.6
                    </td>
<td>
                        1759.0
                    </td>
<td>
                        803.2
                    </td>
<td>
                        1465.0
                    </td>
<td>
                        1552.8
                    </td>
</tr>
<tr>
<td>
                        controlflow
                    </td>
<td>
                        94.0
                    </td>
<td>
                        93.4
                    </td>
<td>
                        65.6
                    </td>
<td>
                        212.4
                    </td>
<td>
                        447.0
                    </td>
</tr>
<tr>
<td>
                        crypto
                    </td>
<td>
                        694.4
                    </td>
<td>
                        615.6
                    </td>
<td>
                        319.0
                    </td>
<td>
                        815.8
                    </td>
<td>
                        934.4
                    </td>
</tr>
<tr>
<td>
                        date
                    </td>
<td>
                        2049.8
                    </td>
<td>
                        628.2
                    </td>
<td>
                        734.2
                    </td>
<td>
                        621.8
                    </td>
<td>
                        796.6
                    </td>
</tr>
<tr>
<td>
                        math
                    </td>
<td>
                        1281.8
                    </td>
<td>
                        1121.8
                    </td>
<td>
                        456.0
                    </td>
<td>
                        1012.4
                    </td>
<td>
                        1075.6
                    </td>
</tr>
<tr>
<td>
                        regexp
                    </td>
<td>
                        784.2
                    </td>
<td>
                        947.0
                    </td>
<td>
                        747.0
                    </td>
<td>
                        337.6
                    </td>
<td>
                        350.0
                    </td>
</tr>
<tr>
<td>
                        string
                    </td>
<td>
                        2603.2
                    </td>
<td>
                        2576.6
                    </td>
<td>
                        2028.6
                    </td>
<td>
                        1265.8
                    </td>
<td>
                        18576.0
                    </td>
</tr>
</tbody>
</table>
<table class="sortable rowstyle-even">
<caption>
                SunSpider 0.9 benchmarks by Item<br />
            </caption>
<thead>
<tr>
<th class="sortable-text">
                        Benchmark
                    </th>
<th class="sortable-numeric">
                        Firefox 2.0.0.11
                    </th>
<th class="sortable-numeric">
                        Firefox 3.0.0 b2
                    </th>
<th class="sortable-numeric">
                        Opera 9.5 b1
                    </th>
<th class="sortable-numeric">
                        Safari 3.04
                    </th>
<th class="sortable-numeric">
                        Internet Explorer 7.0
                    </th>
</tr>
</thead>
<tfoot>
<tr>
<td>
                    Total
                </td>
<td>
                    14032.0
                </td>
<td>
                    11195.2
                </td>
<td>
                    6501.0
                </td>
<td>
                    8583.4
                </td>
<td>
                    26676.8
                </td>
</tr>
<tbody>
<tr>
<td>
                        3d-cube
                    </td>
<td>
                        531.4
                    </td>
<td>
                        543.6
                    </td>
<td>
                        162.8
                    </td>
<td>
                        353.0
                    </td>
<td>
                        334.6
                    </td>
</tr>
<tr>
<td>
                        3d-morph
                    </td>
<td>
                        1078.0
                    </td>
<td>
                        921.8
                    </td>
<td>
                        231.2
                    </td>
<td>
                        490.6
                    </td>
<td>
                        412.4
                    </td>
</tr>
<tr>
<td>
                        3d-raytrace
                    </td>
<td>
                        299.6
                    </td>
<td>
                        355.8
                    </td>
<td>
                        178.0
                    </td>
<td>
                        340.8
                    </td>
<td>
                        465.8
                    </td>
</tr>
<tr>
<td>
                        access-binary-trees
                    </td>
<td>
                        140.6
                    </td>
<td>
                        160.6
                    </td>
<td>
                        50.0
                    </td>
<td>
                        143.4
                    </td>
<td>
                        409.4
                    </td>
</tr>
<tr>
<td>
                        access-fannkuch
                    </td>
<td>
                        422.0
                    </td>
<td>
                        629.2
                    </td>
<td>
                        365.8
                    </td>
<td>
                        703.2
                    </td>
<td>
                        687.6
                    </td>
</tr>
<tr>
<td>
                        access-nbody
                    </td>
<td>
                        484.6
                    </td>
<td>
                        568.4
                    </td>
<td>
                        197.0
                    </td>
<td>
                        331.2
                    </td>
<td>
                        343.8
                    </td>
</tr>
<tr>
<td>
                        access-nsieve
                    </td>
<td>
                        227.8
                    </td>
<td>
                        274.2
                    </td>
<td>
                        162.6
                    </td>
<td>
                        490.4
                    </td>
<td>
                        290.8
                    </td>
</tr>
<tr>
<td>
                        bitops-3bit-bits-in-byte
                    </td>
<td>
                        253.2
                    </td>
<td>
                        280.8
                    </td>
<td>
                        65.6
                    </td>
<td>
                        302.8
                    </td>
<td>
                        368.8
                    </td>
</tr>
<tr>
<td>
                        bitops-bits-in-byte
                    </td>
<td>
                        256.4
                    </td>
<td>
                        286.0
                    </td>
<td>
                        97.0
                    </td>
<td>
                        387.2
                    </td>
<td>
                        387.2
                    </td>
</tr>
<tr>
<td>
                        bitops-bitwise-and
                    </td>
<td>
                        2459.4
                    </td>
<td>
                        808.0
                    </td>
<td>
                        425.0
                    </td>
<td>
                        303.0
                    </td>
<td>
                        450.2
                    </td>
</tr>
<tr>
<td>
                        bitops-nsieve-bits
                    </td>
<td>
                        371.6
                    </td>
<td>
                        384.2
                    </td>
<td>
                        215.6
                    </td>
<td>
                        472.0
                    </td>
<td>
                        346.6
                    </td>
</tr>
<tr>
<td>
                        controlflow-recursive
                    </td>
<td>
                        94.0
                    </td>
<td>
                        93.4
                    </td>
<td>
                        65.6
                    </td>
<td>
                        212.4
                    </td>
<td>
                        447.0
                    </td>
</tr>
<tr>
<td>
                        crypto-aes
                    </td>
<td>
                        215.6
                    </td>
<td>
                        276.0
                    </td>
<td>
                        153.0
                    </td>
<td>
                        218.6
                    </td>
<td>
                        343.6
                    </td>
</tr>
<tr>
<td>
                        crypto-md5
                    </td>
<td>
                        244.2
                    </td>
<td>
                        166.6
                    </td>
<td>
                        81.4
                    </td>
<td>
                        297.0
                    </td>
<td>
                        297.0
                    </td>
</tr>
<tr>
<td>
                        crypto-sha1
                    </td>
<td>
                        234.6
                    </td>
<td>
                        173.0
                    </td>
<td>
                        84.6
                    </td>
<td>
                        300.2
                    </td>
<td>
                        293.8
                    </td>
</tr>
<tr>
<td>
                        date-format-tofte
                    </td>
<td>
                        693.8
                    </td>
<td>
                        409.4
                    </td>
<td>
                        272.0
                    </td>
<td>
                        259.4
                    </td>
<td>
                        390.4
                    </td>
</tr>
<tr>
<td>
                        date-format-xparb
                    </td>
<td>
                        1356.0
                    </td>
<td>
                        218.8
                    </td>
<td>
                        462.2
                    </td>
<td>
                        362.4
                    </td>
<td>
                        406.2
                    </td>
</tr>
<tr>
<td>
                        math-cordiac
                    </td>
<td>
                        665.8
                    </td>
<td>
                        527.6
                    </td>
<td>
                        197.0
                    </td>
<td>
                        559.4
                    </td>
<td>
                        453.6
                    </td>
</tr>
<tr>
<td>
                        math-partial-sums
                    </td>
<td>
                        375.2
                    </td>
<td>
                        383.8
                    </td>
<td>
                        171.8
                    </td>
<td>
                        228.0
                    </td>
<td>
                        281.2
                    </td>
</tr>
<tr>
<td>
                        math-spectral-norm
                    </td>
<td>
                        240.8
                    </td>
<td>
                        210.4
                    </td>
<td>
                        87.2
                    </td>
<td>
                        225.0
                    </td>
<td>
                        340.8
                    </td>
</tr>
<tr>
<td>
                        regexp-dna
                    </td>
<td>
                        784.2
                    </td>
<td>
                        947.0
                    </td>
<td>
                        747.0
                    </td>
<td>
                        337.6
                    </td>
<td>
                        350.0
                    </td>
</tr>
<tr>
<td>
                        string-base64
                    </td>
<td>
                        565.8
                    </td>
<td>
                        466.4
                    </td>
<td>
                        140.8
                    </td>
<td>
                        300.0
                    </td>
<td>
                        9212.6
                    </td>
</tr>
<tr>
<td>
                        string-fasta
                    </td>
<td>
                    	415.6
                    </td>
<td>
                        443.2
                    </td>
<td>
                        390.6
                    </td>
<td>
                        297.0
                    </td>
<td>
                        438.0
                    </td>
</tr>
<tr>
<td>
                        string-tagcloud
                    </td>
<td>
                        512.4
                    </td>
<td>
                        396.8
                    </td>
<td>
                        365.8
                    </td>
<td>
                        237.6
                    </td>
<td>
                        1740.6
                    </td>
</tr>
<tr>
<td>
                        string-unpack-code
                    </td>
<td>
                        718.8
                    </td>
<td>
                        942.0
                    </td>
<td>
                        965.6
                    </td>
<td>
                        193.8
                    </td>
<td>
                        453.2
                    </td>
</tr>
<tr>
<td>
                        string-validate-input
                    </td>
<td>
                        390.6
                    </td>
<td>
                        328.2
                    </td>
<td>
                        165.8
                    </td>
<td>
                        237.4
                    </td>
<td>
                        6731.6
                    </td>
</tr>
</tbody>
</table>
<pre>
SunSpider 0.9 Benchmarks
Performed on 15 January 2007
Ben Gunnink | http://heliologue.com/

- Intel Q6600 Quad-Core
- Windows XP SP2 32-bit
- 4GB RAM

All browsers were tested with extensions and plugins disabled.

Firefox 2.0.0.11

============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                 14032.0ms +/- 2.4%
--------------------------------------------

  3d:                   1909.0ms +/- 4.1%
    cube:                531.4ms +/- 7.6%
    morph:              1078.0ms +/- 3.6%
    raytrace:            299.6ms +/- 10.8%

  access:               1275.0ms +/- 2.3%
    binary-trees:        140.6ms +/- 9.7%
    fannkuch:            422.0ms +/- 0.0%
    nbody:               484.6ms +/- 2.8%
    nsieve:              227.8ms +/- 4.6%

  bitops:               3340.6ms +/- 0.9%
    3bit-bits-in-byte:   253.2ms +/- 3.5%
    bits-in-byte:        256.4ms +/- 4.2%
    bitwise-and:        2459.4ms +/- 0.7%
    nsieve-bits:         371.6ms +/- 4.4%

  controlflow:            94.0ms +/- 0.0%
    recursive:            94.0ms +/- 0.0%

  crypto:                694.4ms +/- 5.2%
    aes:                 215.6ms +/- 7.7%
    md5:                 244.2ms +/- 7.0%
    sha1:                234.6ms +/- 6.0%

  date:                 2049.8ms +/- 0.4%
    format-tofte:        693.8ms +/- 3.1%
    format-xparb:       1356.0ms +/- 1.2%

  math:                 1281.8ms +/- 10.7%
    cordic:              665.8ms +/- 17.3%
    partial-sums:        375.2ms +/- 3.6%
    spectral-norm:       240.8ms +/- 9.2%

  regexp:                784.2ms +/- 5.4%
    dna:                 784.2ms +/- 5.4%

  string:               2603.2ms +/- 7.1%
    base64:              565.8ms +/- 3.8%
    fasta:               415.6ms +/- 4.3%
    tagcloud:            512.4ms +/- 34.7%
    unpack-code:         718.8ms +/- 7.9%
    validate-input:      390.6ms +/- 8.7%

Firefox 3.0.0 beta 2

============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                 11195.2ms +/- 5.9%
--------------------------------------------

  3d:                   1821.2ms +/- 5.4%
    cube:                543.6ms +/- 12.5%
    morph:               921.8ms +/- 2.2%
    raytrace:            355.8ms +/- 11.9%

  access:               1632.4ms +/- 8.6%
    binary-trees:        160.6ms +/- 34.5%
    fannkuch:            629.2ms +/- 8.5%
    nbody:               568.4ms +/- 6.2%
    nsieve:              274.2ms +/- 13.1%

  bitops:               1759.0ms +/- 6.6%
    3bit-bits-in-byte:   280.8ms +/- 12.8%
    bits-in-byte:        286.0ms +/- 8.8%
    bitwise-and:         808.0ms +/- 5.1%
    nsieve-bits:         384.2ms +/- 9.8%

  controlflow:            93.4ms +/- 27.3%
    recursive:            93.4ms +/- 27.3%

  crypto:                615.6ms +/- 3.2%
    aes:                 276.0ms +/- 6.3%
    md5:                 166.6ms +/- 6.2%
    sha1:                173.0ms +/- 5.5%

  date:                  628.2ms +/- 4.4%
    format-tofte:        409.4ms +/- 3.7%
    format-xparb:        218.8ms +/- 8.1%

  math:                 1121.8ms +/- 3.8%
    cordic:              527.6ms +/- 3.8%
    partial-sums:        383.8ms +/- 4.0%
    spectral-norm:       210.4ms +/- 6.4%

  regexp:                947.0ms +/- 57.3%
    dna:                 947.0ms +/- 57.3%

  string:               2576.6ms +/- 14.3%
    base64:              466.4ms +/- 5.7%
    fasta:               443.2ms +/- 10.0%
    tagcloud:            396.8ms +/- 10.0%
    unpack-code:         942.0ms +/- 35.9%
    validate-input:      328.2ms +/- 8.9%

Internet Explorer 7.0.5730.13

============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  26676.8ms +/- 0.8%
--------------------------------------------

  3d:                    1212.8ms +/- 2.4%
    cube:                 334.6ms +/- 5.3%
    morph:                412.4ms +/- 2.6%
    raytrace:             465.8ms +/- 1.8%

  access:                1731.6ms +/- 1.0%
    binary-trees:         409.4ms +/- 2.1%
    fannkuch:             687.6ms +/- 0.1%
    nbody:                343.8ms +/- 0.2%
    nsieve:               290.8ms +/- 3.6%

  bitops:                1552.8ms +/- 1.7%
    3bit-bits-in-byte:    368.8ms +/- 2.9%
    bits-in-byte:         387.2ms +/- 2.2%
    bitwise-and:          450.2ms +/- 1.9%
    nsieve-bits:          346.6ms +/- 2.7%

  controlflow:            447.0ms +/- 2.4%
    recursive:            447.0ms +/- 2.4%

  crypto:                 934.4ms +/- 0.9%
    aes:                  343.6ms +/- 0.2%
    md5:                  297.0ms +/- 0.0%
    sha1:                 293.8ms +/- 3.0%

  date:                   796.6ms +/- 2.9%
    format-tofte:         390.4ms +/- 3.5%
    format-xparb:         406.2ms +/- 3.4%

  math:                  1075.6ms +/- 0.9%
    cordic:               453.6ms +/- 0.2%
    partial-sums:         281.2ms +/- 0.2%
    spectral-norm:        340.8ms +/- 2.6%

  regexp:                 350.0ms +/- 5.0%
    dna:                  350.0ms +/- 5.0%

  string:               18576.0ms +/- 0.9%
    base64:              9212.6ms +/- 0.4%
    fasta:                438.0ms +/- 0.0%
    tagcloud:            1740.6ms +/- 5.7%
    unpack-code:          453.2ms +/- 0.1%
    validate-input:      6731.6ms +/- 1.2%

Safari 3.04 beta

============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  8583.4ms +/- 1.7%
--------------------------------------------

  3d:                   1184.4ms +/- 4.6%
    cube:                353.0ms +/- 3.1%
    morph:               490.6ms +/- 5.2%
    raytrace:            340.8ms +/- 6.4%

  access:               1668.2ms +/- 2.5%
    binary-trees:        143.4ms +/- 6.1%
    fannkuch:            703.2ms +/- 0.1%
    nbody:               331.2ms +/- 2.5%
    nsieve:              490.4ms +/- 7.7%

  bitops:               1465.0ms +/- 2.0%
    3bit-bits-in-byte:   302.8ms +/- 5.8%
    bits-in-byte:        387.2ms +/- 2.2%
    bitwise-and:         303.0ms +/- 3.6%
    nsieve-bits:         472.0ms +/- 1.9%

  controlflow:           212.4ms +/- 5.0%
    recursive:           212.4ms +/- 5.0%

  crypto:                815.8ms +/- 3.1%
    aes:                 218.6ms +/- 10.9%
    md5:                 297.0ms +/- 0.0%
    sha1:                300.2ms +/- 3.0%

  date:                  621.8ms +/- 3.5%
    format-tofte:        259.4ms +/- 4.1%
    format-xparb:        362.4ms +/- 4.6%

  math:                 1012.4ms +/- 1.6%
    cordic:              559.4ms +/- 1.5%
    partial-sums:        228.0ms +/- 5.0%
    spectral-norm:       225.0ms +/- 5.0%

  regexp:                337.6ms +/- 3.2%
    dna:                 337.6ms +/- 3.2%

  string:               1265.8ms +/- 2.2%
    base64:              300.0ms +/- 2.8%
    fasta:               297.0ms +/- 4.7%
    tagcloud:            237.6ms +/- 6.8%
    unpack-code:         193.8ms +/- 5.4%
    validate-input:      237.4ms +/- 3.7%

Opera 9.5 beta 1 (build 9613)

============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  6501.0ms +/- 1.2%
--------------------------------------------

  3d:                    572.0ms +/- 2.9%
    cube:                162.8ms +/- 6.4%
    morph:               231.2ms +/- 3.7%
    raytrace:            178.0ms +/- 5.7%

  access:                775.4ms +/- 2.8%
    binary-trees:         50.0ms +/- 16.7%
    fannkuch:            365.8ms +/- 2.9%
    nbody:               197.0ms +/- 5.5%
    nsieve:              162.6ms +/- 6.6%

  bitops:                803.2ms +/- 5.6%
    3bit-bits-in-byte:    65.6ms +/- 13.2%
    bits-in-byte:         97.0ms +/- 8.6%
    bitwise-and:         425.0ms +/- 6.0%
    nsieve-bits:         215.6ms +/- 4.1%

  controlflow:            65.6ms +/- 14.2%
    recursive:            65.6ms +/- 14.2%

  crypto:                319.0ms +/- 7.0%
    aes:                 153.0ms +/- 5.9%
    md5:                  81.4ms +/- 10.8%
    sha1:                 84.6ms +/- 12.6%

  date:                  734.2ms +/- 1.9%
    format-tofte:        272.0ms +/- 4.0%
    format-xparb:        462.2ms +/- 3.7%

  math:                  456.0ms +/- 3.4%
    cordic:              197.0ms +/- 5.5%
    partial-sums:        171.8ms +/- 0.3%
    spectral-norm:        87.2ms +/- 12.0%

  regexp:                747.0ms +/- 2.2%
    dna:                 747.0ms +/- 2.2%

  string:               2028.6ms +/- 2.9%
    base64:              140.8ms +/- 10.0%
    fasta:               390.6ms +/- 6.1%
    tagcloud:            365.8ms +/- 8.0%
    unpack-code:         965.6ms +/- 1.7%
    validate-input:      165.8ms +/- 6.4%
</pre>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/01/15/sunspider/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Various and sundry technology stuff pertaining to work</title>
		<link>http://heliologue.com/2007/12/08/various-and-sundry-technology-stuff-pertaining-to-work/</link>
		<comments>http://heliologue.com/2007/12/08/various-and-sundry-technology-stuff-pertaining-to-work/#comments</comments>
		<pubDate>Sat, 08 Dec 2007 07:38:25 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://heliologue.com/blog/2007/12/08/various-and-sundry-technology-stuff-pertaining-to-work/</guid>
		<description><![CDATA[I don&#8217;t usually talk about work on this blog, simply because I&#8217;ve read enough horror stories about blogging work matters to know how badly it ends. Granted, if I were to blog about my job, it would mostly consist of technology bits, but it&#8217;s still one of those grey areas I avoid out of propriety. [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t usually talk about work on this blog, simply because I&#8217;ve read enough horror stories about blogging work matters to know how badly it ends.  Granted, if I were to blog about my job, it would mostly consist of technology bits, but it&#8217;s still one of those grey areas I avoid out of propriety.</p>
<p>Yet, I find myself at home, with a <a href="http://en.wikipedia.org/wiki/White_Russian_(cocktail)">White Russian</a> and the urge to opine.</p>
<p><span id="more-1941"></span></p>
<h3>The Background</h3>
<p>In the summer of 2006, my workplace (<a href="http://www.stfrancis.edu">The University of St. Francis</a>, my alma mater) went live with a portal.  For the previous year and half, when I was a student worker, we&#8217;d been working desperately to implement <a href="http://portalcenter.oracle.com/">Oracle Portal</a>.  At a conference that summer, my boss, Tim, heard about <a href="http://uportal.org">uPortal</a>, an open-source J2EE portal.  On the <a href="http://heliologue.com/2006/06/30/the-conference-day-iii/">ride back from Ohio</a>, we more or less decided to try it on a lark.  It&#8217;s basic ease of setup let us switch to uPortal and go live in 6 weeks.  That&#8217;s right, a production-ready portal in 6 weeks.  </p>
<p>Much of the work in that time was tying <a href="http://www.ja-sig.org/products/cas/">CAS</a> into our LDAP implementation (Novell&#8217;s eDirectory), customizing the view (props to Virginia Tech for their excellent <a href="http://my.vt.edu/content/myvt3/myvt/tour-uportal/">Tab-Column customization</a>), and writing some basic portlets to allow quick views into student data:  schedule, personal info, billing, &amp;c.  We&#8217;re a Banner school, so we could basically just reach into our Oracle database and pull the data we needed.</p>
<h3>The Cool Bits</h3>
<p>Since that time, we&#8217;ve poured a tremendous amount of energy into the portal, as it&#8217;s become our go-to spot for finding information and getting things done.  Actually, we&#8217;ve spent very little time on uPortal at all, as it already contains much of the quick-view functionality we want.  Much of what we do is a custom extension to the portal that transparently shares session data via CAS.  </p>
<blockquote title="A brief overview of our functionality, as noted by my boss">
<p>We have completed our portal rollout using uPortal (running on apache/tomcat), and are integrated with Sungard Banner 7.x for much of the information we pull and display, and we are using Novell E-Directory for our directory.</p>
<p>We used uPortal which proved to be a much more promising and easier to use platform than Oracle portal. Within 6 weeks we had our first production portal deployment. Over the last year we have built and put the following into production:</p>
<ul>
<li>Student Schedule and Grades Display (pulled realtime from Banner)</li>
<li>WebCT Integration/SSO</li>
<li>Announcements (Targeted coming by end of summer &#8217;07)</li>
<li>SSO to Novell WebMail, Netstorage, and Banner Self Serve</li>
<li>Bookstore Integration with Barnes and Noble (Shopping cart of books)</li>
<li>Financial Aid Portlet/Accept Loans &#8211; Display and update banner data</li>
<li>Tuition Bill Portlet &#8211; Pulled in realtime from Banner AR</li>
<li>Payment of Tuition Bill/Post Directly to Banner AR</li>
<li>My Profile Portlet (information pulled realtime from Banner)</li>
<li>GPA/Credit Hours Portlet (Pulled realtime from banner)</li>
<li>Banner Security Question/Reset Password Functionality</li>
<li>Expired Password Functionality</li>
<li>Faculty Schedule/Class Rosters/Email Class, Export to Excel</li>
<li>Banner Survey Integration</li>
<li>HR Leave Balances</li>
<li>Budget Reporting/Financial Activity/View Documents, checks cut, etc</li>
<li>Banner Requisition Approval</li>
<li>Web Based University Income/P&#038;L Statement</li>
<li>Banner Finance Journal Voucher Upload</li>
<li>PIDM Usage Utility to help identify and resolve duplicate pidms</li>
<li>EZProxy/Library Databases Integration</li>
<li>Advancement Constituent Profiles</li>
<li>Advancement Fundraising Activity Reports</li>
<li>Advancement Constituent Contacts Data Entry/Reminders</li>
<li>Financial Aid targeted messages</li>
<li>GUAMESG</li>
<li>Residence Life View your Room/Roomates</li>
<li>Bulletin Boards (phpBB)</li>
<li>VT Calendar</li>
<li>Various Web based Reports</li>
<li>E-Directory Integration/Account Creation</li>
<li>Early alert and midterm warning submission, that allows the student, advisor, registrar, athletic coaches, and other support staff know when a student is having academic difficulties.</li>
<li>An online advising center. Advisors can now see all of their advisees, look at who&#8217;s registered, view issues with the students account such as registration or medical holds, etc. The goal is so that advisors can also help the students get their issues resolved.</li>
<li>Our initial stab at targeted announcements is done. We can now target based on the student type, level, or college as currently stored in the Banner ERP, as well as target to only employees or faculty members. The framework is in place to target off of any data element stored in Banner. Now we just need to expand our GUI allowing users to target messages.</li>
<li>Accounts Receivable Reporting Suite &#8211; Our finance office now uses the portal to do various AR reporting tasks, drilling into student details, etc.</li>
<li>Enrollment/Registration Status Reports &#8211; Various members of the university can now easily look at the overall student registration status through the portal.</li>
<li>A faculty attendance tracking module for faculty to electronically submit the attendance of students in their classes at the beginning of term and at the mid-term point. This helps the registrar and financial aid determine who is actually attending, and replaces an old paper based process.</li>
<li>On online Student Check-In procedure. Students can now confirm their class schedules, financial aid, and pay their bill through an easy to use &#8220;wizard&#8221; interface. The system will notify when they need to perform the electronic check in process before the start of the term, and then walks them through the process. This helps to collect payments sooner and determine which students are actually going to show up to class on day 1.</li>
<li>Our portal now has a targeted messaging facility which looks at business rules and notifies the students of issues or action items related to their student records. For example, if a student has holds on their account the system will tell them, show them the hold, tell them what it prevents them from doing, and who to contact to resolve the hold. For students with incomplete medical records they are notified, and shown which parts of their medical records are incomplete (and for our nursing program, which shots, etc they need to have on file to be able to attend clinicals).</li>
<li>A co-curricular transcript which pulls from Banner all the clubs, organizations, and sports a student has been a member of during their time at the university, and shows them in a nicely formatted page that they can print.</li>
<li>A real-time registration status dashboard for administrators, deans, and faculty members. This dashboard now shows the head counts, course registration counts, credit hours, and billing hours generated for registered students, and the number of potential students who are left to register. It breaks the summary counts down in several ways: by college, major, advisor, or level (graduate, undergrad, etc). The users can drill into this report and extract lists of students who still need to get registered, whom to call to see if they need advising help or assistance registering, etc.</li>
</ul>
</blockquote>
<p>As the UI architect for the portal extension, I decided this past summer to standardise on <a href="http://jquery.com">jQuery</a>, and certainly haven&#8217;t regretted it.  The only bad thing about javascript is that it becomes easy to rely on it for things which should really be controlled server-side.  Important validation checks, for instance.   Since our ERP system has certain business logic which it enforces on the database level, we usually do two checks for important data:  one (javascript) for the user&#8217;s sake, and one (servlet) for ours.</p>
<p>It got to the point where we were loading 10 different jQuery javascripts and 2 stylesheets in our header.  Most of the javascripts were either <a href="http://dean.edwards.name/packer/">packed</a> or uncompressed (if packing broke them), and totaled about 200Kb.  Not only was this too much, but the <code>eval()</code> caused a delay for each script.  Recently, after one of our rollouts to production, when I got more leeway to play, I completely upgraded our script layout.  I&#8217;m not going to provide an apples-to-apples comparison table here, since the prior configuration was a hodgepodge, but after <a href="http://developer.yahoo.com/yui/compressor/">minifying</a> and turning on server-side compression for javascripts and stylesheets, I managed to reduce the load from 200Kb in 12 requests to about 50Kb in 5 requests.  According to <a href="http://www.julienlecomte.net/blog/2007/08/13/">Julien Lecomte</a>, running mod_deflate on a minified (but no obfuscated) javascript yields the lowest file size;  regardless of how often that&#8217;s true, I like the idea of avoid latency from the <code>eval()</code>.  A lot of our users are still on IE6, and they take some pretty big performance hits.</p>
<p>Goodness knows there&#8217;s more I could do, but given the nature of our portal (single-image CSS layouts, anyone?), it wouldn&#8217;t be a productive use of our time);  I have enough crap to do with counting pixels.</p>
<h3>jQuery rocks my socks</h3>
<p>I might take a moment here to say just how much I love jQuery.  For those of you who don&#8217;t know, jQuery is a javascript framework which abstracts a lot of functions into a much more easily-written manner.  In the past, I&#8217;ve sort of been a Copy &amp; Paste javascript programmer, since it&#8217;s been easier to use some free script than to write one&#8217;s own code.  jQuery and it&#8217;s vast array (har!) of plugins makes it easy to implement or write new code.  For instance, if we want to implement a support for CSS hover effects in IE, all we do is this:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">$<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;input:text,input:password,textarea&quot;</span><span style="color: #00AA00;">&#41;</span>.focus<span style="color: #00AA00;">&#40;</span>function<span style="color: #00AA00;">&#40;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #00AA00;">&#123;</span>
     $<span style="color: #00AA00;">&#40;</span>this<span style="color: #00AA00;">&#41;</span>.addClass<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;focused&quot;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
&nbsp;
$<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;input:text,input:password,textarea&quot;</span><span style="color: #00AA00;">&#41;</span>.blur<span style="color: #00AA00;">&#40;</span>function<span style="color: #00AA00;">&#40;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #00AA00;">&#123;</span>
     $<span style="color: #00AA00;">&#40;</span>this<span style="color: #00AA00;">&#41;</span>.removeClass<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;focused&quot;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span></pre></div></div>

<p>Easy as pie.</p>
<p>Granted, there are a lot of frameworks to choose from.  Originally, there was only <a href="http://">Prototype</a>;  now there&#8217;s also jQuery, <a href="http://dojotoolkit.org/">Dojo</a>, <a href="http://developer.yahoo.com/yui/">YUI</a>, <a href="http://mootools.net/">Mootools</a>, <a href="http://openrico.org/">Rico</a>, and any one of a number of others.  </p>
<p>The one I wanted to talk about in this post in particular is <a href="http://extjs.com/">ExtJS</a>, which was originally an extension of the YUI framework, but which eventually split off into its own project.  It recently went 2.0, and boasts some rather impressive <a href="http://extjs.com/deploy/dev/examples/">demos</a>.  I marvel at the Vista-like UI, which, admittedly, is very slick.</p>
<p>But the more I look at ExtJS, and half-heartedly consider its possible deployment within our portal, the less enthused I become.  ExtJS&#8217;s grid, for instance, doesn&#8217;t even function on existing HTML table markup:  you mass it an array of data as a javascript variable, and it creates markup on the fly&#8230; a <em>lot</em> of markup, in order to create it&#8217;s slick Office 2007 interface.  While this is <em>good</em> insofar as it manages to completely abstract data from presentation, I&#8217;m not sure how much I <em>like</em> the idea, since it <strong>(1)</strong> relegates users to the script default without heavy customization, and <strong>(2)</strong> doesn&#8217;t allow for any kind of fallback mechanism if the javascript should fail or the user has it disabled.  Our table-sorting function, in a case like that, doesn&#8217;t at all prevent the table markup and data itself from being rendered.</p>
<p>Work can be fun sometimes.</p>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2007/12/08/various-and-sundry-technology-stuff-pertaining-to-work/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Blockquote Metadata Extraction &#8211; now in plugin form</title>
		<link>http://heliologue.com/2007/11/05/blockquote-metadata-extraction-now-in-plugin-form/</link>
		<comments>http://heliologue.com/2007/11/05/blockquote-metadata-extraction-now-in-plugin-form/#comments</comments>
		<pubDate>Mon, 05 Nov 2007 22:31:00 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://heliologue.com/blog/2007/11/05/blockquote-metadata-extraction-now-in-plugin-form/</guid>
		<description><![CDATA[Two months ago, I wrote about using the jQuery library to extract citation information from blockquotes. Just for grins, I&#8217;ve worked that snippet of code up into a genuine jQuery plugin. Go ahead and visit the page for more information. Or, download it directly. Download Blockquote Extract (Version 1.3) Blockquote Extract has been downloaded 657 [...]]]></description>
			<content:encoded><![CDATA[<p>Two months ago, I wrote about using the <a href="http://jquery.com">jQuery</a> library to <a href="http://heliologue.com/2007/09/18/using-jquery-to-extract-blockquote-metadata/">extract citation information from blockquotes</a>.</p>
<p>Just for grins, I&#8217;ve worked that snippet of code up into a genuine jQuery plugin.  Go ahead and <a href="http://heliologue.com/projects/blockquote-metadata-extractor/">visit the page</a> for more information.   Or, download it directly.  </p>

			<div class="download-link">
				<h4>
					<a href="http://heliologue.com/wp-content/plugins/downloads.php?file=blockquote-extract%2Ffiles%2F1.3%2Fblockquote-extract.zip&amp;name=blockquote-extract">Download Blockquote Extract (Version 1.3)</a>
				</h4>
				<p>Blockquote Extract has been downloaded <strong>657</strong> times.</p>
			</div>
			
<p>MIT license.</p>
]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2007/11/05/blockquote-metadata-extraction-now-in-plugin-form/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

