<?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; jquery</title>
	<atom:link href="http://heliologue.com/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://heliologue.com</link>
	<description></description>
	<lastBuildDate>Thu, 29 Jul 2010 18:05:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Conspicuous Absence</title>
		<link>http://heliologue.com/2009/01/19/conspicuous-absence/</link>
		<comments>http://heliologue.com/2009/01/19/conspicuous-absence/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 04:51:50 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=3552</guid>
		<description><![CDATA[It&#8217;s more than halfway through January, and I&#8217;ve made pitifully few posts. I&#8217;ve only one book in my meme so far (though, in my defense, I&#8217;m currently reading five books, with a sixth to be added soon). It&#8217;s a cop-out, I realize, but I&#8217;ve been terribly busy lately. This previous week was my fiance&#8217;s last [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s more than halfway through January, and I&#8217;ve made pitifully few posts.   I&#8217;ve only one book in my meme so far (though, in my defense, I&#8217;m currently reading five books, with a sixth to be added soon).</p>
<p>It&#8217;s a cop-out, I realize, but I&#8217;ve been terribly busy lately.  This previous week was my fiance&#8217;s last in town before heading back to Macomb (home of Western Illinois University, a three-hour drive, and a soul-sucking morass of small-town irrelevance);  in addition, I&#8217;ve been in the throes of house-hunting, in an effort to capitalize on the currently-depressed real estate market.  Sadly, it seems, my buying a house will not come to pass until late summer, when my lease expires:  my landlord, despite having no such verbiage in the lease I signed, decided that early termination of a lease would run me $2,500.</p>
<p>On the educational front, I&#8217;ve started two more grad school classes;  both need books this time.  I&#8217;ve managed to cut the cost of one of them from $200 to $100 by buying an electronic format.  The other, I&#8217;m not sure about yet.  The classes are a heaping of additional deadlines among the many I already deal with.  Not that I&#8217;m complaining;  two online classes is hardly a strenuous life, but I currently like the capacity for very much patience.</p>
<p>My immediate boss at work (not just manager, but technical expert, as well), recently became a father, and has been out for a week and a half.  It&#8217;s amazing how many support issues trickle down when he&#8217;s not there to catch them:  mostly it&#8217;s simple user mistakes, but sometimes its seriously issues with recent upgrades that require more time than I&#8217;d like.  In my spare(!) time, I&#8217;ve been alternating between managing our new hire (who, in turn, is managing the new student worker), and doing some initial codebase cleanup for a new SVN branch I&#8217;m going to make which will eventually become our new redesigned and unified portal.</p>
<p><a href="http://jquery.com">jQuery</a>, the javascript library on which we&#8217;ve standardized, released v1.3 last week.  I hadn&#8217;t intended upon switching so early (to avoid any bugs), but the new release of jQuery UI 1.6, which requires jQuery 1.3, may force that issue.  Then, too, I&#8217;ve noticed a lot of performance issues and IE6 bugs with the release candidates of 1.6, and so we may not do much with them after all.</p>
<p>Some of the work I&#8217;ve been doing is trying to find a decent modal window solution for our portal.  We use them in several places;  generally, it&#8217;s pseudo-replacements for <code>confirm()</code> and <code>alert()</code>, but sometimes they serve as genuine subpages for additional data input.  Our currently codebase, which has been developing since June 2007, contains a mix of <a href="http://dev.iceburg.net/jquery/jqModal/">jqModal</a> and <a href="http://malsup.com/jquery/block/">BlockUI</a>.  I looked into the new jQuery UI Dialog component, but it was too bulky, buggy, and didn&#8217;t quite have the robust API I was looking for.  Perhaps in a version or two&#8230;</p>
<p>jqModal is quick (performance-wise), but its implementation bothers me.  The plugin I&#8217;ve come to enjoy as of late is <a href="http://onehackoranother.com/projects/jquery/boxy/">boxy</a>, which apes the look and feel of <a href="http://famspam.com/facebox">Facebox</a> (which in turn apes the look and feel of Facebook&#8217;s modal script), but which comes with a much better API, I think.  It&#8217;s got built-in methods for <code>alert()</code> and <code>confirm()</code>, as well as a few others, and is relatively fast.  My only worry is that the API still isn&#8217;t stable (current git branches break existing invocations) and that it has no good way to set position or dimensions.</p>
<p>My goal, however, is to do some cleanup on the existing codebase, abstracting wherever possible, while designing the logic for the application redesign.  I would prefer <em>not</em> to do a general redesign and then have to spend weeks upon weeks fixing cruft and broken hacks wherever they exist in our codebase (which, as of mid-January, stands at about 110,449 <abbr title="Lines of Code">LOC</abbr>).</p>
<p>This is all a long and circumlocutory way of saying that I hope posting will pick up soon and I can gain some ground not only on my book meme, but on posting in general. </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2009/01/19/conspicuous-absence/feed/</wfw:commentRss>
		<slash:comments>5</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[Internet Explorer]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[css]]></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>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/09/22/using-yui-compressor-in-a-web-project/feed/</wfw:commentRss>
		<slash:comments>3</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>
<!-- PHP 5.x -->]]></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>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>
<!-- PHP 5.x -->]]></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>Adventures in California</title>
		<link>http://heliologue.com/2008/04/17/adventures-in-california/</link>
		<comments>http://heliologue.com/2008/04/17/adventures-in-california/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 18:59:46 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://heliologue.com/?p=2040</guid>
		<description><![CDATA[I write today safely back in the Midwest after spending about 5 days in Anaheim, California (for which see my previous post). My purpose in California was the annual Sungard Summit, a very large gathering of customers of Sungard Higher Education, mostly Banner users. It&#8217;s a markedly different kind of conference than the ones I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I write today safely back in the Midwest after spending about 5 days in Anaheim, California (for which see my <a href="http://heliologue.com/2008/04/13/anaheim-and-other-larks/">previous post</a>).  My purpose in California was the annual <a href="http://sungardsummit.com/summit2008/index.html">Sungard Summit</a>, a very large gathering of customers of Sungard Higher Education, mostly Banner users.  It&#8217;s a markedly different kind of conference than the ones I&#8217;ve historically been to, which consisted mostly of people trying to get a particular product to work.  Most of the schools at Sungard already <em>have</em> the product working, and so it really was a sort of brain trust, and interesting in a lot of ways.</p>
<p><span id="more-2040"></span></p>
<h3>A (possibly boring) section about institutional technology</h3>
<p>As an application developer, I&#8217;m generally interested in building frontends to things;  by contrast, a lot of sessions at Summit consisted of processes and user-focused talks.  I stayed mostly inside the &#8220;Technical&#8221; track, which did include some cool things.  <a href="http://www.bridgew.edu/">Bridgewater College</a> had done some alterations to make secondary PINs (used for student self-registration) transparent to students;  faculty could turn such self-registration on or off with a single click in a web panel.  Also, the presenter had an absolutely wonderful Boston accent, pronouncing &#8220;vanilla&#8221; as &#8220;vaniller,&#8221; which thrilled me to no end.</p>
<p>As an institution that has built a <em>lot</em> of custom web applications outside the purview of Banner&#8217;s web engine (Self Service / WebTailor), we&#8217;re always looking for good ideas from other institutions that have done the same.  Unfortunately, those institutions are few and far between.  I did go to one session about forecasting class demand in which the school had built a reporting system in PHP, and they used <a href="http://jquery.com">jQuery</a>.  I&#8217;m always surprised there&#8217;s so little custom application writing;  it&#8217;s not as though using the WebTailor piece to make Self Serve screens is particular nice or elegant.  I find it much easier, once you have a simple data access framework, to do it yourself.  That&#8217;s why my university&#8217;s been able to get so many reports, services, and other screens into our portal.</p>
<h3>Peripheral anecdotes not having to do with technology <i>per se</i></h3>
<h4>Victuals</h4>
<p>But the conference only lasted from 8-5 every day, leaving the surplus time free to cavort with my colleagues around Anaheim.  I say &#8220;cavort,&#8221; but what I really mean it &#8220;walk slowly, and stop often for cocktails.&#8221;  I&#8217;ve said before that the immediate surrounding area was almost nothing but hotels and Disneyland, meaning that just about everything in Anaheim, including restaurants, was out of our range.  There were a few restaurants in the vicinity, however.  On Saturday, we ate at the Overland Stage, a somewhat pretentious place whose subtitle included &#8220;BBQ Company.&#8221;   Our waitress was hesitant to bring us additional chips and salsa when asked, claiming that it would ruin our dinner;  as it happens, she forgot to put my order in anyway, which was probably for the best, since when it finally did come, it had as much flavor as chewing on a sock.</p>
<p>On Sunday, we ate at the Cheesecake Factory (our attempt to dine somewhere local was aborted when it was discovered that the real distance was much farther than the map indicated), which was a veritable comedy of errors.  When our promised patio table, at &#8220;15 to 30 minutes&#8221; took about 45, apparently because they forgot about us, we should have known it was a harbinger of things to come.  To date, we don&#8217;t really know what caused it all, but our drinks took about 30 minutes, apparently because they were made and set off to the side and promptly ignored (they were eventually comped).  Our food came in fits and starts, with a turkey club sandwich never coming at all.  Our waitress, who, it must said, was very nice, kept apologizing and saying that this sort of thing never happened at the Cheesecake Factory, though it&#8217;s been my experience that any location besides the rather ugly one in downtown Chicago tends to be subpar.</p>
<p>On Monday, the company hosting the conference sponsored a trip to <a href="http://www.knotts.com/">Knott&#8217;s Berry Farm</a>, which interests me about as much as colorectal surgery;  I gave my ticket to someone from my group who didn&#8217;t have one, and stayed in my hotel room, savoring a bit of isolation and the chance to do some work on my laptop and read my book.  I&#8217;m told I missed a good time, but mostly people just looked exhausted and sore the next day from the g-force and copious amounts of beer.  I have no regrets.</p>
<p>Tuesday night, a subset of my group walked the half-mile or so to Buca de Beppo&#8217;s, one of a chain of family-style Italian restaurants, and stuffed ourselves to the gills with pasta, waddling back to the hotel surprisingly early.  We stopped at the lobby bar of the Sheraton and had cocktails—I thoroughly enjoyed my Manhattan—while everyone sank into the lounge chairs and imagined, wearily, that they could magically be home again, or at least in bed.  Personally, I was doing OK, having relaxed considerably more the previous night, but the bourbon and cream sherry accelerated me to sleep.</p>
<h4>Motivation</h4>
<p>Summits always have at least two big speakers bookending the conference.  This year, the opening address was given by <a href="http://en.wikipedia.org/wiki/Erik_Weihenmayer">Erik Weihenmayer</a>, a blind man who has achieved the summit of the highest peak on each of the <a href="http://en.wikipedia.org/wiki/Seven_Summits">seven continents</a>.  Yes, that&#8217;s as delightfully absurd as it sounds.  I&#8217;m also happy to report that he was actually a very good speaker as well, with a dry, self-deprecating kind of wit.  The man&#8217;s very presence is humbling, since he more or less automatically puts all of your achievements to shame.</p>
<p>The second speaker, more lightly attended since it was 8:00am on the last day of the conference, was <a href="http://www.healingdoc.com/">Carl Hammerschlag</a>.  I was less impressed with him, since, although he made very valid points, tended dangerously close to hokey in his &#8220;Mind Body Spirit&#8221; mantra, which he tries to validate immediately by telling the story of an Indian medicine man he once treated.  Sorry, but I just don&#8217;t feel all warm and fuzzy at such <cite>Chicken Soup for the Soul</cite> kind of pabulum.</p>
<p>But that is neither here nor there.</p>
<h3>Introspection</h3>
<p>Melancholy fills my head with short stories.  On a plane, deep in my own thoughts, I watch the clouds grow a deep red below, and finally thin out to reveal the expansive grid of Chicago lit beneath us, a bustling Lite Brite, pulsing with late traffic.  To me, there&#8217;s nothing quite like staring out the window of a plane at the land below;  nothing so utterly ravishes one&#8217;s sense of proportion as realizing one green speck is a baseballs stadium;  a hairsbreadth of grey is some major highway crossing the California desert; that the endless expanse of Pacific blue is some small fraction of a whole.  At 31&#8217;000 feet, there&#8217;s a persistent grey strip, seemingly thin as a pencil, that separates the sky&#8217;s blue from the seedy grey-white of the clouds below.</p>
<p>I watched an invisible sun slowly cede, blurring the boundaries of the horizon, as I thought about my travels; my desire for home, for sleep, for better coffee.  Eventually all the distinctions I draw, however carefully, are smeared and vanished in low light.  In the seemingly interminable distance between genesis and exodus, radix and terminus, participant and celebrant, attendee and refugee, I belong to neither part of either world, carrying my own time and space with me.  These things ask such capacity of me, an accidental tourist, that I groan to accommodate, and yet the transition happens unbidden, somehow, quietly in a wedge of rarefied time like alarm clocks and takeoffs and the enormous, strange silence of a dark hotel room; in a pocket of space at an equally interminable distance between my hands and my heart.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2008/04/17/adventures-in-california/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[Firefox]]></category>
		<category><![CDATA[browsers]]></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>
<!-- PHP 5.x -->]]></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[Java]]></category>
		<category><![CDATA[css]]></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>
