<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SCORM &#187; Software Development</title>
	<atom:link href="http://scorm.com/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://scorm.com</link>
	<description>We make SCORM easy</description>
	<lastBuildDate>Sat, 04 Feb 2012 08:53:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Facebook + SCORM Cloud</title>
		<link>http://scorm.com/blog/2011/09/facebook-scorm-cloud/</link>
		<comments>http://scorm.com/blog/2011/09/facebook-scorm-cloud/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 18:46:08 +0000</pubDate>
		<dc:creator>chris.tompkins</dc:creator>
				<category><![CDATA[Ideas and Thoughts]]></category>
		<category><![CDATA[SCORM Cloud]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://scorm.com/?p=13538</guid>
		<description><![CDATA[We get asked all the time, “What is an LMS?” So, here’s a challenge&#8230; express it as simply, as elementally as you can. Here’s my effort: A tool that authenticates students, connects them to a topic, as well as each other, and provides the tools to efficiently deliver, track and assess the learning process. - [...]]]></description>
			<content:encoded><![CDATA[<p>We get asked all the time, “What is an LMS?”  So, here’s a challenge&#8230; express it as simply, as elementally as you can. Here’s my effort:</p>
<blockquote><p>A tool that authenticates students, connects them to a topic, as well as each other, and provides the tools to efficiently deliver, track and assess the learning process.</p></blockquote>
<p style="font-size: 9px;padding-left: 45px;margin-top: -10px">- (Think you can do it better using only 140 characters? Step up and <a href="#commentanchor">leave a comment</a>&#8230;)</p>
<p>We’ve been pondering different applications and how they apply to that definition. And I can’t stop coming back to Facebook as a great candidate for an LMS of the future.<br />
<span id="more-13538"></span><br />
A tool that <em>authenticates students</em>&#8230;<br />
<a href="http://scorm.com/wp-content/uploads/2011/09/login2.jpg" rel="lightbox[13538]"><img class="aligncenter size-medium wp-image-13504" src="http://scorm.com/wp-content/uploads/2011/09/login1-300x145.jpg" alt="Social elearning with SCORM Cloud and Facebook" width="300" height="145" /></a><br />
&nbsp;<br />
<em>&#8230;connects them to a topic&#8230;</em><br />
<a href="http://scorm.com/wp-content/uploads/2011/09/group1.jpg" rel="lightbox[13538]"><img class="aligncenter size-medium wp-image-13506" src="http://scorm.com/wp-content/uploads/2011/09/group-300x229.jpg" alt="Social elearning with SCORM Cloud and Facebook" width="300" height="229" /></a><br />
&nbsp;<br />
<em>&#8230;as well as each other&#8230;</em><br />
<a href="http://scorm.com/wp-content/uploads/2011/09/friends1.jpg" rel="lightbox[13538]"><img class="aligncenter size-full wp-image-13508" src="http://scorm.com/wp-content/uploads/2011/09/friends.jpg" alt="Social elearning with SCORM Cloud and Facebook" width="260" height="171" /></a><br />
&nbsp;</p>
<p>This is where SCORM Cloud comes in. Courses could be hosted on SCORM Cloud and delivered via Facebook.</p>
<p><em>&#8230;and provides the tools to efficiently deliver, track and assess the learning process.</em><br />
<a href="http://scorm.com/wp-content/uploads/2011/09/lesson1.jpg" rel="lightbox[13538]"><img class="aligncenter size-medium wp-image-13510" src="http://scorm.com/wp-content/uploads/2011/09/lesson-300x292.jpg" alt="Social elearning with SCORM Cloud and Facebook" width="300" height="292" /></a></p>
<p>Assessments and tracking could also be integrated:<br />
&nbsp;<br />
<a href="http://scorm.com/wp-content/uploads/2011/09/test1.jpg" rel="lightbox[13538]"><img class="aligncenter size-medium wp-image-13512" src="http://scorm.com/wp-content/uploads/2011/09/test-300x298.jpg" alt="Social elearning with SCORM Cloud and Facebook" width="300" height="298" /></a><br />
&nbsp;</p>
<p>Thinking about <em>what could be</em> is something we do a lot&#8230; Lately several of us have often discussed <em>what SCORM Cloud + Facebook could be</em>. I thought it’d be a good idea to expand the discussion and bring our followers into the mix.</p>
<p>Apps in Facebook are nothing new, and they&#8217;re the future of the platform:</p>
<blockquote><p>The next five years will be defined by apps and the depth of social engagement.</p></blockquote>
<p style="font-size:11px;padding-left:250px;margin-top:-10px">-Mark Zuckerberg at F8 2011</p>
<p>&nbsp;</p>
<p>The social learning platform has created thousands of successful virtual farms and Vills. While many of the popular apps currently on Facebook are games, the Facebook population seems to be underutilized for eLearning. Students and Facebook have a healthy relationship — the site’s popularity was born from college students. I’m willing to make the argument that the blend of eLearning and the Facebook environment would be a useful marriage.</p>
<p>Facebook advantages:</p>
<ul>
<li>800+ million users (and growing)</li>
<li>Easy to manage people and groups</li>
<li>Users are loyal, familiar and comfortable with Facebook</li>
<li>Streamlined registration and management process</li>
<li>Frequent log-ins, easily accessible across platforms and devices</li>
<li>Every month, more than 500 million people use an app on Facebook or experience Facebook Platform on other websites</li>
<li>More than 7 million apps and websites are integrated with Facebook</li>
</ul>
<p><img class="aligncenter size-full wp-image-13514" src="http://scorm.com/wp-content/uploads/2011/09/facebook-like.png" alt="Social elearning with SCORM Cloud and Facebook" width="184" height="174" /></p>
<p>By using Facebook to facilitate learning with students and instructors, developers could create a fast and intuitive way to group students and deploy courses. Learning within Facebook provides a platform students are comfortable and familiar with. Relationships formed via a Facebook-based experience could continue past the life of the course, creating a more genuine social experience than traditional eLearning has been able to give. The possibilities of a Learning App within Facebook are exciting to imagine and one I think could become the next big movement of eLearning.</p>
<p>Arguably, this rush to manage learners within Facebook will start soon, and I’m excited to see it begin.  We’ve built our SCORM Cloud to be flexible and adaptable with this scenario in mind. We’ve seen several integrations of our SCORM Cloud. So far it has been blended into Moodle, Sakai, Dokeos, Ilias, WordPress and Google Apps. Instead of reinventing the learning platform, just plug our SCORM Cloud into Facebook and move on.</p>
<p>Facebook is the next step, and one we’re excited to see someone take. Our SCORM Cloud can relieve the pain of hosting content, managing courses, tracking assessments and reporting grades. Facebook will manage students — all a developer needs to do is plug the two together. We’re open to ideas on how we can make this process easier.</p>
<p>Group discussions, wall posts, notifications, real-time chat with classmates, leader boards&#8230; the Facebook platform offers plenty of elements that can be combined to create something cool. What could be within this solution keeps my mind racing. I hope that some momentum for this develops soon.</p>
<p><img class="aligncenter size-full wp-image-13519" src="http://scorm.com/wp-content/uploads/2011/09/SC-plus-Fb.jpg" alt="Social elearning with SCORM Cloud and Facebook" width="300" height="105" /></p>
<p>So the logical question is, “If an e-learning Facebook app is such a great idea, why not do it yourself?” We have built the toolkit that can make this app possible&#8230; we’ve got a lot of development projects in cue.  We’ve made it obvious we’re hiring, great ideas like SCORM Cloud + Facebook are why. If this sounds cool and you’d like to jump in and create a Facebook integration, go for it. Where it goes from here is up to you.  Are you willing to take the leap and become the first to navigate these waters?</p>
<p>We know this process takes time and effort. We’re willing to lend a hand, let’s discuss what that could look like by dropping a comment. If you’re interested in working with us to make this happen, email me — <a href="mailto:chris.tompkins@scorm.com">chris.tompkins@scorm.com</a>.</p>
<p style="font-size: 8px">Some images from: <a href="http://www.flickr.com/photos/88526923@N00/2114874155/" target="blank">benstein</a> &amp; <a href="http://www.flickr.com/photos/findyoursearch/5202301465/" target="blank">FindYourSearch</a></p>
<p><a name="commentanchor"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://scorm.com/blog/2011/09/facebook-scorm-cloud/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Can&#8217;t want what we don&#8217;t know about</title>
		<link>http://scorm.com/blog/2009/09/cant-want-what-we-dont-know-about/</link>
		<comments>http://scorm.com/blog/2009/09/cant-want-what-we-dont-know-about/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 23:23:25 +0000</pubDate>
		<dc:creator>susan.lewis</dc:creator>
				<category><![CDATA[SCORM Cloud]]></category>
		<category><![CDATA[SCORM Engine]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.scorm.com/?p=4087</guid>
		<description><![CDATA[Once upon a time, there was no sliced bread*. And people were happy because they didn’t know they wanted sliced bread. Then someone gave them sliced bread. Suspicion, amazement and eventually joy erupted. Suddenly, they wanted, no needed, sliced bread. These days, it’s tough to sell bread that isn’t pre-sliced. It’s a common problem in [...]]]></description>
			<content:encoded><![CDATA[<p>Once upon a time, there was no sliced bread*. And people were happy because they didn’t know they wanted sliced bread.</p>
<p>Then someone gave them sliced bread. Suspicion, amazement and eventually joy erupted. Suddenly, they wanted, no <em>needed</em>, sliced bread. These days, it’s tough to sell bread that isn’t pre-sliced.</p>
<p>It’s a common problem in product development – delivering something amazing you know people will want but can’t ask for because they don’t even know it is possible. (Face it, did you know you needed TIVO before it came along? I’m waiting for a radio version, pretty please!)</p>
<p>I’m seeing a little of this as I explore the LMS world. Lots of talk about reporting and what should be there and whether anyone cares and who should care. I see admins refusing to bother because no one asks for anything other than the bare bones already provided. I see trainers who would love to know more but figure their LMS just can’t deliver so they suffer in silence. I see instructional designers who feel there has to be a better way to judge the success of a course than just a single score at the end.</p>
<p>Lots of talking, not much asking, very little <em>doing</em>.</p>
<p>One of the nice things about SCORM (yes, there are a few) is the amount of data that just naturally gets created. As we wrap up integrating the SCORM Cloud with various open-source LMS packages, the question of reporting has come up. Not whether to report, but just what and how to format the reports. We already know we can slice the bread; we just have to figure out how thick to make the slices and whether to toss in some butter and jam.</p>
<p>Wanna help us shape up LMS reporting? How would you want the SCORM Cloud (and likely the SCORM Engine by default) to deliver reports and what do you think you want to know? We have some devilishly clever ideas but welcome yours.</p>
<p><em>*After Tim wrote about <a href="http://scorm.com/blog/2009/08/provence-changed-my-mind/">bread</a> on a software company blog, I had to figure out a way to include it as well. Bread. With butter and jam. Seriously. These posts make me hungry.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://scorm.com/blog/2009/09/cant-want-what-we-dont-know-about/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SCORM in &quot;the cloud&quot;, and what we&#039;re doing to TestTrack now</title>
		<link>http://scorm.com/blog/2009/04/testtrack-in-scorm-cloud/</link>
		<comments>http://scorm.com/blog/2009/04/testtrack-in-scorm-cloud/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 12:55:02 +0000</pubDate>
		<dc:creator>tim.martin</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[SCORM Cloud]]></category>
		<category><![CDATA[SCORM Engine]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[testtrack]]></category>

		<guid isPermaLink="false">http://www.scorm.com/?p=3378</guid>
		<description><![CDATA[A few weeks ago, we released the new version of our website (which has been well received) and upgraded our servers. TestTrack, our freely available testing application, has been growing constantly and was overloading the server on which it lived. The transition went very well, the 404s have been handled (for the most part), and [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago, we released the new version of our website (which has been well received) and upgraded our servers.  TestTrack, our freely available testing application, has been growing constantly and was overloading the server on which it lived.  The transition went very well, the 404s have been handled (for the most part), and things are functioning as we all wanted.</p>
<p>During the process, TestTrack was down for a period of time, and our phones started ringing.  People <em>really depend on TestTrack</em>.  We&#8217;re glad.  We <a href="http://scorm.com/scorm-solved/testtrack/testtrack-why/">want</a> folks to use it; it helps us get better and it helps further the standard as a whole.</p>
<p>So, for all you who depend on TestTrack, let this be your warning.  We&#8217;re doing something new with TestTrack again.  We&#8217;re about to move TestTrack from a traditional SCORM Engine installation to our newest release&#8230; something we&#8217;re really excited about.  <strong>We have developed a hosted/cloud based version of the SCORM Engine, the SCORM Cloud. </strong><br />
<span id="more-3378"></span></p>
<h5>&#8220;What?&#8221;</h5>
<p>Some of you are reading this thinking, &#8220;What in the world is &#8220;<a href="http://en.wikipedia.org/wiki/Cloud_computing">cloud computing</a>&#8220;?  Put &#8220;simply&#8221;, cloud computing lets us provide the SCORM Engine functionality as a service.  Rather than having to install the SCORM Engine for each of our customers on their servers, anyone who wishes to integrate against the SCORM Engine may do so against an existing installation in <a href="http://aws.amazon.com/">Amazon&#8217;s Web-service Architecture</a>.</p>
<h5>Is this a big deal?</h5>
<p><strong>No.</strong> If you&#8217;re a TestTrack user, and all you care about is TestTrack&#8217;s ability to import and launch your content, this really isn&#8217;t a big deal.  It <em>does</em> allow us to scale TestTrack more effectively (because we can increase storage <a href="http://www.scorm.com/blog/2009/03/scalable-storage-using-amazons-elastic-block-store/">dynamically</a> and add EC2 instances as need), but it shouldn&#8217;t dramatically impact your experience.</p>
<p><strong>And yes!</strong> I am personally <em>very</em> excited about things that <em>could</em> come out of the Hosted SCORM Engine.  I&#8217;m excited about what we can do with it, and I&#8217;m excited about what <em>others</em> can do with it.  <strong>Anyone who aspires to &#8220;mash-ups for eLearning&#8221; and cares about SCORM may now have the tool that really lets them make a difference.</strong></p>
<p>The first thing we&#8217;re doing with the SCORM Cloud, as mentioned above, is releasing TestTrack against it.  That means that the core part of the TestTrack application will continue to function as it does today (a .NET application hosted on our own servers), but that the content delivery and tracking and import will all be handled by the SCORM Cloud.  Consider this your proof of concept (and our beta).  From there, some of the things we have in mind include (ideas only, no promises):</p>
<ul>
<li>Automatic SCORM Version upgrades</li>
<li>Alternative pricing structures for the SCORM Engine (with lower up-front costs)</li>
<li>Hosting for content vendors who want to track the use of their content</li>
<li>Anything that reduces the &#8220;silo-ed&#8221; nature of the learning industry today</li>
</ul>
<p>And more than anything, we&#8217;re hoping you, the community, will create awesome products around the SCORM Cloud.  What could <em>you</em> do?</p>
<ul>
<li>Deliver content from <em>any</em> application?</li>
<li>A Facebook application?</li>
<li>A Google Calendar based LMS?</li>
<li>Limit the server/bandwidth requirements on your LMS by offloading them?</li>
<li>Anything.  Come up with better ideas than we have!</li>
</ul>
<p>Shoot us a message.  We&#8217;d love to talk through the possibilities with you.  We&#8217;re pretty excited about the unlimited possibilities this creates, and we&#8217;re nearly ready to share the APIs and documentation that will allow <em>you</em> to build around the SCORM Cloud.</p>
]]></content:encoded>
			<wfw:commentRss>http://scorm.com/blog/2009/04/testtrack-in-scorm-cloud/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Scalable Storage Using Amazon&#039;s Elastic Block Store</title>
		<link>http://scorm.com/blog/2009/03/scalable-storage-using-amazons-elastic-block-store/</link>
		<comments>http://scorm.com/blog/2009/03/scalable-storage-using-amazons-elastic-block-store/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 16:37:54 +0000</pubDate>
		<dc:creator>eric.moore</dc:creator>
				<category><![CDATA[SCORM Cloud]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.scorm.com/?p=3321</guid>
		<description><![CDATA[We&#8217;ve recently completed development of a hosted version of our SCORM Engine. In the coming weeks we will be transitioning TestTrack over to using the hosted Engine to enable much greater scalability than the single server install can currently provide. This project will involved liberal use of several of the Amazon Web Services, due largely [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve recently completed development of a hosted version of our SCORM Engine. In the coming weeks we will be transitioning <a href="http://www.scorm.com/scorm-solved/testtrack/">TestTrack</a> over to using the hosted Engine to enable much greater scalability than the single server install can currently provide. This project will involved liberal use of several of the <a href="http://aws.amazon.com/">Amazon Web Services</a>, due largely to their ease of use, low cost and high scalability. Using the Elastic Compute Cloud (EC2) was an obvious choice for us, as we can easily create and destroy machines as our load fluctuates. Less obvious, however, was how we should go about storing content files. These were our requirements for a storage device:</p>
<p>1) easy ability to upload large files using standard FTP clients, and possibly other commonly available protocols. Files over 1 GB aren&#8217;t uncommon, and larger files than that are certainly possible.<br />
2) real-time file updates (i.e. when I upload a new version of a file and then immediately request it, there should be no chance that I get back an older version)<br />
3) small amount of storage for now (so it&#8217;s cheap) with the ability to grow to a few TB or more as demand requires it<br />
4) storage should all be accessible at a single root location. We currently have files spread over two drives, which requires a small bit of one-off code to determine which files from which users go on which drive.<br />
5) ability to access the content directly from any one of (potentially) several web servers<br />
6) some form of backup and/or redundancy to prevent data loss</p>
<p>Amazon currently provides two different mechanisms for persistent storage: Simple Storage Service (S3) and Elastic Block Store (EBS). Each of these storage methods has its advantages, but at first look, neither will fulfill all of our requirements straight out of the box.<span id="more-3321"></span></p>
<p>S3 provides limitless storage in &#8220;buckets&#8221; of up to 5 GB each, while only charging for the amount that you&#8217;re actually using (#3). It provides access to your files via HTTP from anywhere in the world (#5), while promising 99.99% availability because of its decentralized, redundant, fault-tolerant architecture (#6). However, it doesn&#8217;t directly support FTP (#1), and file uploads don&#8217;t necessarily propagate to other nodes instantaneously (#2). We&#8217;d also have to span multiple buckets, meaning that we&#8217;d have to track which customers were stored in each one (#4). We could potentially overcome the FTP issue by writing an FTP client that uses S3 as its back end, but that&#8217;s time-consuming and inelegant, and it makes the cost of switching to another protocol (like SFTP or SCP) extremely high. The other problems are inherent to the S3 architecture, so we&#8217;d just have to deal with those.</p>
<p>EBS behaves just like a traditional block storage system. You can think of an EBS volume as a virtual external hard drive attached to your virtual machine. File access is only limited by the security settings on your machine (#1), and files written to the device are immediately available (#2), just as they would be on a &#8220;regular&#8221; hard drive. Drives can range in size from 1GB to 1TB, and you can mount several EBS drives to one machine (up to 20, I believe), thus providing enough storage to meet our needs for the foreseeable future on a single server (#3). EBS volumes are only available in one Amazon Availability Zone, potentially making them less reliable than S3 storage. However, you can create snapshots of drives and store them in S3, whereafter you can restore those snapshots to any EBS volume in any availability zone. Since EBS volumes behave just like hard drives, you can also mirror them or take any number of other traditional steps to protect your data (#6). The downside to EBS is that you have to pay for all space that&#8217;s allocated to you, whether or not you&#8217;re actually using it (#3). Additionally, multiple drives mean multiple mount points (#4), and as with regular drives, they can only be attached to one machine at a time (#5).</p>
<p>Ultimately, we decided to go with EBS because all of its shortcomings can be overcome with widely available, common solutions. We can start with small volumes to keep the cost down, and then grow them whenever we need to by taking a snapshot and then restoring it to a new, larger volume (#3). We can overcome having to deal with multiple mount points by using LVM to join multiple volumes into one big one (#4), and we can overcome the single machine limitation by exposing the whole thing with NFS.</p>
<p>With all of the decisions out of the way, it&#8217;s now time to actually combine all of these things together. I found a good bit of info about each of these pieces in various places on the web, but it doesn&#8217;t appear that anyone has set out to put all of this in one stack (or if they have, they didn&#8217;t write about it). As such, I thought I&#8217;d take some extra time to record the things I&#8217;ve done to make all of these pieces work together.</p>
<h2>LVM Config</h2>
<p>Before we can begin setting up our storage solution, we first need a machine in the cloud to host the drives. The easiest way to start one up is to use the ElasticFox plugin for Firefox. If you&#8217;re not familiar with ElasticFox, go take a minute to play around with it and see how it works. We&#8217;ll be using it for quite a few different things throughout this document, so you&#8217;ll need to become familiar with it.</p>
<p>Open up ElasticFox and fire up a VM. At some point we may start using home-baked machine images so that everything we need is already installed, but right now we&#8217;re using a public Ubuntu 8.04 image from Alestic (ami-51709438). Since we&#8217;ll be installing most of the required packages as we go, these steps should work on other distributions as well, but I haven&#8217;t tried it.</p>
<p>Once your VM is up and running, take note of which Application Zone it&#8217;s in. Now click over to the Volumes and Snapshots tab in ElasticFox and create two new volumes, making sure they&#8217;re in the same Application Zone as your VM. For the purposes of this demo, I made my drives 1 GB each. Since this demo is starting off as a proof-of-concept, there&#8217;s really no use in paying for more storage until we&#8217;re actually going to use it. We can always come back and grow (or replace) those volumes later.</p>
<p>If you&#8217;re both good at math and observant, you&#8217;ve probably noticed that there&#8217;s not really any need for creating two separate elastic block drives that are only 1 GB each. Why not just create a single 2 GB drive? In practice, the single drive is probably the way to go. But one of the points of this exercise is to prove that we can combine two of these things together and make them look like one drive. If you&#8217;d rather just take my word for it, you can always go through these steps with just one drive, but if you&#8217;re looking for a (practically) infinitely growable, single-volume storage drive, you&#8217;ll still need to get lvm set up.</p>
<p>Once your drives are created, use ElasticFox to attach them to your VM. On the Ubuntu image that I&#8217;m using, partitions already exist as /dev/sda1, /dev/sda2, and /dev/sda3, so I attached my two drives at /dev/sdb and /dev/sdc to avoid any confusion. It&#8217;s probably a good idea to record which drive is attached as which device for future reference. I have tested reconnecting the drives as different devices without any problems, but my testing wasn&#8217;t thorough and I can&#8217;t guarantee that it&#8217;ll always work. If nothing else, it seems like a really bad idea to go switching them around, so I&#8217;d recommend coming up with some way to make sure they&#8217;re always connected as the same device.</p>
<p>Now SSH to your VM and connect as root. ElasticFox allows you to do this easily by right-clicking on a running VM and selecting &#8220;Connect to Public DNS Name.&#8221;</p>
<p>The stock image that I&#8217;m using doesn&#8217;t come with all of the LVM and NFS packages that we&#8217;ll need, so before we can begin configuring our drives, there are a few things that need to be installed. Let&#8217;s update the apt-get cache and then install everything that we&#8217;ll need for LVM.</p>
<p>> apt-get update<br />
> apt-get install lvm2 dmsetup dmapi dmraid</p>
<p>Setting up LVM involves several steps, but they all make sense if you take a step back and look at an overview of what they&#8217;re actually doing. LVM allows you to take a group of physical drives and combine them into one giant virtual drive. You can then partition and/or use that drive in any way you see fit. This allows you to create partitions that are actually larger than any of the physical drives you&#8217;re using, and it also gives you the ability to expand your drive in the future. Based on that explanation, the following steps should be pretty self-explanatory.</p>
<p>First, create a physical volume on each drive. This allows them to be recognized by LVM. Most LVM tutorials that I&#8217;ve read say that you first need to partition the drive with an LVM partition, but that&#8217;s only the case if you plan to use parts of this drive for other purposes. In our case, we want LVM to use the entire drive, so we can just create the physical volume directly on it:</p>
<p>> pvcreate /dev/sdb /dev/sdc</p>
<p>Next, create a volume group, which tells LVM which physical volumes should be grouped together. As you would expect, you can add drives to or remove drives from this group in the future.</p>
<p>> vgcreate elastic_drive /dev/sdb /dev/sdc</p>
<p>Finally, create a logical volume (or multiple logical volumes) that can then be formatted and mounted just like a &#8220;regular&#8221; drive. Here, I&#8217;m specifying the size as 100% of the volume group, but you can also specify an absolute size if you&#8217;d rather.</p>
<p>> lvcreate -n content -l 100%VG elastic_drive</p>
<p>Now that we have a usable drive created, we&#8217;re finally ready to put a filesystem on it. There are a number of options you can use, the most popular of which is probably ext3. ReiserFS and XFS are also pretty popular. After doing a little bit of research, we decided to go with XFS because you can resize it without unmounting it (ext3 can be resized, but only after it&#8217;s been unmounted). You can also freeze it at any time to allow for safe snapshots, but LVM already provides that functionality. Before we can create our filesystem, though, we need to install the necessary XFS packages:</p>
<p>> apt-get install xfsprogs</p>
<p>To create our XFS filesystem:</p>
<p>> mkfs.xfs /dev/elastic_drive/content</p>
<p>The last step in creating our super-large, expandable drive is to create a mount point for the new drive and then mount it. Right now, I&#8217;m mounting it at /var/content.</p>
<p>> mkdir /var/content<br />
> mount /dev/elastic_drive/content /var/content</p>
<p>To make sure that everything is working, let&#8217;s put a couple of files out on our giant drive.</p>
<p>> cp /etc/fstab /var/content<br />
> cp /etc/rc.local /var/content</p>
<p>Now let&#8217;s check to make sure they disappear and reappear when they&#8217;re supposed to:</p>
<p>> ls /var/content</p>
<p>[should see your files listed]</p>
<p>> umount /var/content</p>
<p>> ls /var/content</p>
<p>[should get no results]</p>
<p>> mount /dev/elastic_drive/content /var/content</p>
<p>> ls /var/content</p>
<p>[files should be back]</p>
<p>OK, that&#8217;s progress, but we&#8217;re not finished yet. The final step is to make sure our mount persists when we reboot. You _should_ just be able to add the following line to /etc/fstab:</p>
<p>/dev/elastic_drive/content /var/content xfs defaults 0 0</p>
<p>&#8230; but that&#8217;s not working for me. For some reason, the logical volume isn&#8217;t coming up as active, so the mount fails when I reboot. If you&#8217;re having the same problem, here&#8217;s a little hack that&#8217;ll make it work. Just add the following two lines to your /etc/rc.local file:</p>
<p>lvchange -ay /dev/elastic_drive/content</p>
<p>mount /dev/elastic_drive/content /var/content</p>
<p>I&#8217;d highly recommend rebooting your server now and making sure that your mount comes back up. It&#8217;s much better to discover any problems now before you&#8217;re relying on this shared volume in a production environment.</p>
<h2>NFS Config</h2>
<p>Now that our giant storage drive is configured, the next step is configure NFS to share it amongst all of our other machines. First, let&#8217;s load all of the NFS packages well need:</p>
<p>> apt-get install portmap nfs-kernel-server</p>
<p>Next we need to add an entry in /etc/exports to expose the drive:</p>
<p>/var/content *.compute-1.internal(rw,no_subtree_check,sync)</p>
<p>A few things to note about the above line:</p>
<p>1) We&#8217;re technically exposing our drive with read/write access to anyone in our portion of the Amazon cloud. However, the security group that we&#8217;re in will prevent anyone from outside the group from accessing our machine on the NFS port. As long as that firewall holds, then this is totally secure. I&#8217;ve elected to open myself up to anyone in my security group because I don&#8217;t want to have to come back and edit this file every time we spin up another machine. If you would like an extra layer of security, you can specify specific machine names here instead.</p>
<p>2) For additional security, you can also add entries to the hosts.allow and hosts.deny files to further prevent unauthorized access. Again, this is redundantly securing something already taken care of by the security group, so it&#8217;s not strictly necessary (but it&#8217;s not a horrible idea, either).</p>
<p>Now we just have to refresh which shares have been exported, since apt-get was nice enough to have already started the NFS server:</p>
<p>> exportfs -a</p>
<p>Technically, we&#8217;re finished now, but let&#8217;s verify that our NFS share is actually working. Fire up another vm in the cloud to serve as our client machine, making sure that it&#8217;s in the same security group and application zone as the server. Note that if you didn&#8217;t set up your exports file to allow anyone in your security group to connect, you&#8217;ll have to go specifically add this new machine to your exports file on the server. Once the machine is up and running, we&#8217;ll need to install some NFS packages to allow it to run as a client:</p>
<p>> apt-get update<br />
> apt-get install nfs-common</p>
<p>Once the installation is complete, create a directory to serve as your mount point and mount the remote filesystem. I&#8217;m mounting mine at /var/content_server.</p>
<p>> mkdir /var/content_server<br />
> mount nfs_server_name:/var/content /var/content_server</p>
<p>Finally, test to make sure that your files are showing up:</p>
<p>> ls /var/content</p>
<p>[should see files from your remote drive]</p>
<p>One final note on Security. For the purposes of this document, I&#8217;ve made the assumptions that you both trust and don&#8217;t mind sharing your files with all machines in your security group. The alternative steps that I briefly discussed (using hosts.allow and hosts.deny) should further lock down your server, but the one thing I didn&#8217;t discuss is sharing your files with a machine outside your security group. Beyond the steps outlined here, you&#8217;ll need to add an entry to your security group to open up port 2049 (the default NFS port) to the IP address of your client machine (DNS names won&#8217;t work when configuring security groups).</p>
<h2>Server Restore</h2>
<p>Now we have our file server up and running, with a nice expandable drive for files that&#8217;s easily recoverable even if our host machine crashes or is terminated. That all sounds nice, but how do we know that any of that stuff actually works? We don&#8217;t&#8230; yet. So let&#8217;s find out.</p>
<p>Let&#8217;s assume that everything is set up as it was at the end of the configuration document: you have a &#8220;server&#8221; VM running that has two 1GB EBS volumes attached to it. Those volumes are combined into one logical volume that is then mounted on the &#8220;server&#8221; and shared via NFS. You also have a &#8220;client&#8221; VM running that has the logical volume mounted via NFS. So what happens if the server restarts?</p>
<p>Terminate your server VM. ElasticFox has a nice terminate button that makes this easy.</p>
<p>Now fire up a new VM, reattach your elastic drives, and SSH to it.</p>
<p>Since this is a brand new VM, all of the packages that we installed on the old one aren&#8217;t there. Let&#8217;s get those back:</p>
<p>> apt-get update<br />
> apt-get install lvm2 dmsetup dmapi dmraid xfsprogs portmap nfs-kernel-server</p>
<p>Now let&#8217;s look and see if our logical volume is still set up across the two elastic drives:</p>
<p>> lvs</p>
<p>Sweet! It&#8217;s still there, so we don&#8217;t have to go through all of those configuration steps again. Unfortunately, though, it&#8217;s not active. Let&#8217;s fix that:</p>
<p>> lvchange -ay /dev/elastic_drive/content</p>
<p>Now let&#8217;s mount it again:</p>
<p>> mkdir /var/content<br />
> mount /dev/elastic_drive/content /var/content<br />
> ls /var/content</p>
<p>[should see the files you put on there before]</p>
<p>So our drive is back up and running. Now we just need to make it come back after reboots by redoing our changes to /etc/fstab:</p>
<p>/dev/elastic_drive/content /var/content xfs defaults 0 0</p>
<p>&#8230; or to /etc/rc.local if you had to use my little hack:</p>
<p>lvchange -ay /dev/elastic_drive/content<br />
mount /dev/elastic_drive/content /var/content</p>
<p>And finally, let&#8217;s share it back over NFS with an edit to /etc/exports:</p>
<p>/var/content *.compute-1.internal(rw,no_subtree_check,sync)</p>
<p>and refresh our exported filesystems:</p>
<p>> exportfs -a</p>
<p>Now all that&#8217;s left is to update our client machine(s) with the new location of the content server.</p>
<p>> umount /var/content_server<br />
> mount nfs_server_name:/var/content /var/content_server<br />
> ls /var/content_server</p>
<p>[should see the files from your elastic drives]</p>
<p>There are a couple of remaining problems that I see with this setup, and the only way I know of to solve them is to write my own scripts. First, what happens on a client machine when it tries to write to the remotely mounted directory while the server is down? How do we make sure that no data is lost while we wait for the server to come back up? And second, how can we make the client machines aware when the server&#8217;s location changes? My thought is to write a script that monitors the server. When it detects that the server can&#8217;t be reached, it funnels writes into a temp directory until the server directory can be remounted.</p>
<h2>Volume Growth</h2>
<p>One of the most important features of our storage setup is that it&#8217;s easily expandable, so it&#8217;s probably a good idea to make sure we can actually expand it. There are several ways to do this, so let&#8217;s outline a few of them now.</p>
<p>The easiest way to increase our storage is to just add another EBS volume, so let&#8217;s try that now. Go to the Volumes and Snapshots tab in ElasticFox and create a new volume that&#8217;s equal to the size you want to add.</p>
<p>Attach the volume to your server. Since we&#8217;re currently using /dev/sdb and /dev/sdc, logic allows that we should probably connect this one at /dev/sdd.</p>
<p>Now we go through steps that are similar to the initial setup, except that we&#8217;ll be growing existing entities rather than creating new ones.</p>
<p>First create a new physical volume on your new device:</p>
<p>> pvcreate /dev/sdd</p>
<p>Now add the physical volume to our existing volume group rather than creating a new group:</p>
<p>> vgextend elastic_drive /dev/sdd</p>
<p>Next, extend the logical volume to consume 100% of the free space available (unless you&#8217;re planning on saving some of the space for some other purpose):</p>
<p>> lvresize -l 100%VG /dev/elastic_drive/content</p>
<p>And lastly, expand the filesystem to fill the logical volume (note that the path is to the mounted volume, not to the device):</p>
<p>> xfs_growfs -d /var/content</p>
<p>Now let&#8217;s check our work:</p>
<p>df -h</p>
<p>Our giant drive should show up as /dev/mapper/elastic_drive-content, with a total capacity equal to the sum of the capacity of the three individual drives.</p>
<p>That was nice and easy, but it&#8217;ll only work for so long, as Amazon currently limits each customer to 20 volumes. Assuming that you haven&#8217;t made each of your drives the maximum size (currently 1 TB), you can utilize a lot more space before having to beg Amazon for special treatment.</p>
<p>The easiest way to expand the capacity of your existing drives is to take advantage of Amazon&#8217;s snapshot feature. Amazon allows you to take a snapshot of an EBS drive at any time, automatically storing it to S3. The transfer cost to S3 is free, but you will be charged for the S3 storage space at the standard rate. Once you&#8217;ve created a snapshot, you can restore it to your drive at any time. However, you can also restore that snapshot to a new, larger drive, which is what we&#8217;re going to do here. The downside to this method is that it requires taking down your filesystem. That&#8217;s simply not an option for some people, but if you don&#8217;t mind some downtime, this is definitely the easiest way to expand a single EBS volume.</p>
<p>First, unmount your filesystem.</p>
<p>> umount /var/content</p>
<p>Now set the logical volume to inactive. This is more just a safeguard to make sure that nothing can mount or modify anything on the elastic drive while we&#8217;re expanding it.</p>
<p>> lvchange -an /dev/elastic_drive/content</p>
<p>Now open up ElasticFox and go to the Volumes and Snapshots tab. Find the volume you wish to replace, make a snapshot of it, and then detach it. You can either delete it now or wait until later if you want to be extra-safe (your data is already backed up in the snapshot). Now create a new volume from the snapshot you just took, making sure to specify your new, larger size, and attach it back to your machine at the same point as the old one. (As stated earlier, it&#8217;s probably not 100% necessary to reattach at the same point, but I&#8217;m not willing to say that for sure.)</p>
<p>Back in your ssh window, you should now be able to look for and find all of your physical volumes.</p>
<p>> pvs</p>
<p>At this point, you can go ahead and set the logical volume back to active and remount the drive in order to minimize downtime:</p>
<p>> lvchange -ay /dev/elastic_drive/content<br />
> mount /dev/elastic_drive/content /var/content</p>
<p>Unfortunately, the physical volume on the new drive is still the same size. That&#8217;s because we have to explicitly tell it to grow into the new space:</p>
<p>> pvresize /dev/sdd</p>
<p>Since this new drive was created from a snapshot of the old one, it&#8217;s already a member of the volume group, so we don&#8217;t have to make any changes there. However, we do still have to expand the logical volume and the filesystem to take up the rest of the space:</p>
<p>> lvresize -l 100%VG /dev/elastic_drive/content<br />
> xfs_growfs -d /var/content</p>
<p>That&#8217;s it! To check our work, we can run:</p>
<p>> df -h</p>
<p>So that was pretty easy, but what do we do if it&#8217;s entirely unacceptable to take the filesystem down? The answer to that question is only slightly more complex, but it&#8217;s a good bit more time-intensive. Even though we&#8217;ve used LVM to configure our multiple physical drives as one logical one, LVM provides facilities to guarantee that a particular physical volume is no longer in use (and therefore safe for removal). In order to clear off a volume, however, we have to first have enough unallocated space available in the volume group to be able to hold all of the data from the physical volume that we wish to remove. The easiest way to accomplish that is to go ahead and create a new EBS drive and add it to the volume group, so go to ElasticFox and create and attach a new drive that&#8217;s equal to the amount of space you want to add PLUS the size of the drive you&#8217;re going to remove. For example, if you want to add 100 GB worth of space, but you&#8217;re going to remove a 50 GB drive in the process, your new drive needs to be 150 GB.</p>
<p>Once the new drive is attached, we need to set it up for use by LVM. That means creating a physical volume on it and then adding it to the volume group.</p>
<p>> pvcreate /dev/sdd<br />
> vgextend elastic_drive /dev/sdd</p>
<p>It&#8217;s important to note that we DO NOT want to extend our logical volume onto the new physical volume just yet. Right now, we need that unallocated space in order to clear off the drive we&#8217;re going to remove.</p>
<p>Now we&#8217;re ready to clear off the old drive using pvmove. If you&#8217;re curious to know more about how this works, the pvmove man page is really good.</p>
<p>> pvmove /dev/sdb</p>
<p>When I tried pvmove the first time, I got this error: &#8220;mirror: Required device-mapper target(s) not detected in your kernel.&#8221; This is because pvmove uses the device mapper mirroring module, which isn&#8217;t loaded by default. If you get the same error, try loading that module and trying again.</p>
<p>> modprobe dm-mirror<br />
> pvmove /dev/sdb</p>
<p>Now that our physical volume is empty, we can remove it from the volume group:</p>
<p>> vgreduce elastic_drives /dev/sdb</p>
<p>Note that if you try to call vgreduce on a volume that isn&#8217;t empty, it will NOT get removed. Instead, you&#8217;ll get a warning telling you that the physical volume is still in use. This should give you some peace of mind, as you can rest assured that vgreduce won&#8217;t mess with the integrity of your data.</p>
<p>At this point, /dev/sdb is ready to be repurposed onto something else, or destroyed altogether. If you&#8217;re planning on adding it to another volume group, it&#8217;s ready to be added using the vgextend command. If you plan to use it as a &#8220;regular&#8221; drive, you&#8217;ll first need to remove the physical volume information from it using pvremove. However, if you&#8217;re planning on just destroying the volume, all you need to do is go to ElasticFox, detach the volume, and delete it. It should be noted that deleting the EBS volume does not destroy any snapshots that were made from it. This is a good thing, as those snapshots are still a vital part of any backups you&#8217;ve made. Should you need to restore your drive from an older point, you can always restore one of those snapshots to another drive.</p>
<p>So far, we&#8217;ve added our replacement EBS volume, copied some data over to it, and removed/destroyed the volume that we&#8217;re replacing. However, we haven&#8217;t actually upped the capacity of our logical volume and filesystem, which was the whole point of this exercise in the first place. Let&#8217;s do that now.</p>
<p>> lvresize -l 100%VG /dev/elastic_drive/content<br />
> xfs_growfs -d /var/content</p>
<p>And finally, we can check our work for that last bit of reassurance:</p>
<p>> df -h</p>
<h2>Backup Strategies</h2>
<p>Thus far, we&#8217;ve put a lot of effort into creating a flexible, expandable, and accessible file storage device, but there are still three key attributes that we need to address before our drive is ready to use: performance, redundancy, and recovery. I&#8217;m moving forward with the assumption that performance of the drive itself is already about as good as it&#8217;s going to get. Behind the scenes, Amazon has to be using some pretty hefty hardware, and there&#8217;s probably some degree of striping going on as well. Anything we do on top of that is going to introduce a good bit of complexity, and probably won&#8217;t yield much, if any, performance gain. Certainly we could run some benchmarks to validate or refute those claims, but at this point in time, I don&#8217;t see the need.</p>
<p>Redundancy is also something that we&#8217;re leaving up to Amazon. As they state in their description of EBS, &#8220;Because Amazon EBS servers are replicated within a single Availability Zone, mirroring data across multiple Amazon EBS volumes in the same Availability Zone will not significantly improve volume durability.&#8221; As such, it&#8217;s hard to envision any scenario in which mirroring (or other forms of redundancy like RAID 5) would be worth the trouble. If you disagree with my assessment, there are several tutorials out there that describe combining LVM and various flavors of RAID.</p>
<p>The third item that merits discussion is recovery, and that&#8217;s definitely something that requires a plan. Amazon has a nice snapshotting feature in place that makes backing up single EBS volumes quick, easy, and inexpensive, but it fails to account for situations like ours, where multiple EBS volumes are directly tied together. Fortunately, we can still take advantage of the EBS snapshots if we do a little bit of legwork before and after.</p>
<p>The reason that we can&#8217;t rely on random snapshots taken from our EBS drives is because those snapshots are from different points in time, and the filesystem could have been in a different state at each of those points. Therefore, restoring your EBS drives from snapshots taken even a fraction of a second apart could potentially result in unstable behavior. However, there&#8217;s no way to guarantee that multiple snapshots are taken at the same time, so if we&#8217;re going to use the Amazon snapshot feature, we need to first figure out a way to guarantee that our filesystem remains stable and unchanged across those snapshots. Fortunately, XFS includes a way to make such a guarantee.</p>
<p>XFS includes a utility to &#8220;freeze&#8221; the filesystem at a given point in time. When a filesystem is frozen, all writes that were ongoing before the freeze happened are forced to finish, and all writes that are initiated after the freeze are blocked until the filesystem is &#8220;thawed.&#8221; Any thread attempting to write to the frozen filesystem will simply block until it&#8217;s allowed to complete. From a data integrity standpoint, this is just as safe as unmounting the filesystem, and from an application standpoint, it&#8217;s much, much better, as applications will now just wait for the filesystem to be available again rather than throwing errors because it appears to be missing.</p>
<p>So now, making our backups becomes a relatively simple process. First, freeze the filesystem:</p>
<p>> xfs_freeze -f /var/content</p>
<p>Next, go to ElasticFox and take a snapshot of each elastic drive.</p>
<p>Now go back to your terminal and thaw the filesystem:</p>
<p>> xfs_freeze -u /var/content</p>
<p>A couple of things to point out here:</p>
<p>1) LVM also has a snapshot feature, but it doesn&#8217;t really buy us anything. It requires setting up a second logical volume as a mirror that&#8217;s equal in size to the volume we want to back up. Beyond being a giant pain, we&#8217;d still also need a way to actually save the snapshots, and that would presumably involve S3. So the end result would be that we&#8217;re using twice as much disk space and a significantly more complex setup in order to back up our data to the same place.</p>
<p>2) There is a bit of complexity to restoring from this backup scenario, as you now have multiple snapshots (one for each volume) that represent a single backup. When you do a restore, you&#8217;ll have to make sure that you restore all of the snapshots back to the correct drives. This is pretty easy to do at first, as each snapshot includes the Volume ID representing the volume from which it was taken. However, should you ever replace one volume with a new one (as demonstrated in one of the growth strategies), the Volume ID on the snapshot will no longer correspond to the volume that it represents. Therefore, it&#8217;s imperative that, whenever you &#8220;replace&#8221; a volume, you keep a mapping of the old and new Volume IDs somewhere.</p>
]]></content:encoded>
			<wfw:commentRss>http://scorm.com/blog/2009/03/scalable-storage-using-amazons-elastic-block-store/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tests like these&#8230;</title>
		<link>http://scorm.com/blog/2009/01/tests-like-these/</link>
		<comments>http://scorm.com/blog/2009/01/tests-like-these/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 14:18:00 +0000</pubDate>
		<dc:creator>tim.martin</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[SCORM Engine]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://beta.scorm.com/blog/2009/01/tests-like-these/</guid>
		<description><![CDATA[Tests like these are why you buy the SCORM Engine. &#8220;What is that?&#8221; you might ask. This is a dashboard widget that we maintain on our big screens in the two offices. Anytime you walk through the common space, you get a quick look at this dashboard. Each row here represents a fundamentally important automated [...]]]></description>
			<content:encoded><![CDATA[<p>Tests like these are why you buy the SCORM Engine.</p>
<p><a href="http://www.scorm.com/wp-content/assets/blogsupportfiles/uploaded_images/cruisecontrolbuilds-755422.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" rel="lightbox[2507]"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 209px;" src="http://www.scorm.com/wp-content/assets/blogsupportfiles/uploaded_images/cruisecontrolbuilds-755411.jpg" border="0" alt="" /></a>&#8220;What is that?&#8221; you might ask.  This is a dashboard widget that we maintain on our big screens in the two offices.  Anytime you walk through the common space, you get a quick look at this dashboard.  Each row here represents a fundamentally important automated test of the SCORM Engine.  Green is good news; pink is bad.  (Truth be told, I&#8217;ve been waiting several days to catch some portion of this screen pink.  Things are very stable around here right now, and I thought an &#8220;all green&#8221; dashboard was a bit contrived.  Further truth be told, catching this screen shot half pink <span style="font-style: italic;">might </span>be retaliation for David eating my ice cream yesterday.)</p>
<p><span id="more-2507"></span></p>
<p>Over the summer, Andrew, our intern, spent his time automating the SCORM test suites.  SCORM test suites are anything but fun the first time, and going through them over and over is torture.  We&#8217;ve done this plenty of times (as has Andrew) and it&#8217;s time-consuming enough that no one does it as often as they should.  Our response?  Automation.</p>
<p>The tests listed in the screen shot are run on different periods, but each confirms the current health of various versions of the SCORM Engine.  2008.1.x references are to the currently released product.  &#8220;Trunk&#8221; references are to our forward-looking development.  And you can also catch a glimpse here of the fact that we&#8217;re already testing against SCORM 2004 4th Edition, which is still in beta.  Those who are perceptive will likely notice that last night, all of the Java tests failed.  This is because we&#8217;re doing a bit of internal restructuring and we broke them.  And you know what?  That&#8217;s <span style="font-style: italic;">OK</span>, because we immediately <span style="font-style: italic;">know </span>that they&#8217;re broken, and David and crew will spend time today <span style="font-style: italic;">fixing </span>them.</p>
<p>Would you or your organization <span style="font-style: italic;">ever </span>take the time to create an automated testing platform like this?  Maybe.  Would you do so for the vagaries of the SCORM test suites?  Would that be an effective use of your time?  I doubt it.  Most development shops would make a reasonable effort to test this stuff&#8230; once, when they create it, and hopefully again before they send it off for certification.  Would they take the time, then, to test it monthly?  Or before each release?  As you see here, the SCORM Engine is being tested, in all of its flavors, <span style="font-style: italic;">every single day</span>.  This is not just a confirmation that it builds, either, this is a full fledged run through the entirety of the SCORM test suite.</p>
<p>Even at its best, SCORM is touchy.  Things break, content can be bad, there are plenty of ways for things to go wrong.  You need to know the quality of your delivery platform, whether you buy it from us or build it yourself.  <span style="font-style: italic;">Tests like these are why you buy the SCORM Engine.</span></p>
<p><span style="font-style: italic;">Update, 1/23/09: </span><span>If you want to get developers in a tizzy, post a picture that shows their stuff is broken.  12 hours later, you get a completely green dashboard.</span></p>
<p><a href="http://www.scorm.com/wp-content/assets/blogsupportfiles/uploaded_images/ccgreen-724171.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" rel="lightbox[2507]"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 191px;" src="http://www.scorm.com/wp-content/assets/blogsupportfiles/uploaded_images/ccgreen-724162.jpg" border="0" alt="" /></a><br />
<span style="font-style: italic;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://scorm.com/blog/2009/01/tests-like-these/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convert C# to Java Source Code</title>
		<link>http://scorm.com/blog/2007/08/convert-c-to-java-source-code/</link>
		<comments>http://scorm.com/blog/2007/08/convert-c-to-java-source-code/#comments</comments>
		<pubDate>Fri, 17 Aug 2007 20:22:00 +0000</pubDate>
		<dc:creator>mike.rustici</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://beta.scorm.com/blog/2007/08/convert-c-to-java-source-code/</guid>
		<description><![CDATA[The users of our SCORM Engine predominantly run their LMS&#8217;s on the Windows platform. To best serve their needs we coded the SCORM Engine using C# on the ASP.NET platform. We&#8217;ve long known that we were ignoring the significant population of customers who prefer to develop using Java and deploy to Linux (or any other [...]]]></description>
			<content:encoded><![CDATA[<p>The users of our SCORM Engine predominantly run their LMS&#8217;s on the Windows platform. To best serve their needs we coded the SCORM Engine using C# on the ASP.NET platform. We&#8217;ve long known that we were ignoring the significant population of customers who prefer to develop using Java and deploy to Linux (or any other non-Microsoft platform). We investigated several solutions for supporting these customers and came up with some okay alternatives that allowed us to fulfill the customer need, but they all had one shortcoming or another. Back in November we embarked on an ambitious project to convert the SCORM Engine from C# to Java&#8230;.automatically. We tapped the expertise of Kevin Glynn to develop a tool which automatically converts C# source code to Java source code and I&#8217;m proud to announce that it is complete. We now have a tool capable of translating C# to Java at the source code level. This tool will allow us to support both major platforms concurrently while only maintaining a single code base and still providing full source code to our clients. Initial tests show that the Java version of the SCORM Engine performs comparably to the .Net version and in some cases is even faster. The technology is amazing and we may offer it to others in the future. For now it is just an internal tool, but if you have an interest in it, please let us know as we are batting around the idea of commercializing it or releasing it as an open source product. <a href="http://www.cs2j.com">More info available here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://scorm.com/blog/2007/08/convert-c-to-java-source-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

