<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0">
			<channel>
			<title>Strikefish Blog - Site Performance</title>
			<link>http://blog.strikefish.com/blog/index.cfm</link>
			<description></description>
			<language>en-us</language>
			<pubDate>Mon, 20 May 2013 02:37:27 -0400</pubDate>
			<lastBuildDate>Thu, 31 Mar 2011 20:53:00 -0400</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>jeffrey.bouley@strikefish.com</managingEditor>
			<webMaster>jeffrey.bouley@strikefish.com</webMaster>
			
			<item>
				<title>Get an Airport Extreme</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2011/3/31/Get-an-Airport-Extreme</link>
				<description>
				
				Wow!  So I haven&apos;t blogged in forever, but I had to write something about my experience with my new Airport Extreme...

I had a trusty, well, rusty Linksys Wireless-G.  I know what you&apos;re thinking.  So the short and skinny is that it was about 6 years old and over the course of a couple days choked and died recently.

Being the ignorant wireless router geek that I am, I stepped into Best Buy and looked at the dozens of products they had in stock.  I was a bit cost sensitive so I asked one of the sales guys what my best options were.  Mistake number one.  As much as I hate to say this, this is the 3rd time I&apos;ve been burned by one of these guys...  I told him I needed something solid as I work from my home office and that if the features outweighed the cost I&apos;d go with the better product.

I ended up getting a NetGear N600 trusting that this was the best option after the consult.  Of course it helped that the box had &quot;HIGH PERFORMANCE&quot; on the box.  What malarkey... I am a regular Skype user and after getting the router in place I continually dropped calls to the point where for the 3rd time I was dropped in discussion with a co-worker he stated don&apos;t call me back until you get a new router.

He advised on the Airport Extreme so I purchased online from Apple.  It was delivered via ground in a few days.  MAN!!!!  This thing opens up the pipe!!!  No more dropped Skypes, flying downloads.  I won&apos;t get into the specifics why as I have to run, but get one now if you value a great web/net experience.  

Link to Apple Store:  &lt;a href=&quot;http://store.apple.com/us/product/MC340LL/A/AirPort-Extreme?fnode=MTY1NDEyMQ&amp;mco=MTMzNzk2NTM&quot;&gt;Get IT!&lt;/a&gt; 
				</description>
				
				<category>Entertainment</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<pubDate>Thu, 31 Mar 2011 20:53:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2011/3/31/Get-an-Airport-Extreme</guid>
				
			</item>
			
			<item>
				<title>jvm.config Tuning Tip For All Server Side Java Solutions</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2009/7/15/jvmconfig-Tuning-Tip-For-All-Server-Side-Java-Solutions</link>
				<description>
				
				I have been wanting to blog about an experience I had not too long ago on a project where the jvm was consistently throwing OOM errors.  It had me banging my head against my desk for a few days attempting to trace where the culprit was.

Was it code related?... yes, was it bad code?... sort of, was it very very very intense code (looping over many sql calls and instantiating many objects)?... YES!  The challenge here was to apply a quick band aid rather than redesign this rules engine that had the characteristics listed due to time constraints.  It is important to note I was not responsible for the poorly written code 8-).  

I had to first identify if there were memory leaks due to this code.  To do this I utilized &lt;a href=&quot;http://http://www.yourkit.com/&quot;&gt;YourKit Java Profiler&lt;/a&gt;.  They have .NET and Java profilers that allow you to monitor their respective runtimes.  YourKit Profiler is very simple to configure within the jvm.config file (I&apos;m not going to get into that in this blog).  My point here is that I witnessed memory steadily climb and at times spike, but was only able to reclaim memory when executing a manual GC.  UGGG!!!  So, no memory leak, but the runtime was hanging on to what it had...  Why was the GC not reclaiming memory quickly on it&apos;s own?  I had all the BP jvm args of old, etc., etc. ParNewGC and RMI to no avail.

And to get back to the initial issue; the blasted OOM error.  I searched high and low and identified a thread on a Sun forum that there were issues with jre 1.5 that ultimately threw a OOM error if the runtime was unable to reclaim memory during a GC within a given time frame.  The workaround for this was to set a time constraint in the JVM (which didn&apos;t work) or install 1.6_10 or later.  This was my first step.  I installed this JRE version and pointed my jvm.config to it.  The application ran fine under this JRE except that I was still seeing the memory creep to the ceiling with no reclaim.  

I then read on one of Sun&apos;s GC tuning white papers the following paragraph:

The -XX:+AggressiveHeap option inspects the machine resources (size of memory and number of processors) and attempts to set various parameters to be optimal for long-running, memory allocation-intensive jobs. It was originally intended for machines with large amounts of memory and a large number of CPUs, but in the J2SE platform, version 1.4.1 and later it has shown itself to be useful even on four processor machines. With this option the throughput collector (-XX:+UseParallelGC) is used along with adaptive sizing (-XX:+UseAdaptiveSizePolicy). The physical memory on the machines must be at least 256MB before AggressiveHeap can be used. The size of the initial heap is calculated based on the size of the physical memory and attempts to make maximal use of the physical memory for the heap (i.e., the algorithms attempt to use heaps nearly as large as the total physical memory).

