tag:blogger.com,1999:blog-148479742024-03-14T03:43:33.194-05:00Mincing ThoughtsGarrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.comBlogger40125tag:blogger.com,1999:blog-14847974.post-37672556974648998572018-07-03T17:25:00.000-05:002018-07-03T17:25:19.841-05:00Kids Climbing Play Structure - Part 2<span style="font-family: Trebuchet MS, sans-serif;">A few years ago I posted complete instructions on how to build your own kids climbing structure. At 6.5ft tall it was collapsible, portable, and featured both a rock wall and a cargo net. You can <a href="http://mincingthoughts.blogspot.com/2015/07/kids-climbing-play-structure-building.html?m=1">read the original post here.</a></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">However our situation has changed - our kids school has lost its playground while they undergo renovation, and we’ve added two additional kids to our brood, demanding a structure with a bit more flexibility.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">To accomplish this, I cannibalized our climbing wall into a larger, more permanent structure. I didn’t keep detailed notes this time around, there was simply too much that went into it to provide the same level of instruction. But I hope these pictures provides some additional inspiration as to what you can transform your climbing wall into with a bit of time and a lot of hard work. Overall the additional structure cost me ~$1200 CDN in materials including the two slides which had to be ordered. The vinyl tent cover was custom made for $40 in material (and the labour to sew it was a gift).</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_af-tr2MICTp1OO-FOjLD7dgEPIi9mEhT8FEcagBsZ-PB3o1xvQ72AchvyQBfLPoWJ_T_i-sT3G_TXEUDT729LzzkWjtb3nMDoUX-HVSl4OWYB7POJjDCZ4Uk2Ph5gM1yBsJ/s1600/IMG-5050.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="600" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_af-tr2MICTp1OO-FOjLD7dgEPIi9mEhT8FEcagBsZ-PB3o1xvQ72AchvyQBfLPoWJ_T_i-sT3G_TXEUDT729LzzkWjtb3nMDoUX-HVSl4OWYB7POJjDCZ4Uk2Ph5gM1yBsJ/s320/IMG-5050.JPG" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRV6EMQnf6ryzj7yOCTmtYuN2j_s163ps5leFJkVAlWPV4Q8IsysZji3s0rAg_Dtxy0HWaPb3ocYIEh48MsAg_JPgT4Y8ncQrsCq254HCHS0b_NQ4VCkquTnqhsnCZmMI4zTtF/s1600/IMG-5051.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="600" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRV6EMQnf6ryzj7yOCTmtYuN2j_s163ps5leFJkVAlWPV4Q8IsysZji3s0rAg_Dtxy0HWaPb3ocYIEh48MsAg_JPgT4Y8ncQrsCq254HCHS0b_NQ4VCkquTnqhsnCZmMI4zTtF/s320/IMG-5051.JPG" width="240" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.comtag:blogger.com,1999:blog-14847974.post-89622132160115956702017-12-06T13:10:00.000-06:002017-12-06T13:10:14.979-06:00Breaking the Chains of Analysis Paralysis - The Black Box (Part 1 of 7)<div id="yui_3_17_2_1_1512586995125_17691">
<span style="font-family: Trebuchet MS, sans-serif;">This is the first article in a series of 7 that I will be putting up in the coming weeks about Analysis Paralysis. The purpose of these articles is to highlight primary causes of AP among people who play games, and discuss strategies that you can apply as a designer to <em>reduce the potential</em> for AP.</span></div>
<div id="yui_3_17_2_1_1512586995125_17691">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<span style="font-family: Trebuchet MS, sans-serif;">Each article in this series will go into depth on one potential cause of AP, examples of situations where it can be problematic, and present some solutions that can improve the situation.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Although these articles are specific to <i>Boardgames</i>, the concepts of Analysis Paralysis apply widely to everyday life. These specific examples can easily be translated to apply to systems in general, including business systems and enterprise reporting & dashboards.</span><br />
<ol>
<li><a data-cke-saved-href="https://www.tricorngames.com/designer-blog/2017/12/5/breaking-the-chains-of-analysis-paralysis-the-black-box-part-1-of-7-nftna" href="https://www.tricorngames.com/designer-blog/2017/12/5/breaking-the-chains-of-analysis-paralysis-the-black-box-part-1-of-7-nftna"><em><span style="font-family: Trebuchet MS, sans-serif;">The Black Box</span></em></a></li>
<li><span style="font-family: Trebuchet MS, sans-serif;"><em>The Paradox of Choice – </em>Dec 13</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;"><em>The Prisoner’s Dilemma – </em>Dec 20</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;"><em>The Maze to Victory – </em>Dec 27</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;"><em>Relationship Status: It’s Complicated – </em>Jan 3</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;"><em>Sophie’s Choice – </em>Jan 10</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;"><em>Bigger vs Better – </em>Jan 17</span></li>
</ol>
<span style="font-family: Trebuchet MS, sans-serif;">Additional articles will be released weekly, we hope you will read, share, and comment on them. Tell me what you think, and how you might apply some of these concepts and solutions to your business.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The first article discusses <strong>The Black Box</strong>, the problem of information obscurity. </span><span style="font-family: "Trebuchet MS", sans-serif;">Read </span><a href="https://www.tricorngames.com/designer-blog/2017/12/5/breaking-the-chains-of-analysis-paralysis-the-black-box-part-1-of-7-nftna" style="font-family: "Trebuchet MS", sans-serif;">Analysis Paralysis - The Black Box</a>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-80356763327822073372017-06-09T14:53:00.001-05:002017-06-09T14:57:42.787-05:00Gotcha #7 - AppDynamics and the Mysterious Case of the Vanishing Cookie<span style="font-family: "trebuchet ms" , sans-serif;">Not much of a mystery today in this article (the answer is alluded to in the title) but the process of identifying the problem, discovering why it was a problem, and then fixing it was quite a challenge.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">Today's Gotcha is about Rational Performance Tester (v8.5.1.2 for anyone interested) and a vexing problem with successful test execution.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">The problem originally arose when we discovered that our tests weren't always succeeding. After executing a schedule we would consistently have a large number of pages that wouldn't have 100% success status codes (located on the Server Health Detail view). There would be a few with 100% success rate, but consistently nearly every page was hovering between 94 and 98%. In some larger tests this would drop further, into the 80's or high 70's, but even a simple low volume test would have most pages at less than 100%.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">To get a better handle on why and when these page errors were happening, I added a new counter to the default Page Throughput / Page Hit Rate graph (Add/Remove Performance Counters --> Page Performance Counter... --> Status Code Successes --> Percent Page Status Code Success [for Interval]).</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">Suddenly we could see this wavering line appear on the graph that would start off at 100%, dip sharply at the beginning of the test, before returning back up near 100% and stay fluctuating in the high 90% range.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzUXX8RB3tnc5Eiqxo2kLrusyIOTrsHJkTXD_bFCxyYNmyVtgd0McPEawv8TqR0DCuLcKfCn9hNuRT9We55XtawlQqRyhsFXTIRJe_DChpwZnqpAJ8k3WS0vFjm6kGNGVvSnNO/s1600/success.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="202" data-original-width="592" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzUXX8RB3tnc5Eiqxo2kLrusyIOTrsHJkTXD_bFCxyYNmyVtgd0McPEawv8TqR0DCuLcKfCn9hNuRT9We55XtawlQqRyhsFXTIRJe_DChpwZnqpAJ8k3WS0vFjm6kGNGVvSnNO/s1600/success.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">Baffling when the very same test scripts in the past against the same application would run at 100% without trouble. Doubly-baffling when running the script as a standalone would work perfectly fine.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><span style="font-family: "trebuchet ms" , sans-serif;">Following the Clues</span></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></b></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">The first clue came when we decided to rerun one of our test schedules and monitor the Test Execution of a user thread. Since the failures were reasonably consistent across all pages, chances are we might be able to catch it in the act.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">After a couple of hours of watching successful page responses, we caught one. Right from the beginning of a new test script - a page failure. And then another, and another, and so on until every single page in that script failed in order. And the next script. And the next... but then the fourth script, for no apparent reason, began returning successful responses again.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">Digging into the error, the only message we could find was a "Failed substitution ^csrfToken=.*$" message followed by a cascade of 500 - Server Error responses. The csrfToken appears in the HTTP Response header as a "Set-Cookie" value from the server (you can find an explanation of its purpose <a href="https://stackoverflow.com/questions/5207160/what-is-a-csrf-token-what-is-its-importance-and-how-does-it-work">here</a>). And for some reason, it wasn't being found.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">Except... inspecting the response of that very first page - the csrfToken was right where it should be. Further digging into the application logs showed the same thing - on occasion our test would be sending an invalid csrfToken - the recorded token - which happens when the substitution couldn't be made.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">But it was right there in the Response Header - right where we expected it to be. Except, not quite...</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><b>Smoking Gun</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><b><br /></b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">It <i>looked</i> like it was right where it was supposed to be - in among a half-dozen other cookies being set by the server. But a careful comparison with the original recording showed that it was 1 line down. There was a NEW Set-Cookie value that was inserted in the list just ahead of the csrfToken.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">Inspecting and comparing successful test executions with failed ones showed that this new mysterious cookie only appeared in the failed tests, and wasn't to be found in the successful ones.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">The server was randomly inserting a new cookie in its response... some of the time. And it was enough, by shifting the order of the Set-Cookie headers for RPT fail when trying to identify the csrfToken.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">The culprit was a cookie called ADRUM_BTs and it looks like the following:</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">Set-Cookie: ADRUM_BTs="R:0|s:f"; Version=1; Max-Age=30; Expires=...date...; Path=/; Secure</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">There was no consistency in when or where it would appear. It would show up for a script execution or three, then disappear once more.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><b>Solution</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><b><br /></b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">It turns out that we weren't the only ones to run the Mysterious Case of the Vanishing Cookie - other people had identified ADRUM_BTs as playing havoc with their scripting efforts.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">The cookie in question belongs to AppDynamics End User Monitoring javascript package, a tool that can be used to monitor user behaviour and web application performance from the user's perspective. It was a new feature in the AppDynamics package that had been turned on in our Performance Testing environment recently to try and improve our measurement capabilities.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "trebuchet ms" , sans-serif;">In the end, there was no way to remove this new cookie or adjust the system to consistently distribute it. In order to get our Performance Testing back up and running we had to remove all End-user Monitoring components - and suddenly our vanishing cookie was gone for the last time.</span></div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-56613025704155750792017-03-25T20:15:00.001-05:002017-03-25T20:15:57.496-05:00Go Fish Fitness - Getting Kids Moving<span style="font-family: Trebuchet MS, sans-serif;">My wife and I are parents of 4 (ages 8, 5, 2, and 6 months) and she also runs a home daycare. On any given day we spend time with 10 different kids in our home (though not all at the same time!). We also live in Canada, in a city that has famously been compared unfavourably to the surface of Mars. As a result, we often deal with 10 different kids who have been cooped up inside for long stretches of time due to cold, snow, ice, wind, rain, and general all-around outdoor unpleasantness.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If you’ve been there, you probably know that a group of children stuck inside = energy. A lot of energy. Sometimes destructive energy. They get on each other’s nerves, they fight, they rampage, and they often find it difficult to concentrate. They need to get out and run around, but spending 5 minutes freezing their fingers and faces and they want to come right back in.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEWLc2DUIOkcB83hL5tl4u5hEfc_-7uuuTqPszgCZ7qs6Cz8LQgtilz4xbFtKuZ0fBStN_lAwvCIGsy3_5XRng3CTROjrH1yCzoDdL10Ag8XfBTdfvWQMDc3TbBPvfFnGFyl17/s1600/image1_b.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEWLc2DUIOkcB83hL5tl4u5hEfc_-7uuuTqPszgCZ7qs6Cz8LQgtilz4xbFtKuZ0fBStN_lAwvCIGsy3_5XRng3CTROjrH1yCzoDdL10Ag8XfBTdfvWQMDc3TbBPvfFnGFyl17/s320/image1_b.JPG" width="320" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So we decided to try something. We started making games for the kids, using rules that they were familiar with as a base (Go Fish – for example) and added in an exercise component. We took a normal deck of playing cards and assigned short exercises to each number, and every time a match was made they had to do the associated exercise.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">And then to appeal to their competitive spirit we modified the rules, so that when a match was made everyone ELSE had to do the exercise. Suddenly we had a group of laughing, playing, goofy, jumping around kids who were reveling in the game and making their friends and sibling do the work – and having just as much fun doing it when someone else made a match.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZmxrmTODcu6IgVx0sjV_YOssKFd6nHYLxwydCgS_i8X8xca_Af8kzUlTIgZSN86goJaAiOGvjtMASLhqwZ54_m-Ma1WoNl2aXCb0ilyqW86YNhSwuG_K71jQZ1bGWSBD0oql9/s1600/IMG_3311_sm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZmxrmTODcu6IgVx0sjV_YOssKFd6nHYLxwydCgS_i8X8xca_Af8kzUlTIgZSN86goJaAiOGvjtMASLhqwZ54_m-Ma1WoNl2aXCb0ilyqW86YNhSwuG_K71jQZ1bGWSBD0oql9/s320/IMG_3311_sm.JPG" width="320" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">After 15 minutes of playing, the kids went from destructive to constructive. They still had plenty of energy – a short bout of concentrated effort certainly isn’t enough to tire them – but it was enough to take the edge off the irritable frustration that had set in by being stuck inside. They went from angry to happy to play, or craft, or sit and colour. And as a parent I can tell you that the only blessing greater than naptime, is a horde of children happily engaged in their own independent activity.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If you have kids, you can do this too very easily. It’s as simple as a spare deck of cards and a sharpie – write an exercise on each card (the same numbers have the same exercises) and play Go Fish. When a match is made, everyone else must do the exercise a number of times equal to the number on the card. (For example, 10 Jumping Jacks, or 4 Sit-ups).</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSuhtAj7O8vKC-8EvQO4uT38PvckUZUDeBzZjUuRMKDgpi0Y9EjeaM1EIsCwxZqtG-arGNGJ457N8PavALlv7QlrnGqSxRl_ojlxhXMV7avmCjnL93fMbD0bAqPe93Fh8lD-mm/s1600/image2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSuhtAj7O8vKC-8EvQO4uT38PvckUZUDeBzZjUuRMKDgpi0Y9EjeaM1EIsCwxZqtG-arGNGJ457N8PavALlv7QlrnGqSxRl_ojlxhXMV7avmCjnL93fMbD0bAqPe93Fh8lD-mm/s320/image2.JPG" width="320" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In the interests of making this game accessible and more interesting for kids, we’ve been working with an artist (Fredrik Skarstedt) to create beautiful, colourful cards that we are currently trying to kickstart a print-run for. If this is something of interest to you, come check it out at (<a href="http://www.tricorngames.com/kickstarter">www.tricorngames.com/kickstarter</a>) which ends April 6th, 2017.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiclS2o1bP1QAwQh0SLFWeadpkUwESR8ZyAlb_NwxwOQEimOrTKwHymIhlRY4IcwhaHJfdljz9Nz1gjUSW7L-VViogV9gVlPF_duPiUU-n4bOrbfpitxP-2hnq7pgJYfawzuRYB/s1600/__LargeStatus.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiclS2o1bP1QAwQh0SLFWeadpkUwESR8ZyAlb_NwxwOQEimOrTKwHymIhlRY4IcwhaHJfdljz9Nz1gjUSW7L-VViogV9gVlPF_duPiUU-n4bOrbfpitxP-2hnq7pgJYfawzuRYB/s320/__LargeStatus.jpg" width="320" /></a></div>
<div>
<br /></div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-6841292225207849552017-01-10T11:07:00.000-06:002017-01-10T11:07:56.570-06:00Gotcha #6 - Sometimes Naive Caching is Worse than None<span style="font-family: "trebuchet ms" , sans-serif;">There is a popular proverb about good intentions and the road to hell that is well known, but an alternate version of that proverb is phrased as "Hell is full of good meanings, but Heaven is full of good works". Unfortunately even good works can lead down the wrong path when they are undertaken with insufficient consideration for their impact.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">This post is about one such work - about the implementation of a caching strategy on a large platform that is widely used across the industry. The work itself is good, smart, and done with significant forethought. However under certain conditions, the choices made ended up creating a system worse than if nothing had been done at all. This post explores the choices, circumstances, and effect that implementing an intelligent - but naive - caching system had on one particular project and why the result ended up being worse than if it had never been.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">The names of all organizations, people, and software involved have been withheld.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<b><span style="font-family: "trebuchet ms" , sans-serif;">6 Days to Go-Live</span></b><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b><br /></b>
A war room had been convened. The production deployment of a new Public Access System (PAS) had gone smoothly over the weekend and everything was prepared to turn the switch and make it accessible in less than a week. The public information campaign had already been underway for some time, advertising the date, and getting the word out that this new offering was forthcoming. However, validation of the deployment had hit a snag - one member of the QA team had noticed something wrong.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">At a critical step while making a new purchase on the PAS, the system would appear to pause. After a long delay (45s) it would return with a technical error. Repeating this process several times in a row would produce the same error across multiple sessions, across multiple machines. And then it would go away and everything would work smoothly again.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">Until it happened again about an hour later.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">And again an hour after that.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">And then it went away. Combinations of testing, several people trying to test it in a variety of ways, and using precisely the same data - or different data - it couldn't be reproduced.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">Until the next morning, when the problem showed up anew and again the following hour, before disappearing once more.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">So began an urgent search to understand the problem began, testing the system, combing the logs, reviewing all the code tracing and analytic tools at our disposal to isolate and resolve the problem - in production.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">Underlying this effort was the question - why wasn't this problem seen in any other environment? Through the myriads of Dev and QA environments, through multiple test cycles and performance testing, this pattern of problems had never been encountered before. At times a similar issue would be seen in isolated circumstances immediately following the restart of an environment, but once it was initialized everything was good.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">So why was it happening in production, and nowhere else?</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<b><span style="font-family: "trebuchet ms" , sans-serif;">Architecture</span></b><br />
<b><span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></b>
<span style="font-family: "trebuchet ms" , sans-serif;">The PAS is a clustered three-tier system using RESTful services to communicate between the web server and the Back-end Application (BEA). The BEA contains all the business code required to verify, validate, and persist purchase information.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUmFYPsAH2HAjbvdlBfXluYnagMzRuUuij3pBXvQTZ__Wqu54ouAAdr37PqJ9phMdCSWxinex3NJOpXTj8Z0yrOc106uQ44HFUGL9jmVqkxKtM9Fc4qBc4fQThN3DtplKUgSt0/s1600/dbserver.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUmFYPsAH2HAjbvdlBfXluYnagMzRuUuij3pBXvQTZ__Wqu54ouAAdr37PqJ9phMdCSWxinex3NJOpXTj8Z0yrOc106uQ44HFUGL9jmVqkxKtM9Fc4qBc4fQThN3DtplKUgSt0/s640/dbserver.png" width="640" /></a></div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;">The PAS cluster contains 2 nodes, and the BEA cluster contains 8, separated into two group of 4 - one group dedicated to the PAS and the other for direct Intranet access. As a true RESTful interface, no session information is tracked between requests to the BEA cluster. The load balancer provides a true round-robin.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">When the system is active, most of the processing load takes place on the BEA cluster, the PAS operates as little more than a view rendering layer. When a page request comes in to the PAS, it opens a connection to one of the BEA nodes - passes along the request - and waits for a response. In the case where the BEA node takes an abnormally long time, or if there is a failure and no response is generated - the connection has a 45s timeout. If it takes longer than 45s, the PAS would close the connection and display a technical error message encouraging the customer to call their local company representative to complete the purchase.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;"><b>The Trail of Evidence</b></span><br />
<span style="font-family: "trebuchet ms" , sans-serif;">When the problem was first raised, there was a great deal of speculation as to the possible cause. Database issues, connection issues, misconfiguration, load balancer issues - all possible sources of this technical error, but all things that would need to be verified and eliminated.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">There were a number of observations made about the system that were unusual or worth investigating - including hung database threads and the presence of a query in the AWR (query performance statistics) report that was known to be problematic in other environments. But in hindsight there was only one that would prove to be important to the actual cause: the problem only happened in the morning when full-time employees arrived for work and began using the BEA system directly via the Intranet.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">Now the Intranet BEA nodes are physically separate from the ones used by the PAS, but they do share a database. The problem only occurred during the morning hours when load on the BEA nodes and the database were at their highest. Not high enough to cause a bottleneck or result in performance problems - but not insignificant either. More on this later.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">The most important piece of information came from our enterprise performance monitoring tool that was installed on all production servers. By drilling down, identifying, and isolating a single request that failed we could examine the performance of the BEA code for that single request.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">And what we discovered was a function call that took 24s that involved retrieving a large but critical piece of reference data from the database, and storing it in the application cache. </span><span style="font-family: "trebuchet ms", sans-serif;">By itself, not enough to cause a timeout and result in a technical error - but in a confluence of circumstances this piece of reference data was then being used for a large and complex set of calculations that took ~20s to complete and in this particular instance was just barely slow enough to cross the 45s timeout threshold and cause the technical error to be displayed. </span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">Now this isn't unusual - the median time for this particular load-and-store operation was about 15-18s, and once it was complete the data would be cached and any future accesses would take 1/10th of a second or less. But in the situation where it did have to retrieve the data from the database while the db was under significant load caused it to slow just enough to trigger the problem.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">But why was it happening at all? Why wasn't it happening elsewhere? And why wasn't it discovered during Performance Testing.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;"><b>Unexpected Caching</b></span><br />
<span style="font-family: trebuchet ms, sans-serif;"><b><br /></b></span>
<span style="font-family: trebuchet ms, sans-serif;">The answer came in a conference call to the vendor. The cache on the BEA system </span><span style="font-family: Trebuchet MS, sans-serif;">operated as follows:</span><br />
<br />
<ol>
<li><span style="font-family: Trebuchet MS, sans-serif;">Objects in the cache are marked as stale at intervals of 15 minutes if they have not been accessed during that timeframe.</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">If an object was already marked as stale when the interval arrived, it would be evicted from the cache.</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">Every 4th interval (once per hour) all objects in the cache would be evicted regardless of their state.</span></li>
</ol>
<br />
<span style="font-family: trebuchet ms, sans-serif;">This cache interval was configurable to a maximum of 30 minute intervals, extending the hourly global eviction from 1 hour to 2 hours - but no further. This means that every hour all reference data would be purged from the BEA system's memory and need to be reloaded the next time it was accessed... <i>on each node</i>.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;"><b>The Core Problem</b></span><br />
<span style="font-family: trebuchet ms, sans-serif;"><b><br /></b></span>
<span style="font-family: trebuchet ms, sans-serif;">In order for the problem to occur, the following had to happen:</span><br />
<br />
<ol>
<li><span style="font-family: trebuchet ms, sans-serif;">The BEA's cache was empty on the nodes that were used by the PAS.</span></li>
<li><span style="font-family: trebuchet ms, sans-serif;">The other Intranet BEA nodes had to be actively used by a large number of concurrent users to put sufficient load on the database to cause a retrieval delay for the large amount of reference data.</span></li>
<li><span style="font-family: trebuchet ms, sans-serif;">The PAS had to be inactive, with only 1 or 2 users online performing a new purchase. Other operations would cause the reference data to be loaded but not perform the complex calculations that would cause the response delay to exceed 45s.</span></li>
</ol>
<br />
<span style="font-family: trebuchet ms, sans-serif;">An unlikely scenario it seems, right?</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">Except...</span><br />
<br />
<ol>
<li><span style="font-family: trebuchet ms, sans-serif;">The BEA cache would be emptied on the hour, every hour.</span></li>
<li><span style="font-family: trebuchet ms, sans-serif;">The Intranet BEA nodes were being used by employees for their normal job, and would be heavily used every weekday for several hours during the morning.</span></li>
<li><span style="font-family: trebuchet ms, sans-serif;">The PAS was a limited-scope rollout, the only functions that it performed were New Purchase, and Continue a Saved Purchase.</span></li>
<li><span style="font-family: trebuchet ms, sans-serif;">The PAS was so new, that the initial expected load was only a handful of users per day. So the likelihood of having only 1-2 users performing a new purchase was very high.</span></li>
</ol>
<br />
<span style="font-family: trebuchet ms, sans-serif;">These circumstances meant that it was very likely that <b><i>any</i> </b>user of the system would run into the situation where all three conditions were met and cause their purchase attempt to fail.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">This problem was further compounded by the round-robin load balancer, and the fact that the reference data needed to be loaded on each node separately. This means that not only was a user likely to encounter the technical error message, but if they attempted to retry their purchase their next page request would be directed to a different BEA node whose cache was still empty resulting in the same error message <i>again</i>.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">The expected result is that for a majority of potential customers, each would need to retry their purchase <i>five times</i> before successfully completing it.</span><br />
<br />
<span style="font-family: trebuchet ms, sans-serif;"><b>Why Wasn't This Caught?</b></span><br />
<span style="font-family: trebuchet ms, sans-serif;"><b><br /></b></span>
<span style="font-family: trebuchet ms, sans-serif;">The simple answer is the other environments were not busy enough. Dev, QA, Staging... all of these environments did not have sufficient database usage to cause enough delay to cross the 45s delay threshold. In addition, these environments typically were not configured in the dual-cluster architecture of production, so any activity directly on a BEA node would cause the reference data to be loaded into cache. The chances of a PAS new purchase occurring with an active database were essentially non-existent.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">The exception was the Performance Testing environment which did have a fully configured production system, and sufficient database traffic during a test to cause the problem. The reason it wasn't discovered was that the PAS traffic was too high. Even a half-dozen simultaneous users was sufficient to cache the reference data across all the BEA nodes - and even if the error was observed near the beginning of the test once or twice, a few minor functional errors are not unexpected during a performance test and the absence of reoccurence over the next hour would be simply dismissed as an anomaly.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;">As soon as the circumstances of the problem were discovered, it became a simple matter to intentionally reproduce in Performance Test by adding load to the Intranet BEA nodes and manually attempting to test a new purchase.</span><br />
<span style="font-family: trebuchet ms, sans-serif;"><br /></span>
<span style="font-family: trebuchet ms, sans-serif;"><b>Why Did This Happen?</b></span><br />
<span style="font-family: trebuchet ms, sans-serif;"><b><br /></b></span>
<span style="font-family: trebuchet ms, sans-serif;">This problem is caused directly by the implementation of a naive caching framework on the BEA system. The purpose behind clearing the cache regularly would be to ensure that reference data (if updated) could only be stale for a certain amount of time before being refreshed. </span><span style="font-family: "trebuchet ms", sans-serif;">The assumption was that the cache could be cleared every hour without causing a problem, which ended up not being the case. The BEA system had no facility with which to preload reference data, no functionality allowing it to be refreshed periodically except through eviction and reload on-demand, and no ability to persist reference data in a long-term no-expiry cache.</span><br />
<span style="font-family: "trebuchet ms", sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms", sans-serif;">The reason this was more than just a normal problem, is that by implementing a limited cache the system was successfully able to mask the existence of the problem from developers, qa, and performance testing. The naive caching strategy allowed it to work well under load most of the time, and only appear as a problem in very specific circumstances.</span><br />
<span style="font-family: "trebuchet ms", sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms", sans-serif;">Had there been no cache on the BEA system, this problem would have become abundantly clear in performance testing by resulting in terrible performance for that operation and also causing the error rate to approach 100%. But by masking the issue it managed to survive until mere days before go-live when it was discovered entirely by accident.</span><br />
<span style="font-family: "trebuchet ms", sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms", sans-serif;"><b>The Solution</b></span><br />
<span style="font-family: "trebuchet ms", sans-serif;"><b><br /></b></span>
<span style="font-family: "trebuchet ms", sans-serif;">The permanent solution will be to modify the BEA system to build a more sensible multi-use caching strategy with the ability to preload and periodically refresh reference data independent of a user request. Temporarily it has been resolved with an automated process that makes an appropriate service request to each BEA node every minute that triggers the reference data reload if it has been evicted in an attempt to complete that reload before a user encounters it.</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-66923738464437008302016-08-17T16:16:00.003-05:002016-08-17T16:23:23.924-05:00Tricorn Games - Flipped Off!<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfKUY0BLSzhyLAW1CdeiB2ggnSd4ZHXaohE-ZdIy5jjJmiE546u0JKGak7z1OBYcofQmZGQ_5cEZ7ozvV3expto6TyyWFu79zoYz2nuzs67Lc7Z6x3Hy2i_B_OukbUBbRq78Kv/s1600/tricorn_logo_white.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfKUY0BLSzhyLAW1CdeiB2ggnSd4ZHXaohE-ZdIy5jjJmiE546u0JKGak7z1OBYcofQmZGQ_5cEZ7ozvV3expto6TyyWFu79zoYz2nuzs67Lc7Z6x3Hy2i_B_OukbUBbRq78Kv/s200/tricorn_logo_white.png" width="200" /></a><span style="font-family: "trebuchet ms" , sans-serif;">I am excited to announce that I have embarked upon a new venture - <a href="http://www.tricorngames.com/">Tricorn Games</a>. Under this banner we will be developing and publishing tabletop and card games, with potential expansion into the realm of mobile and computer games.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;"><a href="http://www.tricorngames.com/flipped-off/">Flipped Off!</a>, our first product is currently in the final stages of development and playtesting. Flipped Off is a tactical card game where you play a plotting Mastermind aiming to defeat your rivals and seize control of the city for yourself. You must manage your Minions - the Pirates, Ninjas, and Robots that do your bidding, play actions that can improve your situation or wreak havoc with your enemies, and use your Minions to launch attacks and hope that your rivals can’t turn the cascade of results to their own advantage.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaSW8SMxJJgWmIXmyqsO51GOPiGlCajsgQFVhr2jXp5If6cvXn6DNFBpFvRHu5_8GXhyiYLs7fJZmxC0uAnctMp6zu4kgzPuFIkykrBtHRq2xvWypwa1IcdlvartRuRn0uBuJo/s1600/Logo-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaSW8SMxJJgWmIXmyqsO51GOPiGlCajsgQFVhr2jXp5If6cvXn6DNFBpFvRHu5_8GXhyiYLs7fJZmxC0uAnctMp6zu4kgzPuFIkykrBtHRq2xvWypwa1IcdlvartRuRn0uBuJo/s640/Logo-2.png" width="640" /></a></div>
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">We are currently recruiting playtesters, if you would like an early look at this game and would like to help us refine it and have input into the final result - please <a href="http://www.tricorngames.com/playtest-signup/">sign up here</a> and join us! Playtesters will receive a high-quality printable PDF of all the game components and instructions, access to the playtest forum, and active participants will receive public credit for their contributions when the final release has been completed.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">In addition to </span><a href="http://www.tricorngames.com/flipped-off/" style="font-family: "Trebuchet MS", sans-serif;">Flipped Off!</a><span style="font-family: "trebuchet ms" , sans-serif;">, we have several additional projects under development which will be announced when they are ready for release.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="font-family: "trebuchet ms" , sans-serif;">Remember - Play more games!</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-28011401490596980262016-05-25T06:56:00.001-05:002016-05-25T06:56:26.147-05:00The Tragically Hip - Gord Downie<span style="font-family: Trebuchet MS, sans-serif;">20 years ago when I was in my early-teens I took a trip across the country by myself. Looking back it doesn't seem like much - I flew from Winnipeg to Edmonton via Saskatoon, a 3-4 hour journey with layovers, but at the time it was a huge step towards independence for me. I was going to Edmonton to spend a month with my cousins during the summer. In truth, I was dropped off at one gate, shepherded by a flight attendant who was there to help underage passengers flying alone, and picked up by family on the other end. But for a kid who had never flown before, to do so alone when he was perfectly happy wiling away the hours on a computer screen in the basement, it felt like a huge, scary undertaking.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">It was freedom, and it changed my life, though it took me another five years to realize it.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The flight was uneventful. Scary, thrilling, strange in the way that is common to airplanes and amusement rides. Funny how I became a fan of the former, and you couldn't pay me enough money to tolerate the latter. I wasn't the only unaccompanied minor on the plane, there was another kid seated with me as well who was a couple of years younger and it was his first flight too.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">I guess I was visibly nervous, I was a shy kid to start with - not much for talking - and I expect I was probably white as a sheet, staring out the window at the tarmac as the rest of the plane boarded. As the plane began making its way to the takeoff strip, shuddering, pinging, whirring - all things unfamiliar to a novice traveler - a passenger in the row ahead of me turned to talk to us. I don't recall what he asked us, but I told him my name and that it was my first time flying, and we talked briefly in the way that strangers do while the plane was getting ready for takeoff.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">As I said, the flight was uneventful for anyone who knew what to expect. Once we were in the air and on our way to Saskatoon, the nice guy in the row ahead of us asked us if we could give him a hand. He and his buddy were doing a crossword puzzle from the morning paper. I can't say that either of them were terribly adept at it, but I was a kid. I don't think I helped worth beans, but it was fun. My fellow underage passenger wasn't interested, but I remember poking my head over the top of the guy's seat and spent the better part of an hour working the puzzle with the two of them.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Before I knew it, we were descending into Saskatoon. At the gate, the two guys said goodbye and left with some other friends of theirs who were also on the flight, while I stayed aboard for the next leg of the journey to Edmonton.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">After everyone who was getting off had done so, the flight attendant came back to check on us before more passengers got on. I gather she was a fan - she came over and asked us "Do you know who that was? That was the <i>Tragically Hip!</i>".</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">I was a kid, I didn't have any bloody idea who the Tragically Hip were. I had heard the name before, but I couldn't have named a single song they played. I was more amazed at my uncle's exclamation when I related the story to him that evening. <i>He</i> knew who The Hip were.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Fast-forward five years, I am 17 years old, just about to turn 18, sitting in my dorm room in Waterloo, Ontario - 2,000km from my home and family. I had just embarked upon the biggest, most exciting, most frightening journey of independence in my life since that flight to Edmonton... and I was feeling it pretty badly. That night, and more than a few nights after I would put on my headphones and turn on my favorite playlist, comforted by the familiar strains of songs I had listened to a thousand times before. Songs that spoke to me in some way, songs that sounded like home. I would fall asleep listening to Great Big Sea and The Tragically Hip, whose album I would never have picked up had it not been for an enthusiastic flight attendant.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This post was prompted by the news that <a href="http://www.gorddownie.com/">Gord Downie</a> of The Tragically Hip <a href="http://www.cbc.ca/news/canada/toronto/gord-downie-cancer-1.3596839">has cancer</a>, treatable but terminal. My father-in-law was killed by the disease less than a year ago, so I can relate to some of the experiences his family is going through today. So I wanted to post this, my own personal experience with them.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So for Ahead by a Century, Membership, Thompson Girl, My Music at Work, and most importantly... <i style="font-weight: bold;">Courage</i>, thank you.</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-83616731964054415592016-03-21T14:10:00.002-05:002016-03-21T14:10:42.683-05:00Gotcha #5 - Network Performance, CSS, and HTML5<span style="font-family: Trebuchet MS, sans-serif;">Today's article comes courtesy of understanding your customer's environment, and that emphasizing style over substance can break the bank.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Our story starts with an urgent request for assistance from a system administrator, a minor application update has resulted in a nearly five-fold increase in total network traffic at a remote office. On Monday morning, when the morning shift arrived network traffic began to spike. It grew, and grew, far beyond normal traffic levels for the office and stayed there, night and day, until the last shift signed off on Friday evening.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2dIpEdwSYu9HJ86ZTMcGw97oZYBa0EaWbFMYHxbRGgndMEnFn8sAVH5L0utmJbUv8d8nQQJI7g7QViXYJSZgIeou7xEF-NPBfG7sP5tI4AlOYGzDCl3Dw2QaXxNq7tO7P5PxT/s1600/average.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2dIpEdwSYu9HJ86ZTMcGw97oZYBa0EaWbFMYHxbRGgndMEnFn8sAVH5L0utmJbUv8d8nQQJI7g7QViXYJSZgIeou7xEF-NPBfG7sP5tI4AlOYGzDCl3Dw2QaXxNq7tO7P5PxT/s1600/average.png" /></a></span><br />
<br />
<span style="font-family: Trebuchet MS, sans-serif;">Think about this for a moment.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The <i>application's</i> network traffic did not increase five-fold. The entire office's network traffic consumption increased from ~2Mbps (24-hour average) to nearly 9Mbps (24-hour average) with peaks topping out at 10Mbps.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The first stage is always denial.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">How could a minor update to a server-based web application that mostly consisted of a couple minor bug fixes, one new summary screen, and some UI tweaks be the problem? It must be something else, there isn't anything <i>new</i> or <i>unusual</i> in the application update.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Well...</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 1: Isolating the Problem</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Easy enough to do, by using more detailed reports we could see the initial spike in unusual network activity began at 10am on the Friday before, the same time as the outage window when the application update was deployed.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Also, there were no other maintenance activities ongoing at that time, no file transfers, and no other system updates scheduled or otherwise.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Hmm...</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 2: Reproducing the Issue</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">To confirm, we conducted a test where all instances of the application on every workstation on the site was closed, and by so doing network traffic returned to its normal (low) stable state.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">One by one, each workstation re-loaded the application and by time the last workstation was reconnected the network traffic was back at its five-fold peak. It was during this process of re-loading that the system administrator noticed something unusual. A new UI feature had been added to some screens, when a specific piece of data was in a warning state - the text box would flash orange. And every time a new screen loaded that happened to display one of these flashing orange boxes, network traffic would spike sharply.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In the end, the system administrator noticed 10 out of more than 100 workstations happened to be displaying this flashing orange box. Returning to shut down just these 10 flashing displays suddenly dropped network traffic back to normal once more. When they were re-loaded, network traffic would spike once more.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 3: Cause and Solution</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">So how can a simple CSS and HTML5 flashing text box on 10 screen possibly start pushing 4 times the total network traffic of an office of more than 100? The technique to highlight a text box had been used elsewhere in the application already, and the style control was rendered entirely in-browser with no additional server requests being made.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">How can a box no larger than 400px by 300px with a lovely fade-in/fade-out HTML5 animation possibly consume 800Kbps per screen?</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><i>The Epiphany</i></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><i><br /></i></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Animated. </b>For the first time in this application, the developer (to satisfy a requested requirement) used a simple <i>animation</i> cycle to flash the control orange on a 4-second cycle. It was a lovely effect, understated, but unmistakable and was easily visible when displayed on a large screen from across the room.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">What wasn't clear however, was that each workstation did not use a browser to view the application. Instead, each workstation used a Remote Desktop (RDP) session to a centralized (offsite) server which then connected to the application in a browser window.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Instead of being rendered in a local browser session and consuming no network resources at all, the beautifully animated flashing textbox was being rendered and streamed as uncompressed full-motion video over the network to the site office.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">10 workstations streaming uncompressed video for 24-hours a day, 5 days a week.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 4: Resolution</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">In the end the problem was easy to solve. Rip out the animation, and using a simple steady-state orange highlight to communicate the information.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">But it was an important lesson. You must be aware of how your customer is using the tools that you build, and how the simplest of design choices can cause a major impact under the wrong circumstances.</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-31767574569600994422016-01-19T19:18:00.000-06:002016-01-25T11:45:27.840-06:00Research Study: Memory Test<span style="font-family: Trebuchet MS, sans-serif;">Contest!</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: 'trebuchet ms', sans-serif;">Anyone who signs in with an email address and completes the test before Feb 28 will be entered into a drawing for one of the top 2015/2016 indie games from Steam or an equal value Amazon book order.</span><br />
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><a href="http://study.garretrempel.com/">Participate Here!</a></span><br />
<div>
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div>
<span style="font-family: "trebuchet ms" , sans-serif;"></span><br />
<div>
<span style="font-family: "trebuchet ms" , sans-serif;">I'm conducting a study on memory and the ability for people to memorize short sequences of numbers. In order to do this I've built a small web app to conduct memory tests. It tracks both correct answers and time spent and scores your performance - so speed is better but not at the expense of answering incorrectly.</span></div>
<span style="font-family: "trebuchet ms" , sans-serif;">
<div>
<br /></div>
<div>
The purpose of this study is to test your short term memory skills, numeric analysis ability, and speed. The test is divided in 5 levels of 5 questions that increase in difficulty. You may complete them in any order you choose and at any time if you would like to do some now and return later to do the rest, but you must complete them all before the results can be processed.</div>
<div>
<br /></div>
<div>
The test is randomly generated, so you can take it as many times as you'd like to try and do better, and it tracks your history so you can see you best score if you do it more than once. Each question presents you with a small set of numbers to memorize, then asks you to answer a question about the numbers.</div>
<div>
<br /></div>
<div>
It's very simple, and quick to do. Please give it a try, and share it around - compete against your friends!</div>
<div>
<br /></div>
<div>
For SCIENCE!</div>
</span></div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-66582954869360229702015-11-17T13:35:00.000-06:002015-11-17T13:35:31.253-06:00Refugees - Past, Present, and Future<span style="font-family: Trebuchet MS, sans-serif;">I debated with myself about writing this post. I normally stick to technology, literature, and various constructive activities on my blog, and I avoid commenting on current affairs or political situations. I avoided the Canadian federal election, talking about who I supported and why, among various other noteworthy events.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This post is different. If you want to avoid my thoughts on refugees and their place in Canadian history, then go ahead and stop reading now.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This is from a post that I wrote and shared on Facebook.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">Did you know: 21,000 Mennonites came to Canada as refugees between 1923 and 1930. These were German-speaking people from Russia. This was shortly after the Russian revolution deposed and assassinated most of their royal family who were close allies of the west. This was shortly after the most violent and bloody war the world had ever known, where Germans were the enemy. This was a time when Canada only had 10 million people and 21,000 refugees was a much bigger number for the population to support.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">Mennonites said they were a religion of peace, they were pacifists, but to many Canadians they were the enemy. Sure some Mennonites already lived here, but those Mennonite had been living here for two generations and more than fifty years already.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">But Canada welcomed them anyway, because that is what we do. Canada welcomed my great-grandparents to this country. My family were refugees fleeing war, fleeing persecution, fleeing the Soviet Gulag. They were the enemy in the eyes of many, but they were welcomed anyway.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">Many people are questioning the wisdom of allowing 25,000 refugees into our country who come from circumstances my family knows all too well, as do many families in our nation. I ask you, when has welcoming refugees EVER been bad for this country? When have we ever welcomed in the desperate and persecuted and not been made better for it?</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">I would gladly open my arms to Syrian refugees and tell each and every one of them only one thing. "Welcome home."</span></blockquote>
<span style="font-family: Trebuchet MS, sans-serif;">In light of the attack on Paris, many people are questioning the wisdom of allowing Syrian refugees into their country, about the possibility of enemies sneaking into the country among them. An observation was also made in response to my post about having never heard of a Mennonite strapping on a suicide vest.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This is how I answer.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">I am not calling for scrapping the vetting and selection process that normally takes place for refugees resettling in Canada. I'm not rejecting this: <a href="http://www.cbc.ca/m/touch/news/story/1.3318227">CBC - Syrian Refugee Screening</a></span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">I am rejecting this: <a href="http://www.cnn.com/2015/11/16/world/paris-attacks-syrian-refugees-backlash/">CNN - Syrian Refugee Backlash</a>The refusal to aid in a humanitarian crisis because of fear of a few. What is known of the attackers in Paris is that it was masterminded by a Belgian with a history of violence, and conducted by two Belgians, three Frenchmen, and one Syrian who registered as having crossed over in Greece, along with other unknowns.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">Registered - as in unlikely to have gone through a checkpoint clutching an AK-47 and a suicide vest. The attack in Paris would have happened with or without this one person's participation - and it sounds to me like the French have more to fear from its own natural-born citizens.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">You say you have never heard of a Mennonite with a suicide vest, and I agree with you there. But I would counter that I have heard of Mennonites who joined the SS, and entered the gates of the Stutthof concentration camp as guards. <a href="https://themennonite.org/feature/mennonites-holocaust/">The Mennonite - Mennonites and the Holocaust</a></span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">ISIS may be trying, but they do not yet hold a candle to the mid-century meat grinders that were Germany and Russia.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">What is one or two extremists without resources or equipment in the grand scheme of things? We have exported far more Canadian extremists to Afghanistan, Iraq, and Syria over the past fifteen years. I would suggest perhaps that we might concern ourselves more with actions that we ourselves take that create homegrown extremists, people who feel they are desperate, disenfranchised, and have nothing to lose right here.<br /><a href="http://www.cbc.ca/news/canada/toronto/mosque-peterborough-fire-1.3320013">CBC - Mosque Arson is a Hate Crime</a><a href="http://www.ctvnews.ca/canada/ontario-youth-unemployment-among-the-worst-in-canada-report-1.1473423">CTV - Ontario Youth Unemployment</a><a href="http://www.cbc.ca/strombo/news/10-things-you-might-not-know-about-poverty-in-canada">CBC - Poverty In Canada</a></span></blockquote>
<span style="font-family: Trebuchet MS, sans-serif;">I am the product of refugees being welcomed into Canada. Refugees who were hated, and feared, and demonized for where they were from, for the language they spoke, and for the beliefs that they held. I understand there is fear here, and that to some people it is a very real fear.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Imagine being one of those refugees. Living in a country halfway around the world, a country where you do not speak the language, where you do not share their culture, or the religion of most. A place where people fear and distrust you because they associate you with an enemy. An enemy that kills unexpectedly, attacking with surprise, an enemy that wants to start a war.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Imagine a new war starting, worse than the last one, started by the same people that your new neighbours see you as being part of. A worse war, one more horrible than anyone could imagine, one where atrocities were committed that saw millions of innocent civilians murdered. And you, living in your new home country, refuse to fight.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In World War 2 military casualties on the Eastern Front exceeded 15 million soldiers with another 14 to 17 million civilians killed in a war between my family's ancestral homeland (Germany) and its former adopted homeland (Russia). The fall of one as an enemy of the west led directly into the rise of the other as an enemy of the west.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">And all along, my family lived, grew, and prospered in their new land. They made friends, lived in peace, and grew to be an intrinsic part of their new home. Today there are nearly 200,000 of us in this country, and once again a new wave of refugees are fleeing terror, war, and persecution.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">We have made the right choice in the past. We must have the courage and the fortitude to make the right choice again. It is frightening, risk, uncertainty, the unknown are frightening things. But it is the right thing to do. It is what we do.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Because this is what Canada is.</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-43609157929099513682015-10-13T15:23:00.000-05:002015-10-13T15:23:27.885-05:00The Black Art of Performance Requirements<span style="font-family: Trebuchet MS, sans-serif;"><a href="http://www.pmbaconferences.com/winnipeg/home.html">BAWorld Winnipeg</a> (October 7-9, 2015) at the RBC Convention Centre is now over, and I had a wonderful time listening to a full slate of excellent, interesting, informative speakers. I had the opportunity to meet many new people both in the Winnipeg Business Analyst community as well as others who joined us from out of town, and renew acquaintances and friendships with others that I haven't seen in awhile.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">My own session, The Black Art of Performance Requirements went very well, I had a great time presenting and I'm glad I could provide something a little bit unique and different.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If you are interested in the slides from my presentation, I have made them available here. <a href="https://dl.dropboxusercontent.com/u/35321319/blog/The%20Black%20Art%20of%20Performance%20Requirements.pdf">Download presentation for The Black Art of Performance Requirements</a> (315kb).</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-76746499601988893602015-08-20T11:32:00.002-05:002015-08-20T11:32:49.405-05:00Timesplice - Inkshares Funding and Nerdist Competition<span style="font-family: Trebuchet MS, sans-serif;"><a href="http://www.garretrempel.com/introduction">Timesplice</a> is now open for funding on <a href="https://www.inkshares.com/projects/timesplice/">Inkshares</a> as part of a competition being sponsored by <a href="http://nerdist.com/">Nerdist</a>. The top 5 funded sci-fi and fantasy books will be published by Inkshares, one of which will also be selected to be added to the official Nerdist book collection.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The complete first chapter is available now on Inkshares (and hasn't even been published on my own site yet - but will be over the next couple of weeks).</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If you have never been to Inkshares before - it is a crowd funding site for book publishing. To pledge support for a book it is only $9.99 - with no payment or cost until the book has been completely funded. And if you are new to Inkshares, they will give you a $5.00 credit towards supporting a book - reducing your very first pledge to only $4.99.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If you happen to like what you read, it would make me very happy if you would be willing to support Timesplice. One way or another I will complete this book and make it available to everyone, but if you support it now we might even be able to get it published on actual paper - giving you something to hold in your hands and read which would be amazing!</span><br />
<br />
<iframe frameborder='0' scrolling='no' src='https://www.inkshares.com/projects/timesplice/widget/card' width='220' height=542 ></iframe>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-24353732489086078142015-08-17T10:46:00.001-05:002015-08-17T10:46:36.983-05:00Timesplice - Chapter 1: September 24th, 2015<span style="font-family: Trebuchet MS, sans-serif;">I have updated <a href="http://www.garretrempel.com/introduction">Timesplice</a> adding <a href="http://www.garretrempel.com/ch1-sep24-2015">Chapter 1: September 24th, 2015</a>.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">This is the first update to the "Thread" section - and over the next few weeks I will continue to make additions to this section until the first chapter is complete.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">Enjoy!</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-3618021010099344302015-08-10T06:48:00.002-05:002015-08-10T06:48:44.926-05:00Timesplice - Chapter 1: Experiment 001<span style="font-family: Trebuchet MS, sans-serif;">Just a quick note, I have updated <a href="http://www.garretrempel.com/introduction">Timesplice</a> adding <a href="http://www.garretrempel.com/ch1-experiment001">Chapter 1: Experiment 001</a>.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This is a bigger update than I will normally be making on a weekly basis, but it makes sense to post it in its entirety for the first chapter.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Each chapter will be broken up into three distinct sections. The Prologue, The Experiment, and the Thread. This section is the Experiment, and next week I will start posting the Thread.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Enjoy!</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-7524521483468967552015-08-07T10:09:00.001-05:002015-08-07T10:13:41.328-05:00A New Endeavor - Timesplice : A Novel<span style="font-family: Trebuchet MS, sans-serif;">I've decided to try my hand at something new, something I've never tried to do before. I'm writing a book.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Now I'm not new to storytelling, or short form writing by any stretch. But most of the writing and storytelling that I've done has been in the context of a game - most often Dungeons & Dragons which I have been running games for nearly 15 years. But what I like about being a GM is not only shaping a story, creating grand plots, but also collaborating with the players and getting new and unexpected ideas from them.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This is a bit different. I have control over the story from the start to end, and I'm also writing it in a non-traditional narrative structure too.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So this is where you come in. The website is at <a href="http://www.garretrempel.com/">GarretRempel.com</a> and the book is called Timesplice. It is going to be freely available, chapter by chapter, as I write it. Each week (on Monday mornings) I will add new content and sometimes revise/edit existing content. It won't be a full chapter each week, but at very least a new scene. I would also be happy to receive feedback, the more constructive the better! I have most of the story arc in my head already, I've been thinking about and working on this in some capacity for a year, but I am open to new possibilities too. Questions, comments, suggestions, they are all welcome.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">I've also published on my new website a short story titled "Confessions of a Drone Pilot". It's one I wrote awhile back, but I figured since I was going to the effort to create a website I might as well publish it too.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><span style="background-color: white;">Just as an added plug as a thank you, my friend Bill Harris of </span><a href="http://dubiousquality.blogspot.ca/" style="background-color: white; color: #571a19; font-stretch: normal;" target="_blank">Dubious Quality</a><span style="background-color: white;"> has been helping me with editing. He is also the developer of the game (available on steam) </span><a href="https://www.google.ca/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB0QFjAAahUKEwi8serbkZfHAhUJ9x4KHcTTANo&url=http%3A%2F%2Fstore.steampowered.com%2Fapp%2F266270%2F&ei=z7rEVfyNBonue8Sng9AN&usg=AFQjCNFlG0jgYNDhioJ7yfVRcFpNGNzNMg&sig2=EsP221JtgHYmy6v_QFn2eA&bvm=bv.99804247,d.dmo" style="background-color: white; color: #571a19; font-stretch: normal;" target="_blank">Gridiron Solitaire</a><span style="background-color: white;">.</span></span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-22344461259905427012015-07-09T06:45:00.003-05:002015-08-15T20:57:10.958-05:00Kids Climbing Play Structure - Building a Climbing Wall and Cargo Net<span style="font-family: Trebuchet MS, sans-serif;">My wife was looking at play structures to give our three kids something new to do when they were playing in our yard, and hit on the idea of a climbing structure. After looking through a variety of options available online, we found that most were either too large for our small postage-stamp yard or made entirely of plastic which were impossible to store in the winter and priced at $400 and up. Now I am not a carpenter by any stretch. I am a computer programmer by trade and was never particularly inclined towards manual labour, but I concluded that I could probably build something that was well suited to our yard and would serve our kids well.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So I set off with the following list of requirements.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">1) It must have two climbing components, a rock wall and a cargo net.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">2) It must be sturdy enough to hold 3 children at once.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">3) It must have a small footprint.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">4) It must be portable and it must be able to collapse or fold for storage during the winter.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">5) Total cost of materials must be under $400 CDN and be built using commonly accessible tools (using either what I already had on hand, or could borrow from my father - only tools that I already knew how to use).</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Here is the end result:</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3_53gcGL4FsXxsreb_9N3vJh5LUlrm-3_lDtagh70TH-v0DOVYD6_QrIinrcKOBzh2SG6w0lWOK61vMuVOs68xGDIdn_RDqVcpBhKv85H9jQCgsBCR-6R_O3Yy-aUAe6hMLU-/s1600/2015-07-08+18.38.51.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3_53gcGL4FsXxsreb_9N3vJh5LUlrm-3_lDtagh70TH-v0DOVYD6_QrIinrcKOBzh2SG6w0lWOK61vMuVOs68xGDIdn_RDqVcpBhKv85H9jQCgsBCR-6R_O3Yy-aUAe6hMLU-/s320/2015-07-08+18.38.51.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnNJzSUd0LYKP-LwI2O-ML21krTAnJFYS3T1EOqiLma586fa-p-ooOnugTIr4FeKtCmCEGqOSKe6o8k540o6wvvfnHLXQQjzeiI-FHjmy1Blmoc3oYvqO1aLCaEdMuXHG5nj8N/s1600/2015-07-08+18.39.23.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnNJzSUd0LYKP-LwI2O-ML21krTAnJFYS3T1EOqiLma586fa-p-ooOnugTIr4FeKtCmCEGqOSKe6o8k540o6wvvfnHLXQQjzeiI-FHjmy1Blmoc3oYvqO1aLCaEdMuXHG5nj8N/s320/2015-07-08+18.39.23.jpg" width="240" /></a></div>
<br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<br />
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<b style="font-family: 'Trebuchet MS', sans-serif;"><br /></b><br />
<b style="font-family: 'Trebuchet MS', sans-serif;"><br /></b>
<b style="font-family: 'Trebuchet MS', sans-serif;"><br /></b>
<b style="font-family: 'Trebuchet MS', sans-serif;">Footprint:</b><span style="font-family: 'Trebuchet MS', sans-serif;"> 7.5ft x 4ft</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b>Height:</b> 6ft from ground to top of the wall (6ft 3.75in to highest point)</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b>Folded Dimensions:</b> 7ft x 8in</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b>Total Cost:</b> $468.67 (ok, I didn't succeed here - but it was close!)</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b>Tools Used:</b> Circular saw, jigsaw, hacksaw, electric drill, </span><span style="font-family: 'Trebuchet MS', sans-serif;">power sander,</span><span style="font-family: 'Trebuchet MS', sans-serif;"> </span><span style="font-family: 'Trebuchet MS', sans-serif;">various wrenches / drill bits / screw driving bits, hammer, chisel, screwdriver, pliers, metal file, tape measure, carpenter's square.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If you would like to build something similar, below you can find my complete materials list (not including the extras I had left over!), design plans, assembly instructions, and plenty of photos I took during the process. If you do decide to build your own, I would love to hear from you to see how it turned out - please leave a comment below or send me an <a href="mailto:garret.cs@gmail.com">email</a>.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<b><span style="font-family: Trebuchet MS, sans-serif;">Materials</span></b><br />
<i><span style="font-family: Trebuchet MS, sans-serif;">Note: I have no connection to Home Depot or any renovation stores - I just shop there. I've included links for everything I bought to their product page at the place I bought them from for your reference.</span></i><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<b><span style="font-family: Trebuchet MS, sans-serif;">Qty<o:p></o:p></span></b></div>
</div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<b><span style="font-family: Trebuchet MS, sans-serif;">Material<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<b><span style="font-family: Trebuchet MS, sans-serif;">Purpose<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">7</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/2x6x8-premium-western-red-cedar/959524"><span style="font-family: Trebuchet MS, sans-serif;">8ft
2x6 western red cedar</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Structure</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">7</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/1x6x8-premium-rough-face-western-red-cedar/941933"><span style="font-family: Trebuchet MS, sans-serif;">8ft
1x6 western red cedar</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Climbing deck</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">8</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/reinforcing-angle-zmax/952936"><span style="font-family: Trebuchet MS, sans-serif;">Metal reinforcing
angle (Simpson strong tie) 4-inch wide</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Structure</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">4</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/z-max-2-inch-x-3-inch-anglenbspnbspnbspnbspnbspnbspnbspnbspnbspnbspnbspnbsp/935782"><span style="font-family: Trebuchet MS, sans-serif;">Metal
reinforcing angle (Simpson strong tie) 2-inch x 3-inch</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Structure</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">1</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/8x3-flat-hd-soc-wood-screw-100-bx/956057"><span style="font-family: Trebuchet MS, sans-serif;">100-Package
8x3-inch flat head wood screws</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Structure</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">2</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/8x1-flat-hd-soc-wood-screw-100-bx/956051"><span style="font-family: Trebuchet MS, sans-serif;">100-Package
8x1-inch flat head wood screws</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Structure + Climbing Holds</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">2</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/1-2x4-hex-hd-capscrew-gr5-unc/955841"><span style="font-family: Trebuchet MS, sans-serif;">½-inch
coarse thread hex head <span class="SpellE">capscrew</span> (4-inch)</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Hinge</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">8</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/1-2-ss-flat-washer/957359"><span style="font-family: Trebuchet MS, sans-serif;">½-inch
flat washers</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Hinge</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">2</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/1-213-ss-nylon-insert-stop-nut/957548"><span style="font-family: Trebuchet MS, sans-serif;">½-inch
x13 coarse thread nylon insert lock nut</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Hinge</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">2</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/3-8x2-1-2-188ss-hex-hd-capscrew/955829"><span style="font-family: Trebuchet MS, sans-serif;">3/8-inch
coarse thread hex head <span class="SpellE">capscrew</span> (2.5-inch)</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Cross brace mounting</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">2</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/3-8x4-188-ss-hex-hd-capscrew/955910"><span style="font-family: Trebuchet MS, sans-serif;">3/8-inch
coarse thread hex head <span class="SpellE">capscrew</span> (4-inch)</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Cross brace mounting</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">8</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/3-8-ss-flat-washer/957363"><span style="font-family: Trebuchet MS, sans-serif;">3/8-inch
flat washers</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Cross brace mounting</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">4</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/3-8-16-fin-hex-nuts-gr5-unc/955603"><span style="font-family: Trebuchet MS, sans-serif;">3/8-inch
x16 hex nuts</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Cross brace mounting</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">4</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/3-8-16-steel-wingnut/955806"><span style="font-family: Trebuchet MS, sans-serif;">3/8-inch
steel wingnut</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Cross brace mounting</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">1</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/papc-1-3-8x36-slt-flats-zinc/956909"><span style="font-family: Trebuchet MS, sans-serif;">3/8x36
slotted flats (cut in half @ 60 degree angle)</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Cross brace</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">5</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/2-7-8-inch-zinc-large-screw-eye/821772"><span style="font-family: Trebuchet MS, sans-serif;">2-7/8
inch large screw eyebolt</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Climbing Net Anchors</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">16</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.homedepot.ca/product/1-5-8-inch-zinc-large-screw-eye-8pk/821771"><span style="font-family: Trebuchet MS, sans-serif;">1-5/8
inch large screw eyebolt</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Climbing Net Anchors</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">1</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<a href="http://www.mec.ca/product/5019-610/metolius-greatest-chips-screw-on-40-pack/"><span style="font-family: Trebuchet MS, sans-serif;">Climbing
holds (<span class="SpellE">pkg</span> of 40)</span></a></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Rock Wall</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 31.85pt;" valign="top" width="42"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">1</span></div>
</div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 293.95pt;" valign="top" width="392"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;"><a href="http://www.groupebbh.com/products/a1pj058-twisted-3-strand-polypropylene-reel-58-x-200#.VZu-FvlVhBc">180ft
of 5/8-inch 3-strand twisted polypropylene rope</a> (this was purchased at Rona, but I could not find their product page for it online)</span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 141.7pt;" valign="top" width="189"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: Trebuchet MS, sans-serif;">Climbing Net</span></div>
</td>
</tr>
</tbody></table>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<b><span style="font-family: Trebuchet MS, sans-serif;">Design</span></b><br />
<div>
<span style="font-family: Trebuchet MS, sans-serif;">The basic concept for this build is a simple A-frame with a removable cross brace that allows the two faces of the frame to fold together. An off-center pivot and one face narrower than the other allows it to nest inside it when it is folded and thus letting it fold completely flat.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqhf9hANjR_NRptlckXODd2P9QTsIFv_S5u9bmltCa5XvivV09Wmcwr6g7ikI0l9Zuh32eEGG0qjA4QNgiQZr_bAMOHDaJ0DyX7e4IbLrjDdqWHCLaJ72c4JHrW_3G4u6QmWuP/s1600/Design_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqhf9hANjR_NRptlckXODd2P9QTsIFv_S5u9bmltCa5XvivV09Wmcwr6g7ikI0l9Zuh32eEGG0qjA4QNgiQZr_bAMOHDaJ0DyX7e4IbLrjDdqWHCLaJ72c4JHrW_3G4u6QmWuP/s1600/Design_01.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">The structure would consist of two mirrored A-frames as shown above, built from solid cedar 2x6's. The frames would be connected by 2x6 beams so that the 'exterior' legs are on the same face and that the completed structure is 4ft wide and a 1/2" hex bolt at the top center serves as a pivot so that the two halves can close like a scissor.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">The Rock Wall face will be decked with 1x6 cedar boards for the climbing holds to be mounted on, while the Cargo Net face will have ropes woven together through eyebolt anchors that have been drilled into the frame.</span></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Instructions</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">These instructions include some adjustments that I made during the construction process when I noticed and made some changes during the build. You may see some pictures that seem to be out of order because more of the structure has been finished than where you are. This is because I had to go back and add some reinforcement later on to ensure it was structurally sound.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><i>Building the Frame</i></b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">The legs of the frame are constructed from four 2x6's that are cut identically. Repeat the following for each of the four 2x6 boards.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">1) Drill a 3/16-inch pilot hole located 7 ft (84 inches) from one end and 1 inch off-center (3-3/4 inches from one side, 1-3/4 inches from the other).</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">2) Using a compass (or a piece of string tied to a screw) that is anchored at your pilot hole, mark a 3-3/4 inch radius arc across the short end of the board.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">3) Cut along the arc with a jigsaw and round the end of the leg.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">4) Enlarge your pilot hole with a 5/8-inch drillbit. This is where the Pivot Bolt will be eventually secured.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">5) Mark a diagonal line across the long end of the board from the corner to a point 3-7/16 inches from the end on the same side that has the offset hole.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">6) Cut alone the line with a circular saw.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPpqIPVVwA_acDXAoqFyKR7PY-r4dEX1Z-a0nszCgZ9LpUXnVmEDKm3gERsfH2V2coFxmP8IV9Xg5Zufeu5JJMAQ4aAUxAIkKHg60NsseiiTXzryPAPUbMBF2p96cttYMNgzCb/s1600/Design_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPpqIPVVwA_acDXAoqFyKR7PY-r4dEX1Z-a0nszCgZ9LpUXnVmEDKm3gERsfH2V2coFxmP8IV9Xg5Zufeu5JJMAQ4aAUxAIkKHg60NsseiiTXzryPAPUbMBF2p96cttYMNgzCb/s1600/Design_02.png" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlTrn0YulNFm1uRdO7hQvFOMk5qJzaCfq2Af2VxxFMdJ0UM3ZNrQqvbxha2klpoMWA9SfB8vpWtKL26vV1xtNlUM2dsAEb7BZVjRvfnyKr_hebh-GlUOiSI-AIaVo4x_arGrOt/s1600/2015-07-04+12.27.09.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlTrn0YulNFm1uRdO7hQvFOMk5qJzaCfq2Af2VxxFMdJ0UM3ZNrQqvbxha2klpoMWA9SfB8vpWtKL26vV1xtNlUM2dsAEb7BZVjRvfnyKr_hebh-GlUOiSI-AIaVo4x_arGrOt/s320/2015-07-04+12.27.09.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGBEXmGd55b9qyIxK2gS76gznSf3ZYdbO7THy1ks3F5UhtpRo93BnKksgHbZsHHu-Pjjtjt5H1g5s4x3h80chNv8cpBPdU60a5LFi43lKs6jbbF1iWc0qK5kY5sPbOyJNkTnny/s1600/2015-07-04+11.27.34.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGBEXmGd55b9qyIxK2gS76gznSf3ZYdbO7THy1ks3F5UhtpRo93BnKksgHbZsHHu-Pjjtjt5H1g5s4x3h80chNv8cpBPdU60a5LFi43lKs6jbbF1iWc0qK5kY5sPbOyJNkTnny/s320/2015-07-04+11.27.34.jpg" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZR2yOnwnOTSOITXPcSvFzTUARDvXmsMbMEBKMkSgwvV01D9npuWLt1DqNJz1ZhwlEs8tt8md8RJ8yO95RyI7DU7Ujm4ow17N0t-itT_K1XEB3zmdM1H_xtvAzAa0TEP6Cc_In/s1600/2015-07-04+12.31.41.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZR2yOnwnOTSOITXPcSvFzTUARDvXmsMbMEBKMkSgwvV01D9npuWLt1DqNJz1ZhwlEs8tt8md8RJ8yO95RyI7DU7Ujm4ow17N0t-itT_K1XEB3zmdM1H_xtvAzAa0TEP6Cc_In/s320/2015-07-04+12.31.41.jpg" width="240" /></a></div>
<br />
<span style="font-family: Trebuchet MS, sans-serif;">The legs of the frame are complete (for now), the next step is to cut and attach the beams that will form the support structure for each face.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">7) Using two 2x6's, mark and cut two lengths that are 45 inches long, and two lengths that are 41-1/2 inches long.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">8) Select two legs to use for the larger Rock Wall side of the structure.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">9) Mark and mount the two 45 inch beams flush with the leg's Face Edge. One beam will be positioned 4-1/2 inches above the toe, the tip of the bottom edge of the leg. The other beam will be positioned 3-1/2 inches below the Pivot Hole.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbP0dMpi9JNrPrQHQtjEuNVBrOFrNf9mKrsyKbHzj81V1riHU0tmwNOk_51yAbTC3uaeT26mh-RGvKDc4y0Ddj_Ea5WS0lI7vsSDlpFXP-gyEYFIpA8b3byNyhBGgfL218hXl_/s1600/Design_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbP0dMpi9JNrPrQHQtjEuNVBrOFrNf9mKrsyKbHzj81V1riHU0tmwNOk_51yAbTC3uaeT26mh-RGvKDc4y0Ddj_Ea5WS0lI7vsSDlpFXP-gyEYFIpA8b3byNyhBGgfL218hXl_/s1600/Design_03.png" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">10) Attach each beam using two 4-inch wide metal reinforcing angles and 1-inch wood screws.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpfe9hE19fjtEuGNMHllx324OUyDtSp3MJsq1N-7tJb2jZbcMCklVtDfRhxNYw6_3UaAXA8CNAK_VwBqniRtU4XGXrhkvKLaKvXaE151qXom3vdZHSCC3iI8FJmm6-gGMfjZhw/s1600/2015-07-04+12.36.41.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpfe9hE19fjtEuGNMHllx324OUyDtSp3MJsq1N-7tJb2jZbcMCklVtDfRhxNYw6_3UaAXA8CNAK_VwBqniRtU4XGXrhkvKLaKvXaE151qXom3vdZHSCC3iI8FJmm6-gGMfjZhw/s320/2015-07-04+12.36.41.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe6NVX7myxGa7l_pKqQ-IG8mQNVCEQvYuKtzjqxGpWRPCdYlGMOdAP5SHUVoa8LzdQOV4_qrV50JMX7Ctktu7DW6wytLOHlnSHZNHf_GVhnc6Kw3xgXE85GxVDymNBgmsPfnko/s1600/2015-07-04+13.53.06.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe6NVX7myxGa7l_pKqQ-IG8mQNVCEQvYuKtzjqxGpWRPCdYlGMOdAP5SHUVoa8LzdQOV4_qrV50JMX7Ctktu7DW6wytLOHlnSHZNHf_GVhnc6Kw3xgXE85GxVDymNBgmsPfnko/s320/2015-07-04+13.53.06.jpg" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNhT9ox0txPn4vnW6IIcN-vjRqnbwec6woa7OJeat7Wzm2mcji4wVFBtJ45Pl3ThejkQAGWZgBOTJKqnwJIIjjx39_9ISks5yxRWcf6gtKoqKaYIv26_sAQyrI5mFu7F-yUILv/s1600/2015-07-04+13.54.58.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNhT9ox0txPn4vnW6IIcN-vjRqnbwec6woa7OJeat7Wzm2mcji4wVFBtJ45Pl3ThejkQAGWZgBOTJKqnwJIIjjx39_9ISks5yxRWcf6gtKoqKaYIv26_sAQyrI5mFu7F-yUILv/s320/2015-07-04+13.54.58.jpg" width="240" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVaSwuiKwew17NAfOsurPN_j3JaR0AwS_IHtVCpKdfNpxZ-C-ZfrT3tWnfH5XdaF06D8hErFr1Qol22p_bhqqRaobLFM5PVeVqESGG4x15gCnxRueuE_aCawXV9g6cRzP4eirz/s1600/2015-07-04+14.03.12.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVaSwuiKwew17NAfOsurPN_j3JaR0AwS_IHtVCpKdfNpxZ-C-ZfrT3tWnfH5XdaF06D8hErFr1Qol22p_bhqqRaobLFM5PVeVqESGG4x15gCnxRueuE_aCawXV9g6cRzP4eirz/s320/2015-07-04+14.03.12.jpg" width="240" /></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp1rTf3rlDmk4C2yX3I_i1GgmhQwTYehRYENuVkd-ydjf8hXdma2oH7G-0Kk-4ZLihT5pSzR9ZtZr7t3jCKiOsAhXYvizoSnqc_voqlaTsv1DviSonMhBsnq8yqNK6P6H-bU1s/s1600/2015-07-04+14.17.09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp1rTf3rlDmk4C2yX3I_i1GgmhQwTYehRYENuVkd-ydjf8hXdma2oH7G-0Kk-4ZLihT5pSzR9ZtZr7t3jCKiOsAhXYvizoSnqc_voqlaTsv1DviSonMhBsnq8yqNK6P6H-bU1s/s320/2015-07-04+14.17.09.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<span style="font-family: Trebuchet MS, sans-serif;">11) Select two legs to use for the smaller Cargo Net side of the structure.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">12) Mark and mount the two 41-1/2 inch beams perpendicular to the leg's Face Edge. One beam will be positioned 6 inches above the toe, the tip of the bottom edge of the leg. The other beam will be positioned 3 inches below the Pivot Hole.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYasPCuoM5lmwGFm8hTzf4qIDOse-5G4jcx3MuNrVYUEe2vLiipbjheDhyphenhyphenuGnkg2RTifkJGU6-Dycg7mM96sYtcNA6fffrfwZOnv9e2e0GXc6FMhW3FM7PIIG3Y1EXLWCNBdVs/s1600/Design_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYasPCuoM5lmwGFm8hTzf4qIDOse-5G4jcx3MuNrVYUEe2vLiipbjheDhyphenhyphenuGnkg2RTifkJGU6-Dycg7mM96sYtcNA6fffrfwZOnv9e2e0GXc6FMhW3FM7PIIG3Y1EXLWCNBdVs/s1600/Design_04.png" /></a></div>
<br />
<span style="font-family: Trebuchet MS, sans-serif;">13) Attach each beam using two 4-inch wide metal reinforcing angles and 1-inch wood screws on</span><span style="font-family: 'Trebuchet MS', sans-serif;"> the </span><i style="font-family: 'Trebuchet MS', sans-serif;">bottom side</i><span style="font-family: 'Trebuchet MS', sans-serif;"> of the beams.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguiVi8MbrNYBUWqdwd-ysm97-5gIokg7v3nevVnFAT9haMXgCY_jqRl2yU6_JDSHHH9Jxm9w8MvPsSl0tBT1EWKz3JSxK1gDGwKPws-oMNYcjZt_d-thf2m0wf8TqDRRn7KbAH/s1600/2015-07-04+14.36.21.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguiVi8MbrNYBUWqdwd-ysm97-5gIokg7v3nevVnFAT9haMXgCY_jqRl2yU6_JDSHHH9Jxm9w8MvPsSl0tBT1EWKz3JSxK1gDGwKPws-oMNYcjZt_d-thf2m0wf8TqDRRn7KbAH/s320/2015-07-04+14.36.21.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcD2IQFbEyDugBc6_beGI1SFcdoCpnPTPVxRAWdhf51ixR1_ruVMMmnt1lh3Ze0Onwr1MqSpFEShzGf5QW57TLAd2wOMHW83XGoujwmsDjFGo2beNm32L2YHxkjbuXcZxMe3SJ/s1600/2015-07-04+14.36.25.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcD2IQFbEyDugBc6_beGI1SFcdoCpnPTPVxRAWdhf51ixR1_ruVMMmnt1lh3Ze0Onwr1MqSpFEShzGf5QW57TLAd2wOMHW83XGoujwmsDjFGo2beNm32L2YHxkjbuXcZxMe3SJ/s320/2015-07-04+14.36.25.jpg" width="240" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIFHdL9LS8HaiHSAyqYmbtCfbrvlb08nnN9Nt4W6oDckDG20LEVeIVOWCr78VOTX_dVh-5F2Viy8QA_9kWpXohKeBYFCV0BzVO2Ir8xfd1_DCW3izeB3GHsoL8tOi_wa0sAKgH/s1600/2015-07-04+15.04.56.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIFHdL9LS8HaiHSAyqYmbtCfbrvlb08nnN9Nt4W6oDckDG20LEVeIVOWCr78VOTX_dVh-5F2Viy8QA_9kWpXohKeBYFCV0BzVO2Ir8xfd1_DCW3izeB3GHsoL8tOi_wa0sAKgH/s320/2015-07-04+15.04.56.jpg" width="240" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span><span style="font-family: Trebuchet MS, sans-serif;">14) Take both parts of the structure and tip them onto their sides. Place them so that you line up the pivot holes and the two structures are back-to-back, the Cargo Net side should fit nicely inside the Rock Wall side.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">15) Through each of the pivot holes from the outside-in, thread a 1/2-inch diameter, 4-inch long hex capscrew bolt. Place one washer on the outside, two in between the two pieces of wood, and one on the inside. Use a nylon insert lock nut to hold it in place and tighten firmly.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvWQ3uoRKtoLEMR5pu8aWqQ5Y-LSoMDvPtupnouX2TG231UJSxpFPdJXfdAvvhSZlzLllHXcDw9wJCYbW3rGi0PC9spTAWlHn1iOEAVerqXzNYjhR80iGC-j8FQFA2JFJjq62b/s1600/2015-07-04+15.06.52.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvWQ3uoRKtoLEMR5pu8aWqQ5Y-LSoMDvPtupnouX2TG231UJSxpFPdJXfdAvvhSZlzLllHXcDw9wJCYbW3rGi0PC9spTAWlHn1iOEAVerqXzNYjhR80iGC-j8FQFA2JFJjq62b/s320/2015-07-04+15.06.52.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQbpMdUfm6jGL88uk5kFjPnjM8GoO-Dpkw8XxcWVOelC9JECmbb-2P0otv7PH9vslg7IAxg3rHPMDC6JdZmCdVeUVT7lWANOFc36u8MxGrosiysaZLHq_sbLAsF_EN1fWTZw6_/s1600/2015-07-04+15.18.18.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQbpMdUfm6jGL88uk5kFjPnjM8GoO-Dpkw8XxcWVOelC9JECmbb-2P0otv7PH9vslg7IAxg3rHPMDC6JdZmCdVeUVT7lWANOFc36u8MxGrosiysaZLHq_sbLAsF_EN1fWTZw6_/s320/2015-07-04+15.18.18.jpg" width="240" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYcFTZCdUHm4Nh0agGnf-1_pCLtJkEU1owNQAXxegYFFYHvt8bpiFcJO4gDMZpTPPFj4wvCR34P5Wo8_u2olhY9m-kiOhpIkQS_AwTvXX5QDKa6AXD5Ucq2QYyxQ0TCu0CH-6J/s1600/2015-07-04+15.18.22.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYcFTZCdUHm4Nh0agGnf-1_pCLtJkEU1owNQAXxegYFFYHvt8bpiFcJO4gDMZpTPPFj4wvCR34P5Wo8_u2olhY9m-kiOhpIkQS_AwTvXX5QDKa6AXD5Ucq2QYyxQ0TCu0CH-6J/s320/2015-07-04+15.18.22.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjQfaG9RSmHAsRPy-7fu0Uen7tU-EdrbnPNyAmykei9NH6j1nK0bZh8gqrTL1lxqZHh-zNb8UlvyeXHhXOaLEfXonWnOx28J32_qMP2PmVpxTnjKWO9KHrQfIqVZ7MfOhaBO4e/s1600/2015-07-04+15.18.26.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjQfaG9RSmHAsRPy-7fu0Uen7tU-EdrbnPNyAmykei9NH6j1nK0bZh8gqrTL1lxqZHh-zNb8UlvyeXHhXOaLEfXonWnOx28J32_qMP2PmVpxTnjKWO9KHrQfIqVZ7MfOhaBO4e/s320/2015-07-04+15.18.26.jpg" width="240" /></a></div>
<br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Trebuchet MS, sans-serif;">To complete the base structure the last step is to add reinforcement to the Cargo Net side in order to support the weight of the climbers once the net is mounted to the frame.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">16) Secure each beam on the Cargo Net side</span><span style="font-family: Trebuchet MS, sans-serif;"> using two 2-inch by 3-inch metal reinforcing angles and 1-inch wood screws on</span><span style="font-family: 'Trebuchet MS', sans-serif;"> the </span><i style="font-family: 'Trebuchet MS', sans-serif;">top side</i><span style="font-family: 'Trebuchet MS', sans-serif;"> of the beams. Make sure to position the reinforcing angles so the 2-inch side is vertical against the legs and the 3-inch side is horizontal against the beam.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">17) </span><span style="font-family: 'Trebuchet MS', sans-serif;">Using the last 2x6, mark and cut two lengths that are 41 inches long. Slide each beam on top of the reinforcing angles you just added and attach each of them with 6 3-inch wood screws up through the beam just below it to laminate them together.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkbxrf-ivVTnOPpBzf7YMb62uCikIcNYcTAgeJvfiDfGjEY01cN_20NlrjO9NUCd7n10f1Ypr63laPb0ogFX1u8h2CBni-OEbTpJFTvstalL1wNGIfimLTVB7w3C8_qH-zibck/s1600/2015-07-05+13.50.23.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkbxrf-ivVTnOPpBzf7YMb62uCikIcNYcTAgeJvfiDfGjEY01cN_20NlrjO9NUCd7n10f1Ypr63laPb0ogFX1u8h2CBni-OEbTpJFTvstalL1wNGIfimLTVB7w3C8_qH-zibck/s320/2015-07-05+13.50.23.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjma6kVMDUjIDSQN9Il0dYZht6vRKumCUkQdJCIiiGutt_cP5GmopbQJ4IYdNLLAEBmAnpvS4h3RIPyNDuE0Hs2zrVQteViZ_cHIhSwGDkwrydbTFYqyT7ISFdTqVMAIX_EdALc/s1600/2015-07-05+13.50.16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjma6kVMDUjIDSQN9Il0dYZht6vRKumCUkQdJCIiiGutt_cP5GmopbQJ4IYdNLLAEBmAnpvS4h3RIPyNDuE0Hs2zrVQteViZ_cHIhSwGDkwrydbTFYqyT7ISFdTqVMAIX_EdALc/s320/2015-07-05+13.50.16.jpg" width="240" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinmiJzYTxTIqID09q2Qeotvk9mceebLtUBU51N93aCjxplTWnjrknrsR8dZ0lITI9-utPb5X12KrObJXKzkYTjp1Twh0sgLz4mTMvLsuPBfHDDbaUgJa72LnnVIAPEKd-RKcVS/s1600/2015-07-05+14.08.47.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinmiJzYTxTIqID09q2Qeotvk9mceebLtUBU51N93aCjxplTWnjrknrsR8dZ0lITI9-utPb5X12KrObJXKzkYTjp1Twh0sgLz4mTMvLsuPBfHDDbaUgJa72LnnVIAPEKd-RKcVS/s320/2015-07-05+14.08.47.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfLv3oH_jZL_qz8GiRcBx1q2iOWbgdU8JOpP6dD7bQEeK4ziQccMWIGU_zz7dV6x36SJHyUxsEn9w_LG5JCMPTFcEdt0EWr6gxv4qoZfChOD3ml6GG9xe9oXqRrY2FPBuTO3mL/s1600/2015-07-05+14.12.29.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfLv3oH_jZL_qz8GiRcBx1q2iOWbgdU8JOpP6dD7bQEeK4ziQccMWIGU_zz7dV6x36SJHyUxsEn9w_LG5JCMPTFcEdt0EWr6gxv4qoZfChOD3ml6GG9xe9oXqRrY2FPBuTO3mL/s320/2015-07-05+14.12.29.jpg" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIij0Np7gbYyY9jbFOirO3tw42qncJb_XpnZJ4Dy1erKBOHoJtR53IX3_7m_S-p2t6UTF2BaE3cyNYnrMGSKXWq6TzgkUk-udP0aH9vLqjbjvqbvk5XjMXGX3sz3sQqCV4PZ6A/s1600/2015-07-05+14.08.53.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIij0Np7gbYyY9jbFOirO3tw42qncJb_XpnZJ4Dy1erKBOHoJtR53IX3_7m_S-p2t6UTF2BaE3cyNYnrMGSKXWq6TzgkUk-udP0aH9vLqjbjvqbvk5XjMXGX3sz3sQqCV4PZ6A/s320/2015-07-05+14.08.53.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5qi8Sm3_Oe3XbitcfDEA8pUgqG0qpgtEv3L-KkkhyphenhyphenlGgny6v8olY5B53TQ5PGZ5SS5graybEGjTG0p-YsaVX1oU4eLI1PqyLMsG9tCUNN1L-jtBc5gfKGAIjRV8-2YGb1Cd1O/s1600/2015-07-05+14.12.34.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5qi8Sm3_Oe3XbitcfDEA8pUgqG0qpgtEv3L-KkkhyphenhyphenlGgny6v8olY5B53TQ5PGZ5SS5graybEGjTG0p-YsaVX1oU4eLI1PqyLMsG9tCUNN1L-jtBc5gfKGAIjRV8-2YGb1Cd1O/s320/2015-07-05+14.12.34.jpg" width="240" /></a></div>
<br />
<br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><b><i><br /></i></b></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><b><i><br /></i></b></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><b><i>Adding the Cross Brace Mounting</i></b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">The cross brace is a simple removable metal bar that attaches to the legs of the structure on either side and holds them in place, preventing the structure from sliding open when it is upright. The cross brace is detachable, allowing the structure to be folded up and stored flat.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">1) Using a hacksaw, cut the slotted flat metal bar in half at a slight (60-degree) angle. Use a metal file to file down the sharp cut ends of the bar.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">2) Stand the structure upright so that it is in its final A-frame position. Measure to ensure the pivot bolt is 6 ft above the ground, and from the toe of the Rock Wall side to the toe of the Rope Net side is 7 ft 6 in. The feet of the structure should rest flush and level on the ground.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">3) The outermost unbroken holes in the slotted metal bar are the mounting holes. The next step will be to position them on the structure and mark them so that we can drill holes for the mounting bolts.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">4) Position the metal bar so that the angled cut is almost flush with the Rock Wall face and low enough so that the mounting hole on the cut side is about 1-inch from the face edge, and the mounting hole on the other side is about 1-inch from the back edge of the Cargo Net side.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">4) Mark the mounting hole positions on the structure and repeat for the other side. Use a 3/8-inch drill bit to drill the four marked positions.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Because the Cargo Net side is designed to fit inside the Rock Wall side, if we simply put the mounting bolts in as-is then the cross brace wouldn't sit flush and true on both sides of the structure - it would have to bend to fit properly. Also, the mounting bolt on the Cargo Net side would interfere and prevent the structure from folding completely closed.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">To solve these problems I had to add a block on the Rock Wall side for the cross brace to rest against securely, and I had to counter-sink the bolt on the Cargo Net side.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">5) Using a scrap of 2x6 from previous cuts, rip two 1-1/2 inch strips <i>lengthwise</i> along one of your scrap pieces. Cut these strips down so they are 3-inches long. The grain of the wood <i>must </i>run lengthwise to avoid spitting.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">6) Use a 3/8-inch drill bit to drill holes in the center of each 1-1/2x3 inch block.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">7) </span><span style="font-family: 'Trebuchet MS', sans-serif;">Through each of the brace mounting holes on the Rock Wall side, from the outside-in, thread a 3/8-inch diameter, 4-inch long hex capscrew bolt. Place one washer on the outside prior to threading - you will need a hammer in order to drive the bolt through the hole (it's a tight fit). Once you have the bolt inserted, slide the wooden block that you just made onto the end (again, with a hammer).</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">8) Once the block is firmly in place, place a washer on the bolt and secure it in place with a 3/8-inch hex nut.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi57IkfdNLnbmgn-BLamysL1kOMGl7b3acFM_amdBqPJ3vK6xOetGCdgd3l77lCdsgTDfofkJ3osEWYN7pybEBGuDNM9z5RSSEw6rf9_qtpCF-DtT6U_PECKqtYRFdmMb6mETIW/s1600/2015-07-04+16.12.51.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi57IkfdNLnbmgn-BLamysL1kOMGl7b3acFM_amdBqPJ3vK6xOetGCdgd3l77lCdsgTDfofkJ3osEWYN7pybEBGuDNM9z5RSSEw6rf9_qtpCF-DtT6U_PECKqtYRFdmMb6mETIW/s320/2015-07-04+16.12.51.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBtY7ZO0ujliRz4dwIhBoPYNs1wgOyj9BE0hN6Xnrey4luW6LrvLEP6bdjx3Qgwj9lmj96EtRr67FMNtAL05i0tdiTLWJ8neZhhabaZ5D8AWTID0INgGtNwGVUAMk6l75I86M1/s1600/2015-07-04+16.12.47.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBtY7ZO0ujliRz4dwIhBoPYNs1wgOyj9BE0hN6Xnrey4luW6LrvLEP6bdjx3Qgwj9lmj96EtRr67FMNtAL05i0tdiTLWJ8neZhhabaZ5D8AWTID0INgGtNwGVUAMk6l75I86M1/s320/2015-07-04+16.12.47.jpg" width="240" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0HgEzLq7GrPHp-H6WapKaDOQH2ODW5wmJttUZ9ax4fZjd6sxr547F5tfgUB19V6kqCri9Cv_IqDvwTvuMEcuIwvWZs4kF0laqhyphenhyphenF7Dgl3c3XVlHba9roTsp-lT69kRU5yvZo1/s1600/2015-07-04+16.27.00.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0HgEzLq7GrPHp-H6WapKaDOQH2ODW5wmJttUZ9ax4fZjd6sxr547F5tfgUB19V6kqCri9Cv_IqDvwTvuMEcuIwvWZs4kF0laqhyphenhyphenF7Dgl3c3XVlHba9roTsp-lT69kRU5yvZo1/s320/2015-07-04+16.27.00.jpg" width="240" /></a></div>
<br />
<span style="font-family: 'Trebuchet MS', sans-serif;">9) On the Cargo Net side, use a small coring drill bit (I used 1-1/4 inch bit) to drill 1/2-inch deep on the outside of the frame where you have already drilled the mounting hole. Use a chisel to clear and clean the center of the core.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">10) </span><span style="font-family: 'Trebuchet MS', sans-serif;">Through each of the brace mounting holes on the Cargo Net side, from the outside-in, thread a 3/8-inch diameter, 2-1/2-inch long hex capscrew bolt. Place one washer on the outside prior to threading - you will need a hammer in order to drive the bolt through the hole (it's a tight fit). P</span><span style="font-family: 'Trebuchet MS', sans-serif;">lace a washer on the bolt and secure it in place with a 3/8-inch hex nut.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMoTAK8eMv-TUixaRi6ZQeZ8UKQ2e-MlZvtj_K5XsWfxPPECxgUjW-fvmthOG5vovWil_FEBuh8XZCZWIMwpJo5efnMA4Jc7pq6NMV7m6trWb_twCrfdVBGlN22wOOqfFj8vqg/s1600/2015-07-04+16.27.08.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMoTAK8eMv-TUixaRi6ZQeZ8UKQ2e-MlZvtj_K5XsWfxPPECxgUjW-fvmthOG5vovWil_FEBuh8XZCZWIMwpJo5efnMA4Jc7pq6NMV7m6trWb_twCrfdVBGlN22wOOqfFj8vqg/s320/2015-07-04+16.27.08.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG2q7nDqAcTmBX4JO3eB7ulMwdCE7y9K5Po0htqp2XxtiXoBaCHGew942_Wq6tqVB7btkTNcwx4b9I65OAX7p5ETFIjJiIiO2pj4-3IXpnMelKf4Ph4mSuyFfpxMP4KfVDUU9U/s1600/2015-07-04+16.19.08.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG2q7nDqAcTmBX4JO3eB7ulMwdCE7y9K5Po0htqp2XxtiXoBaCHGew942_Wq6tqVB7btkTNcwx4b9I65OAX7p5ETFIjJiIiO2pj4-3IXpnMelKf4Ph4mSuyFfpxMP4KfVDUU9U/s320/2015-07-04+16.19.08.jpg" width="240" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTNZkfZYy9r1bxqVcukMuJgvsZbcxok0oEvOw7WuJkcTZvMuStEdGT2PkD01zcp9zWydy90TmNS7Q8ybHk2eRXDpa_vsYv93E1EwuCyt2acrr3hI-VmNzSlweZ3Dc54l0DHpz7/s1600/2015-07-04+16.27.13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTNZkfZYy9r1bxqVcukMuJgvsZbcxok0oEvOw7WuJkcTZvMuStEdGT2PkD01zcp9zWydy90TmNS7Q8ybHk2eRXDpa_vsYv93E1EwuCyt2acrr3hI-VmNzSlweZ3Dc54l0DHpz7/s320/2015-07-04+16.27.13.jpg" width="240" /></a></div>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">11) Thread the cross brace on the mounting bolts and secure with two 3/8-inch steel wingnuts.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUUqW_z-o6M_OIJHSQT91Aqra-Twq53h6ed-A2adxcKG9R25RNujDYnHK6x6c9zrIoEzTLgAiEM-mgOjBLqB9upwYdH6xmOy8S0B6lcktkkhdiSeXpXKaXpYvrbvSRMJrXvB6m/s1600/2015-07-05+11.10.28.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUUqW_z-o6M_OIJHSQT91Aqra-Twq53h6ed-A2adxcKG9R25RNujDYnHK6x6c9zrIoEzTLgAiEM-mgOjBLqB9upwYdH6xmOy8S0B6lcktkkhdiSeXpXKaXpYvrbvSRMJrXvB6m/s320/2015-07-05+11.10.28.jpg" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhArKT_Sgh8iBl2x2vriGeLJRPIOcgMxE0k6Ug1nhAUOyyoCdr_ffeWmOiey3sIS0MN1LnQn9u2s7znYvxX3ubiXcEzD4nYItJuaP1N7i-Ke8uGMV-RIH3QwxBYXAm0bZoeRhGE/s1600/2015-07-05+11.10.15.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhArKT_Sgh8iBl2x2vriGeLJRPIOcgMxE0k6Ug1nhAUOyyoCdr_ffeWmOiey3sIS0MN1LnQn9u2s7znYvxX3ubiXcEzD4nYItJuaP1N7i-Ke8uGMV-RIH3QwxBYXAm0bZoeRhGE/s320/2015-07-05+11.10.15.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">The cross bracing is now complete.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><b><i>Finishing the Rock Wall</i></b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">To finish the Rock Wall we will need to install the climbing deck and then add the holds!</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">1) Measure and cut each of your seven 1x6's in half so that you have fourteen 4ft long 1x6 boards.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">2) Remove the cross braces from you structure and fold it up, laying it flat on the ground with the Rock Wall side facing up.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">3) Align the first of your 1x6 boards so that it is flush with the top of the top support beam on the Rock Wall side and lies across the face. Secure in place using 3-inch wood screws.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">4) Position and secure the rest of the 1x6 boards on the face of the Rock Wall side, leaving a small, 1/4-inch gap between them (I used a couple of small screws as spacers to keep it consistent).</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglsQ4m3kA3m51gFgRURbATP5FvXbonvXTOsAG3yi_MWPcvLItSjrSWPmUU2nnMKkqiMh3XwJqnsTL4LS5QyDB9fh91ERdCaYI55iex0fbI8c2c1Nnm16-BvAX7e1BDUYj30Qow/s1600/2015-07-05+10.12.39.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglsQ4m3kA3m51gFgRURbATP5FvXbonvXTOsAG3yi_MWPcvLItSjrSWPmUU2nnMKkqiMh3XwJqnsTL4LS5QyDB9fh91ERdCaYI55iex0fbI8c2c1Nnm16-BvAX7e1BDUYj30Qow/s320/2015-07-05+10.12.39.jpg" width="240" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBo3FTNZNvvTSCIXhBhzr9Hvnkcv9hkwLbeZMTNxqCqZKIH02Gsmj7uG2mt3dDy91pf6Jm2VlVNDgFy9iH9qL22cBweGYlkKxNCM71beEOBaefRHRpWUwM26GCvvHzWpKwfI0m/s1600/2015-07-05+10.55.57.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBo3FTNZNvvTSCIXhBhzr9Hvnkcv9hkwLbeZMTNxqCqZKIH02Gsmj7uG2mt3dDy91pf6Jm2VlVNDgFy9iH9qL22cBweGYlkKxNCM71beEOBaefRHRpWUwM26GCvvHzWpKwfI0m/s320/2015-07-05+10.55.57.jpg" width="240" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU15PZ7gzILaYEvcjSYsht3OpWzQ36vGfqjMsNOhjfsCje-VtlqvkI1pKx_9CT2KQiolMsVsHs3Pq1pW2jcQozBZ8gumY0zNQAbwj3uJWgrkeP9e9Y08X_lvk_Ah2HySE8_JkD/s1600/2015-07-05+11.09.54.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU15PZ7gzILaYEvcjSYsht3OpWzQ36vGfqjMsNOhjfsCje-VtlqvkI1pKx_9CT2KQiolMsVsHs3Pq1pW2jcQozBZ8gumY0zNQAbwj3uJWgrkeP9e9Y08X_lvk_Ah2HySE8_JkD/s320/2015-07-05+11.09.54.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">5) Arrange the climbing holds on the Rock Wall surface however you like and screw them in place.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">A couple notes on how I arranged the holds. I avoided placing any on the bottom or top boards on the wall since they would be wasted there, at the bottom a climber can stand on the ground to reach, and at the top they can grab the top of the wall.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">I also substituted a lot of the provided 2-inch screws provided for the installation of the climbing holds with 1-inch wood screws. The reason is that many of the mounting holes in the climbing holds are very shallow, and in a lot of places the 2-inch screws would punch right through the climbing deck - leaving a sharp point on the reverse side that a child could scratch themselves on. So I swapped out close to 2/3rds of the provided screws, and only used the longer ones for mounting holes that had enough rock that they wouldn't sink right through the deck.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZJRr46Ui1vhKrnIDyuxEMCYP0vdPg7VGnXlXuh8_DEt1Z9XjROva8SN0AvL2wgSFEFhggKkxJUdmK225XnAB_sR2AcHjrpOVVBHP_-p7IACwz9a0rWJICIBNZBcTsHJiDzx3r/s1600/2015-07-05+14.38.25.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZJRr46Ui1vhKrnIDyuxEMCYP0vdPg7VGnXlXuh8_DEt1Z9XjROva8SN0AvL2wgSFEFhggKkxJUdmK225XnAB_sR2AcHjrpOVVBHP_-p7IACwz9a0rWJICIBNZBcTsHJiDzx3r/s320/2015-07-05+14.38.25.jpg" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: 'Trebuchet MS', sans-serif;"><b><i>Finishing the Cargo Net</i></b></span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;">To finish the cargo net and end this project we need to install the rope anchors, weave the net with our ridiculous amount of rope, and tie it off.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">1) Along the underside of the upper beam on the Cargo Net side evenly space and mark 5 points 8-1/2 inches apart along the length and 1 inch from the side's face. The beam is 41.5 inches long, so your marks will be at 3-3/4, 12-1/4, 20-3/4, 29-1/4, and 37-3/4.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">2) Drill a hole slightly smaller than the threading on your 7/8-inch eyebolt. For the eyebolts I bought, I used a 5/16-inch drillbit and drilled 1-1/2 inches deep leaving enough wood for the screw to bite without splitting the beam.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">3) Screw your 7/8-inch eyebolts into the drilled holes and align them so they are flush with the face.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAspIO4BLdFtTS0uXSJkfAgW5vBo9Sqmgmuxi0vxlRTvs9Q_P80mfkOXxLLo9DwQmUMGtoYxdWFpsY0rZmN00xopp5VCOwZLDfXZSkcjnQ5zpmF-0PIlS_qPEy3xELgUT7Dc5g/s1600/2015-07-05+15.46.32.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAspIO4BLdFtTS0uXSJkfAgW5vBo9Sqmgmuxi0vxlRTvs9Q_P80mfkOXxLLo9DwQmUMGtoYxdWFpsY0rZmN00xopp5VCOwZLDfXZSkcjnQ5zpmF-0PIlS_qPEy3xELgUT7Dc5g/s320/2015-07-05+15.46.32.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha5NKRPANVSWLhWYM97fSvd0zaCR0G4ruS7e1Zx8dCMPfNc85wVZARO0b-AoGRpTsbWnjXle6RgButZhJwla69SpqTxKTLY2bOnUBRUtvmna0fSuBXdMCMM8jCNoO9L3yCOzTv/s1600/2015-07-05+15.46.37.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha5NKRPANVSWLhWYM97fSvd0zaCR0G4ruS7e1Zx8dCMPfNc85wVZARO0b-AoGRpTsbWnjXle6RgButZhJwla69SpqTxKTLY2bOnUBRUtvmna0fSuBXdMCMM8jCNoO9L3yCOzTv/s320/2015-07-05+15.46.37.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">4) Mark 8 points down each leg, 1-inch from the face, starting 4-1/4-inches from the top beam and then spaced 8-1/2-inches apart. Drill each mark and install your 5/8-inch eyebolts in the same fashion. Align the eyebolts so they are perpendicular to the face this time.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">The screw length of the 5/8-inch eyebolts is shorter and thinner than the 7/8-inch eyebolts so make sure you select an appropriate drill bit, and don't drill as far into the leg. I used a 3/16-inch drillbit and only drilled 1/2 to 3/4 of an inch deep.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi68iw0QYuBvDw2u48F2Uoy6Cuzhe0eJpKkyIdJ7SOqa1nKnuyc7Pvn9FR_WJE6spwGqwH-yPukOiLsG3wQlbbF_mfDCgnfPDAttF-oPeWGcqpDtn7DjuEP4A1q8__YhR-twhLU/s1600/2015-07-05+16.24.31.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi68iw0QYuBvDw2u48F2Uoy6Cuzhe0eJpKkyIdJ7SOqa1nKnuyc7Pvn9FR_WJE6spwGqwH-yPukOiLsG3wQlbbF_mfDCgnfPDAttF-oPeWGcqpDtn7DjuEP4A1q8__YhR-twhLU/s320/2015-07-05+16.24.31.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwpRfnsH_vL-8gffS8KZOoLQcqBtmkIt_wqOyXyOqAnnHN4hCh5ttEXX7sEr2a1Era4j95QIkFhancUpNsdbOqrGR4C_BiPROn-00odOIRvj82vY84uVySoKH_ZTsce0434cGg/s1600/2015-07-05+16.24.24.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwpRfnsH_vL-8gffS8KZOoLQcqBtmkIt_wqOyXyOqAnnHN4hCh5ttEXX7sEr2a1Era4j95QIkFhancUpNsdbOqrGR4C_BiPROn-00odOIRvj82vY84uVySoKH_ZTsce0434cGg/s320/2015-07-05+16.24.24.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<span style="font-family: 'Trebuchet MS', sans-serif;">5) Cut your rope into 10 equal lengths of 18 feet, using a lighter to melt the ends to prevent fraying. If you are left with one rope slightly shorter than the others when you reach the end of the roll that's ok. Set that rope aside and use it for one of the outside edges of the Cargo Net - the side strands have fewer knots and don't need to be quite as long.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">6) Group your ropes into 5 pairs, tie a secure knot at one end and thread the two long ends through one of the five eyebolts at the top of the frame from the back.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">7) Here I will cheat. I will send you a link to how to tie a cargo net. My wife did the knotting (and did a fantastic job of it too!) because I can't tie knots to save my life.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">Ignore their advice for rope length or net size - only worry about the knot structure and pattern. This net is made using a 6-inch grid and the eyebolts are spaced properly for that size.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><a href="http://www.ehow.com/how_4494993_make-rope-climbing-nets.html?utm_source=eHowMobileShare&utm_medium=email">How to Make Rope Climbing Nets</a></span><br />
<br />
<span style="font-family: Trebuchet MS, sans-serif;">Every other row of knots, the outside strands remain loose. Thread them through the eyebolts to anchor them.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgu5SfgjNcopyvtJb1-bKVzNPfj7kn9Ao5JMntVBJW0cyNY1lQ8-CES0NRhcVJHyn7aamtJmNzHVJLRP7HW0Mt3r6tgnJZkTKyEbIlNg-RkBM-WWErB3H9epoUPItP5pMuSTIJ/s1600/2015-07-07+19.39.15.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgu5SfgjNcopyvtJb1-bKVzNPfj7kn9Ao5JMntVBJW0cyNY1lQ8-CES0NRhcVJHyn7aamtJmNzHVJLRP7HW0Mt3r6tgnJZkTKyEbIlNg-RkBM-WWErB3H9epoUPItP5pMuSTIJ/s320/2015-07-07+19.39.15.jpg" width="240" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicRjJxOWvwa80iuKLfSZ9Dw1b2Uug_cwBMYVq3kJC-4WXWDnG0UYV5lKjNkGboW231tDMd2jKzMchbDhShsf7zfQ6aYv2oxKLHk0XcQm6P57zwqeikmXxjmDsUNXeZKWH5Km4G/s1600/2015-07-07+19.39.02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicRjJxOWvwa80iuKLfSZ9Dw1b2Uug_cwBMYVq3kJC-4WXWDnG0UYV5lKjNkGboW231tDMd2jKzMchbDhShsf7zfQ6aYv2oxKLHk0XcQm6P57zwqeikmXxjmDsUNXeZKWH5Km4G/s320/2015-07-07+19.39.02.jpg" width="320" /></a></div>
<br />
<span style="font-family: Trebuchet MS, sans-serif;">8) When you reach the bottom, drill five 1-inch holes spaced in the same way as the eyebolts at the top of the frame.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">9) Tie one last row of knots, then thread each pair of ropes through the holes and tie them off on the other side. ***</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">***Caveat - I didn't get to do this. I used 150ft of rope, not 180ft - and we came up a little short. I had to improvise using a heavy metal plate and screwing the ropes into place on the underside of the frame. It was my plan to tie them off, but it didn't quite work out.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">And you are done! I hope you have fun with these instructions, and if you give it a try please let me know how it works for you!</span></div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com30tag:blogger.com,1999:blog-14847974.post-77922241335480534572015-05-29T15:35:00.001-05:002015-05-29T15:35:08.356-05:00ICPE 2015, City of Austin - Part 2<span style="font-family: Trebuchet MS, sans-serif;"><i>(Click here to read <a href="http://mincingthoughts.blogspot.com/2015/05/icpe-2015-city-of-austin-part-1.html">Part 1</a>)</i></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">During the remainder of my stay in Austin, it never got as warm as when I arrived. It stayed a rather balmy 5-10 C for the next few days, which was beautiful as I could wander around comfortably in my shirtsleeves. I cannot say my opinion on the weather was exactly shared by the locals, most of whom were bundled up in parkas and toques (<i>the following is translated from Canadian to English: </i>"winter coats and woolen hats"). I think their attitude was best illustrated by a pair of women whom I stopped behind at an intersection waiting for the walk sign. I was in a t-shirt and carrying my windbreaker because I was quite comfortable, while the two of them were quite bundled up against the cold and I overheard one remark to the other "I can't believe how cold it is! I can't wait for it to warm up again, but they're saying its going to be in the 40s all week." For some reason they abruptly switched to a different topic when I passed them by.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">As I alluded to in part 1 of this post, I have never been anywhere that is green in February. Now plenty of the trees had bare branches, and there patches of brown in the grass that spoke of it being winter, but it was still green. But besides that there were two things that struck me plainly on my first day in Austin.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The first was parking.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In the area of San Jancinto Blvd between 3rd and 6th, and east towards 290, downtown Austin is dotted with low and high-rise condo complexes, and if I might digress for a moment downtown Austin is a lovely place. It is open, populated, there are people out and about walking around throughout the day and well into the evening which may have something to do with 6th street. But people <i>live</i> in downtown Austin and it has a very friendly, clean, comfortable atmosphere to it from the short experience I had. I could easily picture living there, right in the heart of the city - something that I would be less inclined to do in my own city (Winnipeg). Now, I live <i>near</i> downtown Winnipeg and I have for nearly a decade, but always just outside of the true core area. In Austin I could easily live right in the core without a second thought.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">What struck me though, was that every single parking garage or pad that I passed was locked up. There were no arms to block entrance, every one was locked behind a 6-foot metal fence and gate. Ok, there were a few public-access surface lots, but every private lot was fenced, gated, and monitored. Perhaps it was the section of the city I was in, but in my experience it was something to note.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The second just about scared the living bejeezus out of me.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The first evening that I was walking back to my hotel, the sun was setting and night was drawing close. Have you ever been suddenly accosted by a pack of wild demons from hell screeching in a chorus and hungry for your flesh? No? Are you sure? As I passed by a tree-lined side street on my walk, the entire line of them began shaking violently with an incredible cacophony of noise. After recovering from my unexpected heart attack I realized they were birds, an enormous flock of them that filled the trees in numbers unlike anything I've seen before. I later learned that I had a close encounter with what was likely an <i>annoyance of grackles.</i> If there has ever been a more appropriate name for a group of creatures, I haven't heard it.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">My conference was being hosted at the <a href="http://hiltongardeninn3.hilton.com/en/hotels/texas/hilton-garden-inn-austin-downtown-convention-center-AUSGIGI/index.html">Hilton Garden Inn Austin Downtown</a> which I wasn't actually staying at, because of timing and funding it had no vacancy when I was booking a room. The hotel was a nice enough facility, but had one particularly unique feature.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1tu8DiPeEfBVRTbtGhTEq9o8CyWM7aF6MhH4wQtjAwKqKYclOHmLKkzPNgiBJ4a2Vf1bdJrNdXr1lQo_59mCODGNdx-3nMFNu3QFCbFZW9siZgGVHJg5zWG16X8Hl0hAneZb0/s1600/IMG_1365.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Trebuchet MS, sans-serif;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1tu8DiPeEfBVRTbtGhTEq9o8CyWM7aF6MhH4wQtjAwKqKYclOHmLKkzPNgiBJ4a2Vf1bdJrNdXr1lQo_59mCODGNdx-3nMFNu3QFCbFZW9siZgGVHJg5zWG16X8Hl0hAneZb0/s400/IMG_1365.JPG" width="300" /></span></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">And that would be the canal and walking paths that ran through it. The windows just on the left side of the photograph is the dining room where we had lunch which afforded a fantastic view of the canal and the paths that run along side it,</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">During the few days that I stayed I managed to dine at two of the most iconic... or should I say <i>representative</i> institutions in Austin. The first was of my own doing, I couldn't pass up visiting a gem of Texas history while I was here: <a href="http://www.driskillhotel.com/">The Driskill Hotel</a>. The lobby is jaw-droppingly gorgeous, and the restaurant/bar is about as truly upper-crust Texas as any visitor could hope for from the beautifully polished woodwork, to the leather seating, and the bust of a steer that graces the wall above the mantle. It doesn't hurt that the food and drinks were fantastic as well, and though it was quiet (it was a Monday evening after all) a musician was busy plying his trade, singing sweet country songs on the small stage. I didn't take any pictures of the building while I was there, but a <a href="https://www.google.ca/search?q=austin+driskill&espv=2&biw=1309&bih=786&source=lnms&tbm=isch&sa=X&ei=YsdoVa3eDdCkyATxqYDIBg&ved=0CAcQ_AUoAg&dpr=1.1#imgrc=_">quick search</a> will give you a good feel for it.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The second place was with all of the attendees at <a href="http://icpe2015.ipd.kit.edu/">ICPE 2015</a> where we were treated to dinner and a show at a place that is true to the spirit of Austin: <a href="http://www.esthersfollies.com/">Esther's Follies</a>. The show combining satire, political commentary, music, and magic was up-tempo and enormously entertaining. I gather that the edition that we saw was more international in appeal than previous ones as one of the local patrons made a comment that there was a lot less Austin-specific material than previous times they had been there. But, considering that our group of more than 100-odd people contained a majority of non-Americans (largely European, but it was very much a group that hailed from across the globe) the show was very well received, though I believe a few Rick Perry references went over their heads. The liberal leaning of the show's writers also seemed to agree quite well with our European friends.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">(Part 3 will be coming soon!)</span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.comtag:blogger.com,1999:blog-14847974.post-64562067193163284772015-05-21T12:18:00.003-05:002015-05-29T15:35:36.454-05:00ICPE 2015, City of Austin - Part 1<span style="font-family: Trebuchet MS, sans-serif;">This post is all about my impressions of my trip to Austin TX for <a href="http://icpe2015.ipd.kit.edu/">ICPE '15</a> and the city in general. I have covered details about the conference itself in other posts.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><a href="http://mincingthoughts.blogspot.com/2015/03/icpe-2015-getting-published-with-acm.html">ICPE 2015, Getting Published with ACM, and Performance Management</a></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><a href="http://mincingthoughts.blogspot.com/2015/05/book-club-foundations-of-software-and.html">Book Club - Foundations of Software and System Performance Engineering</a></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Dear Austin Texas - your town motto seems incredibly appropriate. I'm not referring to your official motto of "Live Music Capital of the World", though that was abundantly evident as well, I mean the unofficial one "Keep Austin Weird."</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Flying to Austin is weird. Flying to Austin on the afternoon of Superbowl Sunday on a plane that is running an hour late and half-filled with Texan transplants that know they aren't going to land before kickoff is more so. Especially for a true-blood Canadian who reserves such passion for games that don't prominently feature an attention hogging rhythm impaired southpaw shark.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">But the weirdness started earlier than that. For a city that is the capitol of the largest state in the lower 48 and the second-largest population, a city that boasts an international reputation as a cultural hub, it is hard to get to. I only had two real options booking my flight from Winnipeg (YWG) to Austin (AUS) if I wanted to avoid an overnight layover (I did) or arriving late at night and risking a delay causing me to be late for the start of <a href="http://icpe2015.ipd.kit.edu/">ICPE '15</a> on Monday morning (also yes). Since I was travelling on February 1st from <i>Winnipeg</i>, delays or cancellations were very much a possibility. The two options I did have were to leave at 6:30am (please arrive at the airport two hours before departure if you are flying internationally) with a 6 hour layover in Minneapolis (MSP) before arriving in the early afternoon. Or leave at 7:30am with short layovers (less than an hour) in Edmonton (YEG), and Los Angeles (LAX) before arriving at dinnertime.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In the interests of not flying a circuitous route around half the continent and potentially missing flights in two different airports, I chose the earlier departure. After arriving and puttering around the Minneapolis airport for a number of hours I went to my departure gate early where the staff let us know that the flight was going to be a half-hour late. Half an hour later it was now an hour late. Shortly after that when our original departure time arrived they let us know that although we were schedule to fly on Delta - someone along the way failed to realize that we would require an actual airplane in order to do so... and that they would try to find a new airplane to replace the non-existent one that we had been scheduled to fly on, but we would be facing further delays or possible cancellation.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Fun!</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Fortunately they were able to discover an airplane in Wichita that we could use. I won't claim to understand the logistics of airline flight scheduling, but when the plane from Wichita arrived it proceeded to unload a full compliment of passengers. I'm not sure if the passengers were intending to come to Minneapolis, or if they were merely abducted in order to justify providing us with transportation, but either way - we had a plane, and one that managed to arrive in Austin less than half an hour ahead of the flight from LAX.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">To give you a little context about my experience arriving in Austin, let me tell you a little about myself. I have never been "south". I've never traveled overseas, never been to Mexico, or Cuba, or on any kind of warm vacation. I've driven coast-to-coast in Canada, put my feet in the Pacific Ocean in Victoria BC, and in the Atlantic along the red sand beaches of PEI. But the absolute furthest south I have ever been is Gary Indiana - just at the very tip of Lake Michigan. I have never been anywhere that doesn't have snow in February. When I left home at 4-something in the morning in a sweater and a windbreaker the temperature was -26 C (windchill of -44 C) and when I arrived in Austin it was +23 C, an apparent difference of 67 C (or 120 F), a change roughly equivalent of that experienced by mall shoppers in Florida when they exit the building on a summer's day. In fact, the day before it was just as cold and I managed to snap a picture of the most brilliant sun dogs I have ever witnessed.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaqZfosGV9VFBz6PhFEm-u-GKqJI7n7T3d4Pgk_cZSJMuA22qrg-ZutHB_FHXa9R8r14jXQ_KJR3BUlmo2rM_J5Xt7Ogteu5xVbphrrUzmaeCdOnRDQ7y8y9fDL4YHrX7zL6if/s1600/IMG_1349.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Trebuchet MS, sans-serif;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaqZfosGV9VFBz6PhFEm-u-GKqJI7n7T3d4Pgk_cZSJMuA22qrg-ZutHB_FHXa9R8r14jXQ_KJR3BUlmo2rM_J5Xt7Ogteu5xVbphrrUzmaeCdOnRDQ7y8y9fDL4YHrX7zL6if/s400/IMG_1349.JPG" width="400" /></span></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In Austin I stayed at the <a href="http://austindowntown.place.hyatt.com/en/hotel/home.html">Hyatt Place Austin Downtown</a> which is a beautiful hotel in the heart of downtown across from the Convention Center and just a few blocks from 6th street, congress avenue bridge, and easy walking distance to the Capitol. The accommodations were fantastic, the staff were wonderful (and one of whom I discovered was an expat from Winnipeg no less), and they put me on the top floor facing east which gave me an amazing view of the morning sunrise.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTZH9S_xITs4KsX86-agHAngrD7wHAlWCCSWfPF_pRFMXMbyMhOLntfp5lsilL82gIuuyrvtaUeX2hLv40eEPzB9T42zehxNMpHC_cSSr6PlvaZN7qY5t6WwBUjVSV_EvEbBFP/s1600/IMG_1361.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Trebuchet MS, sans-serif;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTZH9S_xITs4KsX86-agHAngrD7wHAlWCCSWfPF_pRFMXMbyMhOLntfp5lsilL82gIuuyrvtaUeX2hLv40eEPzB9T42zehxNMpHC_cSSr6PlvaZN7qY5t6WwBUjVSV_EvEbBFP/s400/IMG_1361.JPG" width="400" /></span></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Upon my arrival, seeing that I was in Texas I heeded that age old proverb about the Romans - and I turned on the Super Bowl just in time to see the halftime show which proved to be more baffling than I expected. Alas, as I was busy doing my final preparations for ICPE I was watching it in my room while I worked, so I had no one to translate for me - but I gather that one of Katy Perry's dancing sharks was some kind of fortune teller that was predicting the apocalypse that would be brought about by an enormous lion? But I may have gotten that wrong. I did though appreciate the amazingly entertaining final 5 minutes of the 4th quarter (7 hours in real time) which was about as dramatic an ending to a game as I have ever seen. It's just a pity that Russell Wilson wasn't using the punctured bicycle tire that Brady was playing with or that last interception might not have happened.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><a href="http://mincingthoughts.blogspot.com/2015/05/icpe-2015-city-of-austin-part-2.html">Link to Part 2.</a></span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-78276878385575569492015-05-15T10:44:00.000-05:002015-05-15T10:54:12.409-05:00Book Club - Foundations of Software and System Performance Engineering<span style="font-family: Trebuchet MS, sans-serif;">I recently received and am currently reading a copy of <a href="http://www.amazon.ca/Foundations-Software-System-Performance-Engineering/dp/0321833821"><i>Foundations of Software and System Performance Engineering</i></a> that I ordered through Amazon by André Bondi, a Senior Staff Engineer working in performance at Siemens Corp.</span><br />
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">I had the good fortune of meeting André Bondi this year at <a href="http://icpe2015.ipd.kit.edu/">ICPE '15</a> (which is where I learned about <i>Foundations</i>) and he was a fascinating, enthusiastic, and wonderful person to talk to. After I had presented my paper on <a href="http://mnp.ca/en/media-centre/library/2015/2/25/defining-standards-for-web-page-performance-icpe-15/">Defining Standards for Web Page Performance</a>, he approached me and we had a wonderful discussion about performance requirements and the perspective of the end-user and he had great things to say about the work that I was doing. His energy and interest in the subject was plainly obvious. It was a pure pleasure to have the opportunity to meet and talk with him.</span><br />
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">As for <i>Foundations</i>, I haven't read very far into it yet, about 60 pages or so, but I have gone through and skimmed each section. This book is shaping up to be a fantastic resource and introductory guide to Performance Engineering. Since it is based on a training course that Dr. Bondi developed to train performance engineering and testing teams, I would expect no less. The book covers the entire software lifecycle from the perspective of how it connects with Performance Engineering as a practice, from requirements, to metrics, analysis, workloads, testing, instrumentation, and validation, and how they work within Agile environments and how to communicate and work with stakeholders on the project.</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">I won't write a complete review of <i>Foundations</i> yet as I still have much more to read, but I can be quite sure that this book is going to take a prominent place on my bookshelf, and play an important role while I am training my own performance engineering team.</span></div>
</div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-1258877492155802862015-05-11T15:53:00.000-05:002015-05-11T15:53:15.497-05:00BAWorld Winnipeg 2015 - Oct 7 - 9<span style="font-family: Trebuchet MS, sans-serif;">The schedule for <a href="http://www.pmbaconferences.com/winnipeg/home.html">BA World Winnipeg 2015</a> taking place at the <a href="http://www.wcc.mb.ca/">RBC Convention Centre</a> from October 7th to 9th has just been released, and I have received notice that my seminar proposal has been accepted.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">I will be presenting <a href="http://www.pmbaconferences.com/winnipeg/public-presentation-details.html?uid=14628&speaker_id=7600&speaker_id2=&speaker_id3=&speaker_id4=&speaker_id5=&cbResetParam=1">The Black Art of Performance Requirements for the Modern Web</a> on October 8th at 2:15pm where I will be discussing the disconnect between what we believe the typical end user needs in terms of system performance, what they say they want, and what they actually need. This seminar is based upon a real-life case study and the contrast that it presented with "industry standards" for performance.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Some of the material is based upon a research paper that I presented at <a href="http://icpe2015.ipd.kit.edu/">ICPE 2015</a> in Austin TX and is available online at the <a href="http://dl.acm.org/citation.cfm?doid=2668930.2688056">ACM Digital Library</a> or <a href="http://mnp.ca/en/media-centre/library/2015/2/25/defining-standards-for-web-page-performance-icpe-15">MNP Media Library</a>.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The complete session description is as follows:</span><br />
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">Performance is a critical consideration in any project, many projects fail due to not only poor performance, but project teams that don’t give performance due consideration. Much of the reason is a lack of general understanding about how to define performance requirements, what makes a good performance requirement, and how to elicit co-operation to ensure they are met. The Black Art of Performance Requirements sheds light upon what end users want, what they think they want, and what they actually need. It examines the failings of industry standards, the reasons the results of industry studies fail to provide usable recommendations, and how to salvage value out of existing literature. High profile performance failures such as Healthcare.gov and Examsoft are neither accidental nor unavoidable. They are the result of failure to comprehend, failure to plan, and failure to commit to a set of defined performance requirements. Based on a real-world case study, The Black Art of Performance Requirements presents a process for defining SMART performance requirements in co-operation with business, developers, and analysts. Taking two years of production performance data and connecting with end-user performance complaints during that time frame, this session demonstrates the effectiveness of defining requirements using this process and explores how to objectively evaluate system performance against those requirements.</span></blockquote>
<br />
<blockquote class="tr_bq">
<ol>
<li><span style="font-family: Trebuchet MS, sans-serif;">Understand why users don't understand performance requirements, and learn how to define quality SMART performance requirements that will satisfy them anyway.</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">Learn how to obtain buy-in from business, developers, and analysts for meeting performance targets and resolving performance problems.</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">Learn how to measure, evaluate, and compare performance results against targets objectively.</span></li>
</ol>
</blockquote>
<span style="font-family: Trebuchet MS, sans-serif;">For more information about performance requirements, testing, and how to improve your chances at project success, please see <a href="http://www.mnpconsulting.ca/services/technology/performance-management">MNP Consulting - Performance Management</a>. </span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-52773798542734480922015-03-25T13:54:00.000-05:002015-03-25T13:54:05.104-05:00ICPE 2015, Getting Published with ACM, and Performance Management<span style="font-family: 'Trebuchet MS', sans-serif;">It has been a busy year so far.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">For much of 2014 I had been working on some research around Web Page Performance and understanding users expectations, what the industry believed about response times and how fast was 'fast enough', and how that compared to the real world. What I ended up finding is that much of the research that had been done in this field was, frankly, worthless. Oh, there were good points to be found, some useful results, and valuable nuggets to be unearthed - but on the whole most results drew conclusions that were being interpreted far to generally or their methodology was deeply flawed.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">In short, there was a gaping hole that was asking to be filled. And the question was, how fast is 'fast enough'?</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">The most valuable conclusions I could glean from published works were as follows:</span><br />
<br />
<ol>
<li><span style="font-family: Trebuchet MS, sans-serif;">Faster is better</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">For systems that don't need to rely on real-time feedback, <1s is fast enough to be seamless for most request-response human-computer interactions be it locally or over the web</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">People will happily wait longer if they are given responsive feedback while they are waiting</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">Consistency is important</span></li>
</ol>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">But from a practical perspective, what kind of performance level should I be aiming for? Is 5s fast enough? What about 3s? Is average response time sufficient, or do we need to use something stricter?</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">These kinds of questions led me to doing the research that eventually resulted in writing a paper that in September 2014 I submitted and was accepted by the <a href="http://icpe2015.ipd.kit.edu/">International Conference on Performance Engineering (ICPE 2015)</a>.</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">That research paper is now officially available online at the MNP Library <a href="http://mnp.ca/en/media-centre/library/2015/2/25/defining-standards-for-web-page-performance-icpe-15">Defining Standards for Web Page Performance</a> (also available via the <a href="http://dl.acm.org/citation.cfm?doid=2668930.2688056">ACM Digital Library</a> with the following <a href="http://dx.doi.org/10.1145/2668930.2688056">Citation Link</a>).</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">In February of 2015 I then got to travel to Austin TX to present my paper at the conference. I will post my thoughts about the conference and the trip in an upcoming post, but in short it was a wonderful experience, I got to meet a lot of amazing people, the presentations were fantastic and I learned quite a bit.</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">Now, I am pursuing expanding our service offerings as part of <a href="http://www.mnpconsulting.ca/">MNP's Technology Consulting</a> Team by officially introducing <a href="http://www.mnpconsulting.ca/services/technology/performance-management">Performance Management</a>.</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><a href="http://www.mnpconsulting.ca/services/technology/performance-management">Performance Management</a> is all about improving the success rate of projects with a technology component. Performance is often a consideration that exists only as an afterthought on projects, something that can be taken care of after the important <i>functional</i> work has been completed. That very thinking has led to some spectacular failures in the real world notably including the 2014 <a href="http://www.washingtonpost.com/news/volokh-conspiracy/wp/2014/07/30/examsofts-bar-exam-disaster/">Examsoft debacle</a>, the 2013 launch of <a href="http://calleam.com/WTPF/?p=6061">Healthcare.gov</a>, the 2008 <a href="http://calleam.com/WTPF/?p=351">Edinburgh Fringe Festival ticketing system failure</a>, and the 2007 scrapping of the new <a href="http://calleam.com/WTPF/?p=1818">UK General Register Office System</a>.</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<a href="http://www.mnpconsulting.ca/services/technology/performance-management" style="font-family: 'Trebuchet MS', sans-serif;">Performance Management</a><span style="font-family: 'Trebuchet MS', sans-serif;"> is about planning for success, it is about helping organizations invest in quality and avoid making the mistakes of the past. This is something that has become a bit of a passion of mine, a purpose, and I intend to spend a lot more time using this space to talk about performance in the future.</span></div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-11223652247549648332014-08-05T14:40:00.000-05:002015-03-25T13:57:10.754-05:00RPT Custom Code - Ensuring Unique Logins for Looping Tests<span style="font-family: Trebuchet MS, sans-serif;">A problem I have encountered while performance testing business applications with Rational Performance Tester is the uniqueness of logins. Often, business applications contain logic that will prevent duplicate logins from multiple sources at the same time, or will have workflow control or session replication or persistence that will result in interference if the same login is being used by more than one thread at the same time. A quick workaround to this problem can be to ensure there is a large pool of available logins to reduce the possibility of duplicates, however this is not always possible if a system is using Active Directory or LDAP, or if it SSO enabled. </span><span style="font-family: 'Trebuchet MS', sans-serif;">So the challenge being faced is, how do we bind a unique login to each virtual user thread in our test for the duration of the test?</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">The first approach would be to adjust the settings on your login datapool. When you add a datapool to your test an option exists to "Fetch only once per user".</span><br />
<br />
<a href="http://publib.boulder.ibm.com/infocenter/rpthelp/v7r0m0/index.jsp?topic=/com.ibm.rational.test.lt.doc/topics/tadddp.html" style="font-family: 'Trebuchet MS', sans-serif;">In theory</a><span style="font-family: 'Trebuchet MS', sans-serif;">, this would be sufficient to ensure each thread will have a unique login. However in practice it seems to be not quite so simple. In a test configuration that uses multiple agents "Open mode" must be set to "Segmented" otherwise each agent will have a complete copy of the same list of accounts, resulting in duplication. In order to use Segmented in this manner though, your datapool must be larger than the number of threads in order to ensure sufficient rows are available in each segment. (IBM recommends you have 2x the number of records as threads to ensure balanced segmentation).</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">Despite the theory, I have run into the problem of threads exiting prematurely in a multiple user group/multiple agent/infinite loop test configuration with the error message "End of datapool reached". This is not an error we should be seeing. Reviewing the <a href="http://mincingthoughts.blogspot.com/2014/03/rpt-custom-code-saving-response-data.html">saved response data</a> demonstrated that each thread was correctly using a single unique login, but somehow the error was consistent.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">While attempting to debug the issue, I tried setting the "Wrap when last row is reached" property. Although successful in preventing threads from exiting prematurely, the wrap property appears to override the fetch-once property, returning me to a state of duplicate logins. </span><span style="font-family: 'Trebuchet MS', sans-serif;">Unfortunately, IBM's documentation does a poor job of explaining how each of these datapool properties interact with one another, so in order to overcome this issue I turned to writing my own piece of custom code to manage my logins.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">The following custom code solution binds threads to a specific login on first access, and thereafter will always return the same login identifier for each subsequent request. It also segments the login map into groups that can be manually accessed (by passing the group name as the first parameter) or automatically by setting the User Group Name in your schedule.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">This code is simplified and has a few limitations.</span><br />
<br />
<ol>
<li><span style="font-family: Trebuchet MS, sans-serif;">Distinct Agent Segments - Each Agent must use a distinct User Group Name because static objects are not shared in memory between agents. If two agents are assigned to the same User Group then duplicate logins will occur.</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">Configurability - The segments and login lists are hardcoded in this code segment, this could be overcome by adding an option to read logins from a file (or other data storage)</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">Order - Logins will always be returned in the same order for each subsequent test run, a piece of randomization code would allow them to be shuffled.</span></li>
</ol>
<div>
<span style="font-size: xx-small;"><span style="color: #820040; font-family: Consolas;"><b>package</b></span><span style="font-family: Consolas;"> export;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> java.util.Arrays;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> java.util.HashMap;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> java.util.List;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> java.util.Map;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> com.ibm.rational.test.lt.kernel.IDataArea;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> com.ibm.rational.test.lt.kernel.services.ITestLogManager;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> com.ibm.rational.test.lt.kernel.services.IVirtualUserInfo;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>import</b></span><span style="font-family: Consolas;"> com.ibm.rational.test.lt.kernel.services.RPTCondition;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;">/**</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * !!Warning!!: This code is NOT agent safe. Each unique set of segmentation identifiers MUST be isolated to a single agent for this code to work correctly</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * </span><span style="color: #71b2cf; font-family: Consolas;"><b>@author</b></span><span style="color: #4040c2; font-family: Consolas;"> <u>grempel</u></span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> */</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #820040; font-family: Consolas;"><b>public</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>class</b></span><span style="font-family: Consolas;"> UniqueLoginManager </span><span style="color: #820040; font-family: Consolas;"><b>implements</b></span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>private</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>static</b></span><span style="font-family: Consolas;"> Map<String, List<String>> </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsBySegment</i></span><span style="font-family: Consolas;"> = </span><span style="color: #820040; font-family: Consolas;"><b>new</b></span><span style="font-family: Consolas;"> HashMap<String, List<String>>();</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>private</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>static</b></span><span style="font-family: Consolas;"> Map<String, String> </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsByThread</i></span><span style="font-family: Consolas;"> = </span><span style="color: #820040; font-family: Consolas;"><b>new</b></span><span style="font-family: Consolas;"> HashMap<String, String>();</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>private</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>static</b></span><span style="font-family: Consolas;"> Map<String, Integer> </span><span style="color: #0021bf; font-family: Consolas;"><i>indexBySegment</i></span><span style="font-family: Consolas;"> = </span><span style="color: #820040; font-family: Consolas;"><b>new</b></span><span style="font-family: Consolas;"> HashMap<String, Integer>();</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>private</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>static</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>boolean</b></span><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>initialized</i></span><span style="font-family: Consolas;"> = </span><span style="color: #820040; font-family: Consolas;"><b>false</b></span><span style="font-family: Consolas;">;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #4040c2; font-family: Consolas;">/**</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * Initializes static login maps by segmentation</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> */</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>private</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>synchronized</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>void</b></span><span style="font-family: Consolas;"> init() {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>if</b></span><span style="font-family: Consolas;">(!</span><span style="color: #0021bf; font-family: Consolas;"><i>initialized</i></span><span style="font-family: Consolas;">) {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsBySegment</i></span><span style="font-family: Consolas;">.put(</span><span style="color: #4200ff; font-family: Consolas;">"GRP1"</span><span style="font-family: Consolas;">, Arrays.<i>asList</i>(</span><span style="color: #820040; font-family: Consolas;"><b>new</b></span><span style="font-family: Consolas;"> String[]{</span><span style="color: #4200ff; font-family: Consolas;">"grp1_login1"</span><span style="font-family: Consolas;">,</span><span style="color: #4200ff; font-family: Consolas;">"grp1_login2"</span><span style="font-family: Consolas;">,</span><span style="color: #4200ff; font-family: Consolas;">"grp1_login3"...</span><span style="font-family: Consolas;">}));</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsBySegment</i></span><span style="font-family: Consolas;">.put(</span><span style="color: #4200ff; font-family: Consolas;">"GRP2"</span><span style="font-family: Consolas;">, Arrays.<i>asList</i>(</span><span style="color: #820040; font-family: Consolas;"><b>new</b></span><span style="font-family: Consolas;"> String[]{</span><span style="color: #4200ff; font-family: Consolas;">"grp2_login1"</span><span style="font-family: Consolas;">,</span><span style="color: #4200ff; font-family: Consolas;">"grp2_login2"</span><span style="font-family: Consolas;">,</span><span style="color: #4200ff; font-family: Consolas;">"grp2_login3"...</span><span style="font-family: Consolas;">}));</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsBySegment</i></span><span style="font-family: Consolas;">.put(</span><span style="color: #4200ff; font-family: Consolas;">"GRP3"</span><span style="font-family: Consolas;">, Arrays.<i>asList</i>(</span><span style="color: #820040; font-family: Consolas;"><b>new</b></span><span style="font-family: Consolas;"> String[]{</span><span style="color: #4200ff; font-family: Consolas;">"grp3_login1"</span><span style="font-family: Consolas;">,</span><span style="color: #4200ff; font-family: Consolas;">"grp3_login2"</span><span style="font-family: Consolas;">,</span><span style="color: #4200ff; font-family: Consolas;">"grp3_login3"...</span><span style="font-family: Consolas;">}));</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>indexBySegment</i></span><span style="font-family: Consolas;">.put(</span><span style="color: #4200ff; font-family: Consolas;">"GRP1"</span><span style="font-family: Consolas;">, 0);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>indexBySegment</i></span><span style="font-family: Consolas;">.put(</span><span style="color: #4200ff; font-family: Consolas;">"GRP2"</span><span style="font-family: Consolas;">, 0);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>indexBySegment</i></span><span style="font-family: Consolas;">.put(</span><span style="color: #4200ff; font-family: Consolas;">"GRP3"</span><span style="font-family: Consolas;">, 0);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>initialized</i></span><span style="font-family: Consolas;"> = </span><span style="color: #820040; font-family: Consolas;"><b>true</b></span><span style="font-family: Consolas;">;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #4040c2; font-family: Consolas;">/**</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * Instances of this will be created using the no</span><span style="color: #8f8f8f; font-family: Consolas;">-</span><span style="color: #4040c2; font-family: Consolas;"><u>arg</u> constructor.</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> */</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>public</b></span><span style="font-family: Consolas;"> UniqueLoginManager() {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #4040c2; font-family: Consolas;">/**</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * Returns the previous login if the thread has previously requested a login during this test execution. Otherwise retrieves the next login from the list, binds it to the thread, and returns it.</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * </span><span style="color: #71b2cf; font-family: Consolas;"><b>@param</b></span><span style="color: #4040c2; font-family: Consolas;"> segmentId</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * </span><span style="color: #71b2cf; font-family: Consolas;"><b>@param</b></span><span style="color: #4040c2; font-family: Consolas;"> thread</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * </span><span style="color: #71b2cf; font-family: Consolas;"><b>@return</b></span><span style="color: #4040c2; font-family: Consolas;"> String.class login</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> */</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>public</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>synchronized</b></span><span style="font-family: Consolas;"> String getLogin(String segmentId, String thread) {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>if</b></span><span style="font-family: Consolas;">(</span><span style="color: #0021bf; font-family: Consolas;"><i>loginsByThread</i></span><span style="font-family: Consolas;">.containsKey(thread)) {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>return</b></span><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsByThread</i></span><span style="font-family: Consolas;">.get(thread);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> } </span><span style="color: #820040; font-family: Consolas;"><b>else</b></span><span style="font-family: Consolas;"> {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> init();</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> List<String> logins = </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsBySegment</i></span><span style="font-family: Consolas;">.get(segmentId);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> Integer index = </span><span style="color: #0021bf; font-family: Consolas;"><i>indexBySegment</i></span><span style="font-family: Consolas;">.get(segmentId);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>if</b></span><span style="font-family: Consolas;">(logins!=</span><span style="color: #820040; font-family: Consolas;"><b>null</b></span><span style="font-family: Consolas;"> && logins.size()>0 && index<logins.size()) {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> String login = logins.get(index);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>indexBySegment</i></span><span style="font-family: Consolas;">.put(segmentId, index+1);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #0021bf; font-family: Consolas;"><i>loginsByThread</i></span><span style="font-family: Consolas;">.put(thread, login);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>return</b></span><span style="font-family: Consolas;"> login;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> } </span><span style="color: #820040; font-family: Consolas;"><b>else</b></span><span style="font-family: Consolas;"> {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #3f8080; font-family: Consolas;">//fail</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>return</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>null</b></span><span style="font-family: Consolas;">;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #4040c2; font-family: Consolas;">/**</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * Generate and manage unique logins across multiple user threads and user</span><span style="color: #8f8f8f; font-family: Consolas;">-</span><span style="color: #4040c2; font-family: Consolas;">defined segments.</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * Warning: This class is not thread</span><span style="color: #8f8f8f; font-family: Consolas;">-</span><span style="color: #4040c2; font-family: Consolas;">safe for a segmentation identifier that is distributed across multiple agents. Each segmentation identifier</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * must exist on a single agent to avoid login duplication.</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> * </span><span style="color: #71b2cf; font-family: Consolas;"><b>@param</b></span><span style="color: #4040c2; font-family: Consolas;"> String.class[] args </span><span style="color: #8f8f8f; font-family: Consolas;">-</span><span style="color: #4040c2; font-family: Consolas;"> arg0 = segmentation identifier (optional, if not included will use the UserGroupName as segmentation identifier)</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="color: #4040c2; font-family: Consolas;"> */</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>public</b></span><span style="font-family: Consolas;"> String exec(ITestExecutionServices tes, String[] args) {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> String segmentId = </span><span style="color: #820040; font-family: Consolas;"><b>null</b></span><span style="font-family: Consolas;">;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> ITestLogManager tlm = tes.getTestLogManager();</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> IDataArea dataArea = tes.findDataArea(IDataArea.</span><span style="color: #0021bf; font-family: Consolas;"><i>VIRTUALUSER</i></span><span style="font-family: Consolas;">);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> IVirtualUserInfo virtualUserInfo = (IVirtualUserInfo)dataArea.get(IVirtualUserInfo.</span><span style="color: #0021bf; font-family: Consolas;"><i>KEY</i></span><span style="font-family: Consolas;">);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> String user = virtualUserInfo.getUserName();</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #3f8080; font-family: Consolas;">//If <u>arg</u>[0] not provided, use the UserGroupName as the segmentation identifier</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>if</b></span><span style="font-family: Consolas;">(args.</span><span style="color: #0021bf; font-family: Consolas;">length</span><span style="font-family: Consolas;"><1) {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> segmentId = virtualUserInfo.getUserGroupName();</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> } </span><span style="color: #820040; font-family: Consolas;"><b>else</b></span><span style="font-family: Consolas;"> {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> segmentId = args[0];</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> String login = getLogin(segmentId, user);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>if</b></span><span style="font-family: Consolas;">(login==</span><span style="color: #820040; font-family: Consolas;"><b>null</b></span><span style="font-family: Consolas;">) {</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> tlm.reportErrorCondition(RPTCondition.</span><span style="color: #0021bf; font-family: Consolas;"><i>CustomCodeAlert</i></span><span style="font-family: Consolas;">);</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>return</b></span><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>null</b></span><span style="font-family: Consolas;">;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"></span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> </span><span style="color: #820040; font-family: Consolas;"><b>return</b></span><span style="font-family: Consolas;"> login;</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;"> }</span><span style="background-color: white; font-family: verdana, helvetica, arial, sans-serif;"> </span><br style="font-family: verdana, helvetica, arial, sans-serif;" /><span style="font-family: Consolas;">}</span></span></div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-89708722182759237252014-07-28T06:38:00.000-05:002015-03-25T13:57:55.785-05:00Web Performance Standards: Finding Value in User Surveys<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Studies that purport to establish or define performance
standards for web page loading times typically take one of three forms:
examinations and measurements of physiological traits, empirical studies based
on abandonment, or surveys based on participants’ emotional response. Of these
three, surveys are least likely to produce reliable results as they are based
on participants’ subjective self-assessment of their tolerance levels and not
on precise, concrete, measurable actions. As well, a participant’s tolerance
for loading times may vary significantly based on numerous factors such as:
Age, Experience, Task, Time of Day, and others<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref8">8</a>]</sup>.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">However, the goal for defining performance standards is to
establish a level at which the typical user of a web page will be satisfied.
Setting a target performance level at a point where 50% of study participants
abandon the web page before it completes loading is a poor target for user
satisfaction. In order to aim for user satisfaction, the targets that are set
must be faster than the typical users’ frustration level – an emotional tipping
point that must be reached before a user will decide to abandon a web page.
Thus surveys, by necessity, play an important part in understanding how to
define an effective performance standard.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">This article examines two significant web performance
surveys conducted by JupiterResearch in 2006 and Forrester Consulting in 2009
which attempt to produce generalizations about user’s satisfaction with web
page performance and their tolerance thresholds. The rest of this article
reviews the methodology used by these two surveys and potential deficiencies in
those methodologies, and then describes an experimental survey to compare how
participant responses differ when similar survey questions are used but the
method for providing their response differs. The results of the survey are then
presented and compared. Conclusions are drawn regarding the value and
usefulness of the research.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<h3>
<span style="font-family: Trebuchet MS, sans-serif;">Published Survey-Based Standards</span></h3>
<h4>
<span style="font-family: Trebuchet MS, sans-serif;"><b>JupiterResearch (2006)</b></span></h4>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Retail Web Site Performance, Consumer Reaction to a Poor Online Shopping
Experience. June 1, 2006 prepared for Akamai Technologies, Inc.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<i><span style="font-family: Trebuchet MS, sans-serif;">Key Finding:<o:p></o:p></span></i></div>
<div class="MsoNormal" style="margin-left: 36.0pt;">
<span style="font-family: Trebuchet MS, sans-serif;">“Overall, 28 percent of online
shoppers will not wait longer than four seconds for a Web site page to load
before leaving. Broadband users are even less tolerance of slow rendering. A
full one-third of online shoppers with a broadband connection are unwilling to
wait more than four seconds (compared with 19 percent of online shoppers with a
dial-up connection).”<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref6">6</a>]</sup></span></div>
<div class="MsoNormal">
<i><span style="font-family: Trebuchet MS, sans-serif;"><br /></span></i></div>
<div class="MsoNormal">
<i><span style="font-family: Trebuchet MS, sans-serif;">Methodology:<o:p></o:p></span></i></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">JupiterResearch conducted a survey of 1,058 online shoppers. Among other questions posed to respondents the one we are concerned with is
“Typically, how long are you willing to wait for a single Web page to load
before leaving the Web site? (Select one.)”.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The options presented were:<o:p></o:p></span></div>
<div class="MsoNormal">
</div>
<ul>
<li><span style="font-family: Trebuchet MS, sans-serif;">Less than 1 second</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">1 to 2 seconds</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">3 to 4 seconds</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">5 to 6 seconds</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">More than 6 seconds</span></li>
</ul>
<br />
<h4>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Forrester Consulting (2009)</b></span></h4>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">eCommerce Web Site Performance Today, An Updated Look At Consumer Reaction To
A Poor Online Shopping Experience. August 17, 2009 prepared for Akamai
Technologies, Inc. <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">This report is a directly analogous to the 2006 report by
JupiterResearch as the latter was acquired by Forrester Consulting in 2008<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref7">7</a>]</sup>.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<i><span style="font-family: Trebuchet MS, sans-serif;">Key Finding:<o:p></o:p></span></i></div>
<div class="MsoNormal" style="margin-left: 36.0pt;">
<span style="font-family: Trebuchet MS, sans-serif;">“Forty-seven percent of consumers
expect a Web page to load in 2 seconds or less.”<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref2">2</a>]</sup><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 36.0pt;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<i><span style="font-family: Trebuchet MS, sans-serif;">Methodology:<o:p></o:p></span></i></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Forrester Consulting conducted a survey of 1,048 online
shoppers. Among other questions posed to respondents the one we are concerned
with is “What are your expectations for how quickly a Web site should load when
you are browsing or searching for a product?”.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The options presented were:<o:p></o:p></span></div>
<div class="MsoNormal">
</div>
<ul>
<li><span style="font-family: Trebuchet MS, sans-serif;">Less than 1 second</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">1 second</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">2 seconds</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">3 seconds</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">More than 4 seconds</span></li>
</ul>
<br />
<h3>
<span style="font-family: Trebuchet MS, sans-serif;">Comparison</span></h3>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Forrester Consulting references the previous 2006 study and
attributes the difference in their key findings to increasing access to
broadband among US customers. However the report fails to provide any
supposition as to why the expectations of <i>broadband</i>
users would increase so dramatically in three years. The 2006 survey reports
33% of broadband users will not wait more than 4 seconds, while the 2009 survey
reports that at least 47% of broadband users will not wait more than 2 seconds.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Comparing similar units, the percentage of broadband users
that will not wait more than 2 seconds for a web page to load increases from
12% in 2006 to 47% in 2009. No reason is suggested by the paper as to why there
is a four-fold increase in only 3 years.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The 2009 paper also makes the claim that “This methodology
was consistent with the 2006 study methodology.” Although the basic format of
the survey and how it was conducted remained the same, the options being
presented to the respondents for this question are dramatically different. In
2006, 73.5% of respondents answered with “5 to 6 seconds” or “more than 6
seconds”. These same respondents in 2009 have no longer been given the option
to make this distinction and have all been lumped into the same “more than 4
seconds” category.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Presenting such a limited range of options in the 2009
survey, it may be that respondents who would have naturally answered by
selecting an option with a larger time reconsidered what their answer would be
when presented with options dramatically different from their initial
expectation. It may be that instead of choosing the most appropriate answer
based on their initial thought (more than 4 seconds) they instead selected an
option closer to the middle. This presents the possibility that either or both
of these surveys may be subject to Central Tendency Bias or Position Bias.<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref3">3</a>]</sup></span></div>
<br />
<div class="MsoNormal">
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span></div>
<h3>
<span style="font-family: 'Trebuchet MS', sans-serif;">Experimental Survey Methodology</span></h3>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The purpose of this survey is to determine if the choice of
answer structure and the options presented in the 2006 and 2009 surveys
impacted the answers given by the respondents. In order to make this
determination, this survey presented a single question to respondents that
closely matched the question presented in the 2006 and 2009 surveys. The
differing factor is that this survey allowed respondents to answer however they
wished using a free-form answer field instead of selecting a predefined option.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The primary question presented in this survey is: “When
opening a typical webpage, how long (in seconds) will you wait for it to load
before feeling frustrated or taking some kind of action? Taking an action may
include doing something else while you wait (switching windows/tabs), reloading
the page, or giving up and going somewhere else.”<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Three additional demographic questions were also included in
the survey:</span></div>
<div class="MsoNormal">
</div>
<ul>
<li><b style="font-family: 'Trebuchet MS', sans-serif; text-indent: -18pt;">Age?</b><span style="font-family: 'Trebuchet MS', sans-serif; text-indent: -18pt;">
- Options: under 18, 18-24, 25-36, 35-44, 45-54, 55-64, 65-74, over 75.</span></li>
<li><b style="font-family: 'Trebuchet MS', sans-serif; text-indent: -18pt;">Gender?</b><span style="font-family: 'Trebuchet MS', sans-serif; text-indent: -18pt;">
- Freeform entry</span></li>
<li><b style="font-family: 'Trebuchet MS', sans-serif; text-indent: -18pt;">At what
level of proficiency do you use the internet?</b><span style="font-family: 'Trebuchet MS', sans-serif; text-indent: -18pt;"> - Options: I am a web
application developer, I am a content creator, I use it for work, I use it for
personal use regularly (>3 times/week), I use it for personal use occasionally
(<= 3 times/week).</span></li>
</ul>
<br />
<h3>
<span style="font-family: Trebuchet MS, sans-serif;">Findings</span></h3>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The results of this survey are based on 78 online responses
from Canada and the US. The answers given by the respondents ranged from 0.5s
to 60s. As shown in Table 1 this survey resulted in responses that were
significantly higher and distributed much more broadly than the responses
provided to the 2006 and 2009 surveys, as expected. However we can also see
that this survey’s resulting Median and Mode closely match those from the 2006
survey. Compressing all the responses in the Freeform survey that exceeded 6
seconds into a single >6s option would have resulted in the same Mode value.
In contrast the 2009 survey portrays a vastly different picture.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<h4>
<b><span style="font-family: Trebuchet MS, sans-serif;">Table 1: Survey
Average Values Comparison</span></b></h4>
<table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin-left: 4.65pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184; width: 100%;">
<tbody>
<tr style="height: 12.75pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;">
<td colspan="2" style="border-bottom: solid windowtext 1.0pt; border-left: solid windowtext 1.0pt; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 112.0pt;" valign="bottom" width="187"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Freeform Survey<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td colspan="2" style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 112.0pt;" valign="bottom" width="187"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">2006 Survey (Jupiter)<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td colspan="2" style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: solid windowtext 1.0pt; height: 12.75pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid black .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 124.4pt;" valign="bottom" width="207"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">2009 Survey (Forrester)<o:p></o:p></span></span></b></div>
</td>
</tr>
<tr style="height: 12.75pt; mso-yfti-irow: 1;">
<td style="border-bottom: none; border-left: solid windowtext 1.0pt; border-right: none; border-top: solid windowtext 1.0pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Median<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">5.00<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"></td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Median<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">5-6s<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"></td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: solid windowtext 1.0pt; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Median<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: solid windowtext 1.0pt; border-top: solid windowtext 1.0pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 68.4pt;" valign="bottom" width="114"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">3s<o:p></o:p></span></span></div>
</td>
</tr>
<tr style="height: 12.75pt; mso-yfti-irow: 2;">
<td style="border-bottom: none; border-left: solid windowtext 1.0pt; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Mean<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">9.82<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"></td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Mean*<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">5.80<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"></td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Mean*<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 68.4pt;" valign="bottom" width="114"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">2.51<o:p></o:p></span></span></div>
</td>
</tr>
<tr style="height: 12.75pt; mso-yfti-irow: 3;">
<td style="border-bottom: none; border-left: solid windowtext 1.0pt; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Mode<o:p></o:p></span></span></b></div>
</td>
<td 0cm="" 12.75pt="" 5.4pt="" 56.0pt="" border-left:="" border-right:="" border-top:="" height:="" none="" padding:="" valign="bottom" width:="" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">5.00<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"></td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Mode<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">>6s<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"></td>
<td style="border-bottom: none; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">Mode<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: none; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 68.4pt;" valign="bottom" width="114"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">3s<o:p></o:p></span></span></div>
</td>
</tr>
<tr style="height: 12.75pt; mso-yfti-irow: 4; mso-yfti-lastrow: yes;">
<td style="border-bottom: solid windowtext 1.0pt; border-left: solid windowtext 1.0pt; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">SD<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">11.41<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">SD*<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">1.57<o:p></o:p></span></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 14.0pt;" valign="bottom" width="23"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: none; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 56.0pt;" valign="bottom" width="93"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">SD*<o:p></o:p></span></span></b></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 68.4pt;" valign="bottom" width="114"><div align="right" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right;">
<span style="font-size: 10pt;"><span style="font-family: Trebuchet MS, sans-serif;">1.01<o:p></o:p></span></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<b><span style="font-size: 8.0pt; line-height: 107%;"><span style="font-family: Trebuchet MS, sans-serif;">*Mean and Standard Deviation values for
<i>2006 Survey (Jupiter) and 2009 Survey
(Forrester)</i> were calculated using the midpoint value in each option range, and
using the highest value + 1s for the highest option. These calculations are not
intended to be exact, but are used in this context for comparative purposes
only.<o:p></o:p></span></span></b></div>
<br />
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Grouping the responses to this survey into the same options
presented by the 2006 and 2009 surveys produce a clearer comparison as shown in
Figure 1 and Figure 2.</span><o:p></o:p><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br />
</span><br />
<h4 style="text-align: center;">
<b><span style="font-family: Trebuchet MS, sans-serif;">Figure 1: Response
Frequency by Option, Freeform vs 2006 (Jupiter) Survey</span></b></h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2dVdhyphenhyphenOZwfJ1ERC0QGWNroWLkUvtxRxHjy7Qz02_s4fB7dej1gjs47n6KUkwQP7mgBpB5lS7bOoCIMWzSfvjFohxkfrmy3LmyCuL8635dmw4-lo1xlNUJhXT0ohrN07WQLQrD/s1600/figure1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Trebuchet MS, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2dVdhyphenhyphenOZwfJ1ERC0QGWNroWLkUvtxRxHjy7Qz02_s4fB7dej1gjs47n6KUkwQP7mgBpB5lS7bOoCIMWzSfvjFohxkfrmy3LmyCuL8635dmw4-lo1xlNUJhXT0ohrN07WQLQrD/s1600/figure1.png" /></span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Although the 2006 survey suffers from compression at the
largest interval which contains nearly half of all responses, the results are a
close match to the results of this survey. A slight shift towards faster web
page loading time expectations can be seen between 2006 when the JupiterResearch
survey was completed, and 2014 when this survey was completed. This shift is evident by the </span><span style="font-family: 'Trebuchet MS', sans-serif;">in the increase in percentage of responses in the <1s and 1-2s categories and the corresponding decrease in responses in the 3-4s, 5-6s, and >6s categories.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">The Student’s t-test<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref1">1</a>]</sup> when
applied to the compressed results shown in Figure 1 using an independent
two-sample t-test for unequal variances produced a value of P = 0.1650.</span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<h4 style="text-align: center;">
<b><span style="font-family: Trebuchet MS, sans-serif;">Figure 2: Response
Frequency by Option, Freeform vs 2009 (Forrester) Survey</span></b></h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8LApbKrBDJYa7aj-JhCQDcMoAYsB_hyphenhyphen5v7JJlbihyhvySAwLw5WiPiGK-0OTJcAuK3YoZupUqNjSuGGqhuYPcJpVvQnhUX9WjVyb78z4zLPQfWEdgejcDkFoPIrY0Wd343dnv/s1600/figure2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Trebuchet MS, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8LApbKrBDJYa7aj-JhCQDcMoAYsB_hyphenhyphen5v7JJlbihyhvySAwLw5WiPiGK-0OTJcAuK3YoZupUqNjSuGGqhuYPcJpVvQnhUX9WjVyb78z4zLPQfWEdgejcDkFoPIrY0Wd343dnv/s1600/figure2.png" /></span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The 2009 survey results show no such similarity, the
distribution of responses shows a vastly different pattern than the responses
to both the 2006 survey and this survey. The Student’s t-test<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref1">1</a>]</sup> when applied to
the compressed results shown in Figure 2 using an independent two-sample t-test
for unequal variances produced a value of P = 7.147*10<sup>-8</sup>.<o:p></o:p></span></div>
<div class="MsoNormal">
<b><span style="font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<h3>
<span style="font-family: Trebuchet MS, sans-serif;">
Conclusions</span></h3>
<h2>
<span style="font-family: Trebuchet MS, sans-serif;"><o:p></o:p></span></h2>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">There is a significant agreement between the results of this
freeform survey and the 2006 JupiterResearch survey (P > 0.05) which
indicates that it is unlikely that there is significant bias caused by the
structure of the question or the options presented to the respondents for that
survey. However, the results of the 2009 Forrester Consulting survey disagree
greatly (P < 0.01) which is suggestive that the 2009 survey is being
subjected to some form of bias that is likely imparted by the presentation of
response options to the respondents.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">All surveys that are conducted in an attempt to
quantitatively define an emotional response (frustration) are going to produce
results that are imprecise and limited by the ability of respondents to
accurately self-evaluate. Patience is a volatile thing, fluctuating wildly
between different users and within a single users themselves depending on their
current state of mind.<sup>[<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref4">4</a>][<a href="https://www.blogger.com/blogger.g?blogID=14847974#ref5">5</a>]</sup><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">The freeform survey in particular is also limited by its
small sample size of respondents, increasing the number of respondents to
produce a sample size of >1000 would be beneficial to provide a better
comparison and strengthen confidence in the conclusions.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<h3>
<span style="font-family: Trebuchet MS, sans-serif;">
Business Applicability of Results</span></h3>
<h2>
<span style="font-family: Trebuchet MS, sans-serif;"><o:p></o:p></span></h2>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">It is important when working within a business context to
understand how to apply the results obtained by web page performance surveys
when establishing a set of performance guidelines or requirements. It is
typically ineffective to set performance standards by using the median result –
it is not an effective business goal to aim for a standard where <i>only</i> 50% of your users abandon your web
page out of frustration. On the opposite end setting a standard where every
user will be satisfied with the web page performance for every page may be
unrealistic, factors such as type of connection, geographic location, and
processing time can prevent those from being achievable.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">A more typical approach is to use a high percentile of the
survey results as a business performance standard, setting a goal to meet the
performance level that would satisfy 90% of your users. Figure 3 compares the
three surveys and their responses that correspond to several response
percentile levels.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="MsoNormal">
</div>
<h4 style="text-align: center;">
<b><span style="font-family: Trebuchet MS, sans-serif;">Figure 3: Response Time
Percentile Comparison</span></b></h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSZnCFGmpb02YS3zqpsgiS9GZ9OD9wWbL-zdkclgMywCIDMYIdfUDK4JMXUijfNs2MwMaT6FTgTZoWPykC9EoVg9cct-sTfrhOMZ8sqQym62iEcIahxe3VdOY9XU0hAYpsAqUC/s1600/figure3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Trebuchet MS, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSZnCFGmpb02YS3zqpsgiS9GZ9OD9wWbL-zdkclgMywCIDMYIdfUDK4JMXUijfNs2MwMaT6FTgTZoWPykC9EoVg9cct-sTfrhOMZ8sqQym62iEcIahxe3VdOY9XU0hAYpsAqUC/s1600/figure3.png" /></span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<div class="MsoNormal">
<span style="font-family: Trebuchet MS, sans-serif;">Based on the percentile analysis of survey responses we can draw conclusions regarding the expected percentage of satisfied users based on achieving a specific web page performance response time standard.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">We can observe that the percentage of users that will be satisfied with a web page performance standard of 1s or less is >=95% in the freeform survey, >=99% in the 2006 (Jupiter) survey, and >=90% in the 2009 (Forrester) survey. This gives us the conclusion that in general at least 90% of all users would be satisfied if a web page performance standard of 1s or less was achieved.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">Similarly, a performance standard of 2s or less is >=85% in the freeform survey, >=99% in the 2006 (Jupiter) survey, and >=80% in the 2009 (Forrester) survey. Thus at least 80% of all users would be satisfied if a standard of 2s or less was achieved.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">These observations are based on the worst-case scenario that the survey that provided the most aggressive performance targets is the most accurate of the three. This does provide a good lower bound for user satisfaction, but not perhaps a good expected level of user satisfaction. If we take each of the surveys as having equal weight, we can average their response time percentile values to determine an expected level of user satisfaction.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">Based on the average percentile value, we see that our expected level of user satisfaction with a performance standard of 1s or less is >=99%, and for a standard of 2s or less it is >=90%. Thus given a business case where we </span><span style="font-family: 'Trebuchet MS', sans-serif;">aim to achieve at least a 90% rate of user satisfaction with our web site performance, we expect that our web page response times would need to be 2s or less.</span><br />
<br /></div>
<h3>
<span style="font-family: Trebuchet MS, sans-serif;">
References</span></h3>
</div>
<div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref1">[1]</a><span style="font-size: 7pt;">
</span><!--[endif]-->Encyclopedia Brittanica (2014), Student's t-test. Available at: <a href="http://www.britannica.com/EBchecked/topic/569907/Students-t-test">http://www.britannica.com/EBchecked/topic/569907/Students-t-test</a><o:p></o:p></span></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref2">[2]</a><span style="font-size: 7pt;">
</span><!--[endif]-->Forrester
Consulting (2009), eCommerce Web Site Performance Today. Available at: <a href="http://www.damcogroup.com/white-papers/ecommerce_website_perf_wp.pdf">http://www.damcogroup.com/white-papers/ecommerce_website_perf_wp.pdf</a><o:p></o:p></span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref3">[3]</a><span style="font-size: 7pt;">
</span><!--[endif]-->Gingery, Tyson (2009), Survey Research
Definitions: Central Tendency Bias, <i>Cvent:
Web Surveys</i>, Dec 22, 2009. Available at: <a href="http://survey.cvent.com/blog/market-research-design-tips-2/survey-research-definitions-central-tendency-bias">http://survey.cvent.com/blog/market-research-design-tips-2/survey-research-definitions-central-tendency-bias</a><o:p></o:p></span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref4">[4]</a><span style="font-size: 7pt;">
</span><!--[endif]-->Gozlan, Marc (2013), A stopwatch on the brain’s
perception of time, <i>Guardian Weekly</i>,
Jan 1, 2013. Available at: <a href="http://www.theguardian.com/science/2013/jan/01/psychology-time-perception-awareness-research">http://www.theguardian.com/science/2013/jan/01/psychology-time-perception-awareness-research</a><o:p></o:p></span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref5">[5]</a><span style="font-size: 7pt;">
</span><!--[endif]-->Hotchkiss, Jon (2013), How Bad Is Our Perception
of Time? Very!, <i>Huffington Post – The
BLOG</i>, Sep 19, 2013. Available at: <a href="http://www.huffingtonpost.com/jon-hotchkiss/how-bad-is-our-perception_b_3955696.html">http://www.huffingtonpost.com/jon-hotchkiss/how-bad-is-our-perception_b_3955696.html</a><o:p></o:p></span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref6">[6]</a><span style="font-size: 7pt;">
</span><!--[endif]-->JupiterResearch
(2006), Retail Web Site Performance. Available at: <a href="http://www.akamai.com/dl/reports/Site_Abandonment_Final_Report.pdf">http://www.akamai.com/dl/reports/Site_Abandonment_Final_Report.pdf</a><o:p></o:p></span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref7">[7]</a><span style="font-size: 7pt;">
</span><!--[endif]-->Kaplan, David (2008), Forrester Buys
JupiterResearch for $23 Million, <i>Forbes
Magazine</i>, Jul 31, 2008. Available at: <a href="https://web.archive.org/web/20080915011602/http:/www.forbes.com/technology/2008/07/31/forrester-buys-jupiter-research-tech-cx_pco_0731paidcontent.html">https://web.archive.org/web/20080915011602/http://www.forbes.com/technology/2008/07/31/forrester-buys-jupiter-research-tech-cx_pco_0731paidcontent.html</a><o:p></o:p></span></div>
<div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo1;">
<!--[if !supportLists]--><span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.blogger.com/null" name="ref8">[8]</a><span style="font-size: 7pt;">
</span><!--[endif]-->Shneiderman, Ben (1984), Response Time and
Display Rate in Human Performance with Computers, <i>Computing Surveys 16, no. 3</i> <i>(1984):</i>
pages 265-285. Available at: <a href="http://dl.acm.org/citation.cfm?id=2517">http://dl.acm.org/citation.cfm?id=2517</a></span><o:p></o:p><br />
<br />
<h3>
<span style="line-height: 107%;"><span style="font-family: Trebuchet MS, sans-serif; font-size: small;">Appendix
A – Freeform Survey Response Distribution and Demographics</span></span></h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnjJzz7d2-0AyaoUZ8zyp2oINU77kZPnenRfaLXXowxy4ETDDPNuJOuL9HYWGXuv0eznub9uwG_dbQUiqAhLP5WklroFSKwZ22MoQB4FZYeKOI6PRohbyXbXmXv2mAJnULBm3M/s1600/figure4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnjJzz7d2-0AyaoUZ8zyp2oINU77kZPnenRfaLXXowxy4ETDDPNuJOuL9HYWGXuv0eznub9uwG_dbQUiqAhLP5WklroFSKwZ22MoQB4FZYeKOI6PRohbyXbXmXv2mAJnULBm3M/s1600/figure4.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxEgLpRtmoOg7QpuGu9LDc1fhVXEgF7Amu8YZQCQygpJsRz-02T010XQmkZNXCoPTX2YxkzdEnyZik6Azni-P8NLuE4tKM9Iil6DK2DSl0r2b10daIg_Ukn7TKBgNblMx5SYCn/s1600/figure5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxEgLpRtmoOg7QpuGu9LDc1fhVXEgF7Amu8YZQCQygpJsRz-02T010XQmkZNXCoPTX2YxkzdEnyZik6Azni-P8NLuE4tKM9Iil6DK2DSl0r2b10daIg_Ukn7TKBgNblMx5SYCn/s1600/figure5.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0iY61G-fexJp2u-vMqEx20uvkeWVUi8i_Mx2SUmMkzuRiNtA8607bYH1KPkK8b9-HM7l2sbrZvlSsW-ZHLXbblmvlvUJb3p9sGqYOkDYeAPJFXnNJXMCJfYP57895iow6rxPz/s1600/figure6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0iY61G-fexJp2u-vMqEx20uvkeWVUi8i_Mx2SUmMkzuRiNtA8607bYH1KPkK8b9-HM7l2sbrZvlSsW-ZHLXbblmvlvUJb3p9sGqYOkDYeAPJFXnNJXMCJfYP57895iow6rxPz/s1600/figure6.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghFf5WKLEoTXsjQoTENBVmhnNAHcfoQ3C7zgA7TE3u6Z2HiDo0HeycC6e6N_uqAA0HekFNXihCk62W5gad6bgPSsS-x4cKmuijHLDW6Oro-VFfvsw4w7n3Q7dZQxcr2RxUobq7/s1600/figure7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghFf5WKLEoTXsjQoTENBVmhnNAHcfoQ3C7zgA7TE3u6Z2HiDo0HeycC6e6N_uqAA0HekFNXihCk62W5gad6bgPSsS-x4cKmuijHLDW6Oro-VFfvsw4w7n3Q7dZQxcr2RxUobq7/s1600/figure7.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtoIpqDcGOCCq0w8bxzbPPhUWykLaoYmR2v2TP1FJWlFDibdPvYgB-yFpSEPMFLxP9wqyf92ctl3WybATqWKyL6CjVW11N02GwgmwhpcO6cUPjuOlnUnIc7vhdNAByJ5JQKKXq/s1600/figure8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtoIpqDcGOCCq0w8bxzbPPhUWykLaoYmR2v2TP1FJWlFDibdPvYgB-yFpSEPMFLxP9wqyf92ctl3WybATqWKyL6CjVW11N02GwgmwhpcO6cUPjuOlnUnIc7vhdNAByJ5JQKKXq/s1600/figure8.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNdjPRn07CgaUWbseADthfl54KfDmzDYmgcrePCMXrikgeA6LKzZmCSOgUtILVkIMQ7mUeus-iE0JDKkBz0gqHQw6PCZWFlPgl2mVmaB_1Jey9nC1vL3NLStqwdASEjaTquEV3/s1600/figure9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNdjPRn07CgaUWbseADthfl54KfDmzDYmgcrePCMXrikgeA6LKzZmCSOgUtILVkIMQ7mUeus-iE0JDKkBz0gqHQw6PCZWFlPgl2mVmaB_1Jey9nC1vL3NLStqwdASEjaTquEV3/s1600/figure9.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjXRjWmdhoxceiuwd4XPF2xOaW9HKCsnAMjAnWGChetQ9xFEZbitrYg306k-R21EQNiA59UJzGARpzvd-BfNp6CyETdMazjHk3Bnz99IgCfgpsgi3f_1ieeoUucDzNqWpiCx1z/s1600/figure10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjXRjWmdhoxceiuwd4XPF2xOaW9HKCsnAMjAnWGChetQ9xFEZbitrYg306k-R21EQNiA59UJzGARpzvd-BfNp6CyETdMazjHk3Bnz99IgCfgpsgi3f_1ieeoUucDzNqWpiCx1z/s1600/figure10.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcz8-T0_u-68-IPgfME0p8WavXrfVs3lfB9Omwq86U2eG5_xVFYQlC1Zvvm3kS8fzauVWmrQxwfcXEIkVyOFopmGqDPid15KLen5gyb3DCm_v9habxk7SqhnIN5eThZPlYzHJJ/s1600/figure11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcz8-T0_u-68-IPgfME0p8WavXrfVs3lfB9Omwq86U2eG5_xVFYQlC1Zvvm3kS8fzauVWmrQxwfcXEIkVyOFopmGqDPid15KLen5gyb3DCm_v9habxk7SqhnIN5eThZPlYzHJJ/s1600/figure11.png" /></a></div>
<div>
<span style="line-height: 107%;"><span style="font-family: Trebuchet MS, sans-serif; font-size: small;"><br /></span></span></div>
</div>
</div>
</div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-81785847829471985212014-03-31T13:41:00.003-05:002014-03-31T13:47:40.301-05:00RPT Custom Code - Saving Response Data<i><span style="font-family: Trebuchet MS, sans-serif;">How to build datapools by extracting generated data from a system using custom code in Rational Performance Tester.</span></i><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">A major challenge that I encounter consistently as a Performance Engineer is priming a system with known, consistent data that I can feed into <a href="http://en.wikipedia.org/wiki/Data_pool">datapools</a> and use for testing. There are a variety of ways to accomplish this: conversion processes, generation tools, database scripts, restore/upgrade processes, etc. However, a project that I have been working on recently has a variety of issues with these strategies. The database is automatically generated and nearly impossible to decipher, not to mention that it changes with each new code release. The second issue is that the data generation tools are not being kept up to date by the developers, so they are usually broken with each new release. These issues have led me to the point of using my performance testing tool (<a href="http://www-03.ibm.com/software/products/en/performance/">Rational Performance Tester v8.5.2</a>) as a workaround data priming tool.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This plan has its own challenges, primary identifiers are all system generated - and the only way I can reliably access the data once it is generated is using those primary identifiers. Granted, there are ways to obtain this information once it exists in the system, but they involved days if not weeks of effort to extract and cleanse the data into a form that can be used effectively, and would require significant assistance from a developer to do so. A better way would be to process and extract the desired information from the responses themselves <i>as it is being generated</i> by RPT.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Currently RPT does not have any simple write-back mechanism for references during a test. There may exist a way using references and variables - but if it does it is well hidden beneath the primary strengths of the tool, which are load generation, data substitution, and response analysis. This led me to consider the question "How would I enhance the tool to let me extract response data?". Since RPT is an Eclipse-based tool and supports the addition of custom code and plug-ins it should be entirely feasible to write some code to extract whatever I wanted from it.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So that is what I did - the example and the code presented below is a very simple, bare-bones way of extracting a reference from a page response, passing it into a block of custom code, and writing it to a CSV file in a thread-safe manner that will allow you to import the generated CSV back into your project as a datapool source. There are dozens of ways I can think of to use this code and enhance it if you want to write to a database, do data transformation, correlating reference data with existing datapools, or producing multiple outputs - but this should be sufficient to get you started if you are encountering problems bridging that gap from theoretical to practical.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 1: Create a Custom Code Class</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">With your recorded test open, right-click your top-level test element and select "Add --> Custom Code".</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE9m307nIANI5Aa1uiEBR15lg4fK-TNZVM0kEi2_Y1mC5Kzr7Hcd49LzgnURQ7cXnea-TmA0H_L-wFpaEdpjv_gq7fn58op0OUo4dnDPBCaQAWmzy8BogZejYGWoaJpSoJYqku/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE9m307nIANI5Aa1uiEBR15lg4fK-TNZVM0kEi2_Y1mC5Kzr7Hcd49LzgnURQ7cXnea-TmA0H_L-wFpaEdpjv_gq7fn58op0OUo4dnDPBCaQAWmzy8BogZejYGWoaJpSoJYqku/s1600/01.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Selecting the new Custom code element will show the Custom Code element details in the right-side pane that lets you enter a Class name (in the format: "package.Class"). If this is the first time you have created a Custom Code class - click the "Generate Code" button to create a basic default class implementation. If you already have the Custom Code class you want to use, skip down to Step 4 for adding an existing Custom Code element to your test case.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR5DZNFAa-pL4sr_iYFgLnbht3XTIrJgdFDuYJMVzHeO_S7K5ER-bbvaWA1l3QXhdUQSpFMPl0K8s4daOpk-EaYfT6-jvrND2ZlI1AsjvaM0q9U5BR1-ZTAJFY8MekAuRji5M2/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR5DZNFAa-pL4sr_iYFgLnbht3XTIrJgdFDuYJMVzHeO_S7K5ER-bbvaWA1l3QXhdUQSpFMPl0K8s4daOpk-EaYfT6-jvrND2ZlI1AsjvaM0q9U5BR1-ZTAJFY8MekAuRji5M2/s1600/02.png" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This will generate a simple Custom Code class that you can start using in your test.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">package export; </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices; </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;">/** </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * @author unknown </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> */ </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">public class Test implements </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> com.ibm.rational.test.lt.kernel.custom.ICustomCode2 { </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> /** </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Instances of this will be created using the no-arg constructor. </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> */ </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> public Test() { </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> } </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> /** </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * For javadoc of ICustomCode2 and ITestExecutionServices interfaces, select 'Help Contents' in the </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Help menu and select 'Extending Rational Performance Tester functionality' -> 'Extending test execution with custom code' </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> */ </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> public String exec(ITestExecutionServices tes, String[] args) { </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> return null; </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> } </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">}</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;">To organize my library of custom code, I created a new Performance Test Project called "CustomCodeReference". If you create this project as a Performance Test Project it will automatically include all of the required RPT libraries in its build path. This will also allow me to export the project into a .jar file that I can import into other projects, or simply reuse it as a dependency in other Performance Testing projects as needed.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqCBz_S8567DMclRpYMc-rMSnGfhVpaHbPZt4-rmH0tRlnOxk0zmcHMpi-CP6zGY0gkFikdCZM_S0vCjr3ZGFeBIVwzMxLMaFPEnuCZBzJHPLFNWQxkxIzrYbVwDGd8V9P2ctk/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqCBz_S8567DMclRpYMc-rMSnGfhVpaHbPZt4-rmH0tRlnOxk0zmcHMpi-CP6zGY0gkFikdCZM_S0vCjr3ZGFeBIVwzMxLMaFPEnuCZBzJHPLFNWQxkxIzrYbVwDGd8V9P2ctk/s1600/03.png" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 2: Create a Singleton File Writer</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Create a new class file that will be used by our custom code as the singleton file writer to manage file creation, access, and synchronization between threads. In this example I have created the class "export.ExportAdministrator" in my CustomCodeReference project to be my singleton file writer class. A suggested enhancement to this structure would be to create a dedicated Factory class that returns an instance of an interface to allow for multiple optional implementations such as a CSV file implementation, an XML file implementation, or a database implementation.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">package export;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import java.io.File;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import java.io.FileWriter;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import java.text.DateFormat;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import java.text.SimpleDateFormat;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;">/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * @author grempel</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * @date 2014-03-27</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> *</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Singleton class with factory to manage thread-safe file export</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Usage:</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Call ExportAdministrator.getInstance() to obtain object reference</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Use instance write() or writeln() to export to file</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">public class ExportAdministrator {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>private static ExportAdministrator instance = null;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>private FileWriter fw = null;</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>public ExportAdministrator() {</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//Build string writer</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>File file = new File("C:\\rpt-log\\" + df.format(System.currentTimeMillis()) + " output.csv");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>try {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fw = new FileWriter(file);</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception e) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>e.printStackTrace();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * Retrieve singleton instance of writer.</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>public static synchronized ExportAdministrator getInstance() {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>if(instance==null) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>instance = new ExportAdministrator();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return instance;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * Write string to file</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>public synchronized String write(String str) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>if(fw!=null) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>try {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fw.write(str);</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fw.flush();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return "true";</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception e) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return e.toString();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return "failed";</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * Write string to file and start a new line</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>public synchronized String writeln(String str) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>if(fw!=null) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>try {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fw.write(str);</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fw.write("\r\n");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fw.flush();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return "true";</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception e) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return e.toString();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return "failed";</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * Clean up open file references</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>@Override</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>protected void finalize() throws Throwable {</span><br />
<span class="Apple-tab-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small; white-space: pre;"> </span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">if(fw!=null) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fw.close();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>super.finalize();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">}</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;">This class will generate a timestamped output file in the folder "C:\rpt-log\" on each agent that is running the test.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">One note to make about the usage of this class. If you are using more than 1 virtual user to generate your data, you are best to compile the entire set of data you want to write to the file into 1 string before calling writeln(). If you attempt to call write() multiple times, you cannot guarantee that they will be sequential as another thread may have called the write() method in the meantime.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b><br /></b></span>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 3: Call File Writer from Custom Code</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">With our file writer (ExportAdministrator) singleton in place, we can now modify our custom code to submit whatever we want to write to that file. In this case I have created our Custom Code class called "export.ExportIdentifier" in my CustomCodeReference project.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">This custom code expects 2 arguments to be passed to it, an output type: a simple text string that will allow you to group outputs based on the type of data being written - this allows you to reuse the code for multiple types of values in a single test; and an output value: the value you want to write. In addition to these, this custom code will also generate a timestamp that will be written to the file in order to determine the write operation sequence.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">package export;</span><br />
<span style="font-size: xx-small;"><br /></span>
<span style="font-size: xx-small;">
</span><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import com.ibm.rational.test.lt.kernel.services.ITestLogManager;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import com.ibm.rational.test.lt.kernel.services.RPTCondition;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;">/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * @author grempel</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * @date 2014-03-27</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * </span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Usage:</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Add Custom Code reference to a test</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Set Class name = /CustomCodeReference/export.ExportIdentifier</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * Add Arguments</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * - Text: Value Type String</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> * - Text or Reference: Value String</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">public class ExportIdentifier implements</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * Instances of this will be created using the no-arg constructor.</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>public ExportIdentifier() {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>/**</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * For javadoc of ICustomCode2 and ITestExecutionServices interfaces, select 'Help Contents' in the</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * Help menu and select 'Extending Rational Performance Tester functionality' -> 'Extending test execution with custom code'</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> * @param String.class[] args - arg0 = value type, arg1 = value to write</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span> */</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>public String exec(ITestExecutionServices tes, String[] args) {</span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//Validate arguments</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>String type = null;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>String value = null;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>ITestLogManager tlm = tes.getTestLogManager();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>if(args.length<=1) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>tlm.reportErrorCondition(RPTCondition.CustomCodeAlert);</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return null;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>type = args[0];</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>value = args[1];</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>Long timestamp = System.currentTimeMillis();</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//Generate CSV string to write to file</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>String result = timestamp.toString() + "," + type + "," + value;</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//Submit string to writer</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>String error = ExportAdministrator.getInstance().writeln(result);</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="color: blue; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//Catch errors and return to RPT for validation and handling</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>if(error.equalsIgnoreCase("true")) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return result;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>return error;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">}</span><br />
<div>
<br /></div>
<span style="font-family: Trebuchet MS, sans-serif;"><b>Step 4: Add Custom Code to a Test</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">To use this custom code in your test, add a Custom Code element to your test (see Step 1 for reference). Instead of generating a new class, we will be specifying our existing class in the Class Name field with the format: "/ProjectName/package.ClassName". In the above example this will be "/CustomCodeReference/export.ExportIdentifier".</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Next we will add the arguments to the custom code element details. The first argument is the output type. Click the "Text" button on the right and specify the text to submit as the type. This can be different for each Custom Code element that you add to your test, but it works best as a hard-coded value in order to ensure it remains the same for each iteration.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Then click "Add" and select a data source object or reference to use as the output value. In this example I have set the output type to "TestAccountName" and the output value to the "Username" variable from my datapool. This example is redundant, I already have my usernames in a datapool - normally I would insert the custom code after a page response that contains some data that I want to write to a file, and select a reference instead.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCsgVUavuvcP8bNxYhuIZOwIzr6fJyPrgj3CRu9tWtX5aj1_NVtDRBwGhu7Z_NHCMUoOlj3ATSfb3mM9O_otXySSmMO8FAlZ2g97DfU0W_bBG1ZnRN4e-1g7uBbBAzloWsn-Gv/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCsgVUavuvcP8bNxYhuIZOwIzr6fJyPrgj3CRu9tWtX5aj1_NVtDRBwGhu7Z_NHCMUoOlj3ATSfb3mM9O_otXySSmMO8FAlZ2g97DfU0W_bBG1ZnRN4e-1g7uBbBAzloWsn-Gv/s1600/04.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">This will now allow me to export any generated data that exists in the response record to an external source.</span></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0tag:blogger.com,1999:blog-14847974.post-63581652010423590242014-03-31T09:51:00.000-05:002014-03-31T09:51:32.312-05:00Hurdles #4 - Apache Pivot - Scroll Panes<span style="font-family: 'Trebuchet MS', sans-serif;">Hurdles article number 4 and continuing to overcome challenges with </span><a href="http://pivot.apache.org/" style="font-family: 'Trebuchet MS', sans-serif;">Apache Pivot</a><span style="font-family: 'Trebuchet MS', sans-serif;">, this time we are looking at controlling the current position of a Scroll Pane in response to an event.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">The premise of this article is that I have a Scroll Pane that contains a running log of information that is updated periodically. This log appends rows to a Table Pane that is the Scroll Pane's view. In order to ensure that any new information is immediately visible what I want to do is scroll the Scroll Pane to the bottom of the view.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">There are a couple of pre-built methods to help with this. The Scroll Pane comes with setScrollTop(int y) and setScrollLeft(int x) to adjust the viewport position relative to the top and left respectively. It also has scrollAreaToVisible(Bounds bounds) which serves as an auto-scroll function to zoom to a sub-component.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">The problem with these methods is that they will not work properly inside an event handler that modifies the view component! Within the event handler that is appending information to the view the following problems become immediately apparent:</span><br />
<br />
<ol>
<li><span style="font-family: Trebuchet MS, sans-serif;">getHeight and getBounds methods on both the Scroll Pane and View components return 0.</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">scrollAreaToVisible can throw OutOfBounds exceptions</span></li>
<li><span style="font-family: Trebuchet MS, sans-serif;">setScrollTop(y) when given a hard-coded value will adjust the Scroll Pane, but the scroll bars themselves will <b>not</b> be updated.</span></li>
</ol>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">Through my investigations into the underlying code I discovered that I could obtain a reference to the Scroll Pane Skin object which is the object that controls the Scroll bars, tracks the current and max position of the viewport, and the rendering of these components. However many of the objects and methods within the Skin are private and inaccessible without rewriting the entire class, and the ones that are visible have the same problem of returning 0 values for height and bounds.</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">Eventually I discovered a link in the Apache Pivot Users forum that held the key to the solution. </span><span style="color: #333333; font-family: 'Trebuchet MS', sans-serif;"><a href="http://apache-pivot-users.399431.n3.nabble.com/2-0-2-How-to-move-scroll-bar-to-bottom-of-ScrollPane-td4022253.html">2.0.2 How to move scroll bar to bottom of ScrollPane?</a> The issue is that many of the view attributes are invalidated on a change to the View component, and are only reset as part of the painting code itself, after the event handler has already returned.</span></div>
<div>
<span style="color: #333333; font-family: 'Trebuchet MS', sans-serif;"><br /></span></div>
<div>
<span style="color: #333333; font-family: 'Trebuchet MS', sans-serif;">The solution to the problem is to queue a callback within the ApplicationContext itself specifically to force the repositioning of the Scroll Pane after all the paint operations have completed. I have included the code snippit below.</span></div>
<div>
<span style="color: #333333; font-family: 'Trebuchet MS', sans-serif;"><br /></span></div>
<div>
<span style="color: #333333; font-family: 'Trebuchet MS', sans-serif;">In the update event handler:</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="color: #333333; white-space: pre;"> </span><span style="color: #333333;">ApplicationContext.queueCallback(new ScrollPaneCallbackHandler(scrollPaneComponent));</span></span></div>
<div>
<span style="color: #333333; font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="color: #333333; font-family: Trebuchet MS, sans-serif;">Separate ScrollPaneCallbackHandler class:</span></div>
<div>
<span style="color: #333333; font-family: Courier New, Courier, monospace; font-size: xx-small;"></span><br />
<div>
<span style="color: #333333; font-family: Courier New, Courier, monospace; font-size: xx-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>private class ScrollPaneCallbackHandler implements Runnable {</span></div>
<span style="color: #333333; font-family: Courier New, Courier, monospace; font-size: xx-small;">
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>private ScrollPane pane;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>public ScrollPaneCallbackHandler(ScrollPane pane) {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>this.pane = pane;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>/**</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span> * Resets ScrollTop position to show bottom of view component</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span> */</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void run() {</div>
</span><span style="color: #333333; font-family: Courier New, Courier, monospace; font-size: xx-small;"><div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>pane.setScrollTop(pane.getView().getHeight() - pane.getHeight());</div>
</span><span style="color: #333333; font-family: Courier New, Courier, monospace; font-size: xx-small;"><div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
</span></div>
Garrethttp://www.blogger.com/profile/17598150683470655618noreply@blogger.com0