<?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"
	>

<channel>
	<title>New Skies Development Blog</title>
	<atom:link href="http://blog.coltcooper.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.coltcooper.com</link>
	<description></description>
	<pubDate>Thu, 14 Aug 2008 16:38:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Managing New Skies Settings</title>
		<link>http://blog.coltcooper.com/managing-new-skies-settings/</link>
		<comments>http://blog.coltcooper.com/managing-new-skies-settings/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 06:58:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[SkySales]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=21</guid>
		<description><![CDATA[A new tool exists to help manage settings between two NewSkies environments.  This makes the configuration manager's job a bit more bearable.]]></description>
			<content:encoded><![CDATA[<p>Configuration settings management in New Skies can plague airlines of all sizes.</p>
<p>To be successful at change management in New Skies, carriers resort to a gatekeeper concept where a single person or group is responsible for changes in the development / test / production environments.</p>
<p>The tools that ship with New Skies out of the box fall short of managing settings across multiple environments.  This is either a manual process of having two management windows open at the same time and tediously ensuring the settings are the same in both environments or a request is put in to an understaffed Navitaire operations group to run a database script to bulk copy settings between environments.  I&#8217;ve developed a tool that makes settings management between environments simple.</p>
<p>The Settings Manager tool has two modes, Compare and Sync.  Compare allows the comparison of two settings snapshots.  These could be brand new snapshots between two environments or even two different historical snapshots of the same environment.</p>
<p>If you’re a publicly held company in the US then you’re all too familiar with Sarbanes Oxley requirements.  New Skies is an IT system that directly affects financials, therefore, you’ll need the ability to audit changes to those settings.  The NewSkies database schema fails to provide an auditing of system settings; only saving information on the time a setting was last changed and the user who changed it.  Once a few changes to the same setting has been made, the original information is overwritten.</p>
<p>The Settings Manager can be scheduled to take snapshots of settings on a periodical basis and archive them for auditing.  Snapshots are then archived on disk – there&#8217;s no database to worry about or maintain.</p>
<p>Click play below for a demonstration of the Settings Manager.<br />
<script src="http://www.apple.com/library/quicktime/scripts/ac_quicktime.js" language="JavaScript" type="text/javascript"></script><br />
<script src="http://www.apple.com/library/quicktime/scripts/qtp_library.js" language="JavaScript" type="text/javascript"></script></p>
<link href="http://www.apple.com/library/quicktime/stylesheets/qtp_library.css" rel="StyleSheet" type="text/css" />
<script type="text/javascript"><!--
	QT_WritePoster_XHTML('Click to Play', 'http://blog.coltcooper.com/wp-content/uploads/2008/08/Settings%20Manager%20Web-poster.jpg',
		'http://blog.coltcooper.com/wp-content/uploads/2008/08/Settings%20Manager%20Web.mov',
		'639', '495', '',
		'controller', 'true',
		'autoplay', 'true',
		'bgcolor', 'black',
		'scale', 'aspect');
//-->
</script><br />
<noscript><br />
<object width="639" height="495" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab"><param name="src" value="http://blog.coltcooper.com/wp-content/uploads/2008/08/Settings%20Manager%20Web-poster.jpg" /><param name="href" value="http://blog.coltcooper.com/wp-content/uploads/2008/08/Settings%20Manager%20Web.mov" /><param name="target" value="myself" /><param name="controller" value="false" /><param name="autoplay" value="false" /><param name="scale" value="aspect" /><embed width="639" height="495" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"<br />
		src="http://blog.coltcooper.com/wp-content/uploads/2008/08/Settings%20Manager%20Web-poster.jpg"<br />
		href="http://blog.coltcooper.com/wp-content/uploads/2008/08/Settings%20Manager%20Web.mov"<br />
		target="myself"<br />
		controller="false"<br />
		autoplay="false"<br />
		scale="aspect"></embed></object><br />
</noscript></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/managing-new-skies-settings/feed/</wfw:commentRss>
<enclosure url="http://blog.coltcooper.com/wp-content/uploads/2008/08/Settings%20Manager%20Web.mov" length="317" type="video/quicktime" />
		</item>
		<item>
		<title>&#8220;Booking Modified By Another User&#8221; Error</title>
		<link>http://blog.coltcooper.com/booking-modified-by-another-user-error/</link>
		<comments>http://blog.coltcooper.com/booking-modified-by-another-user-error/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 21:55:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[SkySales]]></category>

		<category><![CDATA[booking]]></category>

		<category><![CDATA[error]]></category>

		<category><![CDATA[Navitaire]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=20</guid>
		<description><![CDATA[On a recent implementation of NewSkies implementation of SkySales, I would occasionally run into a strange error from the NewSkies application server: “Booking Modified By Another User”.]]></description>
			<content:encoded><![CDATA[<p>On a recent implementation of NewSkies implementation of SkySales, I would occasionally run into a strange error from the NewSkies application server: “Booking Modified By Another User”.  It seemed to occur only after a booking was initially created, then was modified again.  On the second attempt at committing the booking, core (the app server) would occasionally throw this error.</p>
<p>This error is triggered when the application server detects that the last updated date/time of the booking in the database doesn’t match what it has in memory.  While this is a valid sanity check to prevent the application server blindly overwriting a booking in the database, we had no idea who or what was modifying the booking in between our commits.</p>
<p>After some digging, we discovered that the last user updating the booking was a process account (ProcessMaster).  This can be seen when whatever action it took left a trace in the booking history (viewed in SkySpeed).</p>
<p>As Navitaire doesn’t seem to have a solution for the problem, the best recommendation was to re-retrieve the booking when this error was found and try the commit again.  This would refresh the application server with the most recent copy of the booking and reset things on the web server as well.</p>
<p>This unfortunately has a side effect of killing any changes the user has just requested to their booking.  It’s less painful if they have to repeat just one screen of changes, but it’s worse if they just finished a change process involving a number of steps.</p>
<p>The only good solution I can think of is to create a change playback queue of actions on any controller calls.  This is theoretical at this point, but I believe one could create a custom state booking controller that uses the default Navitaire SkySales booking controller and queues calls through it.  The only problem with this approach (and it’s a big one) is that Navitaire used a concrete implementation of the booking controller in all of their controls instead of an interface.  This means that you cannot step in between those controls and the controllers without messy overrides.  This solution would only work on custom code.</p>
<p>We can only hope that SkySales will continue to mature and move more toward interfaces.  Unfortunately interfaces are the only Object Oriented way in C# to gain some control over what is going on under the covers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/booking-modified-by-another-user-error/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rethinking the SkySales Payment Control</title>
		<link>http://blog.coltcooper.com/rethinking-the-skysales-payment-control/</link>
		<comments>http://blog.coltcooper.com/rethinking-the-skysales-payment-control/#comments</comments>
		<pubDate>Tue, 27 May 2008 06:04:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[SkySales]]></category>

		<category><![CDATA[Configuration]]></category>

		<category><![CDATA[Control]]></category>

		<category><![CDATA[Custom]]></category>

		<category><![CDATA[New Skies]]></category>

		<category><![CDATA[Payment]]></category>

		<category><![CDATA[PaymentInput]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=15</guid>
		<description><![CDATA[Discover why the default Navitaire payment control isn't great if you need to customize your payment page.]]></description>
			<content:encoded><![CDATA[<p>The Navitaire New Skies SkySales web platform ships with a number of controls out of the box.  One of the more complicated of these is the PaymentInput control.</p>
<p>The PaymentInput control was created with a tabbed paradigm in mind:</p>
<p><a href="http://blog.coltcooper.com/wp-content/uploads/2008/05/tabbed-payment1.jpg"><img class="aligncenter size-full wp-image-13" title="Tabbed Payment Control" src="http://blog.coltcooper.com/wp-content/uploads/2008/05/tabbed-payment1.jpg" alt="Tabbed Payment Control" width="424" height="283" /></a></p>
<p style="text-align: center;"><strong>Figure 1 - <a title="CebuPacific" href="http://book.cebupacificair.com/" target="_blank">CebuPacific&#8217;s</a> Default PaymentInput Control</strong></p>
<p>The original idea was that since the customer could have multiple forms of payment available to them (vouchers, credit, credit cards, etc) and they could pick and choose between adding types of payment by clicking on tabs to enter into the specific payment mode.  The concept probably sounded great because the forms of payment are dynamic, so it’s easy to add and remove tabs based on what the customer has available to them.  In practice, airline websites just don’t work that way.</p>
<p>The major problem with the default payment control is that it’s bound by the ASP.NET postback model.  A postback to the server is required to change payment modes and to change credit card types.  Both of these are confusing to a customer and cause discomfort and discord at the moment of sale.</p>
<p>A secondary problem is that since the control is attempting to handle all forms of payments, it’s output and structure is a mess.  It’s complicated enough as is, but to customize it quickly becomes a bigger mess.  After seeing a competent team’s attempt at customizing the base payment control and seeing the spaghetti code created to coax the control to add simple business functionality, I decided that it needed to ultimately be deconstructed and rebuilt from the ground up.</p>
<p>The following diagram shows the before and after structure of the payment control:</p>
<p style="text-align: center;"><strong></strong><a href="http://blog.coltcooper.com/wp-content/uploads/2008/05/navitaire-payment-control.jpg"><img class="aligncenter size-full wp-image-9" title="Navitaire Payment Control" src="http://blog.coltcooper.com/wp-content/uploads/2008/05/navitaire-payment-control.jpg" alt="Navitaire Payment Control" width="385" height="221" /></a></p>
<p style="text-align: center;"><strong>Figure 2 - Before Refactoring</strong></p>
<p style="text-align: left;">
<p style="text-align: left;">And now after we refactored the code into nice specific chunks:</p>
<p style="text-align: center;"><a href="http://blog.coltcooper.com/wp-content/uploads/2008/05/new-payment-control.jpg"><img class="aligncenter size-full wp-image-10" title="New Payment Control" src="http://blog.coltcooper.com/wp-content/uploads/2008/05/new-payment-control.jpg" alt="New Payment Control" width="369" height="198" /></a></p>
<p style="text-align: center;"><strong>Figure 3 - After Refactoring</strong></p>
<p>The new payment control set follows basic object orientated principals by having an abstract base control that contains common functionality needed by most controls and the concrete implementations of the different forms of payment are left to specific payment classes.</p>
<p>This structure is now easy to understand with events and well-defined points of integration.   If a carrier decided to accept an alternate form of payment like PayPal, they would simply need to create a new simple concrete class that collects the payment information, creates the appropriate payment class and submits the payment.</p>
<p>Another feature of having independent payment classes is that they can co-exist on a payment page together.  Remember, with the default Navitaire payment control you had to be in a certain payment mode.  You can’t have vouchers and credit cards both ready to be utilized on the same page at the same time with out getting your hands messy in the default control.</p>
<p>The last benefit of this refactored control is in the realm of refunds.  Without carefully configured rules, it may be possible to use the payment page in the booking path as a way to get refunds in certain circumstances.  Having explicit forms of payment defined on that page prevents those scenarios.</p>
<p>That’s it!  By implementing your own custom payment control you can easily control your own destiny with one of the most critical parts of the booking process: the cash register.</p>
<p>If you&#8217;re interested in the production code that goes along with this article, please contact me.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/rethinking-the-skysales-payment-control/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SkySales Wait Page Optimization</title>
		<link>http://blog.coltcooper.com/skysales-wait-page-optimization/</link>
		<comments>http://blog.coltcooper.com/skysales-wait-page-optimization/#comments</comments>
		<pubDate>Wed, 21 May 2008 06:43:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[SkySales]]></category>

		<category><![CDATA[Custom]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=8</guid>
		<description><![CDATA[I’ve been implementing and customizing on this platform for over two years and never really thought about the performance of something as simple as the humble Wait page.]]></description>
			<content:encoded><![CDATA[<p>This is a first in a series of tweaks and optimizations for the <a title="Navitaire New Skies" href="http://www.navitaire.com/res_and_dist/newskies.asp" target="_blank">Navitaire New Skies</a> web platform called SkySales.  Look for an article on SkySales development shortly.</p>
<h2>Why Wait?</h2>
<p>A wait page on the internet (also referred to as an <a title="interstitial page" href="http://en.wikipedia.org/wiki/Interstitial_webpage" target="_blank">interstitial page</a>) is usually a mundane step in an e-commerce process that’s only purpose is to convey to the user that the system is processing their request and that they should wait patiently.  The SkySales wait page has a singular purpose: to persist until all payments on the reservation receive a definite status back from the payment acquirer.</p>
<p>The out-of-the box wait page up through the current 2.x version of New Skies uses sleep methods to jump into a polling pattern that essentially creates a long running process (shown in the diagram below).</p>
<p style="text-align: center;"><a href="http://blog.coltcooper.com/wp-content/uploads/2008/05/figure1.jpg"><img class="alignnone size-medium wp-image-6 aligncenter" title="Figure 1" src="http://blog.coltcooper.com/wp-content/uploads/2008/05/figure1-500x195.jpg" alt="Figure 1 - The Current Process" width="500" height="195" /></a></p>
<h2>Wake me when we get there</h2>
<p>The profiled result of a process like this will show a large amount of time spent in the polling method.  An IIS thread on the web server and a worker thread are sitting in a Sleep() state most of this time because the actual call to check payment status is tuned and responds sub-second.  The result of this is that a precious IIS thread is blocked and not able to serve other requests on the web server.  Microsoft <a title="Effects of Sleep() on an IIS Thread" href="http://msdn.microsoft.com/en-us/magazine/cc164128.aspx#S3" target="_blank">published an article </a>on the dramatic effects of Sleeping a thread on not only the pages which use sleep, but on other pages as well.</p>
<h2>Keep it simple, silly</h2>
<p>I’ve been implementing and customizing on this platform for over two years and never really thought about the performance of something as simple as the humble Wait page.  The SkySales wait page is often the “forgotten” page when a new carrier implements a Navitaire reservation system.  I frequently see it in it’s non-customized default state on a number of <a title="JetBlue" href="http://www.jetblueairways.com" target="_blank">live implementations</a> for New Skies and Open Skies.</p>
<p>It really wasn’t until I saw that we were spending over 90 seconds in three automated passes through our booking process that made me take a look at alternatives.  The result is a much more simplified process:</p>
<p style="text-align: center;"><a href="http://blog.coltcooper.com/wp-content/uploads/2008/05/figure2.jpg"><img class="alignnone size-full wp-image-7 aligncenter" title="Figure 2" src="http://blog.coltcooper.com/wp-content/uploads/2008/05/figure2.jpg" alt="Figure 2 - The New Wait Page" width="336" height="203" /></a></p>
<p>The code to implement the new wait page is about as simple as the process itself.  The previous long running process has been replaced with a simple client-directed polling pattern.</p>
<p>The new custom Wait control calls the Remoting Client on all loads except the first one (the payment system wouldn&#8217;t be ready for the initial load).  All subsequent page loads are done with a JavaScript refresh based on the system payment settings for the role of the logged in person (anonymous in most cases).</p>
<p>That&#8217;s it!  This new pattern should keep your IIS threads working hard for you.  The code for this is available, but I&#8217;d rather not just link to it.  Send me a message and I&#8217;d be happy to forward the code on.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/skysales-wait-page-optimization/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