Note: -XX:+UseAdaptiveSizePolicy is on by default so I don&apos;t explicitly define it in my args.

Amazingly, once I added this to the args, removed ParNewGC (enabled UseParallelGC) the server ran flawlessly for days and days without a restart.  I was serving requests into the millions without a restart!!!  A partial arg list specific to these setting are below, please let me know your thoughts and concerns as I always enjoy constructive feedback.

java.args=-server -Xmx1024m -Xms1024m -XX:+AggressiveHeap -XX:+UseParallelGC -Dsun.io.useCanonCaches=false -XX:MaxPermSize=512m

Note: This was for a ColdFusion 8 instance. 
				</description>
				
				<category>Adobe</category>				
				
				<category>.NET</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>Java</category>				
				
				<category>Universal Mind</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Wed, 15 Jul 2009 07:56:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2009/7/15/jvmconfig-Tuning-Tip-For-All-Server-Side-Java-Solutions</guid>
				
			</item>
			
			<item>
				<title>Thank You Greater Miami Chamber of Commerce</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2009/1/29/Thank-You-Greater-Miami-Chamber-of-Commerce</link>
				<description>
				
				I spoke to the GMCC yesterday afternoon about SEO and how Universal Mind has overcome the challenges of spidering flash based solutions.

It was an enjoyable presentation and I appreciated the genuine interest and questions from the attendees.  Thank you Chamber!  I look forward to visiting again.  The &quot;download&quot; link below will allow you to save the PowerPoint presentation. 
				</description>
				
				<category>SEO</category>				
				
				<category>Site Performance</category>				
				
				<category>Flash</category>				
				
				<category>Flex</category>				
				
				<category>IT in General</category>				
				
				<category>Universal Mind</category>				
				
				<pubDate>Thu, 29 Jan 2009 09:11:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2009/1/29/Thank-You-Greater-Miami-Chamber-of-Commerce</guid>
				
				<enclosure url="http://blog.strikefish.com/blog/enclosures/SEO.DB.ppt1.15.09.ppt" length="2144768" type="application/vnd.ms-powerpoint"/>
				
			</item>
			
			<item>
				<title>ColdFusion createObject &quot;Component&quot; and Pathing Performance</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2008/12/12/ColdFusion-createObject-Component-and-Pathing-Performance</link>
				<description>
				
				I haven&apos;t blogged in awhile due to schedule, but had to blog this experience I recently had while attempting to stabilize an application and enhance performance. 

I have always taken for granted that createObject was lightning fast... Well, as fast as feasibly possibly under a given JVM.

I think I was dead wrong and this may be an issue for Adobe to address.  I am unclear on the internals of course.  But I have been up against OOMs on my current project and wanted to test out using soft reference (cached objects) and use duplicate from the cache rather than createObject.

Far stretch I know... but hey it was worth a try.  What was revealed was that performance was negligible and createObject was faster in some intervals.  Memory behaved the same, no real bonus.  So in discussion with a fellow consultant I told him I&apos;d ship a zip to him for test purposes as he had said he&apos;d seen a significant performance enhancement with duplicate (not true by the way).

What happened next totally shocked me.  To simplify the test code I snagged my VO.cfc out of it&apos;s proper place (several dirs down i.e. sitedir, com, bus, app, model, vo.. you get the idea) and put it in the root of the calling cfm.  I then removed all the pathing (dot notation) from my createObject call and executed the cfm to see if it would run ok after the change.  

The test was a loop of 10k over this create object call.  I was seeing execution times of around 30 seconds.  When I ran the updated code it went to 577 milliseconds...  I am still befuddled by this.  Is there that much overhead with pathing?  

I initially thought it was a mapping issue because I had been using mappings, but absolute path from root was just as slow.  

Please Adobe tell me this is Sun&apos;s jvm and not your code.  I know this is negligible with 100 or so creates, but imagine the boost if I did find something here. 

For clarification I am running on a Mac (OS X, CF running in JBOSS), but also tested on my old Dell (XP, CF running in JRUN).  I didn&apos;t see as dramatic a difference on WIntel, but my exec time went from 30 seconds to 4 seconds.  I am happy with 10x faster on Windows too...  

