<?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>Chad Weider</title>
	<atom:link href="http://blog.oofn.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.oofn.net</link>
	<description>You have found the home of</description>
	<lastBuildDate>Mon, 30 Jan 2012 02:04:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>YAJSML</title>
		<link>http://blog.oofn.net/2011/04/21/yajsml/</link>
		<comments>http://blog.oofn.net/2011/04/21/yajsml/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 08:35:44 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/?p=149</guid>
		<description><![CDATA[Ugh, I’m pretty tired of the endless parade of “Oh hai, iz wrtn a JS loaderz” projects. Given the number of existing implementations and the general solved-ness of the problem, the time devoted to it is disappointing. But here I am, doing just the same. Principles This work is related to that done in RequireJS [...]]]></description>
			<content:encoded><![CDATA[<p>Ugh, I’m pretty tired of the endless parade of “Oh hai, iz wrtn a JS loaderz” projects. Given the number of existing implementations and the general solved-ness of the problem, the time devoted to it is disappointing. But here I am, doing just the same.</p>

<h2>Principles</h2>

<p>This work is related to that done in <a href="http://requirejs.org/">RequireJS</a> and <a href="http://wiki.commonjs.org/wiki/Modules">CommonJS</a>, but hardly <a href="http://tagneto.blogspot.com/">bound</a> by them. Instead, the results are a product of the following principles:</p>

<ul>
<li>Improving the loading characteristics of a JavaScript project should be approached as an incremental optimization problem.</li>
<li>Simplicity is best. Only implement the necessary features.</li>
<li>Caching should be exploited. Expensive one-time operations are acceptable provided their responses are reusable.</li>
<li><a href="http://wiki.commonjs.org/wiki/Modules/1.1.1">Modules</a> are well defined, widely used, and well founded. The five different asynchronous loading specifications, not so much.</li>
</ul>

<p>This leads to what I&#8217;m given to think is a much <a href="http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html">simpler version that works</a> than existing implementations. The other nice thing is that the packaging tool takes an original approach to solving the dependency issue.</p>

<h2>Observations</h2>

<h3>Optimization</h3>

<p>Naïve implementations are good. Those implementations may be slow, but they are also cheap and set the stage for proper <a href="http://c2.com/cgi/wiki?RulesOfOptimization">optimization</a>. Chances are, that many possible optimizations are rendered unnecessary by the right tools.</p>

<h3>Dependencies</h3>

<p>Most current implementations use one of <a href="http://wiki.commonjs.org/wiki/Modules/Transport">five</a> ways to wrap a module&#8217;s code with a description of the dependencies that that code requires, and which a library will fetch asynchronously, finally evaluating the modules code once all are loaded. The thought being that, once that module is received, first all of its dependencies need loading (asynchronously so they are non-blocking, natch).</p>

<p>IMHO, that obscures the more obvious and important observation, that having dependencies that aren&#8217;t loaded by the time the current module is loaded, asynchronous or not, is <em>never</em> good. If this is to be treated as an optimization problem, then the issue is one of packaging. If the packaging works well, the question of synchronous/asynchronous loading is moot.</p>

<h3>Packaging</h3>

<p>Existing packagers all perform some sort of parsing on source files, usually a regular expression, maybe a full preprocessor language. Both approaches have the downsides of requiring boilerplate code or being unreliable. There is also the additional complication of describing lazy dependencies so that they do not get confused with loading dependencies.</p>

<p>The good news is that, given the availability of non-browser interpreters, there is a third way, where the code itself can be evaluated offline and dependencies <em>extracted during run-time</em>. Not only would this extract only those dependencies needed exactly at load time and require no boilerplate, using the same kernel in both environments, it would keep both the client and the packager’s results consistent.</p>

<h3>Versioning</h3>

<p>The current practice for deploying JavaScript is to set a query parameter like <code>bust=v_n+1</code> on the URL of the script’s location to, in effect, invalidate the cache. This happens to work in the monolithic file case, however, lazy loading code makes versioning a problem that cannot be ignored. While new clients will use <code>v_n+1</code>, clients using <code>v_n</code> code must continue to receive <code>v_n</code> code. For this reason, versioning should be reflected in the base URI.</p>

<p><code>
http://assets1.example.com/js/src/n/<br />
http://assets1.example.com/js/src/n+1/<br />

http://assets1.example.com/js/src/n+2/

</code></p>

<h3>Caching</h3>

<p>It’s a common observation that different areas of a project change at different rates. This is certainly the case in web applications where library code will change much slower than application code. It follows then that updates to application code should have no effect on still cacheable library code.</p>

<p>Convention already specifies this using a leading slash for <code>'/application/code'</code> and none for <code>'library/code'</code>. This is simple to exploit by allowing different URIs for the two classes of code.</p>

<p><code>
http://assets1.example.com/js/lib/0.1.2/<br />

http://assets1.example.com/js/src/0.3.0/

</code></p>

<h2>Implementation</h2>

<p>The tool that implements this loader provides two things things, a kernel and a module compiler. For the moment it is on an <a href="https://github.com/cweider/modulizer/tree/experimental">experimental branch</a> of the Modulizer project, though I’m beginning to like “Yajsml” more and more.</p>

<p>The kernel is a terse bit of JS that provides the module loading and fetching functionality. It has no references to the global environment and, by default, exports to the <code>require</code> symbol. It&#8217;s the part that enables a simple page like this:</p>

<p><code>
&lt;script type="text/javascript" src="/kernel.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp;require.setRootURI('/js/src/');<br />
&nbsp;&nbsp;require.setLibraryURI('/js/lib/');<br />
&nbsp;&nbsp;require.setGlobalKeyPath('require');<br />
&nbsp;&nbsp;app = new (require('/app').Application)({<br />
&nbsp;&nbsp;&nbsp;&nbsp;"userId": 1234<br />
&nbsp;&nbsp;,&nbsp;"baseURI": "http://example.com/"<br />
&nbsp;&nbsp;});<br />
&lt;/script&gt;
</code></p>

<p>The module compiler takes a number of paths and compiles them into a <code>require.define()</code> call. Using the command line tool:</p>

<p><code>../modulize --output code.js --root-path ./src --library-path ./lib --import-dependencies -- ./src/app.js</code></p>

<p>Produces the following package:<br />
<code>
require.define({<br />
&nbsp;&nbsp;"/app":&nbsp;null<br />
,&nbsp;"/app.js":&nbsp;function&nbsp;(require,&nbsp;exports,&nbsp;module)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;models&nbsp;=&nbsp;require('/models');<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;util&nbsp;=&nbsp;require('util');<br />
&nbsp;&nbsp;}<br />
,&nbsp;"/models":&nbsp;null<br />
,&nbsp;"/models.js":&nbsp;null<br />
,&nbsp;"/models/group":&nbsp;null<br />
,&nbsp;"/models/group.js":&nbsp;function&nbsp;(require,&nbsp;exports,&nbsp;module)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;exports.Group&nbsp;=&nbsp;function&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/<em>...</em>/<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;}<br />
,&nbsp;"/models/index":&nbsp;null<br />
,&nbsp;"/models/index.js":&nbsp;function&nbsp;(require,&nbsp;exports,&nbsp;module)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;exports.User&nbsp;=&nbsp;require('./user').User;<br />
&nbsp;&nbsp;&nbsp;&nbsp;exports.Group&nbsp;=&nbsp;require('./group').Group;<br />
&nbsp;&nbsp;}<br />
,&nbsp;"/models/user":&nbsp;null<br />
,&nbsp;"/models/user.js":&nbsp;function&nbsp;(require,&nbsp;exports,&nbsp;module)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;exports.User&nbsp;=&nbsp;function&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/<em>...</em>/<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;}<br />
,&nbsp;"util":&nbsp;null<br />
,&nbsp;"util.js":&nbsp;null<br />
,&nbsp;"util/index":&nbsp;null<br />
,&nbsp;"util/index.js":&nbsp;function&nbsp;(require,&nbsp;exports,&nbsp;module)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;exports.escapeHTML&nbsp;=&nbsp;function&nbsp;()&nbsp;{};<br />
&nbsp;&nbsp;&nbsp;&nbsp;exports.escapeHTMLAttribute&nbsp;=&nbsp;function&nbsp;()&nbsp;{};<br />
&nbsp;&nbsp;&nbsp;&nbsp;exports.importantURL&nbsp;=&nbsp;'http://example.com/';<br />
&nbsp;&nbsp;}<br />
});
</code></p>