<!-- PHP 5.x -->]]></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>A Modest Construct v2.0:  Hooloovoo</title>
		<link>http://heliologue.com/2007/11/13/a-modest-construct-v20-hooloovoo/</link>
		<comments>http://heliologue.com/2007/11/13/a-modest-construct-v20-hooloovoo/#comments</comments>
		<pubDate>Tue, 13 Nov 2007 20:31:04 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[science fiction]]></category>
		<category><![CDATA[site updates]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://heliologue.com/blog/2007/11/13/a-modest-construct-v20-hooloovoo/</guid>
		<description><![CDATA[Last week, I finally went live with a new design that I&#8217;ve been toying with for this blog. It sort of grew organically out of a few failures that I&#8217;d played with on and off for the last few months. After looking at a lot of available themes, I decided to more or less write [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, I finally went live with a new design that I&#8217;ve been toying with for this blog.  It sort of grew organically out of a few failures that I&#8217;d played with on and off for the last few months.  After looking at a lot of available themes, I decided to more or less write my own from scratch.  I&#8217;ve codenamed this new design &#8220;Hooloovoo,&#8221; which some of you will probably get (and those who don&#8217;t can just as easily Google it).</p>
<p>As I <a href="http://heliologue.com/2007/11/02/friday-random-ten-cxxx/#comment-129118">said</a> in a previous comment, the problem with having content about a new theme is that it won&#8217;t be relevant when the theme goes away or changes.  So this post is to both exhibit and archive this theme so that there is some record of it.</p>
<div class="gallery">
<h4>Hooloovoo</h4>
<p><a href="http://heliologue.com/img/albums/hooloovoo/main.png" title="Hooloovoo main page" rel="lightbox[hooloovoo]"><img src="http://heliologue.com/img/albums/hooloovoo/main_thumb.png" alt="Hooloovoo main page" /></a></p>
<div id="hooloovoo" class="gallery-hidden">
<a href="http://heliologue.com/img/albums/hooloovoo/menu.png" title="Hooloovoo menu" rel="lightbox[hooloovoo]"><img src="http://heliologue.com/img/albums/hooloovoo/menu_thumb.png" alt="Hooloovoo menu" /></a></p>
<p><a href="http://heliologue.com/img/albums/hooloovoo/meta.png" title="Hooloovoo post metadata" rel="lightbox[hooloovoo]"><img src="http://heliologue.com/img/albums/hooloovoo/meta_thumb.png" alt="Hooloovoo post metadata" /></a></p>
<p><a href="http://heliologue.com/img/albums/hooloovoo/comments.png" title="Hooloovoo comments" rel="lightbox[hooloovoo]"><img src="http://heliologue.com/img/albums/hooloovoo/comments_thumb.png" alt="Hooloovoo comments" /></a></p>
<p><a href="http://heliologue.com/img/albums/hooloovoo/footer.png" title="Hooloovoo footer" rel="lightbox[hooloovoo]"><img src="http://heliologue.com/img/albums/hooloovoo/footer_thumb.png" alt="Hooloovoo footer" /></a>
</div>
<p><a class="showImages" rel="hooloovoo">toggle thumbnails</a>
</div>
<p>It&#8217;s a different creature than I&#8217;m used to—I&#8217;ve never <em>not</em> had a sidebar, but I decided that perhaps a sidebar wasn&#8217;t the best way to do things.  I moved that sort of ancillary data to the top, but I used a pull-down menu &aacute; la <a href="http://5thirtyone.com/wordpress-foliage-mod-theme">Foliage mod</a>.  Since sidebar data tends to not be particularly important to the content anyway, it doesn&#8217;t need to take up real estate.</p>
<p>Metadata, while displayed more or less inline on the index page, is moved down into a content footer on the individual post pages.  This kind of graphical metaphor is actually very common now, but I&#8217;ve wanted to do it ever since I saw it in <a href="http://warpspire.com/hemingway">Hemingway</a> about a year and a half ago.  Like the upper menu, I&#8217;m dividing into thirds, and iterating with lists.</p>
<p>In general, I&#8217;ve tried to round off a lot of corners.  This involves more images than I&#8217;d normally like, but I&#8217;ve tried to take shortcuts wherever possible, combining multiple images and simply changing their positioning:  I managed to reduce the number of server requests significantly from the early phases of the design, but I still have some more to go.  </p>
<p>Which brings me to another thing:  I&#8217;ve used some 24-bit PNGs, not only as icons but as background images as well.  I made a half-hearted attempt to use <a href="http://jquery.khurshid.com/ifixpng.php">ifixpng</a> to resolve display issues for IE6, but when it didn&#8217;t work satisfactorily, I decided that I spend enough timer catering to IE6 users and work, and I&#8217;ll be damned if I&#8217;m going to expend any extra effort on my hobby site.   So let me make myself clear:</p>
<p class="alert">
Attention IE6 users: there is <em>no</em> good excuse to be using IE6.  Either <a href="http://www.microsoft.com/windows/products/winfamily/ie/default.mspx">upgrade</a> or use a different browser.  <a href="http://getfirefox.com">Firefox</a> is good, as is <a href="http://opera.com">Opera</a>.  Or go away.
</p>
<p>On with the tour:  I&#8217;ve heavily incorporated the jQuery javascript library into my redesign, and attempted to make it as performance-tuned as possible by including the extra plugins in a common file, and gzipping everything on the fly.</p>
<p>Beyond that, the theme is pretty unremarkable, really, but (I hope) aesthetically-pleasing and useful.  I&#8217;ve completely removed categories from the template, since I think that tags have much more utility.</p>
<p>Comments?  Questions?  Suggestions?  Venom? </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2007/11/13/a-modest-construct-v20-hooloovoo/feed/</wfw:commentRss>
		<slash:comments>6</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 435 [...]]]></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>435</strong> times.</p>
			</div>
			
<p>MIT license.</p>
<!-- PHP 5.x -->]]></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>
		<item>
		<title>Using jQuery to extract blockquote metadata</title>
		<link>http://heliologue.com/2007/09/18/using-jquery-to-extract-blockquote-metadata/</link>
		<comments>http://heliologue.com/2007/09/18/using-jquery-to-extract-blockquote-metadata/#comments</comments>
		<pubDate>Tue, 18 Sep 2007 16:58:08 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://heliologue.com/blog/2007/09/18/using-jquery-to-extract-blockquote-metadata/</guid>
		<description><![CDATA[5 Nov. 2007 • I&#8217;ve formatted this code as a plugin, too. Go to the project page. Blockquotes, by definition, can and should in most cases have a title attribute and, if possible, a cite attribute. The former is the actually name of the quote&#8217;s source. The latter is the URI to the quotes location, [...]]]></description>
			<content:encoded><![CDATA[<p class="alert">
<strong>5 Nov. 2007</strong> • I&#8217;ve formatted this code as a plugin, too.  <a href="http://heliologue.com/projects/blockquote-metadata-extractor/">Go to the project page</a>.
</p>
<p>Blockquotes, by definition, can and should in most cases have a <code>title</code> attribute and, if possible, a <code>cite</code> attribute.  The former is the actually name of the quote&#8217;s source.  The latter is the URI to the quotes location, if it was retrieved online.</p>
<p>For instance:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">blockquote</span> <span style="color: #000066;">cite</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://heliologue.com&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;A Modest Construct&quot;</span>&gt;</span>
&nbsp;
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer arcu ligula, tempus vel, dignissim at, molestie ut, leo. Etiam luctus, ipsum sit amet tincidunt malesuada, magna nisi feugiat eros, in tempus libero justo sed dui. Aliquam bibendum pulvinar turpis. Ut iaculis gravida nibh. Quisque elementum ligula vel nibh. Sed leo augue, tempor sed, nonummy in, interdum at, quam. Ut cursus tincidunt felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer pharetra vulputate nunc. Cras nec felis ornare augue tempor fermentum. Nullam rutrum malesuada nunc. Aliquam vel purus. Aliquam faucibus malesuada orci. Nulla sit amet nulla sit amet tortor fermentum euismod.
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">blockquote</span>&gt;</span></pre></div></div>

<p>This is all well and good for search engines, but it doesn&#8217;t do much for human readers (who are arguably more important, though it depends on who you ask).  A human might want to see something like this:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer arcu ligula, tempus vel, dignissim at, molestie ut, leo. Etiam luctus, ipsum sit amet tincidunt malesuada, magna nisi feugiat eros, in tempus libero justo sed dui. Aliquam bibendum pulvinar turpis. Ut iaculis gravida nibh. Quisque elementum ligula vel nibh. Sed leo augue, tempor sed, nonummy in, interdum at, quam. Ut cursus tincidunt felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer pharetra vulputate nunc. Cras nec felis ornare augue tempor fermentum. Nullam rutrum malesuada nunc. Aliquam vel purus. Aliquam faucibus malesuada orci. Nulla sit amet nulla sit amet tortor fermentum euismod.</p>
<p><cite class="source"><a href="http://heliologue.com" title="A Modest Construct">A Modest Construct</a></cite></p></blockquote>
<p>Which I achieved by appending</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">cite</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;source&quot;</span>&gt;</span>
     <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://heliologue.com&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;A Modest Construct&quot;</span>&gt;</span>A Modest Construct<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">cite</span>&gt;</span></pre></div></div>

<p>to the blockquote.</p>
<p>But nobody wants to hard-code a citation into every blockquote, especially when it&#8217;s technically correct to attach the information to the semantic element in question (the <code>blockquote</code>, for those of you not following along).  So, how to be structurally correct when using blockquotes, while still allowing human readers the benefit of such data?</p>
<p><span id="more-1906"></span></p>
<p>Well, there are a number of methods.   If you&#8217;re using a CMS or any kind of dynamically-generated page, you can use the system itself to parse blockquotes for their attributes and reuse that information.</p>
<h4>The Old Way</h4>
<p>A somewhat simpler and more flexible solution would be Javascript, which isn&#8217;t foolproof, but should be good enough for most people.  Previously, I used <a href="http://demo.1976design.com/blockquotes/">Dunstan&#8217;s Blockquotes</a>, which was an excellent solution for a long time.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> extractBlockquoteInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
        quotes <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'blockquote'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> quotes.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
		cite <span style="color: #339933;">=</span> quotes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cite'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		title <span style="color: #339933;">=</span> quotes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'title'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>cite<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>cite <span style="color: #339933;">!=</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>cite.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http://'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'i'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>cite.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ftp://'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'i'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>cite.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'person://'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'i'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
				newlink <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				newlink.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'href'</span><span style="color: #339933;">,</span> cite<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				newlink.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'title'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Go to '</span> <span style="color: #339933;">+</span> cite<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				title <span style="color: #339933;">=</span> quotes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'title'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>title<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>title <span style="color: #339933;">!=</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#123;</span>
					newlink.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span>title<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #000066; font-weight: bold;">else</span>
					<span style="color: #009900;">&#123;</span>
					newlink.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Quote source'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
				newdiv <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				newdiv.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'source'</span><span style="color: #339933;">;</span>
				newdiv.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'<span style="color: #000099; font-weight: bold;">\u</span>2014 '</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				newdiv.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>newlink<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				quotes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>newdiv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #000066; font-weight: bold;">else</span>
				<span style="color: #009900;">&#123;</span>
				newdiv <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				newdiv.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'source'</span><span style="color: #339933;">;</span>
				newdiv.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'<span style="color: #000099; font-weight: bold;">\u</span>2014 '</span> <span style="color: #339933;">+</span> cite<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				quotes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>newdiv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>title<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>title <span style="color: #339933;">!=</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
			newdiv <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			newdiv.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'source'</span><span style="color: #339933;">;</span>
			newdiv.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'<span style="color: #000099; font-weight: bold;">\u</span>2014 '</span> <span style="color: #339933;">+</span> title<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			quotes<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>newdiv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
extractBlockquoteInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h4>The New Way</h4>
<p>I ran into conflict issues, however.  Also, the script seems overly complicated for what it&#8217;s doing.  I long ago chose my spot in the <a href="http://jquery.com">jQuery</a> camp, and am currently using it on this blog for <a href="http://jquery.com/demo/thickbox/">Thickbox</a> and a few other miscellaneous things.   So I thought:  why not get blockquote data using jQuery?  Here&#8217;s my resulting code (which I&#8217;m sure is flawed and crufty, but I put it together in about five minutes;  suggestions are welcome).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;blockquote&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          <span style="color: #003366; font-weight: bold;">var</span> title <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;title&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #003366; font-weight: bold;">var</span> cite <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;cite&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
          <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>cite <span style="color: #339933;">==</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> title <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&lt;cite class='source'&gt;&quot;</span><span style="color: #339933;">+</span>title<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;&lt;/cite&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
&nbsp;
          <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>cite <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> title <span style="color: #339933;">==</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&lt;cite class='source'&gt;&lt;a href='&quot;</span><span style="color: #339933;">+</span>cite<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;' title='&quot;</span><span style="color: #339933;">+</span>cite<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;'&gt;&quot;</span><span style="color: #339933;">+</span>cite<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;&lt;/a&gt;&lt;/cite&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
&nbsp;
          <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>cite <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> title <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&lt;cite class='source'&gt;&lt;a href='&quot;</span><span style="color: #339933;">+</span>cite<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;' title='&quot;</span><span style="color: #339933;">+</span>title<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;'&gt;&quot;</span><span style="color: #339933;">+</span>title<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;&lt;/a&gt;&lt;/cite&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
&nbsp;
          <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Essentially, I&#8217;m looking for <code>blockquote</code>s that contains at least one of our particular attributes, and then parsing them for <code>title</code> and <code>cite</code> values.    There are four possible outcomes:</p>
<p>1. <strong><code>title</code> but no <code>cite</code>:</strong></p>
<blockquote title="A Modest Construct">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer arcu ligula, tempus vel, dignissim at, molestie ut, leo. Etiam luctus, ipsum sit amet tincidunt malesuada, magna nisi feugiat eros, in tempus libero justo sed dui. Aliquam bibendum pulvinar turpis. Ut iaculis gravida nibh. Quisque elementum ligula vel nibh. Sed leo augue, tempor sed, nonummy in, interdum at, quam. Ut cursus tincidunt felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer pharetra vulputate nunc. Cras nec felis ornare augue tempor fermentum. Nullam rutrum malesuada nunc. Aliquam vel purus. Aliquam faucibus malesuada orci. Nulla sit amet nulla sit amet tortor fermentum euismod.</p>
</blockquote>
<p>2. <strong><code>cite</code> but no <code>title</code>:</strong></p>
<blockquote cite="http://heliologue.com">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer arcu ligula, tempus vel, dignissim at, molestie ut, leo. Etiam luctus, ipsum sit amet tincidunt malesuada, magna nisi feugiat eros, in tempus libero justo sed dui. Aliquam bibendum pulvinar turpis. Ut iaculis gravida nibh. Quisque elementum ligula vel nibh. Sed leo augue, tempor sed, nonummy in, interdum at, quam. Ut cursus tincidunt felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer pharetra vulputate nunc. Cras nec felis ornare augue tempor fermentum. Nullam rutrum malesuada nunc. Aliquam vel purus. Aliquam faucibus malesuada orci. Nulla sit amet nulla sit amet tortor fermentum euismod.</p>
</blockquote>
<p>3. <strong><code>cite</code> and <code>title</code>:</strong></p>
<blockquote cite="http://heliologue.com" title="A Modest Construct">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer arcu ligula, tempus vel, dignissim at, molestie ut, leo. Etiam luctus, ipsum sit amet tincidunt malesuada, magna nisi feugiat eros, in tempus libero justo sed dui. Aliquam bibendum pulvinar turpis. Ut iaculis gravida nibh. Quisque elementum ligula vel nibh. Sed leo augue, tempor sed, nonummy in, interdum at, quam. Ut cursus tincidunt felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer pharetra vulputate nunc. Cras nec felis ornare augue tempor fermentum. Nullam rutrum malesuada nunc. Aliquam vel purus. Aliquam faucibus malesuada orci. Nulla sit amet nulla sit amet tortor fermentum euismod.</p>
</blockquote>
<p>4.  <strong>no <code>cite</code> and no <code>title</code>:</strong></p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer arcu ligula, tempus vel, dignissim at, molestie ut, leo. Etiam luctus, ipsum sit amet tincidunt malesuada, magna nisi feugiat eros, in tempus libero justo sed dui. Aliquam bibendum pulvinar turpis. Ut iaculis gravida nibh. Quisque elementum ligula vel nibh. Sed leo augue, tempor sed, nonummy in, interdum at, quam. Ut cursus tincidunt felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer pharetra vulputate nunc. Cras nec felis ornare augue tempor fermentum. Nullam rutrum malesuada nunc. Aliquam vel purus. Aliquam faucibus malesuada orci. Nulla sit amet nulla sit amet tortor fermentum euismod.</p>
</blockquote>
<p>I think that the <code>&lt;cite&gt;</code> element is the most semantically correct, but of course you&#8217;ll have to change that to fit your needs.  I style it like this:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">blockquote cite<span style="color: #6666ff;">.source</span> <span style="color: #00AA00;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">;</span>
     <span style="color: #000000; font-weight: bold;">border-top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">dashed</span> <span style="color: #cc00cc;">#aaa</span><span style="color: #00AA00;">;</span>
     <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0.95em</span><span style="color: #00AA00;">;</span>
     <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
     <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>And there you go.  An excellent Javascript library, a few lines of code (more than necessary even, as I wanted to cover all the possible cases), and you&#8217;ve got a flexible solution to blockquote citations.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://heliologue.com/2007/09/18/using-jquery-to-extract-blockquote-metadata/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->