<?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>AlexAitken.net</title>
	<atom:link href="http://alexaitken.net/feed" rel="self" type="application/rss+xml" />
	<link>http://alexaitken.net</link>
	<description>The Business of front-end Code and Design</description>
	<lastBuildDate>Thu, 01 Sep 2011 16:32:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>jQuery Demystified</title>
		<link>http://alexaitken.net/code/jquery-demystified.htm</link>
		<comments>http://alexaitken.net/code/jquery-demystified.htm#comments</comments>
		<pubDate>Wed, 31 Aug 2011 16:15:26 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=778</guid>
		<description><![CDATA[Guiding slides for the hour-long presentation on &#8216;What is jQuery&#8217; that I&#8217;ve been giving to backend teams.]]></description>
			<content:encoded><![CDATA[<p><iframe src="https://docs.google.com/present/embed?id=d6fmb2b_38dk8gd3f3" frameborder="0" width="480" height="342"></iframe></p>
<p>Guiding slides for the hour-long presentation on &#8216;What is jQuery&#8217; that I&#8217;ve been giving to backend teams.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/code/jquery-demystified.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thor 2005</title>
		<link>http://alexaitken.net/other/thor-2005.htm</link>
		<comments>http://alexaitken.net/other/thor-2005.htm#comments</comments>
		<pubDate>Sat, 09 Jul 2011 19:48:33 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[biking]]></category>
		<category><![CDATA[France]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=772</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://alexaitken.net/wordpress/wp-content/uploads/2011/07/0508_quillanCriterium_012.jpg"><img class="alignright size-large wp-image-773" title="0508_quillanCriterium_012" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/07/0508_quillanCriterium_012-701x1024.jpg" alt="" width="470" height="686" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/other/thor-2005.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSConf 2011</title>
		<link>http://alexaitken.net/code/jsconf-2011.htm</link>
		<comments>http://alexaitken.net/code/jsconf-2011.htm#comments</comments>
		<pubDate>Wed, 04 May 2011 15:38:53 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=736</guid>
		<description><![CDATA[It&#8217;s a fun thing to be at the fore­front of a lan­guage/tech­no­logy re­volu­tion. I&#8217;m al­ways a little amazed at how the JavaS­cript I began cod­ing ten years ago has turned in to one of the corner­stones of my ca­reer. MBAs and years on con­sensus build­ing are one thing, but it&#8217;s this lan­guage that truly brings [...]]]></description>
			<content:encoded><![CDATA[<p><img style="background: #000; margin: 5px 10px 0px 0px;" src="http://2011.jsconf.us/images/wagon.gif" alt="wagon" align="left" />It&#8217;s a fun thing to be at the fore­front of a lan­guage/tech­no­logy re­volu­tion. I&#8217;m al­ways a little amazed at how the JavaS­cript I began cod­ing ten years ago has turned in to one of the corner­stones of my ca­reer. MBAs and years on con­sensus build­ing are one thing, but it&#8217;s this lan­guage that truly brings my design work to life, from its pro­to­typ­ing stages to its full pro­duc­tion de­ploy­ment. And while I&#8217;ve forged deep­er and deep­er un­der its hood, JavaS­cript has im­plic­ated it­self fur­ther and fur­ther in mod­ern de­vel­op­ment prac­tices. JSConf 2011 brought most of the thought lead­ers re­spons­ible for this im­plic­a­tion to­geth­er for two days in Port­land, OR, in­duc­ted oth­ers in to the circle, and hummed throughout with young, fresh, en­ergy and ideas de­voted to the stand­ards lan­guage mak­ing today&#8217;s web hop. Notes on the sum­mit:</p>
<p><strong>Dav­id Flanagan, @__DavidFlanagan</strong><br />
<em> BLOB (Bin­ary Large OB­jects) APIs</em><br />
Use case: file sys­tem, BLOB, DOM. User se­lects im­age from hard drive, runs it through the API, then sees im­age dis­played in a web page; All files are BLOBs but not all BLOBs are files; Get files the same way we al­ways have: with in­put tag (and on­change)&#8230; or with drag and drop; XHR2; new URL ob­ject; blob://; FileRead­er ob­ject can be used to ex­am­ine and ma­nip­u­late con­tents of BLOBs; Text files can now be read; readAs­Text, readAsAr­ray­Buf­fer, typed ar­rays, Ar­ray­Buf­fer­View; &#8220;en­di­an­ness&#8221;; Blob­Build­er; Web apps can im­ple­ment their own sand­boxed file sys­tems.</p>
<p><strong>John Hann, @un­script­able and Bri­an Cava­lier, @bri­an­cava­lier</strong><br />
<em> Mod­ules &gt; Frame­works</em><br />
Frame­work vs lib­rary vs mod­ule; Switch­ing cost of mov­ing from a lib­rary or frame­work like jQuery is HUGE; &#8220;cod­ing dys­ent­ary&#8221; &#8211; get yer shit outta my code; cod­ing uto­pia &#8211; stan­dalone, small, fast, in­ter­change­able, no glob­als; load­ers and namespa­cing; JavaS­cript stand­ard APIs/in­ter­faces &#8211; ecma, json&#8230;; html5/css3 &#8211; querySe­lect­or­All&#8230;; Com­monJS pro­posed stand­ards; AMD &#8211; Asyn­chron­ous Mod­ule Defin­i­tion; Mod­ules today &#8211; re­quire.js, curl.js, pinf, bd­load, mLAB; prom­ises; in­ver­sion con­trol.</p>
<p><strong>Paul Ir­ish, @paul_irish<br />
</strong><em>Chrome Dev Tools</em><br />
Tab auto­com­ple­tion; click col­or box to it­er­ate through dif­fer­ent col­or format defin­i­tions; new groups by type AND re­vi­sion his­tory; &#8230;and free­form stylesheet edit­ing un­der re­sources; see con­sole api doc for all avail­able con­sole meth­ods; con­sole.dir = DOM view; ESA to hide/show con­sole on all tabs; $0; &#8216;copy&#8217; in con­sole view =&gt; clip­board; &#8216;?&#8217; in con­sole = help on key­board short­cuts; &#8211;re­mote-de­bug­ging = for ex­ample, de­bug­ging tab­let apps via desktop; right-click pretty print of mini­fied js.</p>
<p><strong>Dave Balmer, @balmer</strong><br />
<em>Jo, Light­weight Mo­bile Frame­work</em><br />
Web is the SDK; He&#8217;s look­ing for code con­trib­ut­ors; See &#8216;JavaS­cript, The Good Parts&#8217; ex­tend meth­od; lessc­ss, sass; css3 for an­im­a­tions and trans­form­a­tions to save the mo­bile JS en­gine (and give bet­ter res­ults); joapp.com; light­er weight than en­yo.</p>
<p><strong>Fa­bi­an Jakobs, @fjakobs</strong><br />
<em>Cloud9IDE</em></p>
<p><strong>Bri­an Cava­lier</strong><br />
<em>wire.js</em><br />
In­ver­sion con­trol; &#8220;boot­strap­per&#8221;; As­pect Ori­ented Pro­gram­ming (AOP) &#8211; aug­ment­a­tion of ex­ist­ing com­pon­ents (wheth­er or not source code is avail­able/con­trol­lable); De­pend­en­cies &#8211; in­teg­ral, con­fig­ur­able, re­quired, op­tion­al; Com­ple­ments AMD by provid­ing fur­ther flex­ib­il­ity; Or­der­ing and prom­ises; Con­nect­ors.</p>
<p><strong>Dav­id Kaneda, @Dav­idKaneda</strong><br />
<em>Sen­cha Touch</em><br />
&#8220;De­tails Mat­ter&#8221;; sass and com­pass.</p>
<p><strong>Bor­is Bokowski, @bokowski</strong><br />
<em>Or­i­on Dev En­vir­on­ment</em><br />
Use the web it­self as a plat­form for tool ag­greg­a­tion; js­beau­ti­fer.org, etc; ec­lipse.org/or­i­on</p>
<p><strong>Ant­on Kovalyo, @ant­onkovalyo</strong><br />
<em>Code Qual­ity Tools</em><br />
Gofmt, pylint&#8230;; Lin­ters and doc tools (MDC, Bet­ter JS); JSH­int, a po­liter fork of JSLint;</p>
<p><strong>Gaurav Seth, Mi­cros­fot</strong><br />
<em>Chakra JS En­gine</em><br />
Bet­ter use of dual cores for JS pro­cessing/com­pil­ing; See IE9 dev guide; ecmascript.org &#8211; ecmascripttest262; IE10 now avail­able.</p>
<p><em>Test­ing</em><br />
Fun­cUnit; qunit;</p>
<p><strong>Ray Mor­gan, @rayc­mor­gan</strong><br />
<em>App vs Web</em><br />
Zap­pos; App = nat­ive, web = html5; &#8220;Nat­ive apps aren&#8217;t that hard to write&#8221;; &#8220;Nat­ive Apps are easy to get per­form­ant&#8221;; &#8220;Should mo­bile web really be try­ing to emu­late nat­ive apps..?&#8221;; Be­ware broken ex­pect­a­tions; An­droid vs iphone vs Win­dows; back to ba­sics &#8211; se­mant­ic html; pro­gress­ive en­hance­ment &#8211; test on the older tech­no­lo­gies; Us­ab­il­ity and sim­pli­city; Flickr does it right and cap­tures what the web is about; Hash­bang (and Google&#8217;s spec on); keep the web the web; flex box.</p>
<p><strong>Dave Her­man, @little­cal­culist</strong><br />
<em>Mod­ules for JS.Next</em><br />
Lib­rar­ies are a lan­guage&#8217;s lifeblood; NPM; JavaS­cript ba­sic­ally hands you a chunk of clay and leaves it up to you; Mod­ule pat­tern &#8211; (func­tion(glob­al){&#8230;glob­al.var=var={};}(win­dow)); Com­monJS on serv­er side is tak­ing off; for(i=0;&#8230;) = WRONG b/c of the leaked glob­al; un­der­score.js; I/O; Next.Js lets you de­clare re­quires and pull them without block­ing the main thread; har­mony.js, next.js&#8230;; ev­al is NOT evil (though ir­re­spons­ible/un­educated use of it may be); cof­fescript, scheme, ex­amples of de­clar­at­ively ex­tend­ing html with oth­er lan­guages.</p>
<p><strong>Toby Ho, @air­portyh</strong><br />
<em>Tutti, Mul­tiple Browser JS Test­ing</em></p>
<p><strong>Adam Bald­win, @adam_baldwin</strong><br />
<em>Se­cur­ity in Web Apps</em><br />
CORS head­ers now al­low for cross-do­main script­ing and this can screw you if you&#8217;re work­ing with hash bang nav tech­niques; evilpack­et.net; OWASP/ES­API en­coder; out­put en­cod­ing != val­id­a­tion; FF has new con­tent se­cur­ity policy.</p>
<p><strong>Dan Webb, @dan­wrong</strong><br />
<em>Design­ing Non-Shit JS APIs</em><br />
jQuery today is pretty much the de­facto stand­ard be­cause, even though it&#8217;s cobbled to­geth­er un­der the hood; its in­ter­face is amaz­ing; A good API = pre­dict­ab­il­ity, sim­pli­city, flex­ib­il­ity; Don&#8217;t buck lan­guage con­ven­tions or stand­ards.</p>
<p><strong>Thomas Fuchs, @thomas­fuchs</strong><br />
<em>Zepto Mo­bile Frame­work</em><br />
All ma­jor JS frame­works we know/use today came out be­fore phones had real browsers, so in de­vel­op­ing for a single plat­form (es­sen­tially, what mo­bile is today with Web­kit) get rid of the x-browser bloat/poly­fills; pro­pri­et­ary fea­tures can be killer &#8211; WK&#8217;s doc­u­ment.querySe­lect­or­All, for ex­ample, re­places a huge JS foot­print and is faster; nat­ive JSON sup­port; ar­ray it­er­a­tion gets rid of loops FTW; Some func­tion­al­ity (win­dow.res­ize, for ex­ample) is not mean­ing­ful/rel­ev­ant in the mo­bile con­text; SO, don&#8217;t down­load a whold bunch of code that isn&#8217;t needed (though let&#8217;s have a fall­back plan for if code is run on a non-WK browser) &#8211; Zepto provides easy mech­an­ism for re­pla­cing it­self with jQuery, for ex­ample; querySe­lect­or­All re­turns a node list that Fuchs turns in­to an ar­racy with slice.call; ajax, events, css, poly­fills, mod­u­lar, and web­kit only; base­camp mo­bile = zepto and back­bone; Small is beau­ti­ful, easi­er to un­der­stand, and comes with less bugs; mus­tache.js, lawn­chair.js, back­bone.js; mi­crojs.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/code/jsconf-2011.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get (Vertical) Rhythm</title>
		<link>http://alexaitken.net/code/get-vertical-rhythm.htm</link>
		<comments>http://alexaitken.net/code/get-vertical-rhythm.htm#comments</comments>
		<pubDate>Mon, 28 Mar 2011 17:25:05 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[typography]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=722</guid>
		<description><![CDATA[The grid-based design be&#173;hind much of today&#8217;s web was re&#173;vealed to me a few years back as I was serving as in-house Tech&#173;nic&#173;al Lead for a ma&#173;jor cor&#173;por&#173;ate re&#173;design. My team worked with de&#173;sign&#173;ers from an ex&#173;tern&#173;al agency, and as their comps star&#173;ted com&#173;ing across the wire it was quickly clear that visu&#173;al com&#173;pon&#173;ents were [...]]]></description>
			<content:encoded><![CDATA[<p>The grid-based design be&shy;hind much of today&#8217;s web was re&shy;vealed to me a few years back as I was serving as in-house Tech&shy;nic&shy;al Lead for a ma&shy;jor cor&shy;por&shy;ate re&shy;design. My team worked with de&shy;sign&shy;ers from an ex&shy;tern&shy;al agency, and as their comps star&shy;ted com&shy;ing across the wire it was quickly clear that visu&shy;al com&shy;pon&shy;ents were be&shy;ing aligned to a four-column grid. Every&shy;one liked the or&shy;der and or&shy;gan&shy;iz&shy;a&shy;tion af&shy;forded by the grid. When it came time to turn comps in&shy;to code we went with the 960.gs css frame&shy;work and to this day, design and de&shy;vel&shy;op&shy;ment of new solu&shy;tions takes place with&shy;in the con&shy;text of the grid.</p>
<p>But with our ap&shy;proach we had, in ef&shy;fect, only treated one of the axes of a tra&shy;di&shy;tion&shy;al grid sys&shy;tem. Early con&shy;cep&shy;tu&shy;al&shy;iz&shy;a&shy;tion and pro&shy;to&shy;typ&shy;ing of&shy;ten eli&shy;cit the columns, or ho&shy;ri&shy;zont&shy;al rhythm in our designs. We should real&shy;ize, however, that the con&shy;tent that will oc&shy;cupy those columns will be sub&shy;ject to an in&shy;ter&shy;sect&shy;ing rhythm. This is the ver&shy;tic&shy;al rhythm de&shy;rived from ty&shy;po&shy;graph&shy;ic font sizes and line spa&shy;cings.</p>
<p>Be&shy;cause of its de&shy;pend&shy;ence on doc&shy;u&shy;ment struc&shy;ture and mul&shy;tiple css rules, nail&shy;ing ver&shy;tic&shy;al rhythm with an off-the-shelf solu&shy;tion is pretty hard to do. While there are frame&shy;works that in&shy;cor&shy;por&shy;ate the no&shy;tion of ver&shy;tic&shy;al rhythm, ex&shy;tra-frame&shy;work css de&shy;vi&shy;ations by de&shy;velopers will of&shy;ten break the math, and there&shy;fore the grid. I think a more real&shy;ist&shy;ic (and less bloat-sus&shy;cept&shy;ible) ap&shy;proach is to simply keep an eye on the rhythm through de&shy;vel&shy;op&shy;ment it&shy;er&shy;a&shy;tions. To that end, here&#8217;s a simple de&shy;vel&shy;op&shy;ment tool that draws grid&shy;lines on a can&shy;vas over&shy;laid on the page. Use it, get rhythm, gain con&shy;trol, and shed the bloat.</p>
<p><a href="https://github.com/aaitken/Baseline">ht&shy;tps://git&shy;hub.com/aaitken/Baseline</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/code/get-vertical-rhythm.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kootenays</title>
		<link>http://alexaitken.net/other/kootenays.htm</link>
		<comments>http://alexaitken.net/other/kootenays.htm#comments</comments>
		<pubDate>Mon, 07 Mar 2011 02:43:25 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[Canada]]></category>
		<category><![CDATA[Kootenays]]></category>
		<category><![CDATA[skiing]]></category>
		<category><![CDATA[Valhalla]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=709</guid>
		<description><![CDATA[http://www.flickr.com/photos/59772570@N05/sets/721576261858&#8230; https://picasaweb.google.com/JUSTINSVOBODA/ValhallaPowdercats http://soundcloud.com/ses-one/ses-koots-roots-west-kootenay]]></description>
			<content:encoded><![CDATA[<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2011/03/1102_valhalla-003-bw.jpg" alt="Matt in Koot' fluff" /><br />
<span id="more-709"></span><br />
<a href="http://www.flickr.com/photos/59772570@N05/sets/72157626185832496" target="_blank">http://www.flickr.com/photos/59772570@N05/sets/721576261858&#8230;</a><br />
<a href="https://picasaweb.google.com/JUSTINSVOBODA/ValhallaPowdercats" target="_blank">https://picasaweb.google.com/JUSTINSVOBODA/ValhallaPowdercats</a><br />
<a href="http://soundcloud.com/ses-one/ses-koots-roots-west-kootenay" target="_blank"> http://soundcloud.com/ses-one/ses-koots-roots-west-kootenay</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/other/kootenays.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Venn and the Art of Overlap Maximization</title>
		<link>http://alexaitken.net/business/venn-and-the-art-of-overlap-maximization.htm</link>
		<comments>http://alexaitken.net/business/venn-and-the-art-of-overlap-maximization.htm#comments</comments>
		<pubDate>Wed, 09 Feb 2011 21:34:32 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Adaptive Path]]></category>
		<category><![CDATA[Henning Fischer]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[strategy]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[UX Week]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=679</guid>
		<description><![CDATA[A couple of years back I half-yawned my way through a UX&#173;Week break&#173;out ses&#173;sion on di&#173;git&#173;al strategy led by Hen&#173;ning Fisc&#173;her from Ad&#173;apt&#173;ive Path. Root cause ana&#173;lys&#173;is fea&#173;tured. The group also went through a couple of mock spend&#173;ing ex&#173;er&#173;cises. Then I re&#173;mem&#173;ber a Venn Dia&#173;gram that had me say&#173;ing, &#8220;I have to re&#173;mem&#173;ber this,&#8221; be&#173;fore [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border: 0px solid red;" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/02/tech-bus-uiux.png" alt="Venn diagram" /></p>
<p>A couple of years back I half-yawned my way through a UX&shy;Week break&shy;out ses&shy;sion on di&shy;git&shy;al strategy led by Hen&shy;ning Fisc&shy;her from Ad&shy;apt&shy;ive Path. Root cause ana&shy;lys&shy;is fea&shy;tured. The group also went through a couple of mock spend&shy;ing ex&shy;er&shy;cises. Then I re&shy;mem&shy;ber a Venn Dia&shy;gram that had me say&shy;ing, &#8220;I have to re&shy;mem&shy;ber this,&#8221; be&shy;fore I skipped out early for some San Fran Chinese.</p>
<p>The yawns wer&shy;en&#8217;t Fisc&shy;her&#8217;s fault &#8211; I was just in a time and place that made it hard for me to take the 30,000-foot view. But the Venn stirred in me a sense of re&shy;cog&shy;ni&shy;tion. It showed the over&shy;lap of teams in&shy;volved in design&shy;ing and mak&shy;ing on&shy;line products. If the groups wer&shy;en&#8217;t labeled as they are above they were pretty close, and the spot in the middle, Fisc&shy;her stressed, was where the ten&shy;sion of con&shy;cerns was equal and the product was in&shy;formed by its user ad&shy;voc&shy;ates, and busi&shy;ness and tech&shy;nic&shy;al stake&shy;hold&shy;ers.</p>
<p><img class="alignleft" style="margin: 0 1em 0 0; border: 0px solid red;" title="Venn diagram 1" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/02/venn-out.png" alt="" width="132" height="119" />Part of the reas&shy;on per&shy;spect&shy;ive can be dif&shy;fi&shy;cult, es&shy;pe&shy;cially for mem&shy;bers of in-house teams, is be&shy;cause we of&shy;ten sub&shy;scribe to a sort of jin&shy;go&shy;ist&shy;ic world view that frames the pur&shy;suit of user/busi&shy;ness/tech&shy;nic&shy;al in&shy;terests as a zero-sum com&shy;pet&shy;i&shy;tion. In ef&shy;fect, the Venn is sub&shy;ject to ex&shy;pans&shy;ive, out&shy;ward pres&shy;sures as teams pur&shy;sue their goals over the oth&shy;ers.&#8217; And in en&shy;vir&shy;on&shy;ments where one group has a dis&shy;pro&shy;por&shy;tion&shy;ate amount of power or con&shy;trol, this view en&shy;sures that that group&#8217;s con&shy;cerns are dis&shy;pro&shy;por&shy;tion&shy;ately rep&shy;res&shy;en&shy;ted in the fi&shy;nal product. Google&#8217;s products smell of en&shy;gin&shy;eer&shy;ing. Most oth&shy;ers leave us won&shy;der&shy;ing why re&shy;gis&shy;tra&shy;tion is re&shy;quired be&shy;fore we&#8217;re offered con&shy;tent, or why they simply aren&#8217;t bet&shy;ter&#8230;</p>
<p><img class="alignright" style="margin: 0 0 0 1em; border: 0px solid red;" title="Ven diagram 2" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/02/venn-in.png" alt="" width="140" height="119" />If we&#8217;re able to do a 180 and turn from na&shy;tion&shy;al&shy;ists in&shy;to glob&shy;al&shy;ists, the fo&shy;cus for all teams be&shy;comes max&shy;im&shy;iz&shy;a&shy;tion of the Venn over&shy;lap. Pri&shy;or&shy;it&shy;ies con&shy;tin&shy;ue to dif&shy;fer&shy; but they&#8217;re no longer at odds by defin&shy;i&shy;tion. Busi&shy;ness stake&shy;hold&shy;ers re&shy;cog&shy;nize that UX, though no&shy;tori&shy;ously dif&shy;fi&shy;cult to quanti&shy;fy, is in&shy;teg&shy;ral to the bot&shy;tom line and the UX guys in turn seek coun&shy;sel from their backend coun&shy;ter&shy;parts. Each re&shy;gion of the Venn is in&shy;formed by the oth&shy;er two as UX goals be&shy;come Busi&shy;ness goals be&shy;come De&shy;vel&shy;op&shy;ment goals. &#8220;What could be a four-step pro&shy;cess has turned in to nine&#8230; Are we sure that the busi&shy;ness value in users who com&shy;plete these off&shy;sets the im&shy;plied tech&shy;nic&shy;al chal&shy;lenges and user in&shy;con&shy;veni&shy;en&shy;ce and fal&shy;lout?&#8221; Con&shy;struct&shy;ive de&shy;bate on that kind of ques&shy;tion puts us on our way to the right bal&shy;ance of busi&shy;ness and cus&shy;tom&shy;er needs.</p>
<p>I&#8217;ve per&shy;son&shy;ally fallen in&shy;to the trap of think&shy;ing I needed to de&shy;fend UI/UX ter&shy;rit&shy;ory as part of my job. What I&#8217;ve later come to re&shy;cog&shy;nize-through ex&shy;per&shy;i&shy;ence, read&shy;ing, con&shy;fer&shy;ences, and UCD course audits-is that even in en&shy;vir&shy;on&shy;ments that don&#8217;t in&shy;vest heav&shy;ily in user stud&shy;ies or re&shy;search, that UI/UX re&shy;gion doesn&#8217;t be&shy;long to us but rather to the user. Ac&shy;know&shy;ledge&shy;ment of this real&shy;ity can free today&#8217;s UI/UX de&shy;sign&shy;er to ad&shy;voc&shy;ate on be&shy;half of the user, but with unique in&shy;sight in&shy;to busi&shy;ness and tech&shy;nic&shy;al con&shy;cerns-in oth&shy;er words, to take the 30,000-foot view. And in fact, as the de&shy;sign&shy;ers of today&#8217;s di&shy;git&shy;al products, this is our ob&shy;lig&shy;a&shy;tion. It&#8217;s up to us to be first in&shy;to the over&shy;lap.</p>
<h5>Related</h5>
<p>The three-legged stool<br />
im&shy;ple&shy;ment&shy;a&shy;tion, men&shy;tal, and rep&shy;res&shy;en&shy;ted mod&shy;els</p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/business/venn-and-the-art-of-overlap-maximization.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>McNamara, 12-31-2010</title>
		<link>http://alexaitken.net/other/mcnamara-12-31-2010.htm</link>
		<comments>http://alexaitken.net/other/mcnamara-12-31-2010.htm#comments</comments>
		<pubDate>Sat, 08 Jan 2011 05:50:23 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[new year's]]></category>
		<category><![CDATA[skiing]]></category>

		<guid isPermaLink="false">http://alexaitken.net/uncategorized/mcnamara-12-31-2010.htm</guid>
		<description><![CDATA[Rear-wheel drive from Denver to Vail in surprise 12-30 storm. 5:45am 12-31 de&#173;par&#173;ture for 9:00am 0-de&#173;gree As&#173;pen trail&#173;head. REM, Dylan, Jimmy Vaughn, Son Volt, Tokyo Po&#173;lice. 21 ski&#173;ers, 4.5 hours, 2,000 feet&#8230; 16 beds, 2 days, 42 ski boots. East Coast Rockies time zone. Sparklers and down coats. Eu&#173;k&#173;er, Pigs, Celebrity, Comet, Jenga, Dice, Hearts… [...]]]></description>
			<content:encoded><![CDATA[<p>
<img style="isplay: inline;" title="1012_mcnamara_2630-1-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/5333729243_f516b3b244_b-web.jpg" border="0" alt="5333729243_f516b3b244_b-web" />
</p>
<p>
Rear-wheel drive from Denver to Vail in surprise 12-30 storm.<br />
5:45am 12-31 de&shy;par&shy;ture for 9:00am 0-de&shy;gree As&shy;pen trail&shy;head.<br />
REM, Dylan, Jimmy Vaughn, Son Volt, Tokyo Po&shy;lice.<br />
21 ski&shy;ers, 4.5 hours, 2,000 feet&#8230;<br />
16 beds, 2 days, 42 ski boots.<br />
East Coast Rockies time zone.<br />
Sparklers and down coats.<br />
Eu&shy;k&shy;er, Pigs, Celebrity, Comet, Jenga, Dice, Hearts…<br />
Laphroaig, Red Bull, Vodka, Egg&shy;plant, Ba&shy;con, Pine&shy;apple Ex&shy;press.<br />
Skins, skis, snow.<br />
Blisters, tape, and short on joe.<br />
High&shy;lands Bowl&#8230;<br />
And a wrinkle in time.<br />
Thanks y’all… and Happy 2011!
</p>
<p><span id="more-647"></span></p>
<p>
<img style="display: inline;" title="1012_mcnamara_2644-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/1012_mcnamara_2644-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2624-1-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/1012_mcnamara_2624-1-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2645-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/DSC02308-web.jpg" border="0" alt="DSC02308-web.jpg" /><br />
<img style="display: inline;" title="1012_mcnamara_2640-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/1012_mcnamara_2640-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2640-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/DSC02307-web.jpg" border="0" alt="DSC02307-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2630-1-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/1012_mcnamara_2630-1-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2645-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/1012_mcnamara_2645-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2649-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/1012_mcnamara_2649-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2655-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/1012_mcnamara_2655-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /><br />
<img style="display: inline;" title="1012_mcnamara_2655-web" src="http://alexaitken.net/wordpress/wp-content/uploads/2011/01/DSC02304-web.jpg" border="0" alt="1012_mcnamara_2630-1-web" /></p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/other/mcnamara-12-31-2010.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Form</title>
		<link>http://alexaitken.net/design/a-form.htm</link>
		<comments>http://alexaitken.net/design/a-form.htm#comments</comments>
		<pubDate>Fri, 26 Nov 2010 04:39:10 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[minimalism]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=566</guid>
		<description><![CDATA[$(document).ready(function(){$('#iframe').attr('scrolling','no');}) iframe{display:none;height:650px !important;overflow:hidden-y} Al&#173;most all ap&#173;plicatons we in&#173;ter&#173;act with on the web are form driv&#173;en. User-sup&#173;plied data in; sys&#173;tem con&#173;clu&#173;sion out. To be sure, a dec&#173;ade plus of ex&#173;per&#173;i&#173;en&#173;ce and in&#173;nov&#173;a&#173;tion has seen UX im&#173;prove by leaps and bounds. But we&#8217;re still build&#173;ing forms, and to that end I al&#173;ways en&#173;joy re-vis&#173;it&#173;ing the ba&#173;sic ques&#173;tion [...]]]></description>
			<content:encoded><![CDATA[<p><script>$(document).ready(function(){$('#iframe').attr('scrolling','no');})</script></p>
<style type="text/css">iframe{display:none;height:650px !important;overflow:hidden-y}</style>
<p><img style="margin: 5px 15px 0px 0px;border:0px solid red;-webkit-transform: rotate(7deg);-moz-transform: rotate(7deg);transform: rotate(7deg);" title="chairless" border="0" alt="form elements" align="left" src="http://alexaitken.net/wordpress/wp-content/uploads/2010/11/form.png" />Al&shy;most all ap&shy;plicatons we in&shy;ter&shy;act with on the web are form driv&shy;en. User-sup&shy;plied data in; sys&shy;tem con&shy;clu&shy;sion out. To be sure, a dec&shy;ade plus of ex&shy;per&shy;i&shy;en&shy;ce and in&shy;nov&shy;a&shy;tion has seen UX im&shy;prove by leaps and bounds. But we&#8217;re still build&shy;ing forms, and to that end I al&shy;ways en&shy;joy re-vis&shy;it&shy;ing the ba&shy;sic ques&shy;tion of how to build them well. Here&#8217;s the es&shy;sence of a re&shy;cent stab.</p>
<p><span id="more-566"></span></p>
<h5>Re&shy;quire&shy;ment</h5>
<p>A con&shy;fer&shy;ence re&shy;gis&shy;tra&shy;tion form to be used by ad&shy;mins from at&shy;tend&shy;ing schools to sub&shy;mit school info, names and de&shy;tails for event at&shy;tendees, and at&shy;tendee &#8216;Pre-Con&shy;fer&shy;ence&#8217; and &#8216;In&shy;sti&shy;tute&#8217; choices for each of the con&shy;fer&shy;ence&#8217;s three days. Form sub&shy;mit&shy;tal de&shy;liv&shy;ers an email re&shy;ceipt to the ad&shy;min as well as the con&shy;fer&shy;ence or&shy;gan&shy;izers.</p>
<h5>Chal&shy;lenges</h5>
<ol>
<li><b>In&shy;form&shy;a&shy;tion</b>&emsp;There was a lot. From form sub&shy;mit&shy;ters we re&shy;quired school info, point of con&shy;tact info, at&shy;tendees&#8217; de&shy;tails and con&shy;tact info, and at&shy;tendees&#8217; choices for each of the three days. We also needed to give a de&shy;tailed break&shy;down of the choices along with cost in&shy;form&shy;a&shy;tion.</li>
<li><b>Ac&shy;cu&shy;mu&shy;la&shy;tion</b>&emsp;The form needed to ac&shy;com&shy;mod&shy;ate mul&shy;tiple at&shy;tendees from a school, and track each at&shy;tendee&#8217;s choices for each day of the con&shy;fer&shy;ence.</li>
<li><b>De&shy;pend&shy;ency</b>&emsp;While at&shy;tendees would be able to choose only a single Pre-Con&shy;fer&shy;ence or In&shy;sti&shy;tute for each of the first two days of the event, it would be pos&shy;sible to choose two In&shy;sti&shy;tutes for the third day. Pos&shy;sib&shy;il&shy;it&shy;ies for a second would de&shy;pend on the choice made for the first.</li>
<li><b>Cal&shy;cu&shy;la&shy;tion</b>&emsp;Cost de&shy;term&shy;in&shy;ants in&shy;clude a school&#8217;s &#8216;mem&shy;ber&#8217; status, the num&shy;ber of at&shy;tendees it sends, wheth&shy;er its at&shy;tendees are also &#8216;presenters,&#8217; and which ses&shy;sions its at&shy;tendees re&shy;gister for. Each of these vari&shy;ables needed to be tracked so that be&shy;fore form sub&shy;mis&shy;sion we can present sum&shy;mary info in&shy;clud&shy;ing total cost.</li>
<li><b>Val&shy;id&shy;a&shy;tion</b>&emsp;&#8230;as al&shy;ways.</li>
</ol>
<h5>Solu&shy;tions</h5>
<ol>
<li><b>Wiz&shy;ard &amp; Se&shy;greg&shy;a&shy;tion</b>&emsp;Chunking long forms in to steps with wiz&shy;ards is a tried and true ap&shy;proach that works well here. And rather than blur the line between in&shy;form&shy;a&shy;tion we are re&shy;quest&shy;ing and in&shy;form&shy;a&shy;tion we are de&shy;liv&shy;er&shy;ing, we sharpen it with two dis&shy;tinct views (&#8216;Con&shy;fer&shy;ence Re&shy;gis&shy;tra&shy;tion&#8217; and &#8216;Con&shy;fer&shy;ence &amp; Re&shy;gis&shy;tra&shy;tion De&shy;tails&#8217;).</li>
<li><b>Ad&shy;apt&shy;ab&shy;il&shy;ity</b>&emsp;We handle mul&shy;tiple at&shy;tendees as they come, with a tabled lay&shy;out. After an at&shy;tendee has been entered with re&shy;quired info, we let the form user &#8216;Add Next At&shy;tendee&#8217; by ap&shy;pend&shy;ing a new row to the ta&shy;ble. With this ap&shy;proach we al&shy;low for an un&shy;lim&shy;ited num&shy;ber of at&shy;tendees but nev&shy;er present more fields than are re&shy;quired. In the single-page form, at&shy;tendee ses&shy;sion choices are re&shy;cor&shy;ded in a second ta&shy;ble that synchs to the first.</li>
<li><b>Cus&shy;tom Con&shy;trols</b>&emsp;Ba&shy;sic&shy;ally we want drop&shy;downs with Pre-Con&shy;fer&shy;ence/In&shy;sti&shy;tute op&shy;tions for each of the three days&#8230; ex&shy;cept that for the last day, mul&shy;tiple se&shy;lec&shy;tions may be val&shy;id. Here, a cus&shy;tom con&shy;trol emu&shy;lates the stand&shy;ard drop&shy;down but ties lo&shy;gic to each se&shy;lec&shy;tion/un-se&shy;lec&shy;tion so that the user can nev&shy;er make an in&shy;val&shy;id se&shy;lec&shy;tion. For visu&shy;al con&shy;sist&shy;ency and great&shy;er flex&shy;ib&shy;il&shy;ity, we use a vari&shy;ation of this con&shy;trol for the first two days also.</li>
<li><b>JavaS&shy;cript</b>&emsp;The lan&shy;guage has al&shy;ways been great for cli&shy;ent-side cal&shy;cu&shy;lat&shy;ors. It still is.</li>
<li><b>Min&shy;im&shy;al, Some&shy;times Live Feed&shy;back</b>&emsp;We de&shy;cided that val&shy;id emails were im&shy;port&shy;ant and that bey&shy;ond that, we simply wanted to en&shy;force com&shy;ple&shy;tion of re&shy;quired fields. This stripped down set of re&shy;quire&shy;ments meant we could de&shy;liv&shy;er a single, stand&shy;ard mes&shy;sage for all er&shy;ror scen&shy;ari&shy;os. When an er&shy;ror mes&shy;sage dis&shy;plays, val&shy;id&shy;a&shy;tion switches to a &#8216;live&#8217; mode that re&shy;moves er&shy;ror in&shy;dic&shy;at&shy;ors as source data is cor&shy;rec&shy;ted.</li>
</ol>
<h5>Clos&shy;ing Notes</h5>
<p>Some as&shy;pects of the design get a little bit cheated when presen&shy;ted in the iframe pulled up by the demo but&shy;ton above. For IE, we de&shy;cided on re&shy;quir&shy;ing users to use an&shy;oth&shy;er browser or else to in&shy;stall Google Chrome Frame. While Chrome Frame de&shy;tec&shy;tion works from with&shy;in the iframe, Chrome Frame itself ap&shy;par&shy;ently does not.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/design/a-form.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSRF Protection via X-Browser jQuery Ajax Hijack</title>
		<link>http://alexaitken.net/code/csrf-protection-via-x-browser-jquery-ajax-hijack.htm</link>
		<comments>http://alexaitken.net/code/csrf-protection-via-x-browser-jquery-ajax-hijack.htm#comments</comments>
		<pubDate>Thu, 28 Oct 2010 18:52:08 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[csrf]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=498</guid>
		<description><![CDATA[#codeSnippetWrapper pre+p{display:none} Cross-Site Re&#173;quest For&#173;ger&#173;ies (CSRF) ex&#173;ploit the trust that a site has with&#173;in a user&#8217;s browser. By in&#173;du&#173;cing clicks on links to sites where users are sus&#173;pec&#173;ted to be au&#173;then&#173;tic&#173;ated, per&#173;pet&#173;rat&#173;ors can ex&#173;ecute trans&#173;ac&#173;tions un&#173;der the um&#173;brella of a user&#8217;s cur&#173;rent ses&#173;sion. Re&#173;quir&#173;ing newly gen&#173;er&#173;ated para&#173;met&#173;er val&#173;ues with each new POST or GET is [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css">#codeSnippetWrapper pre+p{display:none}</style>
<p>Cross-Site Re&shy;quest For&shy;ger&shy;ies (CSRF) ex&shy;ploit the trust that a site has with&shy;in a user&#8217;s browser. By in&shy;du&shy;cing clicks on links to sites where users are sus&shy;pec&shy;ted to be au&shy;then&shy;tic&shy;ated, per&shy;pet&shy;rat&shy;ors can ex&shy;ecute trans&shy;ac&shy;tions un&shy;der the um&shy;brella of a user&#8217;s cur&shy;rent ses&shy;sion. Re&shy;quir&shy;ing newly gen&shy;er&shy;ated para&shy;met&shy;er val&shy;ues with each new POST or GET is one way for pro&shy;gram&shy;mers to pro&shy;tect against CSRF. But while im&shy;ple&shy;ment&shy;ing this re&shy;quire&shy;ment in page-driv&shy;en ap&shy;plic&shy;a&shy;tions is fairly straight-for&shy;ward, ajaxi&shy;fied apps make things more com&shy;plic&shy;ated. The fol&shy;low&shy;ing ap&shy;proach lets us ab&shy;stract the com&shy;plic&shy;a&shy;tions out of our day-to-day so we can code both cur&shy;rently and se&shy;curely.</p>
<p style="margin-bottom: 0em;">In&shy;stead of</p>
<pre>bank.com/with&shy;draw?ac&shy;count=bob&amp;amount=1000000&amp;for=mal&shy;lory</pre>
<p style="margin-bottom: 0em;">we&#8217;re now go&shy;ing to re&shy;quire</p>
<pre>bank.com/with&shy;draw?ac&shy;count=bob&amp;amount=1000000&amp;for=mal&shy;lory&amp;csr&shy;f&shy;Pro&shy;tect=1234567890</pre>
<p>where the csr&shy;f&shy;Pro&shy;tect value is up&shy;dated with each serv&shy;er hit. As new pages are con&shy;struc&shy;ted on the ap&shy;plic&shy;a&shy;tion serv&shy;er, the csr&shy;f&shy;Pro&shy;tect para&shy;met&shy;er and latest value are ap&shy;pen&shy;ded to any stat&shy;ic links or ac&shy;tions that kick off GETs or POSTs. Thus when le&shy;git users fire the re&shy;quests from the pages re&shy;turned to their browsers, they also sup&shy;ply a cur&shy;rent csr&shy;f&shy;Pro&shy;tect value that sig&shy;nals all is above&shy;board.</p>
<p>The com&shy;plic&shy;a&shy;tion in these be&shy;ing fired through ajax is two&shy;fold. First, for each re&shy;quest we need to dy&shy;nam&shy;ic&shy;ally de&shy;tect and in&shy;clude a cur&shy;rent csr&shy;f&shy;Pro&shy;tect value. Then on the re&shy;sponse, be&shy;cause the app serv&shy;er isn&#8217;t giv&shy;en the chance to con&shy;struct a new page, we need to it&shy;er&shy;ate through in-page links and ac&shy;tions and up&shy;date their para&shy;met&shy;er value.</p>
<p>The easi&shy;est way I&#8217;ve found to keep up with the chan&shy;ging csr&shy;f&shy;Pro&shy;tect value is to simply re&shy;quire it be sup&shy;plied in any page that might in&shy;stig&shy;ate ajax re&shy;quests, and as part of the data in any ajax re&shy;sponse (in the code be&shy;low, the value is trans&shy;por&shy;ted with in&shy;put[type=hid&shy;den].csr&shy;f&shy;Pro&shy;tect). With these hooks and a stand&shy;ard&shy;iz&shy;a&shy;tion of IE&#8217;s im&shy;ple&shy;ment&shy;a&shy;tion in place, we can modi&shy;fy the XM&shy;L&shy;Ht&shy;tpRe&shy;quest ob&shy;ject&#8217;s pro&shy;to&shy;type with a new csr&shy;f&shy;Pro&shy;tect prop&shy;erty and a cus&shy;tom open meth&shy;od that in&shy;ter&shy;cepts and up&shy;dates re&shy;quests be&shy;fore they are sent to the serv&shy;er. jQuery&#8217;s ajax&shy;Com&shy;plete meth&shy;od keeps XM&shy;L&shy;Ht&shy;tpRe&shy;quest.pro&shy;to&shy;type.csr&shy;f&shy;Pro&shy;tect up-to-date and ready for the next re&shy;quest.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New',courier,monospace; direction: ltr; max-height: 500px; font-size: 8pt; overflow: auto; cursor: text; border: 1px solid silver; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum1" style="color: #606060;">  1:</span> <span style="color: #008000;">/*</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum2" style="color: #606060;">  2:</span> <span style="color: #008000;">in&shy;clude jQuery</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum3" style="color: #606060;">  3:</span> <span style="color: #008000;">in&shy;clude ht&shy;tp://code.google.com/p/xm&shy;l&shy;ht&shy;tpre&shy;quest to stand&shy;ard&shy;ize XM&shy;L&shy;Ht&shy;tpRe&shy;quest as con&shy;struct&shy;or func&shy;tion in IE&lt;7 (info at ht&shy;tp://www.il&shy;in&shy;sky.com/art&shy;icles/XM&shy;L&shy;Ht&shy;tpRe&shy;quest/)</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum4" style="color: #606060;">  4:</span> <span style="color: #008000;">*/</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum5" style="color: #606060;">  5:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum6" style="color: #606060;">  6:</span> <span style="color: #008000;">//over&shy;ride jQuery's de&shy;fault IE&lt;7 call for the Act&shy;iveX ob&shy;ject with stand&shy;ard con&shy;struct&shy;or (avail&shy;able to IE&lt;7 via il&shy;in&shy;sky.com script)</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum7" style="color: #606060;">  7:</span> $.ajax&shy;Setup({</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum8" style="color: #606060;">  8:</span>   xhr:<span style="color: #0000ff;">func&shy;tion</span>(){<span style="color: #0000ff;">re&shy;turn</span> <span style="color: #0000ff;">new</span> XM&shy;L&shy;Ht&shy;tpRe&shy;quest();}</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum9" style="color: #606060;">  9:</span> });</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum10" style="color: #606060;"> 10:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum11" style="color: #606060;"> 11:</span> (<span style="color: #0000ff;">func&shy;tion</span>(){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum12" style="color: #606060;"> 12:</span>   <span style="color: #0000ff;">var</span> $links,<span style="color: #008000;">//in-page ele&shy;ments whose csr&shy;f&shy;Pro&shy;tect param value needs up&shy;dat&shy;ing on ajax re&shy;sponses </span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum13" style="color: #606060;"> 13:</span>     b;<span style="color: #008000;">//'?' or '&amp;' de&shy;pend&shy;ing on if re&shy;ques&shy;ted URL already has params</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum14" style="color: #606060;"> 14:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum15" style="color: #606060;"> 15:</span>   <span style="color: #008000;">//Store off nat&shy;ive XM&shy;L&shy;Ht&shy;tpRe&shy;quest.open as XM&shy;L&shy;Ht&shy;tpRe&shy;quest.nat&shy;i&shy;ve&shy;Open</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum16" style="color: #606060;"> 16:</span>   XM&shy;L&shy;Ht&shy;tpRe&shy;quest.pro&shy;to&shy;type.nat&shy;i&shy;ve&shy;Open = (<span style="color: #0000ff;">func&shy;tion</span>(){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum17" style="color: #606060;"> 17:</span>     <span style="color: #0000ff;">re&shy;turn</span> XM&shy;L&shy;Ht&shy;tpRe&shy;quest.pro&shy;to&shy;type.open;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum18" style="color: #606060;"> 18:</span>   }());</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum19" style="color: #606060;"> 19:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum20" style="color: #606060;"> 20:</span>   <span style="color: #008000;">//Re&shy;define XM&shy;L&shy;Ht&shy;tpRe&shy;quest.open to in&shy;ter&shy;cept and modi&shy;fy re&shy;quest</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum21" style="color: #606060;"> 21:</span>   XM&shy;L&shy;Ht&shy;tpRe&shy;quest.pro&shy;to&shy;type.open = <span style="color: #0000ff;">func&shy;tion</span>(){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum22" style="color: #606060;"> 22:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum23" style="color: #606060;"> 23:</span>     <span style="color: #0000ff;">var</span> a=ar&shy;gu&shy;ments;<span style="color: #008000;">//ori&shy;gin&shy;ally sup&shy;plied ajax ar&shy;gu&shy;ments</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum24" style="color: #606060;"> 24:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum25" style="color: #606060;"> 25:</span>     <span style="color: #008000;">//Mutate first in&shy;stance (ini&shy;tial re&shy;quest) of XM&shy;L&shy;Ht&shy;tpRe&shy;quest with csr&shy;f&shy;Pro&shy;tect prop&shy;erty and value if 'csr&shy;f&shy;Pro&shy;tect' class is found with&shy;in the page</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum26" style="color: #606060;"> 26:</span>     <span style="color: #0000ff;">if</span>(!<span style="color: #0000ff;">this</span>.csr&shy;f&shy;Pro&shy;tect&amp;&amp;$(<span style="color: #006080;">'.csr&shy;f&shy;Pro&shy;tect'</span>).length&gt;0){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum27" style="color: #606060;"> 27:</span>       <span style="color: #0000ff;">this</span>.csr&shy;f&shy;Pro&shy;tect=$(<span style="color: #006080;">'.csr&shy;f&shy;Pro&shy;tect:eq(0)'</span>).val();</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum28" style="color: #606060;"> 28:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum29" style="color: #606060;"> 29:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum30" style="color: #606060;"> 30:</span>     <span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">this</span>.csr&shy;f&shy;Pro&shy;tect){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum31" style="color: #606060;"> 31:</span>       a[1]=a[1]+(<span style="color: #0000ff;">func&shy;tion</span>(){a[1].in&shy;dex&shy;Of(<span style="color: #006080;">'?'</span>)&gt;0?b=<span style="color: #006080;">'&amp;'</span>:b=<span style="color: #006080;">'?'</span>;<span style="color: #0000ff;">re&shy;turn</span> b}())+<span style="color: #006080;">'csr&shy;f&shy;Pro&shy;tect='</span>+<span style="color: #0000ff;">this</span>.csr&shy;f&shy;Pro&shy;tect;<span style="color: #008000;">//ap&shy;pend csr&shy;f&shy;Pro&shy;tect para&shy;met&shy;er and value to re&shy;ques&shy;ted url</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum32" style="color: #606060;"> 32:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum33" style="color: #606060;"> 33:</span>     <span style="color: #0000ff;">this</span>.nat&shy;i&shy;ve&shy;Open(a[0],a[1],a[2],a[3],a[4]);<span style="color: #008000;">//open re&shy;quest</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum34" style="color: #606060;"> 34:</span>   };</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum35" style="color: #606060;"> 35:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum36" style="color: #606060;"> 36:</span>   $(win&shy;dow).ajax&shy;Com&shy;plete(<span style="color: #0000ff;">func&shy;tion</span>(<span style="color: #0000ff;">event</span>,xhr,set&shy;tings){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum37" style="color: #606060;"> 37:</span>     <span style="color: #0000ff;">var</span> csrf&shy;Split=xhr.re&shy;spon&shy;se&shy;Text.split(<span style="color: #006080;">'class=&quot;csr&shy;f&shy;Pro&shy;tect&quot; VALUE='</span>),</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum38" style="color: #606060;"> 38:</span>       csr&shy;f&shy;Value;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum39" style="color: #606060;"> 39:</span>     <span style="color: #0000ff;">if</span>(csrf&shy;Split.length&gt;1){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum40" style="color: #606060;"> 40:</span>       csr&shy;f&shy;Value=csrf&shy;Split[1].split(<span style="color: #006080;">'&gt;'</span>)[0];</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum41" style="color: #606060;"> 41:</span>       <span style="color: #0000ff;">this</span>.XM&shy;L&shy;Ht&shy;tpRe&shy;quest.pro&shy;to&shy;type.csr&shy;f&shy;Pro&shy;tect=csr&shy;f&shy;Value;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum42" style="color: #606060;"> 42:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum43" style="color: #606060;"> 43:</span>     <span style="color: #008000;">//up&shy;date page links with latest csr&shy;f&shy;Pro&shy;tect value</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum44" style="color: #606060;"> 44:</span>     $links.each(<span style="color: #0000ff;">func&shy;tion</span>(){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum45" style="color: #606060;"> 45:</span>       <span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">this</span>.href){<span style="color: #0000ff;">this</span>.href=<span style="color: #0000ff;">this</span>.href.re&shy;place(/csr&shy;f&shy;Pro&shy;tect.*/,<span style="color: #006080;">'csr&shy;f&shy;Pro&shy;tect='</span>+<span style="color: #0000ff;">this</span>.XM&shy;L&shy;Ht&shy;tpRe&shy;quest.pro&shy;to&shy;type.csr&shy;f&shy;Pro&shy;tect);}<span style="color: #008000;">//this re&shy;place makes the as&shy;sump&shy;tion that csr&shy;f&shy;Pro&shy;tect param and value are al&shy;ways last in URL</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum46" style="color: #606060;"> 46:</span>     });</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum47" style="color: #606060;"> 47:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum48" style="color: #606060;"> 48:</span>   });</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum49" style="color: #606060;"> 49:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum50" style="color: #606060;"> 50:</span>   <span style="color: #008000;">//links</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum51" style="color: #606060;"> 51:</span>   $(doc&shy;u&shy;ment).ready(<span style="color: #0000ff;">func&shy;tion</span>(){</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum52" style="color: #606060;"> 52:</span>     $links=$(<span style="color: #006080;">'a'</span>);<span style="color: #008000;">//modi&shy;fy this se&shy;lect&shy;or and $(win&shy;dow).ajax&shy;Com&shy;plete lo&shy;gic per ele&shy;ments that need up&shy;dat&shy;ing</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum53" style="color: #606060;"> 53:</span>   });</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum54" style="color: #606060;"> 54:</span> }());</pre>
<p><!--CRLF--></p>
</div>
</div>
<p>The sleep&shy;er in this im&shy;ple&shy;ment&shy;a&shy;tion is Sergey Il&shy;in&shy;sky&#8217;s script, which not only ex&shy;poses the XM&shy;L&shy;Ht&shy;tpRe&shy;quest&#8217;s pro&shy;to&shy;type prop&shy;erty in IE but stand&shy;ard&shy;izes the ajax im&shy;ple&shy;ment&shy;a&shy;tion across <em>all</em> browsers. In the code above we take ad&shy;vant&shy;age of the jQuery wrap&shy;per and meth&shy;ods be&shy;cause we&#8217;re work&shy;ing in a jQuery shop. XM&shy;L&shy;Ht&shy;tpRe&shy;quest.js, however, gives us the same cross-browser ac&shy;cess to ajax states that jQuery does. If we wer&shy;en&#8217;t already in&shy;cur&shy;ring the jQuery over&shy;head, we could achieve the same res&shy;ults with some slightly raw&shy;er JavaS&shy;cript.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/code/csrf-protection-via-x-browser-jquery-ajax-hijack.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In Response to Ryan Carson</title>
		<link>http://alexaitken.net/business/in-response-to-ryan-carson.htm</link>
		<comments>http://alexaitken.net/business/in-response-to-ryan-carson.htm#comments</comments>
		<pubDate>Mon, 13 Sep 2010 21:49:12 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[Ryan Carson]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[webapps]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=460</guid>
		<description><![CDATA[A yank in the UK who runs a four-days-per-week web agency, has up&#173;wards of 26k Twit&#173;ter fol&#173;low&#173;ers, and hangs (at least vir&#173;tu&#173;ally) with oth&#173;er big names like Veen, Heil&#173;man, and Snook, it seems Ry&#173;an Car&#173;son&#160;gets his work and is pas&#173;sion&#173;ate about bring&#173;ing it to oth&#173;ers. He also re&#173;cently caused a stir with a tweet and [...]]]></description>
			<content:encoded><![CDATA[<p><img style="height: 143px; width: 112px; margin: 5px 10px 0px 0px;" src="http://alexaitken.net/wordpress/wp-content/uploads/2010/09/trinity-1.jpg" alt="trinity" align="left" />A yank in the UK who runs a four-days-per-week web agency, has up&shy;wards of 26k Twit&shy;ter fol&shy;low&shy;ers, and hangs (at least vir&shy;tu&shy;ally) with oth&shy;er big names like Veen, Heil&shy;man, and Snook, it seems Ry&shy;an Car&shy;son&#160;gets his work and is pas&shy;sion&shy;ate about bring&shy;ing it to oth&shy;ers. He also re&shy;cently caused a stir with a tweet and ac&shy;com&shy;pa&shy;ny&shy;ing blog post in which he pos&shy;ited that &quot;UX Pro&shy;fes&shy;sion&shy;al is a bull&shy;shit job title&quot; and that only two people &#8211; a web de&shy;sign&shy;er and a web de&shy;veloper &#8211; were needed to cre&shy;ate a web site or app. I think UX Pros have their place. The piece I honed in on, however, was the single de&shy;veloper con&shy;ten&shy;tion. Web site? Sure. But are we reas&shy;on&shy;ably ex&shy;pect&shy;ing de&shy;velopers to build mod&shy;ern and per&shy;form&shy;ant web apps end to end right when new devices and web stand&shy;ards are adding fur&shy;ther (al&shy;beit ex&shy;cit&shy;ing) com&shy;plex&shy;ity to the task? I don&#8217;t know&#8230;</p>
<p>I&#8217;ve come to be&shy;lieve in a trin&shy;ity. To stand out, today&#8217;s apps re&shy;quire tran&shy;scend&shy;ant visu&shy;al design, front-end markup and script&shy;ing, and backend ar&shy;chi&shy;tec&shy;ture. I&#8217;m pas&shy;sion&shy;ate (and opin&shy;ion&shy;ated) when it comes to UI ap&shy;pear&shy;ance and have a healthy ap&shy;pre&shy;ci&shy;ation for what con&shy;sti&shy;tutes re&shy;spons&shy;ible serv&shy;er-side prac&shy;tice. For the last sev&shy;en years of my ca&shy;reer, however, I&#8217;ve been de&shy;voted to mak&shy;ing the present&shy;a&shy;tion lay&shy;er hap&shy;pen with web stand&shy;ard html, css, and JavaS&shy;cript. Oth&shy;er&shy;wise put, a single ele&shy;ment of the trin&shy;ity has kept me oc&shy;cu&shy;pied full-time. And with the new html5, css3, ECMAscript5, and myri&shy;ad frame&shy;works sup&shy;port&shy;ing these, I&#8217;m con&shy;fid&shy;ent I could con&shy;tin&shy;ue my ded&shy;ic&shy;ated front end fo&shy;cus without ever scrap&shy;ing the bot&shy;tom of the know&shy;ledge bar&shy;rel.</p>
<p>One of the com&shy;ments on Car&shy;son&#8217;s ori&shy;gin&shy;al blog post likened the evol&shy;u&shy;tion of web spe&shy;cial&shy;iz&shy;a&shy;tions to what&#8217;s happened in the med&shy;ic&shy;al field over the past fifty years. &#160;It used to be that a sur&shy;geon was a sur&shy;geon; today we have heart sur&shy;geons, brain sur&shy;geons, left knee oth&shy;o&shy;pods, right knee oth&shy;o&shy;pods&#8230; While the de&shy;gree to which this spe&shy;cial&shy;iz&shy;a&shy;tion needs to hap&shy;pen is de&shy;bat&shy;able, spe&shy;cial&shy;iz&shy;a&shy;tion it&shy;self is less so. As prac&shy;tices and tech&shy;no&shy;lo&shy;gies ma&shy;ture so do the bod&shy;ies of know&shy;ledge that sur&shy;round them, un&shy;til even&shy;tu&shy;ally it be&shy;comes too much to ex&shy;pect that a single phys&shy;i&shy;cian or pro&shy;gram&shy;mer be ex&shy;pertly pro&shy;fi&shy;cient across the spec&shy;trum. Doc&shy;tors be&shy;come neur&shy;o&shy;lo&shy;gists or rheum&shy;at&shy;o&shy;lo&shy;gists. Soft&shy;ware de&shy;sign&shy;ers be&shy;come UI de&shy;velopers or backend en&shy;gin&shy;eers.</p>
<p>In the end it comes down to the level of care the pa&shy;tient or cli&shy;ent ex&shy;pects. I&#8217;ve built end-to-end LAMP stack solu&shy;tions that seem to per&shy;form ad&shy;equately. As a php/DB dilletante, however I know that the back end ar&shy;chi&shy;tec&shy;ture of these sys&shy;tems should be im&shy;proved and will prob&shy;ably hinder scal&shy;ing ef&shy;forts, for ex&shy;ample, un&shy;til the im&shy;prove&shy;ments hap&shy;pen. I&#8217;ve like&shy;wise worked in en&shy;vir&shy;on&shy;ments where JAVA pro&shy;gram&shy;mers have been asked to as&shy;semble and pro&shy;gram User In&shy;ter&shy;faces. Here, the res&shy;ult&shy;ing prob&shy;lem can ar&shy;gu&shy;ably be more ser&shy;i&shy;ous since design and in&shy;ter&shy;ac&shy;tion blun&shy;ders land dir&shy;ectly in the user&#8217;s lap.</p>
<p>So when I think about per&shy;fectly di&shy;vid&shy;ing web app labor (in a nimble or&shy;gan&shy;iz&shy;a&shy;tion) I have three people in mind. The first is Car&shy;son&#8217;s afore&shy;men&shy;tioned &#8216;web de&shy;sign&shy;er,&#8217; who is kick-ass in all things pho&shy;toshop and il&shy;lus&shy;trat&shy;or on top of be&shy;ing a true visu&shy;al artist. The second gets off on and is ex&shy;pert at all things serv&shy;er-side in&shy;clud&shy;ing DB design and im&shy;ple&shy;ment&shy;a&shy;tion, SQL, and php. Last is me do&shy;ing the things I&#8217;m pas&shy;sion&shy;ate about and ex&shy;pert at: UI and in&shy;ter&shy;ac&shy;tion design, markup, css, and JavaS&shy;cript. We move around in each oth&shy;er&#8217;s ter&shy;rit&shy;or&shy;ies and do bet&shy;ter work in our own be&shy;cause of this. But the concept of the trin&shy;ity and its areas of ex&shy;pert&shy;ise un&shy;der&shy;pin beau&shy;ti&shy;ful, in&shy;tu&shy;it&shy;ive, per&shy;form&shy;ant, scal&shy;able, and main&shy;tain&shy;able ap&shy;plic&shy;a&shy;tions. Now Car&shy;son may well have at&shy;trac&shy;ted a su&shy;per&shy;star crew com&shy;pris&shy;ing the (ever) rare(er) kit&shy;chen sink de&shy;veloper. I simply don&#8217;t think the two-man team is gen&shy;er&shy;ally a vi&shy;able pre&shy;scrip&shy;tion for well-de&shy;signed ap&shy;plic&shy;a&shy;tions. In my book it takes three. That is, un&shy;til cross-chan&shy;nel ini&shy;ti&shy;at&shy;ives re&shy;quire the stra&shy;tegic per&shy;spect&shy;ive that a real UX Pro will of&shy;fer&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/business/in-response-to-ryan-carson.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