<h2>Future</h2>

<p>This the first iteration in a longer project with several more big ideas to adopt, but, IMHO, aside from one or two missing features, this is a pretty comprehensive solution for the problem of distributing code from the client’s perspective. The remaining improvements revolve around improving the optimization of packaging and using the cache more effectively.</p>

<p>Regarding effective use of the cache, having module requests get redirected to designated/canonical packages has lots of potential to increase cache hits when loading order varies &#8211; such as across pages. As far as finding an optimal packaging goes, it’s the kind of problem that sounds like the perfect job for some sort of nondeterministic heuristic-ish algorithm.</p>

<p>And finally, while the two buckets, <code>libraryURI</code> and <code>rootURI</code>, are probably sufficient for most projects, the thought of allowing for multiple library paths is appealing. Searching would of course be made more expensive for some modules, but I suspect that ordering the search paths by increasing frequency of updates may allow caching to compensate for this.</p>

<h2>Updates</h2>

<p>It’s since become clear that parts of this discussion are reasonably independent of each other, so they’ve been broken into their own projects:</p>

<ul>
<li><a href="https://github.com/cweider/require-kernel">require-kernel</a>: A minimalist implementation of <code>require</code> that supports asynchronous retrieval.</li>
<li><a href="https://github.com/cweider/yajsml">yajsml</a>: An asset server that  performs packaging and clever things like redirecting to a canonical resource.</li>
<li><a href="https://github.com/cweider/yajsml">modulizer</a>: A tool that finds  dependencies at runtime.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2011/04/21/yajsml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finding JavaScript’s Global Object</title>
		<link>http://blog.oofn.net/2011/04/10/finding-javascript%e2%80%99s-global-object/</link>
		<comments>http://blog.oofn.net/2011/04/10/finding-javascript%e2%80%99s-global-object/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 23:06:15 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/?p=124</guid>
		<description><![CDATA[With JavaScript code being written in ever more diverse environments these days, some assumptions are bound to get broken. One such assumption is that the object bound to the symbol window in the current scope is the global object. Every approach I’ve seen searches through a list of probable symbols and returns the first defined, [...]]]></description>
			<content:encoded><![CDATA[<p>With JavaScript code being written in ever more diverse environments these days, some assumptions are bound to get broken. One such assumption is that the object bound to the symbol <code>window</code> in the current scope is the global object. Every approach I’ve seen searches through a list of probable symbols and returns the first defined, instead of using the language itself.</p>

<p><code>var global = (typeof window != 'undefined' ? window : global)</code></p>

<p>Below is a snippet that will return the global object independent of scope and interpreter.</p>

<p><code>var global = (function () {return this})();</code></p>

<p><em>Note: except in the rarest of cases, direct address of the global object is illegitimate regardless of approach, using this more robust snippet is no excuse.</em><em></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2011/04/10/finding-javascript%e2%80%99s-global-object/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>According to Wikipedia…</title>
		<link>http://blog.oofn.net/2008/06/27/according-to-wikipedia%e2%80%a6/</link>
		<comments>http://blog.oofn.net/2008/06/27/according-to-wikipedia%e2%80%a6/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 21:29:36 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Observations]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/06/27/according-to-wikipedia%e2%80%a6/</guid>
		<description><![CDATA[If you didn&#8217;t know already, I&#8217;m a lover of eclectic information. Here is a sampling of some of the more interesting facts I’ve gleaned from the Wikipedia. In no particular order: Birds, reptiles and amphibians only have one orifice for their intestinal and urinary tract. This orifice is called the Cloaca, from the Latin for [...]]]></description>
			<content:encoded><![CDATA[<p>If you didn&#8217;t know already, I&#8217;m a lover of eclectic information. Here is a sampling of some of the more interesting facts I’ve gleaned from the Wikipedia. In no particular order:</p>

<ul>
<li><p>Birds, reptiles and amphibians only have one orifice for their intestinal and urinary tract. This orifice is called the <a href="http://en.wikipedia.org/wiki/Cloaca">Cloaca</a>, from the Latin for sewer. If that’s not cool enough get this: some turtles have gills in their cloacal cavity. </p></li>
<li><p><a href="http://en.wikipedia.org/wiki/Belt_%28mechanical%29">Belt Drives</a> are cool! Because of the repetitive nature of their use, wear is a major concern. Thankfully there are clever ways to reduce the wear. 1) flat belts can be made into a <a href="http://en.wikipedia.org/wiki/Möbius_strip">Möbius strip</a>. 2) timing belts can made so that the number of teeth on the belt and all of the sprokets are <a href="http://en.wikipedia.org/wiki/Coprime">coprime</a>.</p></li>
<li><p><a href="http://en.wikipedia.org/wiki/Gastropoda">Gastropoda</a> have diversified so much over geological time that evolutionarily things have gotten very confused. There are land species with gills as well as marine species with lungs. Slugs (Gastropoda without much of a shell) are also interesting because most go through <a href="http://en.wikipedia.org/wiki/Torsion_%28gastropod%29">torsion</a> where the internals and the shell of the gastropod rotate. This can be problematic since it puts the anus right by the mouth – but evolutionarily speaking it must of been helpful for something.</p></li>
<li><p>The parasitic flatworm <a href="http://en.wikipedia.org/wiki/Leucochloridium_paradoxum">Leucochloridium paradoxum</a>  is an amazing example of <a href="http://en.wikipedia.org/wiki/Aggressive_mimicry">aggressive mimicry</a>. The flatworm&#8217;s sporocyst grows within a snail, invading the tentacles of the snail, with a preference to the left. The now swollen and colored tentacle mimics the appearance of a caterpillar – which a bird host eats. A snail then consumes the birds feces completing the cycle. Some interesting bits about the infected tentacle’s effect on the snail: 1) it cannot retract into its shell, leaving the flatworm always exposed. 2) it appears to reduce light sensitivity in the snail which keeps it out in the open in view of potential hosts.</p></li>
<li><p>The <a href="http://en.wikipedia.org/wiki/Tempest_Prognosticator">Tempest Prognosticator</a> was a curious invention from the 1850’s. It was a barometer made of <a href="http://en.wikipedia.org/wiki/Leech">leeches</a>. The inventor, George Merryweather, found that leeches would respond to changes in the atmosphere by climbing to higher ground. It consisted of a number of leaches each in their own glass jar, at the top of which was a piece of whale bone tied to a string. &#91;<a href="http://www.scholars.nus.edu.sg/landow/victorian/technology/packer/merryweather.html">diagram</a>&#93; When the leach would climb the jar it would dislodge the whale bone which would pull a mallet which would strike a bell – you would guess the likelihood of a storm by the number of bell rings. He had lobbied for it to be distributed throughout the coast of England, but the British Crown decided instead on the (still not entirely understood) <a href="http://en.wikipedia.org/wiki/Storm_glass">storm glass</a>.</p></li>
<li><p><a href="http://en.wikipedia.org/wiki/Neurocysticercosis">Neurocysticercosis</a> is a condition caused by the infestation of the brain by the tapeworm <a href="http://en.wikipedia.org/wiki/Taenia_solium">Taenia solium</a>. If you aren&#8217;t afraid of undercooked meat yet, I think you might now – the usual vector for infection is through larvae in pork meat (though autoinfection through vomit or feces is also possible). Treatment of  Neurocysticercosis can be very problematic. The problem is that living cysticerci are typically asymptomatic, the complications arise when the organism dies, triggering the host’s immune response  and leading to the inflammation, scarring, etc. that can lead to seizures, paralysis, and death.</p></li>
<li><p>While all flies will occasionally mistake fetid wounds for dead flesh, <a href="http://en.wikipedia.org/wiki/Cochliomyia_hominivorax">Cochliomyia hominivorax</a>, a spechies of <a href="http://en.wikipedia.org/wiki/Screw_worm">screwworm fly</a>, is notable for targeting fresh wounds and even exposed skin (e.g. the navel) for laying their larvae, causing <a href="http://en.wikipedia.org/wiki/Myiasis">Myiasis</a>. The larvae are also very aggressive, if disturbed they will burrow further into the host, hence their name. They are known to infect humans and are also a major concern for <a href="http://en.wikipedia.org/wiki/Merino">merino</a> sheep, where the condition is called flystrike. However, before you get too worried, know this – that the fly caused so much destruction to American cattle herds that the <a href="http://en.wikipedia.org/wiki/Sterile_insect_technique">sterile insect technique</a> was developed as a means of controlling the screw worm. This led to its eradication in the United States in 1982.</p></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/06/27/according-to-wikipedia%e2%80%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DarkKit</title>
		<link>http://blog.oofn.net/2008/06/11/darkkit/</link>
		<comments>http://blog.oofn.net/2008/06/11/darkkit/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 14:41:32 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/06/11/darkkit/</guid>
		<description><![CDATA[It&#8217;s been sitting in my ~/Projects folder for the better part of a year, but now it really is about time I dust it off and set it free… finished or not. It started with my work on LaserLine. I had written a parser for ILDA files, but needed a way to test its output. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="right" width="128px" height="128px" src="/pictures/DKIcon.png" alt=""/>
It&#8217;s been sitting in my <code>~/Projects</code> folder for the better part of a year, but now it really is about time I <a href="http://blog.oofn.net/2008/05/07/the-developer’s-dilemma/">dust it off</a> and set it free… finished or not.</p>

<p>It started with my work on <a href="http://www.acm.uiuc.edu/projects/LaserLine">LaserLine</a>. I had written a parser for ILDA files, but needed a way to test its output. Naturally, I couldn’t accept Aqua’s presence in an app associated with an app for Lasers – which are all about bright lights and dark rooms. Granted, it was only two controls and some custom images, but by the time I was done there was no doubt in my or anybody else’s mind that the final app would be “dark”.</p>

<p><img class="center" width="360px" height="422px" src="/pictures/ILDAInspector.png" alt="ILDA Inspector Animation"/></p>

<p>Knowing that a complete app would need a more complete library of widgets and subclassing AppKit seemed like a good way to get intimately acquainted with its internals, I didn’t stop there. A full accounting of my adventures in AppKit really deserves its own (lengthy) post that I&#8217;ll for later, I will just say this — kids, don’t try this at home. Even I, in my pixel perfecting, eye candy licking, gradient loving glory, will admit that the whole endeavor was likely not worth the time and frustration involved. But the work was done, so I might as well publish it.</p>

<p><span style="font-weight:bold; font-style:small-caps">Disclaimer:</span> DarkKit is full of sketchy code. It began as a hack – and it still is a hack. It does a whole lot of things AppKit doesn’t want you do to; a whole lot of things you <em>shouldn&#8217;t</em> do. It uses private, undocumented methods and even shadier things (IIRC there was toying with a <code>super</code>’s instance variables somewhere). Keep this in mind if you think you might need help from AppKit folks – I doubt abusing their framework will endear them to you. <em>Use at your own risk</em>.</p>

<p><img class="center" width="470px" height="360px" src="/pictures/DarkKit_TestApp.png" alt="DarkKit Widgets"/></p>

<p>What does it cover? not everything, but hopefully enough to be kinda useful. Most of the controls have their dark alternatives and <code>DKButton</code> covers some of the button variants present in AppKit (the normal shiny capsule button, the square beveled button, and square gradient button). Where things get iffy are Views… <code>NSScrollView</code>s were not designed with alternative looks in mind (not that that’s a bad thing) and that causes problems when it comes to TableViews, etc.</p>

<h3>Using DarkKit</h3>

<p>If you&#8217;ve ever gone about working out in the dark, then you probably have a good appreciation for one of the reasons I decided DarkKit would be a nice thing to have. When everything around you is pitch black, the fluorescent glow of the computer’s screen stresses your eyes terribly, so much so that when I’d be typesetting text or some other project that extended way into the night I would regularly enable high-contrast mode (⌃⌥⌘8) to give my eyes a chance to relax. So, if you happen to be designing an application that is going to be used in low-light settings (a laser show for example) a good low-light interface approaches the point of being a requirement.</p>

<p>IMHO, a really dark interface also does an excellent job of placing content front-and-center. The huge contrast between your app’s monochrome controls and your app’s colorful/interesting content tells your eyes exactly what to look at and drastically reduces visual clutter.</p>

<p>So yea, if you happen to be doing a pro-thing (and you accept the disclaimer from earlier) DarkKit might be for you. And, if you hadn’t noticed yet, jet black interfaces seem to have a way of kicking an app’s sex appeal up a notch. So, if on the other hand you find yourself looking for cheap UI pixie dust DarkKit might also be helpful – not that I endorse pixie dust… just sayin’.</p>

<p><img class="center" width="281px" height="167px" src="/pictures/DarkKit_IBPlugin.png" alt="DarkKit IBPlugin"/></p>

<p>Seeing that doing something as damaging to you application’s stability, maintainability, and general code-quality as adding an illegitimate framework like DarkKit should only be done with the greatest care and after considered thought, I built a IBPlugin* so you can build all your dark interfaces with minimal effort right from interface builder. Enjoy!</p>

<p class="footnote">*There was also a palette, back when that was cool…</p>

<p><em><strong>» Continue on to <a href="http://svn.oofn.net">svn.oofn.net</a></strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/06/11/darkkit/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Meanwhile…</title>
		<link>http://blog.oofn.net/2008/05/30/meanwhile%e2%80%a6/</link>
		<comments>http://blog.oofn.net/2008/05/30/meanwhile%e2%80%a6/#comments</comments>
		<pubDate>Fri, 30 May 2008 06:57:12 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/05/30/meanwhile%e2%80%a6/</guid>
		<description><![CDATA[I&#8217;m my past post I forgot to mention just how significant distraction can be to keeping projects from getting finished. Well, a bit ago I got Atmel&#8217;s AT90USBKey and last week, while up in a cabin in Wisconsin’s northwoods, I indulged my sentimental side and started reading Thoreau&#8217;s Walden. I’ll plan on getting back on [...]]]></description>
			<content:encoded><![CDATA[<p><img class="center" width="450px" height="338px" src="/pictures/LindyBridge.jpg" alt="Wisconsin Northwoods"/></p>

<p>I&#8217;m my past post I forgot to mention just how significant distraction can be to keeping projects from getting finished. Well, a bit ago I got Atmel&#8217;s <a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3879">AT90USBKey</a> and last week, while up in a cabin in Wisconsin’s northwoods, I indulged my sentimental side and started reading Thoreau&#8217;s <em>Walden</em>. I’ll plan on getting back on the wagon, just not right now…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/05/30/meanwhile%e2%80%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>As Seen on Campus</title>
		<link>http://blog.oofn.net/2008/05/08/as-seen-on-campus/</link>
		<comments>http://blog.oofn.net/2008/05/08/as-seen-on-campus/#comments</comments>
		<pubDate>Thu, 08 May 2008 16:45:26 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Cool]]></category>
		<category><![CDATA[Observations]]></category>
		<category><![CDATA[University]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/05/08/as-seen-on-campus/</guid>
		<description><![CDATA[Call (217) 352–9993. We&#8217;ll haul your Garrrrrbage…]]></description>
			<content:encoded><![CDATA[<p><img class="center" width="450px" height="338px" src="/pictures/GARRRRBAGE.jpg" alt="Dumpster on Campus 'Capt. Hook'"/></p>

<div style="text-align:center; font-style:italic">Call (217) 352–9993. We&#8217;ll haul your Garrrrrbage…</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/05/08/as-seen-on-campus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Developer’s Dilemma</title>
		<link>http://blog.oofn.net/2008/05/07/the-developer%e2%80%99s-dilemma/</link>
		<comments>http://blog.oofn.net/2008/05/07/the-developer%e2%80%99s-dilemma/#comments</comments>
		<pubDate>Wed, 07 May 2008 22:58:11 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/05/07/the-developer%e2%80%99s-dilemma/</guid>
		<description><![CDATA[People always like to quip that “real artists ship,” as a quick one-liner I guess that’s pretty good, but as with everything else… only sorta true. Anybody familiar with creativity has to admit that an end result of any quality usually requires a great deal of quantity in the background. Photographers will take hundreds of [...]]]></description>
			<content:encoded><![CDATA[<p>People always like to quip that “real artists ship,” as a quick one-liner I guess that’s pretty good, but as with everything else… only sorta true. Anybody familiar with creativity has to admit that an end result of any quality usually requires a great deal of quantity in the background. Photographers will take hundreds of pictures in the process of producing tens of photos. Films emerge from hours worth of additional footage thrown in the waste bin. Graphic Designers build copious numbers of mockups to produce a final design.</p>

<p>We developers are in the idea business too and, although I feel wholly unqualified to say this, the <em>good</em> developers are the ones with lots of ideas. In my experience as a mediocre programmer I spend a lot of my time hounded by ideas of my own creation.</p>

<p>I found this great passage in an <a href="http://www.dreamsongs.com/10ideas.html">article</a> by <a href="http://en.wikipedia.org/wiki/Richard_P._Gabriel">Richard P. Gabriel</a>:</p>

<blockquote>
<p>John’s world is a world of ideas, a world in which ideas don’t belong to anyone, and when an idea is wrong, just the idea – not the person – is wrong. A world in which ideas are like young birds, and we catch them and proudly show them to our friends. The bird’s beauty and the hunter’s are distinct.</p>

<p>[…]</p>

<p>Some people won’t show you the birds they’ve caught until they are sure, certain, positive that they – the birds, or themselves – are gorgeous, or rare, or remarkable. When your mind can separate yourself from your bird, you will share it sooner, and the beauty of the bird will be sooner enjoyed. And what is a bird but for being enjoyed?</p>
</blockquote>

<p>Every creative would love to claim a monopoly on divine inspiration, but since we can never quite manage that we settle for just hiding away all those half-finished, not quite thought-through, potentially embarrassing ideas of ours – and it’s a really nasty habit.</p>

<p>For developers, we have trouble kicking things out of out our <code>~/Projects</code> folder and sharing them with others because they’re “just not done yet.” Doneness is a dangerous idea – especially for perfectionists. It is always so tempting to keep polishing this or that project until you can really say it is done. Or worse, putting something pretty good to the side and promising to come back to it later to finish it off.</p>

<p>I’ve without a doubt fallen into that trap, granted I’ll make an argument for school getting in the way, but the truth is I’ve been sitting on a whole lot of “not done yet” projects for no great reason at all. Now that I’m nearly out of school, with new-found time on my hands, I’m resolving to drag them out of the closet, give them the once-over and throw them out for others to have – done or not.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/05/07/the-developer%e2%80%99s-dilemma/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>UIUC iCard [Free Design Advice]</title>
		<link>http://blog.oofn.net/2008/04/11/uiuc-icard-free-design-advice/</link>
		<comments>http://blog.oofn.net/2008/04/11/uiuc-icard-free-design-advice/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 03:59:11 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[University]]></category>
		<category><![CDATA[Users]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/04/11/uiuc-icard-free-design-advice/</guid>
		<description><![CDATA[I&#8217;ll start this post being blunt – I hate our new ID cards. I had been holding off for as long as I could, but with its swipe strip wearing through and the prospect of getting locked out of important places at inconvenient times, I decided to get proactive, suck it up, and trade my original [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll start this post being blunt – I hate our new ID cards. I had been holding off for as long as I could, but with its swipe strip wearing through and the prospect of getting locked out of important places at inconvenient times, I decided to get proactive, suck it up, and trade my original card for the new and “improved” version.</p>

<p>There, that said, let&#8217;s begin. Last year the university began a transition to new ID cards. Starting in the fall 2007 semester all new cards issued are of the new type and the old cards will eventually be phased out completely sometime after 2009.</p>

<p><img class="center" src="/pictures/ID_old.png" width="361px" height="228px" alt="Pre 2007 ID Card"/></p>

<p>According to the <a href="http://www.icard.uillinois.edu/dsp_new_icard.cfm">document</a> announcing the new design:</p>

<blockquote style="font: normal 10px/160% Georgia; text-align: left">
<p>The i-card has a new look! After nearly 11 years without a major design change, the University of Illinois i-card is getting a facelift. The new card embodies both aesthetic and functional upgrades essential to the support of new card-based services. The new design represents several months of collaboration, consultation, and planning with multiple campus leaders. In addition, designs were approved by standing campus ID Committees and representatives from several campus units that provide card services. 
</p>
</blockquote>

<p>With regard to the aesthetic and functional improvements, on the former they manage only by virtue of default and to the latter the card is an abject failure. Concerning the “several months of collaboration, consultation and planning…” well, on second thought let us not go there.</p>

<p>The purpose of an ID card is to present information and <em>absolutely</em> nothing else. Sure, it can look good, but it is not a fashion accessory. In this context the designer&#8217;s job is to convey information as effectively as possible, only working to make it pretty to the extent that it doesn&#8217;t detract from it’s effectiveness. it’s all about usability.</p>

<h3>Usability</h3>

<p>In this application it’s very important to understand that not all information is equal. Some items are more important than others; I care about the person&#8217;s name more than I do their card&#8217;s number and so on. In order to account for this a good designer should make sure that useful information pops out at the user and other information fades into the background – the ways you do this are pretty standard, changing the text size, color, typeface, and/or position.</p>

<p>With that in mind lets see how effectively each version does its job. Here&#8217;s a list and subjective ranking of how apparent each bit of information is on the card:</p>

<table>
    <tr>
        <th style="text-align:center">Old Card</th>
        <th style="text-align:center">New Card</th>
    </tr>
    <tr>
        <td><img src="/pictures/ID_old_small.png" width="221px" height="139px" alt="Pre 2007 ID Card"/></td>
        <td><img src="/pictures/ID_new_small.png" width="221px" height="139px" alt="Post 2007 ID Card"/></td>
    </tr>
    <tr>
        <td style="vertical-align:top">
            <ol style="margin-left:40px">
                <li>Name
                </li><li>ID number
                </li><li>Campus
                </li><li>Expiration date
                </li><li>Username
                </li><li>Classification
                </li><li>Library number<br />Card number
                </li><li>Issue date
            </li></ol>
        </td>
        <td style="vertical-align:top">
            <ol style="margin-left:40px">
                <li>Name
                </li><li>Expiration date
                </li><li>Classification<br />ID number<br />Library number<br />Card number
                </li><li>Campus
            </li></ol>
        </td>
    </tr>
</table>

<p>The number one thing that amazes me with this new card is that its designers managed to reduce the amount of information presented while, at the same time, <em>reducing</em> the usability of the remaining information. For any non-designers out there, just be aware that this is not how things are supposed to work. How did they manage this? THEY DESTROYED THE HIERARCHY.</p>

<p>Taking a look at the ranking for the old card design, it has a clear order that seems to correspond with what I would consider the relative importance of each morsel of information – name and number at the top and onto the library and card number (two seldom used items) at the bottom. On the other hand, for the new card the hierarchy formed only has half as many levels and I notice that half of the items of the new card fall into the 3rd stratum… uh oh.</p>

<p>The old card was designed smart… it was designed so that the very first number that appears to the searching eye was the most important – the university ID. In the “redesign” finding this number requires real, conscious effort. Where in the old it was set in a larger, bolder, unique color; in the new it is thrown into a big lump of useless information set in 10pt grey Arial – blech.</p>

<p>The very same thing could be said about the  classification label. The label was a beautiful little piece of usability, where it could be color coded to the class of the card holder – along the lines of green for “Undergraduate”, orange for “Faculty”, etc., but now it too is dumped in with the always-grey text at the bottom. And I just don&#8217;t know what to make of the expiration text, with its bright-yellow color it is near if not possibly above cardholder name in noticeability.</p>

<h3>Appearance</h3>

<p>Like I mentioned above… the claiming their design is an aesthetic improvement over the past really isn&#8217;t terribly impressive, it would be hard to argue that the original was even trying.</p>

<p><img class="center" src="/pictures/ID_new.png" width="361px" height="228px" alt="Post 2007 ID Card"/></p>

<p>First things first, why did the card get set entirely in Arial? I&#8217;m not one jump onto the Arial-Helvetica hatefest too readily, but I do ask that there be a good reason for using Arial over the original.  Apart from the (distinct) possibility that this card was designed in MS Word I can&#8217;t think of one.</p>

<p>Next up is the gaping whitespace in the upper-right of the photograph. Huh? It is completely detracting and a bit unbalancing. In the physical version where the entire card is higher contrast (pre-press issues?) I will occasionally think a part of the card has gone missing.</p>

<p>And finally onto the business of this whole “i-card” thing. The cause of my university&#8217;s compulsion to brand everything will probably never be understood and I don&#8217;t feel like debating its premise… though it certainly is debatable (Email at UIUC is Express Mail™), but I would like question this i-card idea. 1, It does not add value – mentioning to my friends that I have an “i-card” does not impress them. 2, It does not aid identifiably – I don&#8217;t expect to get confused between this ID card or the zero (0) other university cards I have in my wallet. 3, The i-card logo is a ridiculous comic-sans-like handwriting that has no place in a formal document like this.</p>

<h3>What to Do</h3>

<p>Since being a responsible critic means having a reasonable solution at the ready. And since a coping strategy of mine for living in this terribly designed world of ours is dwelling on “better” solutions, I went about designing a card of my own.</p>

<p><a href="http://blog.oofn.net/pictures/ID_prop.svg" onclick="window.open('/pictures/ID_prop.svg','popup','width=691,height= 441,scrollbars=no,resizable=no,toolbar=no,directories=no,menubar=no,status=no');return false"><img class="center" src="/pictures/ID_prop.png" width="363px" height="230px" alt="Proposed ID Card"/></a></p>

<p>I&#8217;ll spare you all the designing details (as this post has already gotten <em>very</em> long), but I would like to spend some time to justify the design. I&#8217;ll begin with the hierarchy. Front and center is are the 3 most important identifiers (excluding the picture) each of which are unique easily identifiable. Following is the expiry date and then the classification, coded with color for at-a-glance recognition. In the background are the library and card numbers, in small (but legible) type. Out of sight and to the side is and orange banner with the campus’s short name.</p>

<p>Except for the issue date, the design retains all the information of the old card. It returns the barcode and username that were removed in the revision. It also adds a printed signature field that was on the back of the original card (and curiously missing completely in the revision).</p>

<p>It also, IMHO, looks better than the previous designs too.</p>

<h3>Postscript</h3>

<p>This is not to say that UIUC&#8217;s card is the worst of the bunch. The university ID card is an apparent backwater in the world of design. Below is a gallery of cards I collected as research:</p>

<p><a href="http://blog.oofn.net/pictures/ID_Gallery/ID_Gallery.html" onclick="window.open('/pictures/ID_Gallery/ID_Gallery.html','popup','width= 589,height= 630,scrollbars=no,resizable=no,toolbar=no,directories=no,menubar=no,status=no');return false"><img class="center" src="/pictures/ID_Gallery/ID_Gallery_small.png" width="390px" height="418px" alt="ID Card Gallery"/></a></p>

<p>Out of the lot Wisconsin, MIT, and PennState came out with what I&#8217;d consider to be the best designs (and Chicago gets an honorable mention). But as a general rule they all either did pretty good in appearance (UCLA &amp; Minnesota) but failed as far as usability went, or they failed in both respects. Eastern Illinois, without question, took last place. The beveled Gill Sans Ultra Bold “panther card” text is nauseating.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/04/11/uiuc-icard-free-design-advice/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Shady Dealings in Legoland</title>
		<link>http://blog.oofn.net/2008/03/23/shady-dealings-in-legoland/</link>
		<comments>http://blog.oofn.net/2008/03/23/shady-dealings-in-legoland/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 09:05:18 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Cool]]></category>
		<category><![CDATA[Observations]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/03/23/shady-dealings-in-legoland/</guid>
		<description><![CDATA[Last time my younger cousins paid us a visit, I dug up our (rather large) collection of Legos so we could keep them entertained. Naturally I got to building things with them as well. Ostensibly for ‘research’ – the fact that Lego&#8217;s instructions are designed in such a way that 5 year-olds can build quite [...]]]></description>
			<content:encoded><![CDATA[<p>Last time my younger cousins paid us a visit, I dug up our (rather large) collection of Legos so we could keep them entertained. Naturally I got to building things with them as well. Ostensibly for ‘research’ – the fact that Lego&#8217;s instructions are designed in such a way that 5 year-olds can build quite complex objects in ~20 steps is impressive, but I digress.</p>

<p>After they left I decided to keep indulging in past childhood and build some more sets. As I was flipping through the binder of instructions those for set #6563 caught my eye:</p>

<p><a href="http://blog.oofn.net/pictures/GatorLanding.jpg" onclick="window.open('/pictures/GatorLanding.jpg','popup','width= 800,height= 537,scrollbars=no,resizable=no,toolbar=no,directories=no,menubar=no,status=no');return false"><img class="center" src="/pictures/GatorLanding_small.jpg" width="400px" height="268px" alt="Gator Island Lego set"/></a></p>

<p>While it may seem innocuous at first glance look a little closer:</p>

<p><img class="center" src="/pictures/GatorLanding_closeup.jpg" width="277px" height="451px" alt="Close up of picture"/></p>

<p>You see that it comes with two suspicious looking brown 1×2 pieces, copious amount money, and suitcases to carry them in. The pontoon plane also has a safe for storing “the goods”. Hmmmm…</p>

<p>It appears that <a href="http://guide.lugnet.com/set/6563">Gator Landing</a> is all about DRUGS!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/03/23/shady-dealings-in-legoland/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sounding Smart pt.I</title>
		<link>http://blog.oofn.net/2008/03/20/sounding-smart-pti/</link>
		<comments>http://blog.oofn.net/2008/03/20/sounding-smart-pti/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 06:56:42 +0000</pubDate>
		<dc:creator>Chad Weider</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Users]]></category>

		<guid isPermaLink="false">http://blog.oofn.net/2008/03/20/sounding-smart-pti/</guid>
		<description><![CDATA[Ever find yourself in the middle of a conversation touching on usability or cognition? Well, incase you ever do, here is a great little piece of information to quote: A few years ago, while analyzing an experiment on number comparisons, Dehaene noticed that subjects performed better with large numbers if they held the response key [...]]]></description>
			<content:encoded><![CDATA[<p>Ever find yourself in the middle of a conversation touching on usability or cognition? Well, incase you ever do, here is a great little piece of information to quote:</p>

<blockquote>
  <p>A few years ago, while analyzing an experiment on number comparisons, Dehaene noticed that subjects performed better with large numbers if they held the response key in their right hand but did better with small numbers if they held the response key in their left hand.</p>
  
  <p>[other interesting info]</p>
  
  <p>He even suspects that this may be why travellers get disoriented entering Terminal 2 of Paris’s Charles de Gaulle Airport, where small-numbered gates are on the right and large-numbered gates are on the left.</p>
</blockquote>

<p>Now I could never advocate blindly quoting someting like this without (at the very least) a peak at the source <a href="http://www.newyorker.com/reporting/2008/03/03/080303fa_fact_holt/">article</a> – especially one as interesting, accessible, and informative as this one was.</p>

<p>Found amongst the many other quite interesting facts about cognition with a neurological slant on the wonderful Mind Hacks <a href="http://www.mindhacks.com/blog/2008/03/maths_and_the_number.html">blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oofn.net/2008/03/20/sounding-smart-pti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.545 seconds -->
<!-- Cached page served by WP-Cache -->