Any insight here is greatly appreciated.
Example Code:   
&lt;code&gt;
&lt;cfscript&gt;
  		currentTime = now();
  	  rqaArray = arrayNew(1);
  	  initTime = getTickCount();
			for (index=1; index lte 10000; index = index + 1)
      {
	      // pathing example replace vo reference with
	      //this pathing call com.mercer.mercerOnline.model.RQASummaryVO

	      rqa = createObject(&quot;component&quot;,&quot;RQASummaryVO&quot;);
	      rqa.rqaID                 = index;
				rqa.type                  = &quot;theType&quot;;
				rqa.createDate            = currentTime;
				rqa.submitDate            = currentTime;
				rqa.client                = &quot;currentClient&quot;;
				rqa.clientID              = &quot;clientID&quot;;
				rqa.status                = 6;
				rqa.userID                = 123456;
				rqa.agencyID              = &quot;agencyID&quot;;
				rqa.predecessorID         = 0;
				rqa.locked                = false;
				rqa.deleted               = false;
				rqa.title                 = &quot;The Title &quot;&amp;#index#;
				rqa.policyNumber          = &quot;thePolicyNum&quot;;
				rqa.agencyName            = &quot;agencyName&quot;;
				rqa.totalPremium          = &quot;totalPremium&quot;;
				rqa.hasMessages           = false;
				rqa.isAssigned            = false;
				rqa.assignedTo            = &quot;&quot;;
				rqa.proposedEffDate       = currentTime;
	      rqa.proposedExpDate       = currentTime;
	      rqa.agentName							= &quot;agentName&quot;;
				ArrayAppend(rqaArray,rqa);
			}

			endTime = getTickCount();

			totalTime = endTime - initTime;
&lt;/cfscript&gt;
&lt;cfdump var=&quot;#arrayLen(rqaArray)#&quot;&gt;
&lt;cfdump var=&quot;#rqaArray[10000]#&quot; /&gt;
&lt;cfdump var=&quot;#totalTime#&quot; /&gt;
&lt;/code&gt; 
				</description>
				
				<category>Adobe</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>Java</category>				
				
				<category>Universal Mind</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Fri, 12 Dec 2008 16:25:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2008/12/12/ColdFusion-createObject-Component-and-Pathing-Performance</guid>
				
			</item>
			
			<item>
				<title>Why VOs (transfer objects) are good...but they can be abused like...</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/11/29/Why-VOs-transfer-objects-are-goodbut-they-can-be-abused-like</link>
				<description>
				
				any other design pattern....

Sorry for the confusing title, but long titles are rather lame.  So you&apos;re a flex cf, java, or php developer and you are leveraging all the beautiful one to one mapping associated with server and client object creation.

&quot;YES!&quot;, you said.  No more guess work; my server vals returned can be readily passed around within my AS code with the ease of code insight! Ctrl-space... wow theres my property!  Ok, getting tacky I know.

So we embark on our design of a sytem always using VOs no matter the cost.  Eee gaadd stop now.  VOs, pending on design approaches may possibly have multiple layers of nested VOs YIKES!  

Everyone knows that Rambo&apos;s weapons of choice were the bone cutting hunting knife and explosive bow and arrows.  But there were times when he had to pull in the heavy artillery or perform a sneak attack with a much more lightweight approach like a choke hold (ahh, the violence of my youth...).

This is why VOs can be a problem if implemented without understanding the performance ramifications that can be incurred if they are always used.

Here&apos;s a real world scenario.  Requesting an array of 100+ VOs from your middle tier that each have nested arrays of child VOs.  Imagine just having two child VOs and the impact that could have on performance with this approach.

You call in to pull back the parent VOs that contain an array of child VOs (say 5) that all need to get created for each item in the array.  So in this process we are creating 100 parent objects and internal to each we are creating 10 child VOs.  This yields 1000 objects which each need to get created and the memory and process grow each time you do so on your middle tier (now add just a few users doing this incrementally over the first couple of hours).  

I&apos;m being facetious here of course as this isn&apos;t a very high number.  But why return such a dense object to the client unless you were going to use it.  There is a lot of wasted horsepower with this approach.  Think of the scene with Rambo emptying that M60 E4 machine gun and never hitting his target... &lt;img src=&quot;http://blog.strikefish.com/blog/images/rambo.jpg&quot; width=&quot;100&quot; height=&quot;114&quot; alt=&quot;Rambo&quot; /&gt;

A better approach is to pass back a snapshot of the data directly from your middle tier and pull back its VO representation when an edit needs to be performed or the VO truly is required to facilitate a process in the application.

So if you are going to populate a grid, I don&apos;t recommend doing it with VOs and if you absolutely have to create an array of VOs understand the possible performance impact (and data stagnation) that can ensue if the VO is of a complex nature and how it can impact the health of your server and ultimately the user experience.  

