<?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>Mon, 23 Apr 2012 06:14:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Reboot with a Past Blast on SAAS</title>
		<link>http://alexaitken.net/business/reboot-with-a-past-blast-on-saas.htm</link>
		<comments>http://alexaitken.net/business/reboot-with-a-past-blast-on-saas.htm#comments</comments>
		<pubDate>Mon, 23 Apr 2012 05:15:04 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[hec]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[p&h]]></category>
		<category><![CDATA[pioneering]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[transformation]]></category>

		<guid isPermaLink="false">http://alexaitken.net/?p=788</guid>
		<description><![CDATA[blog&#8217;s been dormant. Re&#173;cently I&#8217;ve found my&#173;self in con&#173;ver&#173;sa&#173;tions on products vs ser&#173;vices. I&#8217;ve star&#173;ted dig&#173;ging up some of my B-School work from five years ago. &#8230;are some of the reas&#173;ons I&#8217;m throw&#173;ing up this case study on the SAAS pi&#173;on&#173;eer&#173;ing of P&#38;H (a former em&#173;ploy&#173;er, since ac&#173;quired by ACI). Not en&#173;tirely rel&#173;ev&#173;ant to the [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2012/04/ph-logo.jpg" align="left" style="margin: 6px 10px 0 0"> blog&#8217;s been dormant. Re&shy;cently I&#8217;ve found my&shy;self in con&shy;ver&shy;sa&shy;tions on products vs ser&shy;vices. I&#8217;ve star&shy;ted dig&shy;ging up some of my B-School work from five years ago. &#8230;are some of the reas&shy;ons I&#8217;m throw&shy;ing up this case study on the SAAS pi&shy;on&shy;eer&shy;ing of P&amp;H (a former em&shy;ploy&shy;er, since ac&shy;quired by ACI). Not en&shy;tirely rel&shy;ev&shy;ant to the Busi&shy;ness of front end Code and Design, un&shy;less you con&shy;sider that everything is.</p>
<h4>How one com&shy;pany’s product-to-ser&shy;vice evol&shy;u&shy;tion is open&shy;ing new mar&shy;kets and demo&shy;crat&shy;iz&shy;ing the bank&shy;ing sec&shy;tor</h4>
<p>P&amp;H Solu&shy;tions Inc. (P&amp;H) is the U.S. mar&shy;ket lead&shy;er in de&shy;vel&shy;op&shy;ing cash man&shy;age&shy;ment and com&shy;mer&shy;cial bank&shy;ing soft&shy;ware. Foun&shy;ded in 1983 and (there&shy;fore) ini&shy;tially ded&shy;ic&shy;ated to the de&shy;vel&shy;op&shy;ment of DOS and Win&shy;dows products, the com&shy;pany’s product of&shy;fer&shy;ings are now en&shy;tirely web-based. P&amp;H today has an in&shy;stalled base of over 100 fin&shy;an&shy;cial in&shy;sti&shy;tu&shy;tions (FIs) in pro&shy;duc&shy;tion, in&shy;clud&shy;ing icons such as J.P. Mor&shy;gan and Mer&shy;rill Lynch but also nu&shy;mer&shy;ous cred&shy;it uni&shy;ons and smal&shy;ler re&shy;gion&shy;al banks. P&amp;H soft&shy;ware serves as the in&shy;ter&shy;face between these in&shy;sti&shy;tu&shy;tions and their cus&shy;tom&shy;ers, en&shy;abling the lat&shy;ter to per&shy;form as&shy;sor&shy;ted bank&shy;ing activ&shy;it&shy;ies re&shy;motely.</p>
<p>As little as 5-6 years ago P&amp;H sold 100% of its soft&shy;ware on the ‘in-house,’ or ‘li&shy;cense mod&shy;el.’ Fin&shy;an&shy;cial in&shy;sti&shy;tu&shy;tions ran their own hard&shy;ware, bought Web Cash Man&shy;ager ‘product mod&shy;ules,’ and paid P&amp;H sig&shy;ni&shy;fic&shy;ant project man&shy;age&shy;ment fees for the per&shy;son&shy;nel and know-how re&shy;quired to con&shy;fig&shy;ure the pro&shy;grams and ma&shy;chines in&shy;volved and bring the new sys&shy;tem to mar&shy;ket (when FI cus&shy;tom&shy;ers would make live, money trans&shy;ac&shy;tions us&shy;ing the sys&shy;tem). Cur&shy;rently, however, the ma&shy;jor&shy;ity of the deals P&amp;H closes ad&shy;here to an en&shy;tirely dif&shy;fer&shy;ent mod&shy;el.</p>
<p>One-half to a full two-thirds of P&amp;H cus&shy;tom&shy;ers today are in&shy;stalled in the com&shy;pany’s ‘Out&shy;source Solu&shy;tion Cen&shy;ter’ (OSC) With this of&shy;fer&shy;ing, P&amp;H re&shy;lieves fin&shy;an&shy;cial in&shy;sti&shy;tu&shy;tions of the bur&shy;den of host&shy;ing and ad&shy;min&shy;is&shy;ter&shy;ing their own hard&shy;ware. FIs choose from among the same product mod&shy;ules as those offered un&shy;der the li&shy;cense mod&shy;el but run them on ma&shy;chines that P&amp;H man&shy;ages in part&shy;ner&shy;ship with a third party, NCR. The dif&shy;fer&shy;ence between mod&shy;els is en&shy;tirely trans&shy;par&shy;ent to the end-users (FI cor&shy;por&shy;ate cus&shy;tom&shy;ers).</p>
<p>P&amp;H’s out&shy;source mod&shy;el was made pos&shy;sible by a new tech&shy;no&shy;logy (the in&shy;ter&shy;net), and by the ob&shy;ser&shy;va&shy;tion from mem&shy;bers of a formerly-ex&shy;cluded mar&shy;ket seg&shy;ment (small FIs) that the tech&shy;no&shy;logy could be lever&shy;aged to put them on an even play&shy;ing field with the big guys. This pa&shy;per de&shy;tails the cir&shy;cum&shy;stances lead&shy;ing to the out&shy;source of&shy;fer&shy;ing, the dif&shy;fer&shy;ences between the out&shy;source and li&shy;cense mod&shy;els, and the pro&shy;cess that P&amp;H went through to set up its Out&shy;source Solu&shy;tions Cen&shy;ter.</p>
<h5>Back&shy;ground</h5>
<p>Through most of the 1980s and 1990s P&amp;H de&shy;veloped and sold DOS and Win&shy;dows ver&shy;sions of its cash man&shy;age&shy;ment soft&shy;ware. Large FIs and their cor&shy;por&shy;ate cus&shy;tom&shy;ers in&shy;stalled the soft&shy;ware, which en&shy;abled the lat&shy;ter to sub&shy;mit batch-based trans&shy;ac&shy;tion in&shy;struc&shy;tions via mo&shy;dem. 1998 saw P&amp;H’s re&shy;lease of Web Cash Man&shy;ager (WCM) – a move con&shy;sist&shy;ent with a soft&shy;ware-in&shy;dustry-wide trend to&shy;wards web-based ap&shy;plic&shy;a&shy;tion de&shy;liv&shy;ery and its in&shy;her&shy;ent eco&shy;nom&shy;ies. While in&shy;stall&shy;a&shy;tion of P&amp;H soft&shy;ware was still re&shy;quired on the FI-side, soft&shy;ware dis&shy;tri&shy;bu&shy;tion to FI cus&shy;tom&shy;ers was elim&shy;in&shy;ated as these could now use the ubi&shy;quit&shy;ous In&shy;ter&shy;net Ex&shy;plorer or Nets&shy;cape Nav&shy;ig&shy;at&shy;or to in&shy;ter&shy;face with their fin&shy;an&shy;cial in&shy;sti&shy;tu&shy;tions.</p>
<p>But al&shy;most as soon as the ini&shy;tial WCM re&shy;lease was mar&shy;keted, P&amp;H sales people and ex&shy;ec&shy;ut&shy;ives star&shy;ted sens&shy;ing that the move to an in&shy;ter&shy;net-based product prom&shy;ised be&shy;ne&shy;fits far bey&shy;ond those im&shy;plied by just the saved post&shy;age and lo&shy;gist&shy;ics of an elim&shy;in&shy;ated cli&shy;ent soft&shy;ware dis&shy;tri&shy;bu&shy;tion re&shy;quire&shy;ment. “Our DOS and Win&shy;dows products were really only avail&shy;able to large in&shy;sti&shy;tu&shy;tions be&shy;cause of the sig&shy;ni&shy;fic&shy;ant, up-front cap&shy;it&shy;al out&shy;lays they re&shy;quired,” ex&shy;plains Terry Mon&shy;teith, P&amp;H Seni&shy;or VP of Product and Mar&shy;ket&shy;ing. “Ini&shy;tially this was true of Web Cash Man&shy;ager un&shy;der the li&shy;cense mod&shy;el as well. But around 1999, with WCM on the mar&shy;ket for about a year, we star&shy;ted hear&shy;ing from smal&shy;ler banks that if we could run the soft&shy;ware for them, they’d be able to af&shy;ford same tech&shy;no&shy;lo&shy;gies as the big guys. So we gave it a shot.” </p>
<p>And the shot hit home. By as&shy;sum&shy;ing hard&shy;ware and ad&shy;min&shy;is&shy;tra&shy;tion re&shy;spons&shy;ib&shy;il&shy;it&shy;ies and of&shy;fer&shy;ing a rev&shy;en&shy;ue shar&shy;ing-based pri&shy;cing scheme (which in ef&shy;fect amounts to a rent), P&amp;H lowered the up-front out&shy;lay re&shy;quired of banks by a factor of 10. This proved the key to open&shy;ing up en&shy;tirely new mar&shy;kets for P&amp;H and the Web Cash Man&shy;ager product, as il&shy;lus&shy;trated by the fig&shy;ure be&shy;low.</p>
<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2012/04/hec-saas-1.png" style="border:none"></p>
<p style="font-style:italic"><b>Fig&shy;ure 1</b> Num&shy;ber of U.S. com&shy;mer&shy;cial banks by total as&shy;sets, with P&amp;H’s tra&shy;di&shy;tion&shy;al and newly rel&shy;ev&shy;ant mar&shy;ket seg&shy;ments high&shy;lighted. Data as of 9/30/2006, provided by FD&shy;IC.</p>
<p><b>The Two Mod&shy;els Com&shy;pared From an FI’s View&shy;point</b></p>
<p>The ta&shy;ble be&shy;low sum&shy;mar&shy;izes the key FI con&shy;sid&shy;er&shy;a&shy;tions of price, pay&shy;ment sched&shy;ule, and time-to-mar&shy;ket for the li&shy;censed and out&shy;sourced de&shy;ploy&shy;ment mod&shy;els. Fig&shy;ures are for the ‘En&shy;ter&shy;prise’ edi&shy;tion of Web Cash Man&shy;ager with all mod&shy;ules in&shy;stalled and full func&shy;tion&shy;al&shy;ity de&shy;livered.</p>
<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2012/04/hec-saas-2.png" style="border:none"></p>
<p><b>Product, Ser&shy;vices, and Rents</b></p>
<p>When P&amp;H switched its fo&shy;cus from DOS and Win&shy;dows to the in&shy;ter&shy;net, it did so be&shy;cause of the evid&shy;ent be&shy;ne&shy;fits that web-based soft&shy;ware prom&shy;ised in terms of cus&shy;tom&shy;er-base growth (as P&amp;H is a B2B com&shy;pany, the growth was to be in its cli&shy;ents’ cus&shy;tom&shy;er bases but the value of this growth was of course to be shared). Product de&shy;liv&shy;ery, however, con&shy;tin&shy;ued in much the same way as dur&shy;ing the era of the com&shy;pany’s mo&shy;dem-re&shy;li&shy;ant products. And in&shy;deed many of P&amp;H’s cli&shy;ents still ad&shy;here to this ‘li&shy;cense’ mod&shy;el, whereby the Web Cash Man&shy;ager product is bought out&shy;right and phys&shy;ic&shy;ally in&shy;stalled on ma&shy;chines at the cli&shy;ent sites. The value of the product is bought and trans&shy;ferred.</p>
<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2012/04/hec-saas-3.png" style="border:none"></p>
<p style="font-style:italic"><b>Fig&shy;ure 2</b> The tra&shy;di&shy;tion&shy;al value trans&shy;fer mod&shy;el. FI buys Web Cash Man&shy;ager out&shy;right from P&amp;H (as&shy;sum&shy;ing its value), rents re&shy;quired con&shy;sult&shy;ing and sup&shy;port ser&shy;vices, and sells ac&shy;cess to the product it now owns to its cor&shy;por&shy;ate cus&shy;tom&shy;ers.</p>
<p>In con&shy;trast to the value trans&shy;fer mod&shy;el above, P&amp;H has, for close to a dec&shy;ade now, been de&shy;vel&shy;op&shy;ing its OSC of&shy;fer&shy;ing. As de&shy;scribed, this is a mod&shy;el in which P&amp;H does not sell the Web Cash Man&shy;ager product it&shy;self, but in&shy;stead sells ac&shy;cess to it. As the num&shy;ber of FIs rent&shy;ing this ac&shy;cess has in&shy;creased and the out&shy;source op&shy;er&shy;a&shy;tion has grown, P&amp;H has found that it in turn has needed to pur&shy;chase ser&shy;vices from oth&shy;er, third-party pro&shy;viders. In ef&shy;fect, the val&shy;ues of the sep&shy;ar&shy;ate ser&shy;vices ac&shy;crue as we move down&shy;stream along the chain.</p>
<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2012/04/hec-saas-4.png" style="border:none"></p>
<p style="font-style:italic"><b>Fig&shy;ure 3</b> The out&shy;sourced value ac&shy;cru&shy;al mod&shy;el. PH rents host&shy;ing (from NCR) and data re&shy;dund&shy;ancy (from Sav&shy;vis) ser&shy;vices; FIs rent Web Cash Man&shy;ager mod&shy;ules and sys&shy;tem man&shy;age&shy;ment from PH; Cor&shy;por&shy;ate cus&shy;tom&shy;ers rent ac&shy;cess form FIs to the Web Cash Man&shy;ager func&shy;tion&shy;al&shy;ity that lets them man&shy;age their treas&shy;ury op&shy;er&shy;a&shy;tions.</p>
<h5>Trans&shy;form&shy;a&shy;tion Pro&shy;cess</h5>
<p>Al&shy;most as soon as Web Cash Man&shy;ager was re&shy;leased, P&amp;H star&shy;ted hear&shy;ing re&shy;quests for an out&shy;source op&shy;er&shy;a&shy;tion from smal&shy;ler banks who had too long been shut out of the big-tech&shy;no&shy;logy mar&shy;ket. In re&shy;sponse, P&amp;H ef&shy;fect&shy;ively called the seg&shy;ment’s bluff by hav&shy;ing its sales force pro&shy;act&shy;ively ex&shy;plore the idea dur&shy;ing 1-on-1 sales calls to po&shy;ten&shy;tial cli&shy;ents. The com&shy;pany needed a pi&shy;on&shy;eer. “We felt from a gut level that there was an op&shy;por&shy;tun&shy;ity there for us,” Mon&shy;teith ex&shy;plains. “We just wanted to get one bank to com&shy;mit so that we’d have a con&shy;crete reas&shy;on to in&shy;vest.”</p>
<p><b>Stage 1 &#8211; Pi&shy;on&shy;eer&shy;ing</b></p>
<p>In 1998/9 they got their trail&shy;blazer. Dur&shy;ing what Mon&shy;teith calls ‘Stage 1’ of the Out&shy;sourcing ven&shy;ture, P&amp;H ran the WCM soft&shy;ware for this ini&shy;tial cli&shy;ent, and those that tumbled in on its heels, on ma&shy;chines housed at the com&shy;pany’s headquar&shy;ters in New&shy;ton, MA, just out&shy;side of Bo&shy;ston. Ex&shy;ist&shy;ing com&shy;pany re&shy;sources were re&shy;dis&shy;trib&shy;uted to sup&shy;port the ef&shy;fort.</p>
<p>It didn’t take long for the com&shy;pany to re&shy;cog&shy;nize what it had spawned. “With&shy;in the first year it be&shy;came pretty clear to us that this was go&shy;ing to take off,” Mon&shy;teith says. “We had 15-20 banks in&shy;stalled in our out&shy;sourcing cen&shy;ter and it be&shy;came clear that we, in turn, were go&shy;ing to have to out&shy;source parts of the op&shy;er&shy;a&shy;tion.”</p>
<p>FIs opt&shy;ing for P&amp;H’s new Out&shy;sourcing Solu&shy;tion Cen&shy;ter were choos&shy;ing to en&shy;trust the non-core areas of IT in&shy;fra&shy;struc&shy;ture and soft&shy;ware ad&shy;min&shy;is&shy;tra&shy;tion to what was in ef&shy;fect a second party – the com&shy;pany whose soft&shy;ware was ne&shy;ces&shy;sit&shy;at&shy;ing the in&shy;fra&shy;struc&shy;ture and ad&shy;min&shy;is&shy;tra&shy;tion. As a soft&shy;ware de&shy;vel&shy;op&shy;ment firm, P&amp;H had fairly ro&shy;bust in&shy;tern&shy;al IT re&shy;sources and ex&shy;pert&shy;ise that were able to ab&shy;sorb the in&shy;fra&shy;struc&shy;ture re&shy;quire&shy;ments of its early Out&shy;sourcing Solu&shy;tion Cen&shy;ter ad&shy;op&shy;ters. But with 20 banks in&shy;stalled and more knock&shy;ing at the door, those re&shy;sources were stretched and com&shy;pany man&shy;age&shy;ment real&shy;ized that it, in turn, needed to di&shy;vest it&shy;self of pieces of the op&shy;er&shy;a&shy;tion not tied to its core soft&shy;ware de&shy;vel&shy;op&shy;ment and sup&shy;port mis&shy;sion. </p>
<p>P&amp;H tapped NCR Cor&shy;por&shy;a&shy;tion, with whom it had an ex&shy;ist&shy;ing re&shy;seller agree&shy;ment, for the job of host&shy;ing the ma&shy;chines and in&shy;fra&shy;struc&shy;ture that would run Web Cash Man&shy;ager in&shy;stall&shy;a&shy;tions for OSC cli&shy;ents. With the agree&shy;ment, phys&shy;ic&shy;al hard&shy;ware sup&shy;port&shy;ing the op&shy;er&shy;a&shy;tion moved to Mary&shy;land, U.S., while at P&amp;H headquar&shy;ters in Mas&shy;sachu&shy;setts a bare&shy;bones team was kept on to re&shy;motely man&shy;age the in&shy;stall&shy;a&shy;tions.</p>
<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2012/04/hec-saas-5.png" style="border:none"></p>
<p style="font-style:italic"><b>Fig&shy;ure 4</b> Align&shy;ment of act&shy;ors and core com&shy;pet&shy;en&shy;cies (in black) over time. Ini&shy;tially FIs as&shy;sume 3 main op&shy;er&shy;a&shy;tion&shy;al areas, only one of which is their core busi&shy;ness. With the NCR deal, the 3 main op&shy;er&shy;a&shy;tion&shy;al areas have been dis&shy;trib&shy;uted to the three cor&shy;res&shy;pond&shy;ing spe&shy;cial&shy;ists.</p>
<p><b>Stage 2 &#8211; Grow&shy;ing Up</b></p>
<p>P&amp;H had suc&shy;ceeded in find&shy;ing a cap&shy;able part&shy;ner to as&shy;sume the hard&shy;ware im&shy;plic&shy;a&shy;tions of the Out&shy;source Solu&shy;tion Cen&shy;ter. But the cus&shy;tom&shy;ers kept com&shy;ing, and even hav&shy;ing es&shy;caped in&shy;fra&shy;struc&shy;ture re&shy;spons&shy;ib&shy;il&shy;it&shy;ies, those in&shy;volved with the out&shy;sourcing project found them&shy;selves kick&shy;ing hard to keep their heads above wa&shy;ter. “At 25 to 30 in&shy;stalled banks, we star&shy;ted feel&shy;ing some pain,” says Mon&shy;teith. “It’s boot&shy;strapped, fly-by the seat of your pants stuff and we were hav&shy;ing a hard time keep&shy;ing up. We ba&shy;sic&shy;ally ad&shy;dressed this through staff&shy;ing, and through bring&shy;ing in out&shy;side ex&shy;pert&shy;ise”</p>
<p>P&amp;H was no longer treat&shy;ing the Out&shy;source Solu&shy;tion Cen&shy;ter as an ex&shy;per&shy;i&shy;ment or side project, but rather as a profit cen&shy;ter of huge po&shy;ten&shy;tial to which ded&shy;ic&shy;ated re&shy;sources needed to be de&shy;voted. And as the com&shy;pany be&shy;came more ad&shy;ept at man&shy;aging the en&shy;vir&shy;on&shy;ment with more suc&shy;cess stor&shy;ies to share, the pro&shy;files of the banks who were sign&shy;ing up di&shy;ver&shy;si&shy;fied. Quoted in 2001, Mike Thong&shy;pait&shy;hoon, who was then P&amp;H’s dir&shy;ect&shy;or of cli&shy;ent ser&shy;vices, de&shy;scribed P&amp;H’s out&shy;sourcing cus&shy;tom&shy;ers. “They are typ&shy;ic&shy;ally re&shy;gion&shy;al and smal&shy;ler com&shy;munity banks that need to com&shy;pete with the big boys. But we also have some big cus&shy;tom&shy;ers – banks in the bil&shy;lion-dol&shy;lar plus range – out&shy;sourcing be&shy;cause they just don&#8217;t want to deal with the hassles.&quot;</p>
<p>Over the next years, as the num&shy;ber of in&shy;stalled banks climbed to&shy;wards 60, more big banks would come, each pre&shy;sum&shy;ably bolstered in con&shy;fid&shy;ence by the one that pre&shy;ceded. The sign&shy;ing of a $10b FI in&shy;to the Out&shy;sourcing Solu&shy;tion Cen&shy;ter was a mile&shy;stone un&shy;til re&shy;cently, when a $70b bank chose to out&shy;source to P&amp;H. “The stakes are def&shy;in&shy;itely get&shy;ting pretty high, “ says Mon&shy;teith. “And or&shy;gan&shy;iz&shy;a&shy;tion&shy;ally, we’re start&shy;ing to look at Out&shy;sourcing as one of our biggest cus&shy;tom&shy;ers.”</p>
<p><b>Stage 3 &#8211; Matur&shy;ing With the En&shy;vir&shy;on&shy;ment</b></p>
<p>As P&amp;H has ma&shy;tured in its man&shy;age&shy;ment and de&shy;liv&shy;ery of out&shy;sourced solu&shy;tions, so too has the reg&shy;u&shy;lat&shy;ory en&shy;vir&shy;on&shy;ment in which it op&shy;er&shy;ates. Today, the chal&shy;lenges P&amp;H faces with the Out&shy;source Solu&shy;tion Cen&shy;ter de&shy;rive from both the size of its cus&shy;tom&shy;er base and a set of gov&shy;ern&shy;ment rules that has grown up around the in&shy;ter&shy;net bank&shy;ing in&shy;dustry. A par&shy;tial list of these in&shy;cludes:</p>
<ul>
<li>Man&shy;age&shy;ment of WCM patch and up&shy;grade in&shy;stall&shy;a&shy;tions</li>
<li>Man&shy;age&shy;ment of mul&shy;tiple ‘pods’ or ‘en&shy;vir&shy;on&shy;ments’ for cus&shy;tom&shy;ers in dif&shy;fer&shy;ent<br />
time zones
</li>
<li>Gov&shy;ern&shy;ment-man&shy;dated SAS Level I and II se&shy;cur&shy;ity audits</li>
<li>Sar&shy;banes Ox&shy;ley com&shy;pli&shy;ance</li>
<li>Dis&shy;aster re&shy;cov&shy;ery and fail&shy;over cap&shy;ab&shy;il&shy;ity (in es&shy;sence, backup solu&shy;tions)</li>
<li>Gov&shy;ern&shy;ment-man&shy;dated user sign-on au&shy;then&shy;tic&shy;a&shy;tion</li>
</ul>
<p>“We’re ba&shy;sic&shy;ally now re&shy;spons&shy;ible for any&shy;thing reg&shy;u&shy;lat&shy;ory hap&shy;pen&shy;ing in the en&shy;vir&shy;on&shy;ment,” says Mon&shy;teith. Fin&shy;an&shy;cial in&shy;sti&shy;tu&shy;tions, in oth&shy;er words, out&shy;source not just the day-to-day op&shy;er&shy;a&shy;tion&shy;al as&shy;pects of an en&shy;ter&shy;prise-level soft&shy;ware im&shy;ple&shy;ment&shy;a&shy;tion, but also all as&shy;so&shy;ci&shy;ated com&shy;pli&shy;ance con&shy;cerns. As a res&shy;ult, P&amp;H has brought in top gun man&shy;age&shy;ment for the Out&shy;source Solu&shy;tion Cen&shy;ter from the out&shy;side and de&shy;veloped new com&shy;pet&shy;en&shy;cies in know&shy;ledge areas it con&shy;siders spe&shy;cif&shy;ic to the core ser&shy;vice it provides with the op&shy;er&shy;a&shy;tion. It con&shy;tin&shy;ues, however, to pen deals with oth&shy;er pro&shy;viders for ser&shy;vices and third-party products it views as an&shy;cil&shy;lary. Re&shy;cently, for ex&shy;ample, P&amp;H brought on a second hard&shy;ware host&shy;ing com&shy;pany, Sav&shy;vis, which has as&shy;sumed dis&shy;aster re&shy;cov&shy;ery and fail&shy;over du&shy;ties for the out&shy;sourcing op&shy;er&shy;a&shy;tion – ba&shy;sic&shy;ally run&shy;ning mirrored in&shy;stall&shy;a&shy;tions of the NCR ma&shy;chines in Mary&shy;land.</p>
<h5>Out&shy;come and Fu&shy;ture Dir&shy;ec&shy;tions</h5>
<p>By any meas&shy;ure, the P&amp;H Out&shy;source Solu&shy;tion Cen&shy;ter has proven a re&shy;sound&shy;ing suc&shy;cess. Talk&shy;ing to Mon&shy;teith, and in&shy;deed any&shy;one who has been in&shy;volved in the ef&shy;fort, about the ex&shy;per&shy;i&shy;ence of get&shy;ting the op&shy;er&shy;a&shy;tion off the ground eli&shy;cits from them terms and phrases such as ‘fren&shy;et&shy;ic,’ ‘rap&shy;id growth,’ ‘hanging on by the seat of our pants.’ At every step along the way, growth in the in&shy;stalled cus&shy;tom&shy;er base has met or ex&shy;ceeded in&shy;tern&shy;al pre&shy;dic&shy;tions.</p>
<p>Dur&shy;ing the near-dec&shy;ade that P&amp;H has been run&shy;ning its Out&shy;source op&shy;er&shy;a&shy;tions it has ac&shy;quired mar&shy;ket know&shy;ledge and Pro&shy;fes&shy;sion&shy;al Ser&shy;vices ex&shy;pert&shy;ise that the com&shy;pany now lever&shy;ages by of&shy;fer&shy;ing con&shy;sult&shy;ing ser&shy;vices to large fin&shy;an&shy;cial in&shy;sti&shy;tu&shy;tions. And in a bid to ap&shy;peal to even the smal&shy;lest banks and budgets, the P&amp;H mar&shy;ket&shy;ing group is now ex&shy;plor&shy;ing the idea of what it calls ‘pro&shy;cessor op&shy;tions.’ With this op&shy;tion, banks could, in ef&shy;fect, choose to share in&shy;stall&shy;a&shy;tions of WCM with oth&shy;er in&shy;sti&shy;tu&shy;tions that were will&shy;ing to fore&shy;go cus&shy;tom&shy;iz&shy;a&shy;tion for price. A cook&shy;ie cut&shy;ter ver&shy;sion of the soft&shy;ware at an even lower price point.</p>
<p><img src="http://alexaitken.net/wordpress/wp-content/uploads/2012/04/hec-saas-6.png" style="border:none"></p>
<p style="font-style:italic"><b>Fig&shy;ure 5</b> Schem&shy;at&shy;ic (NOT to scale) de&shy;pict&shy;ing re&shy;l&shy;at&shy;ive sizes of three P&amp;H seg&shy;ments and mar&shy;ket share in each. Grey bar rep&shy;res&shy;ents num&shy;ber of in&shy;sti&shy;tu&shy;tions in each seg&shy;ment; black bar por&shy;trays P&amp;H’s pen&shy;et&shy;ra&shy;tion of the seg&shy;ment. Dol&shy;lar signs in&shy;dic&shy;ate the com&shy;par&shy;at&shy;ive rev&shy;en&shy;ue rep&shy;res&shy;en&shy;ted by a typ&shy;ic&shy;al deal closed in each seg&shy;ment.</p>
<p>For all P&amp;H’s suc&shy;cess, however, the amaz&shy;ing thing in this B2B en&shy;vir&shy;on&shy;ment is that after 23 years in busi&shy;ness and de&shy;pend&shy;ing on who you talk to, P&amp;H’s total in&shy;stalled cus&shy;tom&shy;er base (in&shy;clud&shy;ing out&shy;sourced and in-house in&shy;stall&shy;a&shy;tions) is between 100 and 150 fin&shy;an&shy;cial in&shy;sti&shy;tu&shy;tions – ap&shy;prox&shy;im&shy;ately 2% (us&shy;ing the more op&shy;tim&shy;ist&shy;ic fig&shy;ure) of the sev&shy;en-to-eight thou&shy;sand banks de&shy;tailed in Fig&shy;ure 1, on page 2. Should P&amp;H de&shy;cide to mar&shy;ket ‘pro&shy;cessor op&shy;tions,’ the de&shy;cision will have been made, in ef&shy;fect, in or&shy;der to blanket all seg&shy;ments with of&shy;fer&shy;ings. It cer&shy;tainly won’t have been made be&shy;cause the com&shy;pany has ex&shy;hausted the mar&shy;kets it cur&shy;rently finds it&shy;self in. The choice P&amp;H cur&shy;rently faces with its Out&shy;sourcing Solu&shy;tion Cen&shy;ter is one between breadth and con&shy;cen&shy;tra&shy;tion.</p>
<h5>Takeaways</h5>
<p>The Fol&shy;low&shy;ing dicta are based on four as&shy;pects that proved key to P&amp;H’s suc&shy;cess&shy;ful growth of its Out&shy;source Solu&shy;tion Cen&shy;ter, and which should be con&shy;sidered in any B2B product-based to ser&shy;vice-based mar&shy;ket&shy;ing evol&shy;u&shy;tion.</p>
<ol>
<li><b>Dip your toe in first&#8230; prefer&shy;ably with a part&shy;ner</b><br />
When P&amp;H first star&shy;ted hear&shy;ing mur&shy;murs about how an out&shy;source of&shy;fer&shy;ing could po&shy;ten&shy;tially provide the keys to a hitherto locked mar&shy;ket, dol&shy;lar signs must have flashed in more than a few sets of eyes. To the mar&shy;ket&shy;ing group’s cred&shy;it, however, the com&shy;pany didn’t lurch for&shy;ward with an if-you-build-it-they-will-come ef&shy;fort. In&shy;stead, it cour&shy;ted a part&shy;ner with whom to test the wa&shy;ters. P&amp;H got guar&shy;an&shy;teed rev&shy;en&shy;ue for its ef&shy;forts and the trail&shy;blaz&shy;ing cli&shy;ent en&shy;joyed spe&shy;cial treat&shy;ment. Had the ven&shy;ture proved a flop, P&amp;H’s losses would have min&shy;im&shy;al. But it didn’t, and we know the rest.
</li>
<li><b>Buy Ser&shy;vices to Provide Ser&shy;vices </b><br />
One of the most in&shy;triguing as&shy;pects of P&amp;H’s ma&shy;ture Out&shy;source Solu&shy;tions Cen&shy;ter is the string of ser&shy;vice-pro&shy;vider agree&shy;ments it com&shy;prises (see Fig&shy;ure 3, page 2). The value chain is in fact a ser&shy;vice chain. As P&amp;H’s out&shy;sourcing op&shy;er&shy;a&shy;tion grew, the com&shy;pany found it&shy;self hav&shy;ing to de&shy;vote an in&shy;creas&shy;ing pro&shy;por&shy;tion of en&shy;ergy and ex&shy;pert&shy;ise to ex&shy;tend&shy;ing its core com&shy;pet&shy;en&shy;cies of WCM de&shy;vel&shy;op&shy;ment and ad&shy;min&shy;is&shy;tra&shy;tion. Less and less band&shy;width was avail&shy;able to ab&shy;sorb man&shy;age&shy;ment of the sup&shy;port&shy;ing in&shy;fra&shy;struc&shy;ture, which in it&shy;self was be&shy;com&shy;ing more in&shy;tric&shy;ate with the ex&shy;pand&shy;ing op&shy;er&shy;a&shy;tion, and so the com&shy;pany con&shy;trac&shy;ted with third-parties who spe&shy;cial&shy;ized in hard&shy;ware and fail&shy;over. In short, P&amp;H found that by out&shy;sourcing parts of its out&shy;sourcing op&shy;er&shy;a&shy;tion, it was able to con&shy;cen&shy;trate on max&shy;im&shy;iz&shy;ing the dif&shy;fer&shy;en&shy;ti&shy;at&shy;ing value for its cus&shy;tom&shy;ers.
</li>
<li><b>Bal&shy;ance</b><br />
Eight years in&shy;to the Out&shy;sourcing ven&shy;ture, Mon&shy;teith says that find&shy;ing the right equi&shy;lib&shy;ri&shy;um is cru&shy;cial to suc&shy;cess. “The chal&shy;lenge be&shy;comes how to keep func&shy;tion&shy;ally com&shy;pet&shy;it&shy;ive, be on top of the all reg&shy;u&shy;lat&shy;ory re&shy;quire&shy;ments, of&shy;fer qual&shy;ity im&shy;ple&shy;ment&shy;a&shy;tion ser&shy;vices, and de&shy;liv&shy;er this at a good price point. It’s really a big bal&shy;an&shy;cing act.” On top of free&shy;ing P&amp;H to con&shy;cen&shy;trate on its core com&shy;pet&shy;en&shy;cies, the third-party deals ref&shy;er&shy;enced above let P&amp;H de&shy;ploy the re&shy;quired hard&shy;ware at a cost sig&shy;ni&shy;fic&shy;antly lower than would have been pos&shy;sible oth&shy;er&shy;wise. P&amp;H has spent ap&shy;prox&shy;im&shy;ately $5m on hard&shy;ware, pays NCR and Sav&shy;vis their rents, and em&shy;ploys twenty people to run the Out&shy;source Solu&shy;tion Cen&shy;ter. With 60 out&shy;sourcing con&shy;tracts worth between $2m and $5m each, the mod&shy;el has proven prof&shy;it&shy;able. Non&shy;ethe&shy;less, should the bal&shy;ance Mon&shy;teith de&shy;scribes be dis&shy;turbed – should the tech&shy;no&shy;lo&shy;gists, for ex&shy;ample, suc&shy;ceed with an in&shy;tern&shy;al sell of the latest in&shy;ter&shy;net tech&shy;no&shy;logy for the WCM product without de&shy;term&shy;in&shy;ing if its value would be per&shy;ceived and bought by P&amp;H’s cus&shy;tom&shy;ers – the profits which are now healthy could well prove to be eph&shy;em&shy;er&shy;al.
</li>
<li><b>Book the Re&shy;cur&shy;ring Rev&shy;en&shy;ue</b><br />
If P&amp;H’s out&shy;sourcing op&shy;er&shy;a&shy;tions had proven just a means to open new mar&shy;kets, cel&shy;eb&shy;ra&shy;tion would have been jus&shy;ti&shy;fied on this count alone. In fact, however, the very pri&shy;cing mod&shy;el that sud&shy;denly made small banks a vi&shy;able seg&shy;ment for the com&shy;pany also proved a boon to the com&shy;pany’s plan&shy;ning cap&shy;ab&shy;il&shy;it&shy;ies. The deals P&amp;H signs for in-house in&shy;stall&shy;a&shy;tions bring the com&shy;pany im&shy;me&shy;di&shy;ate rev&shy;en&shy;ue in today’s dol&shy;lars. But the rev&shy;en&shy;ue shar&shy;ing mod&shy;el in&shy;her&shy;ent in the Out&shy;source Solu&shy;tion Cen&shy;ter deals brings something just as valu&shy;able – a pre&shy;dict&shy;able, re&shy;cur&shy;ring rev&shy;en&shy;ue stream, or an an&shy;nu&shy;ity. Know&shy;ing the pro&shy;por&shy;tion of a fu&shy;ture year’s rev&shy;en&shy;ue goals that has already booked al&shy;lows the com&shy;pany to de&shy;vel&shy;op co&shy;her&shy;ent, long-range plans for growth.
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://alexaitken.net/business/reboot-with-a-past-blast-on-saas.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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[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 of how to [...]]]></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[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 one way [...]]]></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>
	</channel>
</rss>

