<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Platte Canyon/Jeff Rhodes Blog</title>
	<atom:link href="http://plattecanyon.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://plattecanyon.wordpress.com</link>
	<description>Information on .NET, ToolBook, HTML, JavaScript, Flex, and Software</description>
	<lastBuildDate>Sun, 12 Feb 2012 16:46:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='plattecanyon.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Platte Canyon/Jeff Rhodes Blog</title>
		<link>http://plattecanyon.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://plattecanyon.wordpress.com/osd.xml" title="Platte Canyon/Jeff Rhodes Blog" />
	<atom:link rel='hub' href='http://plattecanyon.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Another Method to Eliminate Suspend Data: SCORM 2004</title>
		<link>http://plattecanyon.wordpress.com/2012/02/12/another-method-to-eliminate-suspend-data-scorm-2004/</link>
		<comments>http://plattecanyon.wordpress.com/2012/02/12/another-method-to-eliminate-suspend-data-scorm-2004/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 16:43:50 +0000</pubDate>
		<dc:creator>Jeff Rhodes</dc:creator>
				<category><![CDATA[SCORM]]></category>
		<category><![CDATA[ToolBook]]></category>

		<guid isPermaLink="false">http://plattecanyon.wordpress.com/?p=44</guid>
		<description><![CDATA[As a follow-up to last post, the customer noticed that the user was not getting a bookmark back to the scoring page during the next section. I had used SCORM Watch for testing and saw the bookmark (cmi.location) being sent by ToolBook. But then I tested in Tracker.Net and saw that the customer was right. This was [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=44&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As a follow-up to <a title="Eliminating Unwanted Suspend Data" href="http://plattecanyon.wordpress.com/2012/02/04/eliminating-unwanted-suspend-data-in-toolbook/" target="_blank">last post</a>, the customer noticed that the user was not getting a bookmark back to the scoring page during the next section. I had used <a title="SCORM Watch" href="http://www.scormwatch.com" target="_blank">SCORM Watch</a> for testing and saw the bookmark (cmi.location) being sent by ToolBook. But then I tested in <a title="Tracker.Net" href="http://www.trackernet.net" target="_blank">Tracker.Net</a> and saw that the customer was right. This was because the SCORM 2004 standard says that once a lesson (SCO) has been marked as complete, the user basically has to start over if they return to the lesson. That means that no bookmark, status, or suspend data is sent the next session. So a simpler solution to preventing the extra suspend data is to stick with SCORM 2004 (this doesn&#8217;t work in SCORM 1.2) and mark the book as completed if the user passes and otherwise discard results. This is shown below.</p>
<p><a href="http://plattecanyon.files.wordpress.com/2012/02/scorebtn2004.png"><img class="alignnone size-medium wp-image-46" title="Score button using SCORM 2004" src="http://plattecanyon.files.wordpress.com/2012/02/scorebtn2004.png?w=300&#038;h=101" alt="" width="300" height="101" /></a></p>
<p>This is somewhat less efficient than the last post in that the huge suspend data is sent to the LMS and stored. But it is not sent BACK to the content and, most importantly, ToolBook doesn&#8217;t need to spend the time and processing power to reset all the questions to their original state.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/plattecanyon.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/plattecanyon.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/plattecanyon.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/plattecanyon.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/plattecanyon.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/plattecanyon.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/plattecanyon.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/plattecanyon.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/plattecanyon.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/plattecanyon.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/plattecanyon.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/plattecanyon.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/plattecanyon.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/plattecanyon.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=44&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://plattecanyon.wordpress.com/2012/02/12/another-method-to-eliminate-suspend-data-scorm-2004/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f086fb18aac25554c9b4f3d1bac327?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">plattecanyon</media:title>
		</media:content>

		<media:content url="http://plattecanyon.files.wordpress.com/2012/02/scorebtn2004.png?w=300" medium="image">
			<media:title type="html">Score button using SCORM 2004</media:title>
		</media:content>
	</item>
		<item>
		<title>Eliminating Unwanted Suspend Data in ToolBook</title>
		<link>http://plattecanyon.wordpress.com/2012/02/04/eliminating-unwanted-suspend-data-in-toolbook/</link>
		<comments>http://plattecanyon.wordpress.com/2012/02/04/eliminating-unwanted-suspend-data-in-toolbook/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 23:33:44 +0000</pubDate>
		<dc:creator>Jeff Rhodes</dc:creator>
				<category><![CDATA[SCORM]]></category>
		<category><![CDATA[ToolBook]]></category>

		<guid isPermaLink="false">http://plattecanyon.wordpress.com/?p=28</guid>
		<description><![CDATA[I was working with a Tracker.Net customer recently. As part of testing, I noticed that their ToolBook lessons were sending lots of suspend data and interaction data. I helped them rework their logic and wanted to document that in case it would be helpful to other ToolBook developers. There were several issues. The book was sending a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=28&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was working with a <a title="Tracker.Net" href="http://www.trackernet.net" target="_blank">Tracker.Net</a> customer recently. As part of testing, I noticed that their ToolBook lessons were sending lots of suspend data and interaction data. I helped them rework their logic and wanted to document that in case it would be helpful to other ToolBook developers. There were several issues.</p>
<ol>
<li>The book was sending a complete test score and interaction data as soon as a user relaunched the lesson. That was a combination of the automatic bookmarking of ToolBook and SCORM and the &#8220;load page&#8221; action. The load page action looked this:
<pre>on load page
    trigger Score Quiz "Score Quiz"</pre>
<p>This made since in that the developer wanted to score the entire book (35 questions) when the user reached the score page. However, since the user then exited from this page, the first thing that happened was that the whole book was scored again. You would think that the user would have a zero score the second time, but that brings us to item 2:</li>
<li>ToolBook&#8217;s suspend data includes all the question responses. This can be quite extensive and can go over the 4096 bytes that SCORM 1.2 allows. This developer was using SCORM 2004, so that wasn&#8217;t a limit. But it was still quite a bit of data to send back. More importantly, the user had to wait while all the questions were put back to their original state. Putting this together with #1, the user ended up with the same score (and 35 questions worth of interaction data) being immediately sent back to the LMS when they reopened the lesson.</li>
</ol>
<p>Here is what the suspend data looked like:</p>
<pre>global _AXF_YEAR=0 SEQUENCE=["p0","p92","p121","p122","p123","p124","p125","p126","p128","p127","p129","p131","p133","p134","p135","p136","p137","p138","p139","p140","p141","p142","p144","p145","p146","p147","p148","p149","p150","p151","p152","p143","p153","p154","p155","p120"] RAWSCORE=15 qn P92.O3=1~0~a~1~0~.022~b~0~0~.012~c~0~0~.017~d~0~1 P121.O3=1~yes~a~1~0~no~b~0~1 P122.O3=1~1~a~1~1~2~b~0~0 P123.O3=1~1~a~1~0~2~b~0~1 P124.O3=1~1~a~1~1~2~b~0~0 P125.O3=1~.012~d~0~0~.006~b~0~0~.010~c~1~0~0~a~0~1 P126.O3=1~Least Material Condition~c~0~0~Maximum Material Condition~a~0~0~Regardless of Feature Size~b~1~1 P128.O3=1~A~a~0~0~B~b~1~1~C~c~0~0 P127.O3=1~A~a~0~0~B~b~0~0~C~c~1~1~D~d~0~0 P129.O9=1~A~a~0~1~B~b~0~0~C~c~1~0~D~d~0~0 P131.O9=1~A~a~0~0~B~b~0~1~C~c~1~0~D~d~0~0 P133.O3=1~A~a~0~1~B~b~1~0~C~c~0~0 P134.O3=1~.742~b~0~0~.766~a~0~0~.758~c~1~0~.734~d~0~1 P135.O3=1~.367~c~0~0~.395~a~0~0~.355~d~1~1~.383~b~0~0 P136.O3=1~LMC Pin~c~0~0~Ø.375 Pin~b~1~0~Expanding Pin~a~0~1 P137.O3=1~A~a~0~1~B~b~0~0~C~c~1~0~D~d~0~0 P138.O3=1~.320~d~0~0~.312~c~0~0~.308~a~1~1~.316~b~0~0 P139.O3=1~.308~a~0~1~.312~c~0~0~.316~b~1~0~.320~d~0~0 P140.O3=1~.574~c~0~0~.590~d~0~0~.548~a~1~1~.556~b~0~0 P141.O3=1~.004~d~0~0~.008~b~0~1~.001~a~1~0~.000~c~0~0 P142.O3=1~Yes~a~0~0~No~b~1~1 P144.O3=1~Yes~a~1~0~No~b~0~1 P145.O3=1~Yes~a~1~0~No~b~0~1 P146.O3=1~Yes~a~1~1~No~b~0~0 P147.O3=1~Two parallel planes~a~0~1~Two parallel lines~b~1~0 P148.O3=1~Derived Median Line~b~0~1~Surface~a~1~0 P149.O3=1~Yes~a~0~0~No~b~1~1 P150.O3=1~Yes~a~0~0~No~b~1~1 P151.O3=1~Yes~a~0~1~No~b~1~0 P152.O3=1~Yes~a~0~0~No~b~1~1 P143.O3=1~1.940~a~0~1~2.000~b~0~0~2.060~d~1~0~1.880~c~0~0 P153.O3=1~.028~c~0~0~.020~b~0~0~.004~d~1~1~.016~a~0~0 P154.O3=1~Entire surfaces~b~0~0~Individual slices~a~1~1 P155.O3=1~1.500~a~0~0~1.505~d~0~0~1.520~c~1~0~1.510~b~0~1</pre>
<p>Quite a big chunk. Here is what the interaction data looked like for just <span style="text-decoration:underline;">one</span> question:</p>
<pre>paramName = cmi.interactions.33.id. paramValue = Multiple_Choice__P155_3_ 40.949:
paramName = cmi.interactions.33.timestamp. paramValue = 2012-02-04T08:24:17 40.987:
paramName = cmi.interactions.33.type. paramValue = choice 41.23:
paramName = cmi.interactions.33.latency. paramValue = PT3.70S 41.51:
paramName = cmi.interactions.33.correct_responses.0.pattern. paramValue = 1.510 41.86:
paramName = cmi.interactions.33.result. paramValue = 0 41.122:
paramName = cmi.interactions.33.weighting. paramValue = 1 41.160:
paramName = cmi.interactions.33.learner_response. paramValue = 1.520 41.198:
paramName = cmi.interactions.33.description. paramValue = What is the maximum outside diameter of the sleeve?</pre>
<p>So we have lots of unwanted data going to/from the LMS and duplicate quiz scores and question data showing up in reports and so forth. So what do we do?</p>
<ol>
<li><span style="font-family:Consolas;">Only score the test if the user started at the beginning and didn&#8217;t just arrive on the scoring page via a bookmark. We do this with a global variable as shown below.<br />
<a href="http://plattecanyon.files.wordpress.com/2012/02/globalvariables.png"><img class="alignnone size-medium wp-image-29" title="GlobalVariables" src="http://plattecanyon.files.wordpress.com/2012/02/globalvariables.png?w=300&#038;h=275" alt="" width="300" height="275" /></a><br />
Notice that we initialize the value of the hasVisitedPage1 variable to false. We then set the value to true on the load page of page 1 of our book.<br />
<a href="http://plattecanyon.files.wordpress.com/2012/02/loadpage1.png"><img class="alignnone  wp-image-31" title="loadPage1" src="http://plattecanyon.files.wordpress.com/2012/02/loadpage1.png?w=300&#038;h=142" alt="" width="300" height="142" /></a></span><br />
When the user gets to the scoring page, we check this same hasVisitedPage1 variable to determine whether to score the book. If not, we ask if the user wants to start the quiz. If so, we navigate them to page 1. If not, we exit the book and discard results (which eliminates suspend data). Here is the screen capture:<br />
<a href="http://plattecanyon.files.wordpress.com/2012/02/loadpage.png"><img class="alignnone size-medium wp-image-30" title="loadPage" src="http://plattecanyon.files.wordpress.com/2012/02/loadpage.png?w=300&#038;h=114" alt="" width="300" height="114" /></a></li>
<li>The next step is to prevent all that suspend data from going to the LMS in the first place. The lesson has a &#8220;record score and exit&#8221; button. My first approach was to reset the book before marking the book as complete. This eliminates the suspend data but makes the score 0. Here is a screen capture, but I don&#8217;t recommend this approach since having a zero score doesn&#8217;t make sense.<br />
<a href="http://plattecanyon.files.wordpress.com/2012/02/scorebtn.png"><img class="alignnone size-medium wp-image-32" title="scoreBtn" src="http://plattecanyon.files.wordpress.com/2012/02/scorebtn.png?w=300&#038;h=100" alt="" width="300" height="100" /></a></li>
<li>There is a bit of a &#8220;Catch 22&#8243; here as we don&#8217;t want suspend data but need the completion status and the score. I decided to go ahead and make my own SCORM calls. So we send the data that we need manually and THEN discard results. This bumps us into another challenge in ToolBook: coming up with the percentage score. While you can programmatically score the book with the Actions Editor, the resulting score is a raw number. There is no programmatic way to get the maximum score so that you can calculate the percentage. We could set a global variable with this raw score, but this is asking for maintenance problems down the road. Instead, we use the fact that the score button WILL display the percentage score in a &#8220;score&#8221; field. Since we score the book when the page loads, we know that this field will be populated by the time the user clicks the &#8220;Record Score&#8221; button (we can run into timing problems scoring and reading the field in the same script). Here&#8217;s what the dialog box for the &#8220;Score Quiz&#8221; button looks like:<br />
<a href="http://plattecanyon.files.wordpress.com/2012/02/scorequizproperties.png"><img class="alignnone size-medium wp-image-39" title="scoreQuizProperties" src="http://plattecanyon.files.wordpress.com/2012/02/scorequizproperties.png?w=300&#038;h=146" alt="" width="300" height="146" /></a>.<br />
The score field then looks like this:  Score: 80%. We can change this format via &#8220;Generic Runtime System Prompts,&#8221; but we&#8217;ll just deal with parsing the score we want out of the text. Here is the updated action for the &#8220;Record Score&#8221; button.<br />
<a href="http://plattecanyon.files.wordpress.com/2012/02/scorebtnupdated.png"><img class="alignnone size-medium wp-image-38" title="scoreBtnUpdated" src="http://plattecanyon.files.wordpress.com/2012/02/scorebtnupdated.png?w=300&#038;h=201" alt="" width="300" height="201" /></a><br />
We first read the text of our Score field to get our hands on the &#8220;Score: 80%&#8221; value. We then parse that to set the <em>scoreVal</em> variable to 80 (or whatever score the user has of course). We divide that by 100 to get the <em>scaledScoreVal</em> variable. Note that this example is for SCORM 2004, which uses a scaled passing score. If we were doing SCORM 1.2, we would work directly with <em>scoreVal</em> and read &#8220;student_data.mastery_score&#8221; in order to get the raw passing score. Next, we call LMSGetValue with the parameter &#8220;cmi.scaled_passing_score&#8221;. We store the return value in <em>passingScaledPassingScore</em>. We then compare this value to our <em>scaledScoreVal</em> variable. If the user scored high enough, we set the <em>completionStatus</em> and <em>successStatus</em>variable to completed and passed respectively. These default to incomplete and failed. If you were using SCORM 1.2, you only need a single completion status. Next, we call LMSSetValue with these parameters and values:1. &#8220;cmi.completion_status&#8221; and <em>completionStatus</em>. 2. &#8220;cmi.success_status&#8221; and <em>successStatus</em>. 3. &#8220;cmi.score.min&#8221; and 0. 4. &#8220;cmi.score.max&#8221; and 100. 5. &#8220;cmi.score.raw&#8221; and <em>scoreVal</em>. &#8220;cmi.score.scaled&#8221; and <em>scaledScoreVal</em>. Note that ToolBook by default sends a cmi.score.max and cmi.score.raw that correspond to the actual scores (e.g., 35 for a max and 28 for a raw), but it actually preferable in all cases I know of to use the normalized values out of 100. Note also that you need to use the SCORM 1.2 versions such as cmi.core.score.max, but otherwise the logic would be the same. Finally, we exit and discard results.</li>
</ol>
<p>This turned into quite a bit of work, but these changes reduced traffic to/from the LMS tremendously AND provided better functionality. I hope this is helpful to other ToolBook developers and Tracker.Net customers.</p>
<p>This exercise has led us to add a feature to &#8220;Ignore Suspend Data&#8221; to the Tracker.Net version 6 wish list. It would also be quite useful for ToolBook to create a property to remove question data from suspend data or skip it completely. Doing the same with bookmarks would be helpful as well.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/plattecanyon.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/plattecanyon.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/plattecanyon.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/plattecanyon.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/plattecanyon.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/plattecanyon.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/plattecanyon.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/plattecanyon.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/plattecanyon.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/plattecanyon.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/plattecanyon.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/plattecanyon.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/plattecanyon.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/plattecanyon.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=28&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://plattecanyon.wordpress.com/2012/02/04/eliminating-unwanted-suspend-data-in-toolbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f086fb18aac25554c9b4f3d1bac327?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">plattecanyon</media:title>
		</media:content>

		<media:content url="http://plattecanyon.files.wordpress.com/2012/02/globalvariables.png?w=300" medium="image">
			<media:title type="html">GlobalVariables</media:title>
		</media:content>

		<media:content url="http://plattecanyon.files.wordpress.com/2012/02/loadpage1.png?w=300" medium="image">
			<media:title type="html">loadPage1</media:title>
		</media:content>

		<media:content url="http://plattecanyon.files.wordpress.com/2012/02/loadpage.png?w=300" medium="image">
			<media:title type="html">loadPage</media:title>
		</media:content>

		<media:content url="http://plattecanyon.files.wordpress.com/2012/02/scorebtn.png?w=300" medium="image">
			<media:title type="html">scoreBtn</media:title>
		</media:content>

		<media:content url="http://plattecanyon.files.wordpress.com/2012/02/scorequizproperties.png?w=300" medium="image">
			<media:title type="html">scoreQuizProperties</media:title>
		</media:content>

		<media:content url="http://plattecanyon.files.wordpress.com/2012/02/scorebtnupdated.png?w=300" medium="image">
			<media:title type="html">scoreBtnUpdated</media:title>
		</media:content>
	</item>
		<item>
		<title>Two Great Leadership Speeches</title>
		<link>http://plattecanyon.wordpress.com/2012/01/26/two-great-leadership-speeches/</link>
		<comments>http://plattecanyon.wordpress.com/2012/01/26/two-great-leadership-speeches/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 14:35:39 +0000</pubDate>
		<dc:creator>Jeff Rhodes</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://plattecanyon.wordpress.com/?p=25</guid>
		<description><![CDATA[I&#8217;ve run into two outstanding leadership speeches recently. The first is by General Welsh, commander of the U.S. Air Force in Europe. It is from a recent speech to the Cadet Wing at the Air Force Academy. I remember some good speeches while I was a cadet, but none as impressive as this. I particularly [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=25&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve run into two outstanding leadership speeches recently. The first is by General Welsh, commander of the U.S. Air Force in Europe. It is from a recent speech to the Cadet Wing at the Air Force Academy. I remember some good speeches while I was a cadet, but none as impressive as this. I particularly liked how he called everyone, even lieutenants, by their first names and gave the whole speech without any notes. Kudos to the Association of Graduates for sending out a link with the speech.</p>
<p><a title="General Welsh Speech" href="http://www.youtube.com/watch?v=hFBpxB5zgnY" target="_blank">General Welsh Speech to USAFA</a></p>
<p>The second video came via my wife Sue, who in turned got it from her boss Toby. The concept that &#8220;people don&#8217;t buy what you do but why you do it&#8221; is fascinating. There are lots of good examples and anecdotes as well.</p>
<p><a title="How Great Leaders Inspire Action" href="//www.ted.com/talks/simon_sinek_how_great_leaders_inspire_action.html" target="_blank">How Great Leaders Inspire Action</a> by Simon Sinek</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/plattecanyon.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/plattecanyon.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/plattecanyon.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/plattecanyon.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/plattecanyon.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/plattecanyon.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/plattecanyon.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/plattecanyon.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/plattecanyon.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/plattecanyon.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/plattecanyon.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/plattecanyon.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/plattecanyon.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/plattecanyon.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=25&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://plattecanyon.wordpress.com/2012/01/26/two-great-leadership-speeches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f086fb18aac25554c9b4f3d1bac327?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">plattecanyon</media:title>
		</media:content>
	</item>
		<item>
		<title>Fixing SQL Divide By Zero Error</title>
		<link>http://plattecanyon.wordpress.com/2012/01/24/fixing-sql-divide-by-zero-error/</link>
		<comments>http://plattecanyon.wordpress.com/2012/01/24/fixing-sql-divide-by-zero-error/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 16:31:43 +0000</pubDate>
		<dc:creator>Jeff Rhodes</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://plattecanyon.wordpress.com/?p=18</guid>
		<description><![CDATA[We had an issue yesterday with reports failing in Tracker.Net yesterday. The exception was &#8220;Divide by Zero Error Encountered.&#8221; I first thought it might be an error in a report itself. But searching for the error pointed to the SQL Server query instead. This Stack Overflow article describes the problem pretty well. The problem with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=18&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We had an issue yesterday with reports failing in <a title="Tracker.Net" href="http://www.trackernet.net" target="_blank">Tracker.Net</a> yesterday. The exception was &#8220;Divide by Zero Error Encountered.&#8221; I first thought it might be an error in a report itself. But searching for the error pointed to the SQL Server query instead. This <a title="Divide by Zero Error" href="http://stackoverflow.com/questions/861778/how-to-avoid-the-divide-by-zero-error-in-sql" target="_blank">Stack Overflow </a>article describes the problem pretty well. The problem with my reports was that I was calculating the &#8220;percent score&#8221; on a test. I was accounting for a null &#8220;maximum score&#8221; but not for a zero maximum score. I haven&#8217;t checked the SCORM specification to see if a zero value is even valid, but it doesn&#8217;t really matter as at least one customer has data like that. Here is the original section of a query:</p>
<pre>Tracker_SessionLessonStudentLog.LessonTestScore / ISNULL(Tracker_SessionLessonStudentLog.LessonMaxScore, 100) AS SessionPercentScore</pre>
<p>The ISNULL() function checks if LessonMaxScore is null and, if so, substitutes 100. But it doesn&#8217;t address the situation where LessonMaxScore has an actual value of 0. That&#8217;s what caused the divide by zero error. As suggested in the article referenced above, I added the NULLIF() function as shown below.</p>
<pre>Tracker_SessionLessonStudentLog.LessonTestScore / NULLIF(ISNULL(Tracker_SessionLessonStudentLog.LessonMaxScore, 100), 0) AS SessionPercentScore</pre>
<p>So if the inside expression is 0, the whole divisor becomes null and the SessionPercentScore becomes null.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/plattecanyon.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/plattecanyon.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/plattecanyon.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/plattecanyon.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/plattecanyon.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/plattecanyon.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/plattecanyon.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/plattecanyon.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/plattecanyon.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/plattecanyon.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/plattecanyon.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/plattecanyon.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/plattecanyon.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/plattecanyon.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=18&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://plattecanyon.wordpress.com/2012/01/24/fixing-sql-divide-by-zero-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f086fb18aac25554c9b4f3d1bac327?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">plattecanyon</media:title>
		</media:content>
	</item>
		<item>
		<title>Hit By SQL Injection Attack</title>
		<link>http://plattecanyon.wordpress.com/2011/12/19/hit-by-sql-injection-attack/</link>
		<comments>http://plattecanyon.wordpress.com/2011/12/19/hit-by-sql-injection-attack/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 23:15:36 +0000</pubDate>
		<dc:creator>Jeff Rhodes</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://plattecanyon.wordpress.com/?p=8</guid>
		<description><![CDATA[I hate to admit it, but we were hit by this SQL Injection Attack last week. The gist of a SQL Injection Attack is that the attacker hijacks your database query and inserts his own query that displays your data on the screen, wipes out your database, or other action. This particular attack wipes out every row [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=8&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I hate to admit it, but we were hit by this <a title="SQL Injection Attack" href="http://isc.sans.org/diary/SQL+Injection+Attack+happening+ATM/12127">SQL Injection Attack</a> last week. The gist of a SQL Injection Attack is that the attacker hijacks your database query and inserts his own query that displays your data on the screen, wipes out your database, or other action. This particular attack wipes out every row and column in EVERY table in your database and replaces its content with a URL and script tags in the hope that your site will then be filled with links to the rogue web site. The best defense against this type of attack is to use parameterized queries/stored procedures rather than a &#8220;dynamic&#8221; SQL statement. This keeps the &#8220;bad&#8221; query from actually executing. Instead, the bad info is passed in as a parameter and the procedure then just fails or returns no data.</p>
<p>If I know how to prevent an attack, how did this attack work on our site? The short answer is that I was dumb. The longer answer is that most explanations of this type of attack demonstrate with a username and password-type page. You enter your username and password on a page. The insecure way to code this is to dynamically have code like this:</p>
<pre>Dim sqlStatement As String = String.Format("Select * From Users Where username = '{0}' AND password = '{1}'", usernameField.Text, passwordField.Text)</pre>
<p>The attacker then puts in a big set of SQL code in the username field that comments out your own statement and does what he wants with the statement. I went through every page and application on the site that got hit and couldn&#8217;t find anywhere where we were building dynamic SQL like this. But then a great support member from our hosting company, <a title="DiscountASP.NET" href="http://www.discountasp.net">DiscountASP.NET</a>, looked through the logs and found the problem. It was with a particular design that we originally used with our VBTrain.NET controls. It passed the productId in as part of the query string. For example:  <a href="http://www.vbtrain.net/productDisplay.aspx?id=9">http://www.vbtrain.net/productDisplay.aspx?id=9</a>. There are no active links to this page, but they were still on the site and working. The attack came when the rogue site sent the bogus SQL Statement (encoded) in place of the 9 above. So the URL looked like this:</p>
<p>productDisplay.aspx id=6%29+declare+%40s+varchar%284000%29+set+%40s%3Dcast%280x73657420616e73695f7761726e696e6773206f6666204445434c41524&#8230; rest removed for security reasons.</p>
<p>If I had used stored procedures for the query to get the data, we still would not have been vulnerable. Unfortunately, when I first set these sites up, I was reading data from various tables and decided to have a common method where I passed in the table, column, default value, etc. Here was the original method:</p>
<pre>Protected Function RetrieveDataReader(ByVal tableName As String, ByVal columnName As String, ByVal columnValue As String, Optional ByVal sortColumn As String = "notAColumn") As SqlDataReader</pre>
<pre style="padding-left:30px;">Dim conId As SqlConnection = Me.VBTrainConnectionId</pre>
<pre style="padding-left:30px;">Dim dbString As String = String.Format("Select * from {0} where ({1} = {2})", tableName, columnName, columnValue)</pre>
<pre style="padding-left:30px;">If sortColumn &lt;&gt; "notAColumn" Then</pre>
<pre style="padding-left:60px;">dbString &amp;= String.Concat(" order by ", sortColumn)</pre>
<pre style="padding-left:30px;">End If</pre>
<pre style="padding-left:30px;">Dim dbCommand As New SqlCommand(dbString, conId)</pre>
<pre style="padding-left:30px;">Dim dbReader As SqlDataReader = dbCommand.ExecuteReader(CommandBehavior.CloseConnection)</pre>
<pre style="padding-left:30px;">Return dbReader
End Function</pre>
<p>We needed to use dynamic SQL in this case since it is hard if not impossible to write a stored procedure where the name of the table and the columns vary. We then called the function like this:</p>
<pre>Dim dbReader As SqlDataReader
dbReader = Me.RetrieveDataReader("productInfo", "productID", idVal)</pre>
<p>idVal was what we grabbed off the query string (everything after the ?). Those of you who have made it this far can probably see how this was a huge security hole. The other pages using this function had hard-coded values, which were safe. But passing in idVal straight from the URL allowed the hacker to blow away our database. So what to do?</p>
<ol>
<li>The best thing would be to change the design so that it calls a stored procedure instead. We will do this on the next redesign.</li>
<li>For now, we can eliminate the vulnerability by checking the parameter before passing to the RetrieveDataReader function. We now make sure the parameter is a number AND that it is a very short length before allowing it through. Otherwise, we use a known value such as the 9 above.</li>
</ol>
<p>Hopefully someone will read this and use it to protect your sites better than we did. I created the pages in question back in 2002. So another lesson is to go back and look at your old sites and applications and check them for security vulnerabilities.</p>
<p>On the positive side, we have the master copies of the databases in question saved locally and were able to recover quickly by using <a title="SQL Data Compare" href="http://www.red-gate.com/products/sql-development/sql-data-compare/" target="_blank">SQL Data Compare from Red Gate Software</a> to update the database that had gotten hacked.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/plattecanyon.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/plattecanyon.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/plattecanyon.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/plattecanyon.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/plattecanyon.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/plattecanyon.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/plattecanyon.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/plattecanyon.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/plattecanyon.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/plattecanyon.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/plattecanyon.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/plattecanyon.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/plattecanyon.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/plattecanyon.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=8&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://plattecanyon.wordpress.com/2011/12/19/hit-by-sql-injection-attack/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f086fb18aac25554c9b4f3d1bac327?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">plattecanyon</media:title>
		</media:content>
	</item>
		<item>
		<title>Good Articles About Pricing Software</title>
		<link>http://plattecanyon.wordpress.com/2011/12/19/good-articles-about-pricing-software/</link>
		<comments>http://plattecanyon.wordpress.com/2011/12/19/good-articles-about-pricing-software/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 22:34:31 +0000</pubDate>
		<dc:creator>Jeff Rhodes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Pricing]]></category>

		<guid isPermaLink="false">http://plattecanyon.wordpress.com/?p=6</guid>
		<description><![CDATA[I was having lunch recently with a fellow owner of a small software business. We were discussing pricing strategy and I followed up with the list of my favorite articles related to pricing software. I have been interested in pricing theory ever since my graduate studies at the London School of Economics and even taught [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=6&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was having lunch recently with a fellow owner of a small software business. We were discussing pricing strategy and I followed up with the list of my favorite articles related to pricing software. I have been interested in pricing theory ever since my graduate studies at the <a title="London School of Economics" href="http://www2.lse.ac.uk/home.aspx" target="_blank">London School of Economics</a> and even taught Microeconomics for a time the Colorado Springs campus of <a title="Regis University" href="http://www.regis.edu/regis.asp?sctn=loc&amp;p1=cs" target="_blank">Regis University</a>. When it comes to pricing your own software, it can literally be a make or break decision for your company.</p>
<p>The first three links are from Eric Sink. I first read his &#8220;Closing the Gap&#8221; articles a number of years ago in <a title="The Best Software Writing I" href="http://www.amazon.com/Best-Software-Writing-Selected-Introduced/dp/1590595009/ref=pd_sim_b_3#_" target="_blank">The Best Software Writing 1</a> edited by Joel Spolsky. It very closely mirrored by own thoughts on how to run a business and how to sell software without the hype and the pressure that is so often used. Eric articulates his concepts and vision brilliantly. I bought the book mentioned above after reading <a title="Joel on Software" href="http://www.joelonsoftware.com" target="_blank">Joel on Software</a> for years before that. Joel has many great opinions on running a software company and other topics. His Camels and Rubber Duckies is a great article. I frequently tell our propective customers that we proudly post our prices on our site and never use the &#8220;How Much Money Have You Got&#8221; pricing that Joel picks apart in his article.</p>
<p>Product Pricing Primer: <a href="http://www.ericsink.com/bos/Product_Pricing.html">http://www.ericsink.com/bos/Product_Pricing.html</a></p>
<p>Closing the Gap, Part 1:  <a href="http://www.ericsink.com/bos/Closing_the_Gap_Part_1.html">http://www.ericsink.com/bos/Closing_the_Gap_Part_1.html</a></p>
<p>Closing the Gap, Part 2: <a href="http://www.ericsink.com/bos/Closing_the_Gap_Part_2.html">http://www.ericsink.com/bos/Closing_the_Gap_Part_2.html</a></p>
<p>Camels and Rubber Duckies: <a href="http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html">http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/plattecanyon.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/plattecanyon.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/plattecanyon.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/plattecanyon.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/plattecanyon.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/plattecanyon.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/plattecanyon.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/plattecanyon.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/plattecanyon.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/plattecanyon.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/plattecanyon.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/plattecanyon.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/plattecanyon.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/plattecanyon.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=6&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://plattecanyon.wordpress.com/2011/12/19/good-articles-about-pricing-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f086fb18aac25554c9b4f3d1bac327?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">plattecanyon</media:title>
		</media:content>
	</item>
		<item>
		<title>Joining the 21st Century</title>
		<link>http://plattecanyon.wordpress.com/2011/12/19/hello-world/</link>
		<comments>http://plattecanyon.wordpress.com/2011/12/19/hello-world/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 22:00:59 +0000</pubDate>
		<dc:creator>Jeff Rhodes</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://plattecanyon.wordpress.com/?p=1</guid>
		<description><![CDATA[Although I have written three books, presented at numerous conferences, and publish the quarterly EnterPage newsletter, this is my first blog post. My focus will be primarily technical, with (hopefully) interesting insights into .NET, ToolBook, HTML, JavaScript, and Flex/Flash. I will also add some content on topics related to running your own small software company [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=1&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Although I have written <a title="three books" href="http://www.amazon.com/s/ref=sr_nr_n_1?rh=n%3A283155%2Cp_27%3AJeffrey+Rhodes%2Cn%3A%211000%2Cn%3A5&amp;bbn=1000&amp;ie=UTF8&amp;qid=1324332525&amp;rnid=1000" target="_blank">three books</a>, presented at numerous conferences, and publish the quarterly <a title="EnterPage newsletter" href="http://plattecanyon.com/enterPage.aspx" target="_blank">EnterPage newsletter</a>, this is my first blog post. My focus will be primarily technical, with (hopefully) interesting insights into .NET, ToolBook, HTML, JavaScript, and Flex/Flash. I will also add some content on topics related to running your own small software company as well as whatever random subjects come up. I hope you join me for the ride.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/plattecanyon.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/plattecanyon.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/plattecanyon.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/plattecanyon.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/plattecanyon.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/plattecanyon.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/plattecanyon.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/plattecanyon.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/plattecanyon.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/plattecanyon.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/plattecanyon.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/plattecanyon.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/plattecanyon.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/plattecanyon.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=plattecanyon.wordpress.com&amp;blog=30634702&amp;post=1&amp;subd=plattecanyon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://plattecanyon.wordpress.com/2011/12/19/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f086fb18aac25554c9b4f3d1bac327?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">plattecanyon</media:title>
		</media:content>
	</item>
	</channel>
</rss>