The J2EE Core Pattern docs on Transfer Object speak to this.  Check out the &quot;Consequences&quot; section of caching large sets of VOs. Line from the article:  There is a trade-off associated with this strategy. Its power and flexibility must be weighed against the performance overhead...  &lt;a href=&quot;http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html&quot; target=&quot;_blank&quot;&gt;THE LINK&lt;/a&gt; 
				</description>
				
				<category>Adobe</category>				
				
				<category>.NET</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>Flex</category>				
				
				<category>Java</category>				
				
				<category>Universal Mind</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Thu, 29 Nov 2007 20:11:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/11/29/Why-VOs-transfer-objects-are-goodbut-they-can-be-abused-like</guid>
				
			</item>
			
			<item>
				<title>Flex ColdFusion Extension Wizard Gotcha</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/11/11/Flex-ColdFusion-Extension-Wizard-Gotcha</link>
				<description>
				
				This entry will hopefully be brief and to the point in regard to the title.  I want to start off by stating how much I like the ColdFusion extension support in Flex 2 and hope to see Adobe add extenstions that support other languages/middle tier solutions as well hint: (java, php, c#).  

There is nothing like beginning your application architecture and development with an out of the box mvc approach utilizing well known approaches to server side development utilizing delegates, services, daos, gateways, and value objects.  

Where I see a major problem with the extension is how it is implemented.  I have been involved with several projects that have utilized Flex and ColdFusion and upon initially beginning my trek into Flex 2 I saw this issue right away only because I have been working with ColdFusion for 10 years, have consulted on its benefits, scaled servers, architected highly successful and efficient enterprise solutions with it, and know the do&apos;s and don&apos;ts...

The problem I am speaking of with the CF extension implementation is the iterating over read functions in the data access object cfcs.

To be more clear, in the templated or skeleton dao cfcs there are db calls made, mostly crud calls.  The read function I am discussing here is &quot;r&quot; in crud.  The problem is that in many cases I&apos;ve seen engineers design a composite or aggregate VO.  This is a VO cfc that contains other VO cfcs.

This is a perfectly efficient and best practice OOP approach that ColdFusion handles very well.  The problem arises when a child resultset of ids (usually a query or array) is used to iterate over and call the read function in the dao to get the vo properties from the db to return via remoting to the Flex application.  

The main issue here is performance, specifically with the possible 100s of calls that can be made to the database in one ColdFusion request from the application.  Imagine a dump truck going 200 times to the gravel pit taking one pebble, with today&apos;s gas prices I don&apos;t think you&apos;d last long on the job if you took that approach 8-)... This is what you are doing when you loop over queries.  Not only could these calls prove to be slow and taxing on the database but it can also lock up threads in ColdFusion and create cpu and memory spiking out of the shoot.  You also have to deal with any kind of network latency that may exist between your CF server and the database as well.  AAAACKKKKK! 

But there is a solution:  First a band-aid needs to be applied.  For these complex objects an investigation must be made to locate where these iterating processes could be going on.  Second, there is a function in ColdFusion that automagically converts a query field to a comma-delimited value list(or delimiter of your choosing).  The function is called &quot;valueList(query.column, &apos;,&apos;)&quot; there is also a quotedValueList for strings.  With this list you could then use the SQL IN clause on the hopefully indexed id field used to pull back the child VO data.  Add another function in the dao or better yet the data gateway that specifies readMultiple or getMulipleObjectName...

Once this is done the code should truly be refactored to call the database only once for all its data (think one cf call/one db call).  If you did not know ColdFusion is one of the most robust languages when integrating with the more popular dbms on the market (Oracle, SQL Server, MySQL, DB2, Informix).  The cfstoredproc tag allows you to call into a stored procedure to get procedure resultsets.  

cfstoredproc also allows a developer to return multiple resultsets from a stored procedure to ColdFusion.  So, one call to a stored procedure in Oracle that returns 2,3,4,or more ref cursors to ColdFusion.  These could be all your objects&apos; data which only requires you to loop once over all of them (maybe some nesting and brief logic to create them, but still 1000s of times faster than separate db calls for each loop).

This may be one of the drier entries I&apos;ve had (no code, pictures, jokes).  But I hope it helps you when using and not abusing the ColdFusion extension wizards in Flex 8-). 
				</description>
				
				<category>Adobe</category>				
				
				<category>Database</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>Flex</category>				
				
				<category>Universal Mind</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Sun, 11 Nov 2007 19:51:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/11/11/Flex-ColdFusion-Extension-Wizard-Gotcha</guid>
				
			</item>
			
			<item>
				<title>MapQuest&apos;s AS3 API in Beta</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/9/10/MapQuests-AS3-API-in-Beta</link>
				<description>
				
				I recently assisted in developing and testing on the API Development and QA teams for this product and wanted to share some information on their new Actionscript 3 API with the community.  

If you are interested in mapping GIS related data (what data doesn&apos;t have a GIS component?) or are currently working with competing products you should evaluate what MapQuest has to offer with their new AS3 API.  I can&apos;t stress enough the concentrated effort that went in to streamlining the integration process, performance and speed, and feature set.

The Libraries:

&lt;ol&gt;
	&lt;li&gt;AdvantageAPI.swc - Actionscript Library used for retrieving geographical data from mapquest servers&lt;/li&gt;
    &lt;li&gt;TilemapToolkit.swc - Actionscript Library used for creating a tilebased map&lt;/li&gt;
    &lt;li&gt;TilemapComponent.swc - Flex Library used for placing tilemaps within MXML&lt;/li&gt;
&lt;/ol&gt;

With the above libraries you can acquire geocode information for existing address information, place points of interest on a map, utilize vector based overlays, and fully customize all built in MapQuest default features such as the zoom and pan controls.

It is important to stress that with MapQuest&apos;s API you can customize the entire look and feel of the map to suite your business (logo etc.) 

It is important to stress some of the peformance gains I noticed from the legacy html and javascript based solution.  Most importantly the speed in which POIs (points of interests) can be added to a map.  I witnessed a 500 poi legacy application load 500 pois in 10 seconds and via the AS3 API load the same 500 POIs instantaneously.  Imagine this performance benefit if you were to embed a map in a desktop app written in AIR?

If you are currently utilizing MapQuest and have standardized on javascript or don&apos;t foresee spending this years budget on converting to AS3, that is ok, you can utilize a version of the API wrapped to support javascript integration, which should allow you to drop the new flash based solution in to your existing javascript/html/AJAX solution.

There are many more advanced features such as POI decluttering, customizing POI graphics, and display windows to name a few.  There are also Flash CS3 supported swc libraries that can be imported in to the Flash IDE as well.  

MapQuest went above and beyond to make integration with Adobe products seamless.

The following links will detail some of the release information and how to get ahold of the libraries:

Links to various MapQuest sponsored information and links:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://company.mapquest.com/mqbs/4a.html&quot; target=&quot;_blank&quot;&gt;MapQuest(site)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Examples @ MapQuest (@ above link)
    &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://company.mapquest.com/videos/AS3%20MapQuest%20Apollo%20VCard%20Integration%20-%20Apollo%20Local%20File%20Access/AS3%20MapQuest%20Apollo%20VCard%20Integration%20-%20Apollo%20Local%20File%20Access.html&quot; target=&quot;_blank&quot;&gt;Map a Contact&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://company.mapquest.com/videos/AS3%20MapQuest%20Local%20DB%20POI%20Lookup/AS3%20MapQuest%20Local%20DB%20POI%20Lookup.html&quot; target=&quot;_blank&quot;&gt;Database Search and Plot&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.oobgolf.com/courses/finder/&quot; target=&quot;_blank&quot;&gt;Live application by Kevin Langdon demonstrating Overlays, POIs, and More&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://company.mapquest.com/jsp/eval.jsp&quot; target=&quot;_blank&quot;&gt;Request an Evaluation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://mashable.com/2007/05/29/mapquest-advantage/&quot; target=&quot;_blank&quot;&gt;Mashable News Article&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

Snapshot:

&lt;img src=&quot;http://www.strikefish.com/images/oobgolf.jpg&quot; alt=&quot;oobgolf.com MapQuest Application&quot;/&gt; 
				</description>
				
				<category>Adobe</category>				
				
				<category>Universal Mind</category>				
				
				<category>Flash</category>				
				
				<category>Site Performance</category>				
				
				<category>Apollo</category>				
				
				<category>Flex</category>				
				
				<category>IT in General</category>				
				
				<category>MapQuest</category>				
				
				<pubDate>Mon, 10 Sep 2007 15:19:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/9/10/MapQuests-AS3-API-in-Beta</guid>
				
			</item>
			
			<item>
				<title>Simple Cluster Setup With CF 8</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/8/23/Simple-Cluster-Setup-With-CF-8</link>
				<description>
				
				Last evening I installed ColdFusion 8 for a client and setup two instances outside of the default cfusion for clustering.  Gone are the days of MX when one had to access jrunsvc or jrun itself to create a Windows Service for the instance or stop and start the instance via the command line.  ColdFusion 7 had these features as well, but I wanted to note ColdFusion 8&apos;s continued support of clustering.  It is a bugless or for lack of a better term &quot;gotchaless&quot; task that if all ducks are in a row can take minutes to configure in its entirety, including install of ColdFusion, import of legacy CAR file, creation of instances (deployment, etc.), and configuring the cluster.

For those that are looking for CF 8 documentation on clustering ColdFusion it is located here: &lt;a href=&quot;http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=clustering_6.html&quot; target=&quot;_blank&quot;&gt;CF 8 clustering&lt;/a&gt;. 

I would like to see an updated approach to clustering with CF 8 and BIG IP (hardware load balancers in general).  Some of the more advanced topics, are a bit out of date and at this time many companies are upgrading their hardware infrastructure and would benefit from this updated information. 
				</description>
				
				<category>Adobe</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Thu, 23 Aug 2007 09:02:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/8/23/Simple-Cluster-Setup-With-CF-8</guid>
				
			</item>
			
			<item>
				<title>Flex and ColdFusion &quot;They&apos;re in the Game...&quot;</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/7/17/Flex-and-ColdFusion-Theyre-in-the-Game</link>
				<description>
				
				I recently assisted &lt;a href=&quot;http://www.xostech.com&quot; target=&quot;_blank&quot;&gt; XOSTechnologies, Inc.&lt;/a&gt; in clustering their ColdFusion servers with a bit of development to support a site they engineered with a full Flex 2.0 front end utilizing Flash Remoting (AMF) to ColdFusion 7.0.2 cfcs (ColdFusion talking to Oracle).  ColdFusion processes are monitored by &lt;a href=&quot;http://www.seefusion.com&quot; target=&quot;_blank&quot;&gt;SeeFusion&lt;/a&gt;. 

The site was built to support the &lt;a href=&quot;http://www.easports.com&quot; target=&quot;_blank&quot;&gt;EA Sports&lt;/a&gt; gaming community and their release of some of the most dynamic sports gaming software to date.  The site is a social community which allots for picture and video upload as well as messaging, forums, and that&apos;s not all.  You should check it out at &lt;a href=&quot;http://www.easportsworld.com&quot; target=&quot;_blank&quot;&gt;EA Sports World&lt;/a&gt;.  

For details on their infrastructure as they are &quot;doing it right&quot; feel free to send me an email. 
				</description>
				
				<category>Adobe</category>				
				
				<category>Site Performance</category>				
				
				<category>Flash</category>				
				
				<category>Flex</category>				
				
				<category>IT in General</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Tue, 17 Jul 2007 14:11:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/7/17/Flex-and-ColdFusion-Theyre-in-the-Game</guid>
				
			</item>
			
			<item>
				<title>ColdFusion Version Chart</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/4/2/ColdFusion-Version-Chart</link>
				<description>
				
				I was recently doing some research with regard to a customer&apos;s version of ColdFusion and thought that this would be helpful.  Adobe keeps a chart of the versions of ColdFusion at this &lt;a href=&quot;http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_18515&quot; target=&quot;_blank&quot;&gt;link&lt;/a&gt;.  

Why is this important you may ask?  Well, as in every software package there are patches and updates that come on-line as the product matures. In past cases there have been versions of CF which have had issues that a patch or update resolved.  With any update it is important to conduct preliminary tests of your current environment with the update in a test or staging area to resolve any issues that might arise, though it is rare to see an updater to CF result in an unstable machine.

To locate the version of CF that you currently have installed, open the CF administrator and browse to Settings Summary.  You will see version information at the top of the screen output.  It will look something like this:

&lt;table border=&quot;0&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;2&quot; bgcolor=&quot;#E2E6E7&quot; class=&quot;cellBlueTopAndBottom&quot;&gt;
		&lt;b&gt;
Version Information
&lt;/b&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;
		
		&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;
		&lt;tr&gt;
			&lt;td colspan=&quot;2&quot; class=&quot;cellBlueTopAndBottom&quot; bgcolor=&quot;#F3F7F7&quot;&gt;
				&lt;strong&gt;
Server Details
&lt;/strong&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width=&quot;250&quot; nowrap class=&quot;cell3BlueSides&quot;&gt;
				
Server Product

			&lt;/td&gt;
			&lt;td class=&quot;cellRightAndBottomBlueSide&quot; width=&quot;1000&quot;&gt;
				ColdFusion MX
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td nowrap class=&quot;cell3BlueSides&quot;&gt;
				
Version

			&lt;/td&gt;
			&lt;td class=&quot;cellRightAndBottomBlueSide&quot;&gt;
				7,0,2,142559 &amp;nbsp;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td nowrap class=&quot;cell3BlueSides&quot;&gt;
				
Edition

			&lt;/td&gt;
			&lt;td class=&quot;cellRightAndBottomBlueSide&quot;&gt;
				
	
	


	


	


	


	


	
	
	
	
		
			
				Enterprise &amp;nbsp;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td nowrap class=&quot;cell3BlueSides&quot;&gt;
				
Serial Number

			&lt;/td&gt;
			&lt;td class=&quot;cellRightAndBottomBlueSide&quot;&gt;
				Not displayed to protect the innocent 8-) &amp;nbsp;
			&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr&gt;
			&lt;td nowrap class=&quot;cell3BlueSides&quot;&gt;
				
Operating System

			&lt;/td&gt;
			&lt;td class=&quot;cellRightAndBottomBlueSide&quot;&gt;
				Windows XP &amp;nbsp;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td nowrap class=&quot;cell3BlueSides&quot;&gt;
				
OS Version

			&lt;/td&gt;
			&lt;td class=&quot;cellRightAndBottomBlueSide&quot;&gt;
				5.1 &amp;nbsp;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;/table&gt;
		
	&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;br&gt;&lt;br&gt; 
				</description>
				
				<category>Adobe</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Mon, 02 Apr 2007 07:12:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/4/2/ColdFusion-Version-Chart</guid>
				
			</item>
			
			<item>
				<title>Session Damage</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/3/11/Session-Damage</link>
				<description>
				
				I have written about the architectural flaws I see in various applications, many focusing on poor database design and poorly written sql. I felt it necessary to write about an issue I have seen in various web applications that unbeknownst to the developer/architect can hinder and or ultimately spell disaster for the application and the customer using the application.

The title &quot;Session Damage&quot; came about from this very issue. When does storing information in session scope in CF, ASP.NET, JSP, etc. become a problem? I&apos;ve seen a couple of scenarios that were poor approaches to utilizing session. My first experience with this was (not having seen the actual code) when monitoring the JRUN service on a UNIX (Solaris) machine I witnessed 4 megabyte of memory peeling off the server upon every new login. Initially my mind went to the idea that there was a memory leak somewhere due to the memory bloat. On the UNIX platform this caused the operating system to dump core and restart the service when memory exceeded set thresholds. This lead to customers losing shopping cart/session data left and right. YIKES!!!! 

There was one scenario where a customer had purchased $4000 worth of goods and actually took the time to call the support team and have them purchase the items because he did not have the time or patience to spend another 30 minutes selecting the items all over again...
The culprit, once I got a chance to look at the code was that the application was written in such a way that upon a successful login, the system cached much of the database for each user (much of it was actually never utilized). This resulted in the memory bloat. Of course this was all done in an effort to speed performance, but regardless it was a poor approach. I had difficulty explaining what was going on to the CIO because he was unable to grasp the concept and kept saying &quot;Memory is cheap, just buy more memory&quot;. Ouch, I had to explain a server has a maximum capacity for memory and that this would not fix the problem, just mask it for awhile. 

So, the system had to be reengineered due to the memory issue and the queries streamlined to speed querying of the session data. The lesson learned here is that it is a poor approach to cache data at session to save .01 seconds of round trip time to get it from the database. An architect or developer must weigh the cost/benefit to the system when looking at this challenge. I always recommend tweaking the db so that the query search yields a timely response.

Another scenario I witnessed recently was the use of session caching associated with search results. These were very large datasets getting cached at the user level. It caused the JRUN service to bloat to 600 megabytes in no time at all if there were only a dozen or so active sessions on the server. There are times when caching search info is pertinent, but rather than caching the entire result set it might be a better approach to cache the search results unique identifiers only (array or comma-delim list) and go back to the database to pull back the details when needed. The reason the system developers built the system in this way was to facilitate pagination. The solution was to stop caching and go &quot;round trip&quot; to the db for this process, the performance impact was slight (.02) milliseconds difference, but it is of my opinion that even if there was a 1 to 2 second difference the user would not find issue with the search, considering the big picture of server stabilization and a more an application that no longer required a restart during peak usage do to unresponsiveness.  Isn&apos;t that what we all look for in an application?  One that is written once and never requires intervention?  8-) 
				</description>
				
				<category>ColdFusion</category>				
				
				<category>.NET</category>				
				
				<category>Database</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>Java</category>				
				
				<pubDate>Sun, 11 Mar 2007 11:16:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/3/11/Session-Damage</guid>
				
			</item>
			
			<item>
				<title>ColdFusion Timeout</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/2/21/ColdFusion-Timeout</link>
				<description>
				
				I was recently consulting with a client who was experiencing timeout issues due to long running requests.  This issue has plagued their site for quite awhile.  My approach to solving their long running requests was to jump into the CF logs to find out what might be the problem. 

The challenge was that it was a legacy fusebox site and because of the architecture of this version of fusebox every error pointed to index.cfm.  The logs were somewhat helpful with regard to the timeouts and where exactly the error was coming from at a higher level of the multiple application supporting server.  Noticing that it was a particular application, I challenged the development team to wrap all cfquery/cfstoredproc requests in a cftry/cfcatch.  As is the case with many CF developers (including myself when I was starting out) it is easy to take for granted that the database is always going to be stable and ColdFusion&apos;s very straightforward ability to query the database will execute with no problem.

This is a huge mistakes in application development no matter what technology you are working with.  In code for the immediate application i.e. CF, java, C#, VB, etc. anytime the application has to go outside of itself to query a database, web service, shared api call, etc. this code must be contained in a try or catch because it can fail due to multiple reasons.

Back to the CF issue... I recommended that the client update the queries (no timeout for cfstoredproc, wonder why?) with a timeout settings forcing it to fail (this would identify the long running query) and due to CF throwing a time out error the cfcatch could write a very detailed description from the given cfcatch scope and then they could write the actual page and line of code where the failure happened.  At this point after this code was implemented they could then place a cfthrow tag at the end of the catch to bubble up the error to a global error handler in Application.cfc so that it would be handled gracefully by displaying a friendly error page.  

Sorry if I&apos;m getting wordy... Thoughts tend to flow when blogging and sentences run-on...  So you may be thinking, I have a huge application with queries all over the place where the heck do I start?  If you are a dreamweaverer or cfeclipser or homesiter you have the tools at your disposal to do a sitewide search.  I like dreamweaver&apos;s and homesite&apos;s search capabilities due to the fact that you can export the file list in various formats and organize a plan of attack with your team to patch up the application.  You&apos;ll have your site ready to diagnose itself and in turn be able to stabilize or reengineer the failed module. 
				</description>
				
				<category>Adobe</category>				
				
				<category>.NET</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>Java</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Wed, 21 Feb 2007 18:29:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/2/21/ColdFusion-Timeout</guid>
				
			</item>
			
			<item>
				<title>Why Is My Server So Unstable?</title>
				<link>http://blog.strikefish.com/blog/index.cfm/2007/2/8/Why-Is-My-Server-So-Unstable</link>
				<description>
				
				Ever ask that question?  It&apos;s not necessarily the easiest question to answer if you&apos;re a head down coder type.  Not that there&apos;s anything wrong with head down coder types.

Recently a customer was experiencing server unresponsiveness though when opening up the task manager on the web server would see the CPU at next to 0 utilization and memory somewhat stable.  So when this happened I asked for a bit more information the web server in question in the way of what was running on it and what database servers it hooked into.

I was told it was running ColdFusion apps, ASP.NET apps, and Reporting Services... UGGGGG!!!!  

To be able to see what is happening on the server there are counters that need to be implemented on the various services in question.  

ColdFusion version 7 can be monitored with the JRun Metrics and you can find information on it here http://www.bpurcell.org/blog/index.cfm?mode=entry&amp;entry=991 on Brandon Purcell&apos;s blog.  

ASP.NET can be monitored with a custom counter, an article on this topic is located here http://msdn2.microsoft.com/en-us/library/ms979194.aspx.

These approaches will identify what process is blocking up the web server.  The true caveat in all instances when CPU utilization is low and server memory stable points to db or possibly network issues.  In most cases a db will be pegged due to long running sql statements and it is important to monitor these machines while troubleshooting the cause of the bottleneck.  

If the database is the culprit to clogging the server than in measures can be taken to find out which currently running sql statements are causing the problems.  A tool I have used in that past that does an excellent job of monitoring sessions and currently executing sql statements (ORACLE) is TOAD with its DBA module.  If the user account you are utilizing gives you the ability to run system queries than this module will show you why the server is doing some heavy lifting.  There are similar feature in SQL Server, I will post these shortly.

In closing it is important to understand the demands an application may place on server hardware and while keeping that in mind look to incorporate or segregate the application in an existing environment. 
				</description>
				
				<category>Adobe</category>				
				
				<category>.NET</category>				
				
				<category>Database</category>				
				
				<category>Site Performance</category>				
				
				<category>IT in General</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Thu, 08 Feb 2007 23:30:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm/2007/2/8/Why-Is-My-Server-So-Unstable</guid>
				
			</item>
			
			<item>
				<title>Session lock your ColdFusion function to avoid Race Condition</title>
				<link>http://blog.strikefish.com/blog/index.cfm?mode=entry&amp;entry=6460E392-1422-201A-55524E59C758D989</link>
				<description>
				
				I recently assessed an issue occurring in a Flash Forms application that utilizes remoting heavily.

A brief description of the function... The method calls 2 procedures.  One that does a read to get data to update and another updates the passed in data.  The resultset of the &quot;get&quot; proc call is used to facilitate email notification and a file write/append.  

The problem occurs when a user double clicks or multi clicks on the submit button from the flash form.  If the simultaneous requests from the user hits the function within milliseconds the initial select and subsequent select return the same results due to the insert not completing on the initial request.  It lead to multiple entries of the same data into the file write/append process.  

To resolve this issue I was going to go the route of disabling the submit button after the initial mouseUp event fired and enable on a response from the remoting call.  But thought through it and came up with a fix that required much less code.  The method was wrapped with a cflock tag set as exclusive and scoped as session.  This will block simultaneous requests from the same session until the initial request is complete.  A quick and dirty fix but if time constraints prove an issue and you come across this in your remoting apps. it does a good job of single threading a function call for a session.

I was also contemplating combining the procs into one proc call, but don&apos;t believe this to be a fix considering the possible lag that could occur with the multiple request. 
				</description>
				
				<category>ColdFusion</category>				
				
				<category>Site Performance</category>				
				
				<category>Flash</category>				
				
				<category>Flex</category>				
				
				<category>IT in General</category>				
				
				<pubDate>Thu, 31 Aug 2006 09:04:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm?mode=entry&amp;entry=6460E392-1422-201A-55524E59C758D989</guid>
				
			</item>
			
			<item>
				<title>CFINCLUDE Rant...</title>
				<link>http://blog.strikefish.com/blog/index.cfm?mode=entry&amp;entry=D0347EDB-1422-201A-55C790B26178C749</link>
				<description>
				
				A wacky motivational speaker once coined the phrase &quot;Stop the insanity!&quot;  That&apos;s where I was at recently when perusing a customer&apos;s now close to &quot;legacy&quot; ColdFusion application.  

I have seen this before and never understood developer&apos;s fascination with littering their applications with cfinclude.  Yes, I have written on its benefits but for cripes sake!!!  When you see a cfinclude that then runs a case statement or else if (Yuck bottleneck!) and that case statement or else block runs a cfinclude which is wrapped in an if and sets the initiating switch var on the else when false and reincludes the initial include... You get my point.  Long story short, we&apos;re talking about a process that took 1.5 seconds to execute. 

The overall execution time of the page was in the 10 second range, due to the &quot;Default Query&quot; concept implemented on the site as well. This is when the same queries are run on every request.  A very poor architectural approach to web development.  These approaches plagued legacy asp and coldfusion apps pre .Net/CF 5/CF MX.  

I am hoping to get some immediate fixes in place and am working toward converting the site to the MachII framework.  Stay tuned.  I believe I will have a very happy customer in the not so distant future. 
				</description>
				
				<category>ColdFusion</category>				
				
				<category>Site Performance</category>				
				
				<pubDate>Wed, 02 Aug 2006 14:34:00 -0400</pubDate>
				<guid>http://blog.strikefish.com/blog/index.cfm?mode=entry&amp;entry=D0347EDB-1422-201A-55C790B26178C749</guid>
				
			</item>
			</channel></rss>