<?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>HackRunner</title>
	<atom:link href="http://www.hackrunner.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hackrunner.com</link>
	<description>Bits, Bytes, and Long Runs</description>
	<lastBuildDate>Mon, 16 Apr 2012 01:23:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Installing Nexus on Ubuntu 11.10 and Tomcat 6 Part 2</title>
		<link>http://www.hackrunner.com/2012/04/installing-nexus-on-ubuntu-11-10-and-tomcat-6-part-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installing-nexus-on-ubuntu-11-10-and-tomcat-6-part-2</link>
		<comments>http://www.hackrunner.com/2012/04/installing-nexus-on-ubuntu-11-10-and-tomcat-6-part-2/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 00:58:10 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[nexus]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=385</guid>
		<description><![CDATA[In Part 1 of this post, I covered performing a basic installation of Nexus in a Tomcat servlet container on Ubuntu 11.10.  Now I&#8217;m going to cover the details of configuring Nexus. Nexus is a repository that can be used with tools such as Maven to index and store artifacts for dependency management across projects.  I like to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.hackrunner.com/wp-content/uploads/2012/04/nexus2.png"><img class="alignleft  wp-image-425" title="Nexus" src="http://www.hackrunner.com/wp-content/uploads/2012/04/nexus2.png" alt="Nexus" width="72" height="78" /></a>In <a title="Installing Nexus on Ubuntu 11.10 and Tomcat 6 Part 1" href="http://www.hackrunner.com/2012/04/installing-nexus/">Part 1</a> of this post, I covered performing a basic installation of Nexus in a Tomcat servlet container on Ubuntu 11.10.  Now I&#8217;m going to cover the details of configuring Nexus.</p>
<p><a title="Sonatype Nexus" href="http://www.sonatype.org/nexus/">Nexus</a> is a repository that can be used with tools such as <a title="Apache Maven" href="http://maven.apache.org/">Maven</a> to index and store artifacts for dependency management across projects.  I like to use the Nexus/Maven combo for three main reasons:</p>
<ol>
<li>Storing Versions of My Own Artifacts &#8211; I try to do all my Java builds in Maven these days.  This means that all my projects always have a standard lifecycle and release procedures.  I can commit my code to SVN, but its also nice to have a repository to store my compiled artifacts.  Nexus fills this job, allowing me to deploy all versioned projects to the central repository, accessible from all of my machines.  Additionally, the repository makes all these versioned artifacts available as dependencies for any of the other projects I work with.</li>
<li>Proxying Other Repositories &#8211; When you work with Java Maven projects, you&#8217;ll get pretty used to Maven &#8220;downloading the internet&#8221; the first time you build a particular project on a machine.  This is Maven getting all the dependencies and transitive dependencies required to build your project.  It might take a little while, but its far better than trying to manage all those dependencies yourself.  This step is often dependent on external repositories outside of my control, however.  The external repositories may gone down (but rarely), and it is common for these repositories to eventually remove old versions of artifacts or reorganize their repositories.   Proxying a repository means that my Maven builds will always fetch artifacts from my Nexus repository first.  If Nexus can&#8217;t find the artifact, it will download it from the external repository, but it will store it locally so future requests do not depend on the external repository.  This means that the artifacts I use never go away, and the process is much faster since I only need to retrieve artifacts from my own repository in most cases.</li>
<li>Hosting 3rd Party Artifacts &#8211; There are times when I use a jar, but the jar isn&#8217;t readily available in a Maven repository somewhere.  I try to avoid just adding those jars to SVN.  Instead, I&#8217;ll upload the artifacts to Nexus and I can access them as needed via standard Maven builds.</li>
</ol>
<p><span id="more-385"></span></p>
<h2>Cleaning up Nexus</h2>
<p>First things first.  Nexus gives you a pretty nice setup out of the box, but there&#8217;s a few auto-configured repositories I simply don&#8217;t want.  The first of these is the shadow repository.</p>
<p>For compatibility purposes, Nexus will allow you to shadow another repository as a different format.  i.e. you can make your Maven 2 repo look like a Maven 1 repo.  I don&#8217;t use Maven 1, so the shadow repository is the first thing to go.  To do this, simply log in as the admin user, click on Repositories on the left side, then select the shadow repository and hit Delete on the toolbar.</p>
<p>Nexus also automatically sets up Proxies to a few locations on the web.  Maven central is a key repo to proxy, so I&#8217;ll leave that alone.  There are default proxies set up for Apache Snapshots and Codehaus Snapshots however.  I prefer not to use snapshot jars, so I&#8217;m going to remove these.  Using the steps detailed below, you can easily add them back later.</p>
<p>Nexus also comes pre-configured with a Public group, which groups together several proxies.  I&#8217;m going to create my own group later with the permissions I want, so the group is the last thing to go.</p>
<p>I&#8217;m now left with 1 proxy repository to Maven central and 3 hosted repositories for releases, snapshots, and 3rd party jars.  This is a pretty clean canvas to work on, so I&#8217;ll move on to setting up a few more proxy repositories next.</p>
<h2>Creating Proxy Repositories</h2>
<p>As I mentioned above, Nexus comes pre-configured with a proxy to Maven Central.  This will give you access to almost all dependencies you&#8217;ll ever need, but you may find yourself in a situation where you&#8217;d like to get artifacts from a repository other than central.  In my case, I&#8217;ve often used artifacts from <a href="http://fusesource.com/">Fusesource</a>.  These guy provide commercial support for several Apache products and do an excellent job bundling more frequent releases of the Apache projects to address bug issues.</p>
<p>Fusesource provides all their artifacts via a Maven repository, so I&#8217;m going to set up Nexus with a proxy to their repository.</p>
<p>Creating a proxy is pretty easy, just go to Repositories on the left side of Nexus and then click Add and choose Proxy Repository.  Fill out the following fields, the rest can be left as defaults.</p>
<ul>
<li>Repository ID &#8211; I used fusesource, this name is used in the URL for the repository</li>
<li>Repository Name &#8211; I again used fusesource, this is the display name for the repo in Nexus</li>
<li>Remote Storage Location &#8211; Use the URL of the remote Maven repository you will proxy, for Fusesource it&#8217;s http://repo.fusesource.com/maven2/</li>
</ul>
<p>The rest of the settings can be left as defaults.  It should look something like the screenshot below when you&#8217;re done.</p>
<div id="attachment_387" class="wp-caption aligncenter" style="width: 655px"><a href="http://www.hackrunner.com/wp-content/uploads/2012/04/proxy.png"><img class=" wp-image-387  " title="Nexus Proxy Repository" src="http://www.hackrunner.com/wp-content/uploads/2012/04/proxy-1024x792.png" alt="Nexus Proxy Repository" width="645" height="499" /></a><p class="wp-caption-text">Nexus Proxy Repository</p></div>
<h2>Creating Nexus Groups</h2>
<p>I&#8217;m also going to use Nexus to host Snapshots and Releases of my own artifacts and upload 3rd party artifacts that I can&#8217;t find hosted anywhere else.  Fortunately, Nexus&#8217;s defaults for these repositories are OK by me.</p>
<p>Breaking things down by repository is nice, but at the end of the day, I want the simplest Maven configuration possible to access the artifacts in my repositories.  Nexus&#8217;s concept of groups is a great way to simplify a complex repository storage scheme.</p>
<p>The general idea with groups is that a Group is a super-repo that consists of all the contents of multiple repos.  My preferred setup is to have one group that encapsulates all the repositories I use.  In this way, my Maven configuration simply ends up being one mirror that mirrors all repositories (more on this at the end of this post).</p>
<p>Creating a group only requires a few short steps.  First go the the Repositories Nexus Page, click Add on the menu at the top, then choose Repository Group.</p>
<p>Fill out the following fields:</p>
<ul>
<li>Group ID: the ID of the group that will be used in the URL (I used allrepos)</li>
<li>Group Name: the display name that will be used inside Nexus (I used allrepos)</li>
<li>Provider: choose Maven2</li>
<li>Publish URL: choose True</li>
</ul>
<p>You then want to add all the repositories that the group should use in a prioritized order.  Repos at the top of the list will override other repos at the bottom of the list if there is a collision.  I use my All Repos group to group all my repositories, and I make sure that the repos I manage are at the top of the list.</p>
<div id="attachment_394" class="wp-caption aligncenter" style="width: 566px"><a href="http://www.hackrunner.com/wp-content/uploads/2012/04/groupconfig.png"><img class=" wp-image-394 " title="Nexus Group Configuration" src="http://www.hackrunner.com/wp-content/uploads/2012/04/groupconfig.png" alt="Nexus Group Configuration" width="556" height="447" /></a><p class="wp-caption-text">Nexus Group Configuration</p></div>
<h2>Securing Nexus</h2>
<p>I am using Nexus exclusively on my home network, so securing it is not vital, but you may want to make it so only authorized users can access your Nexus repository.  I am going to setup Nexus to disable anonymous access and require authenticated users to view and interact with repos.</p>
<p>First up, I&#8217;m going to remove the anonymous access.  To do this, I went to the Security panel on the left and chose Users.  I then selected the anonymous user, changed the Status to disabled and hit Save.  While I was at it, I also disabled the default &#8220;deployment&#8221; user, as I&#8217;ll be creating my own account with similar permissions.</p>
<p>Next up is setting up the permissions to my repositories.  Nexus can be a bit of a pain to configure, but the model is pretty easy to follow.  Nexus has a set of defined Privileges, which enumerate individual permissions such as Read/Write on a Repo, or searching in the web interface.   There are then Roles which combine sets of Privileges together into more manageable chunks.  Roles can also be nested within each other.</p>
<p>The first thing I&#8217;m going to do is set up privileges for the repos that I&#8217;ll be working with.  These repos are the repos I would typically deploy to (3rd party, release, snapshot), and the new All Repos group that I created.  (Note Nexus uses &#8220;All Repositories&#8221; in its built-in privileges to distinguish a privilege that works on all repositories in Nexus.  Make sure you distinguish this from the All Repos group I created [bad naming on my part]).</p>
<p>For each one of these, I went to the Privileges screen and chose Add Repository Target Privilege.  I then filled out a Name, Description, and chose the given Repository.  For Repository Target, I left things to All, implying that this includes all artifacts and data in the repository.  Adding these Privileges creates a set of CRUD (create,read,update,delete) privileges for each repository which you can now use to create a larger role.</p>
<p>I&#8217;m going to create two Roles, developer and deployer.  It&#8217;s intended that developer will be able to use Nexus in read only mode, while the deployer will also be able to add artifacts to the repository.</p>
<p>Creation of Roles is done via the Roles page under the Security Menu.  Simply go to the page and click add.  You&#8217;ll have to add a role id, name, and description, similar to all other entities in Nexus.</p>
<p>For my developer (read only) Role, I added the following Privileges.</p>
<ul>
<li>Nexus Developer Role (I piggy back off Nexus&#8217;s predefined role to give this role the general privileges to log in to nexus and view repositories).</li>
<li>All Repos &#8211; (view)</li>
<li>All Repos Group &#8211; (read)</li>
</ul>
<div>Note that I only gave read permissions to the All Repos group that I set up.  This is because a developer only needs to download artifacts from the repository, and All Repos already has all the artifacts the developer would need.  (view) is a default Privilege that Nexus sets up that allows a user to view a repo within Nexus, while the (read) Privilege is part of the CRUD set which relates back to REST calls on the repository.  Essentially, (read) allows you to download artifacts from the repository.</div>
<div></div>
<div>For my deployer (read/write) Role, I added the following Privileges.</div>
<div>
<ul>
<li>Nexus Developer Role (I piggy back off Nexus&#8217;s predefined role to give this role the general privileges to log in to nexus and view repositories).</li>
<li>All Repos &#8211; (view)</li>
<li>All Repos Group &#8211; (read)</li>
<li>3rd Party &#8211; (create,delete,read,update,view)</li>
<li>Releases &#8211; (create,delete,read,update,view)</li>
<li>Snapshots &#8211; (create,delete,read,update,view)</li>
<li>Artifact Upload</li>
</ul>
<div>This user has a bunch of additional Privileges when compared to the developer Role i created.  When this type of user gets artifacts, it will still be via the All Repos group, so read only access is still the only thing required there.  When the user deploys or modifies artifacts, however, he/she will need read/write privileges on the destination repos.  I also added the Artifact Upload Privilege which enables a nice tool to upload artifacts directly with the Nexus UI.</div>
</div>
<div></div>
<div>The last step in securing Nexus is to add users.  I&#8217;m going to add one deployer User (myself) and a test developer User just to make sure I&#8217;ve got it configured correctly.</div>
<div></div>
<div>You can  add users via the Security &gt; User page. Make sure you fill out</div>
<div>
<ul>
<li>User ID &#8211; the login id to use</li>
<li>Email &#8211; for password resets and stuff</li>
<li>Active &#8211; make this Active</li>
<li>Password/Confirm Password &#8211; The password for this account</li>
<li>Roles &#8211; The roles to add.</li>
</ul>
<div>Since I&#8217;ve created high level roles, my Deployer User gets simply the Deployer Role, and my Developer User get simply the Developer Role.</div>
</div>
<div id="attachment_398" class="wp-caption aligncenter" style="width: 524px"><a href="http://www.hackrunner.com/wp-content/uploads/2012/04/Users.png"><img class=" wp-image-398  " title="Nexus Configuring Users" src="http://www.hackrunner.com/wp-content/uploads/2012/04/Users.png" alt="Nexus Configuring Users" width="514" height="417" /></a><p class="wp-caption-text">Nexus Configuring Users</p></div>
<p>A quick test of the security scheme is probably in order.  Here&#8217;s a few quick steps to make sure everything is working.</p>
<ul>
<li>Log out of Nexus &#8211; You should see a warning saying &#8220;Warning: Could not retrieve Nexus status, anonymous access might be disabled.&#8221;  This ensures anonymous access was disabled.</li>
<li>Log in as the Developer User &#8211; You should be able to navigate to the repositories and see only the All Repos group.</li>
<li>Log in as the Deployment User &#8211; You should be able to navigate to the repositories and see the All Repos group as well as 3rd Party, Releases, and Snapshots repos.  Additionally, you should see the option to upload artifacts to 3rd Party, Releases, and Snapshots.</li>
</ul>
<h2>Configuring Maven and Testing It All Out</h2>
<p>The server side of nexus is now configured, but you&#8217;ll still need to configure each of your machines so that they are aware of Nexus.  Maven handles configuration via a settings.xml file in the .m2 directory in your user home directory.  On linux/unix this would typically be something like /home/tom/.m2/settings.xml and on Windows you might see something like C:\Users\tom\.m2\settings.xml.</p>
<p>As I mentioned previously, the single Group makes configuration pretty simple.  I&#8217;m just going to set up a mirror entry in my configuration that says for all repos ever defined, always go through my personal Nexus mirror.  Since I password protected my Nexus group, I&#8217;ll also need to specify the login/password to use when connecting to the repo.  My settings.xml file looks like this:</p>
<pre class="brush:xml">&lt;settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
  http://maven.apache.org/xsd/settings-1.0.0.xsd"&gt;
    &lt;mirrors&gt;
        &lt;mirror&gt;
            &lt;id&gt;home&lt;/id&gt;
            &lt;name&gt;Home Mirror&lt;/name&gt;
            &lt;url&gt;http://nexus.my.home/content/groups/allrepos&lt;/url&gt;
            &lt;mirrorOf&gt;*&lt;/mirrorOf&gt;
        &lt;/mirror&gt;
    &lt;/mirrors&gt;
    &lt;servers&gt;
        &lt;server&gt;
            &lt;id&gt;home&lt;/id&gt;
            &lt;username&gt;tom&lt;/username&gt;
            &lt;password&gt;mypass&lt;/password&gt;
        &lt;/server&gt;
        &lt;server&gt;
            &lt;id&gt;releases&lt;/id&gt;
            &lt;username&gt;tom&lt;/username&gt;
            &lt;password&gt;mypass&lt;/password&gt;
        &lt;/server&gt;
        &lt;server&gt;
            &lt;id&gt;snapshots&lt;/id&gt;
            &lt;username&gt;tom&lt;/username&gt;
            &lt;password&gt;mypass&lt;/password&gt;
        &lt;/server&gt;
        &lt;server&gt;
            &lt;id&gt;thirdparty&lt;/id&gt;
            &lt;username&gt;tom&lt;/username&gt;
            &lt;password&gt;mypass&lt;/password&gt;
        &lt;/server&gt;
    &lt;/servers&gt;
&lt;/settings&gt;</pre>
<p>There are a few important things to note in this config.</p>
<ul>
<li>The URL of your mirror should match the URL of the group you created in Nexus.  You can find it by looking at the Repositories page in Nexus.</li>
<li>The id of your mirror should correspond to the id of a server where you specify your login/password for the mirror (I used home).</li>
<li>You should have server entries for each of the repos you may eventually deploy too.</li>
<li>The username/password should match the username password of a user you create in Nexus that at least has read privileges to the group.</li>
</ul>
<p>To make sure that I&#8217;ve got everything configured correctly, I&#8217;m going to walk through the standard process of creating a project from a maven archetype, building it, and deploying it.  First though, I want to start from a clean slate with my Nexus repo, so I delete everything in the .m2/repository directory.</p>
<p>I then switched to a temporary directory and ran the following command:</p>
<pre class="brush:bash">mvn archetype:generate -DgroupId=home.my.scratch -DartifactId=HelloWorld -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false</pre>
<p>This creates a simple  project.  You should note that when downloading all the required dependencies, Maven actually uses the URL of the All Repos group and not Maven Central.</p>
<p>Before we begin, I&#8217;m going to modify the project, and add a distributionManagement element specifying that snapshots should be deployed to my snapshot repo, and releases should be deployed to my releases repo.  To do this I modified the pom.xml in the project and added the following:</p>
<pre class="brush:xml">&lt;distributionManagement&gt;
  &lt;repository&gt;
    &lt;id&gt;releases&lt;/id&gt;
    &lt;name&gt;Releases&lt;/name&gt;
    &lt;url&gt;http://nexus.my.home/content/repositories/releases/&lt;/url&gt;
    &lt;layout&gt;default&lt;/layout&gt;
  &lt;/repository&gt;
  &lt;snapshotRepository&gt;
    &lt;id&gt;snapshots&lt;/id&gt;
    &lt;name&gt;Snapshots&lt;/name&gt;
    &lt;url&gt;http://nexus.my.home/content/repositories/snapshots/&lt;/url&gt;
    &lt;layout&gt;default&lt;/layout&gt;
  &lt;/snapshotRepository&gt;
&lt;/distributionManagement&gt;</pre>
<p>Note how the id&#8217;s used match up to the ids specified in settings.xml.  Maven will use this to determine the password to use when deploying artifacts.  The URLs should also match the URLs of the individual repos (not the group) in Nexus.</p>
<p>Next up, run install the project to your local repo to make sure it compiles.</p>
<pre class="brush:bash">mvn install</pre>
<p>The project should build successfully.  Now you can deploy the project, which is currently in snapshot mode.</p>
<pre class="brush:bash">mvn deploy</pre>
<p>If the deployment was successful, you&#8217;ll see a message in the console saying your artifact was uploaded to the URL of your snapshot repository.  You should be able to go to Nexus now, browse the Snapshot repository, and see your newly deployed artifact.  This will confirm that you can deploy to the Snapshot repository.</p>
<p>I now want to test deployment to the Release repository.  To do this, I simply go into the pom.xml and update the version from 1.0-SNAPSHOT to 1.0.  The I deploy the artifact again.</p>
<pre class="brush:bash">mvn deploy</pre>
<p>If the deployment was successful, you&#8217;ll see a message in the console saying your artifact was uploaded to the URL of your release repository this time.  You should be able to go to Nexus now, browse the Release repository, and see your newly deployed artifact.  This will confirm that you can deploy to the Release repository.</p>
<p>At this point everything is working.  You may want to go into Nexus and delete the artifacts that you have uploaded as part of the test.  From here on it, you can use Nexus to manage your dependencies.  If I get a chance, I may add a Part 3 to this article soon discussing some of the maintenance jobs and additional configuration options you may want to turn on in Nexus.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2012/04/installing-nexus-on-ubuntu-11-10-and-tomcat-6-part-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Places Where My Cat Shouldn&#8217;t Be: On the Rafters</title>
		<link>http://www.hackrunner.com/2012/04/places-where-my-cat-shouldnt-be-on-the-rafters/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=places-where-my-cat-shouldnt-be-on-the-rafters</link>
		<comments>http://www.hackrunner.com/2012/04/places-where-my-cat-shouldnt-be-on-the-rafters/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 17:13:46 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Places My Cat Shouldn't Be]]></category>
		<category><![CDATA[cat]]></category>
		<category><![CDATA[izzy]]></category>
		<category><![CDATA[rafters]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=408</guid>
		<description><![CDATA[I just need to do some final proof-reading on Part 2 of the Nexus/Maven post, but in the man time, here&#8217;s another place my cat shouldn&#8217;t be.  In the rafters of the family room this time.]]></description>
			<content:encoded><![CDATA[<p>I just need to do some final proof-reading on Part 2 of the Nexus/Maven post, but in the man time, here&#8217;s another place my cat shouldn&#8217;t be.  In the rafters of the family room this time.</p>
<div id="attachment_409" class="wp-caption aligncenter" style="width: 562px"><a href="http://www.hackrunner.com/wp-content/uploads/2012/04/izzy-rafters.jpg"><img class="size-full wp-image-409" title="Cat in the Rafters" src="http://www.hackrunner.com/wp-content/uploads/2012/04/izzy-rafters.jpg" alt="Cat in the Rafters" width="552" height="736" /></a><p class="wp-caption-text">Izzy in the Rafters</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2012/04/places-where-my-cat-shouldnt-be-on-the-rafters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Nexus on Ubuntu 11.10 and Tomcat 6 Part 1</title>
		<link>http://www.hackrunner.com/2012/04/installing-nexus/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installing-nexus</link>
		<comments>http://www.hackrunner.com/2012/04/installing-nexus/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 11:37:29 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[nexus]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=362</guid>
		<description><![CDATA[I&#8217;ve used Maven and Nexus at work quite extensively, and since I&#8217;ve become familiar with the tooling, I&#8217;ll never go back.  When using a mature language like Java that has an expansive ecosystem, dependency management is a must.  Maven has its rough edges, but it does get the job done, and I&#8217;ve always been pleasantly surprised with how easy it is [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve used <a title="Apache Maven" href="http://maven.apache.org">Maven</a> and <a title="Sonatype Nexus" href="http://www.sonatype.org/nexus/">Nexus</a> at work quite extensively, and since I&#8217;ve become familiar with the tooling, I&#8217;ll never go back.  When using a mature language like Java that has an expansive ecosystem, dependency management is a must.  Maven has its rough edges, but it does get the job done, and I&#8217;ve always been pleasantly surprised with how easy it is to use Nexus and how little maintenance it really requires.</p>
<p>I&#8217;m planning on doing a bit more Java development at home, and I&#8217;d like to have my own Nexus repository hosted on my internal network.  Part 2 of this article will cover configuring Nexus and the benefits of using it.  In this part of the article, I&#8217;ll walk through the steps for setting up and configuring Nexus from a base <a title="Ubuntu Server" href="http://www.ubuntu.com/business/server/overview">Ubuntu 11.10 Server</a> installation.</p>
<p>For my purposes, I would like the end result of my installation to be that I can go to nexus.my.home (a DNS name on my internal network) and be able to interact with Nexus, so I&#8217;ll be doing some additional configuration with Apache Web Server to make this happen.<br />
<span id="more-362"></span></p>
<h2>Installing Tomcat</h2>
<p>Nexus comes packaged as a war, and you&#8217;ll need to run it in a Java application server or servlet container.  For my home use, <a title="Apache Tomcat" href="http://tomcat.apache.org/">Tomcat</a> fits the bill, and Tomcat 6 is nicely integrated into Ubuntu, so that will be my servlet container of choice.</p>
<p>Installation of Tomcat in Ubuntu is pretty straight forward.  I&#8217;ve paraphrased <a title="Tomcat Installation Steps" href="https://help.ubuntu.com/11.10/serverguide/C/tomcat.html">the steps from Ubuntu&#8217;s documentation</a>.</p>
<p>You can install tomcat directly with apt-get.</p>
<pre class="brush:bash">sudo apt-get install tomcat6</pre>
<p>After installing tomcat, you can start and stop it using the init.d script.  Its a good idea to start it up at this point and make sure it works.  Just run the command below and then point your browser to localhost:8080.  You should see the Tomcat &#8220;It Works!&#8221; page.</p>
<pre class="brush:bash">sudo /etc/init.d/tomcat6 start</pre>
<p>If all went smoothly, you can stop tomcat with the following command.</p>
<pre class="brush:bash">sudo /etc/init.d/tomcat6 stop</pre>
<p>The following steps will install the tomcat documentation, administration, and examples servlets.  These are not required, but if you&#8217;re going to be messing around with Tomcat these can be quite handy.  If you&#8217;re going to be exposing your Tomcat instance publicly, however, I&#8217;d recommend skipping these steps.</p>
<pre class="brush:bash">sudo apt-get install tomcat6-docs
sudo apt-get install tomcat6-admin
sudo apt-get install tomcat6-examples</pre>
<p>You&#8217;ll also want to modify your tomcat-users configuration by editing /etc/tomcat6/tomcat-users.xml.  Add the following lines below.  This will create the required roles for the admin app and assign it to the admin user identified by the password you include in your file.</p>
<pre class="brush:xml">&lt;role rolename="admin"/&gt;
&lt;role rolename="manager"/&gt;
&lt;user username="admin" password="mysecretpass" roles="admin,manager"/&gt;</pre>
<p>Finally, since I&#8217;m always going to want Nexus to be available, I&#8217;d like to launch Tomcat when my Ubuntu server launches.  Ubuntu should do this by default, but you can toggle Tomcat launching at startup by using the update-rc.d script.</p>
<pre class="brush:bash"># remove tomcat6 from server startup
sudo update-rc.d tomcat6 remove
# add tomcat6 to server startup
sudo update-rc.d tomcat6 defaults</pre>
<h2>Installing Nexus</h2>
<p>First of all, you&#8217;ll need to create a work directory for Nexus.  This is the directory where Nexus will store all its binary files.  By default, this directory is sonatype-work in /usr/share/tomcat6.  After creating the directory, you&#8217;ll also want to change the ownership to the tomcat6 user.</p>
<pre class="brush:bash">sudo mkdir /usr/share/tomcat6/sonatype-work
sudo chown tomcat6:tomcat6 /usr/share/tomcat6/sonatype-work</pre>
<p>You can download the latest Nexus distribution from <a title="Download Nexus" href="http://www.sonatype.org/nexus/go">Sonatype&#8217;s download page</a>.  You&#8217;ll want to just get the WAR distribution.  As of writing this article, 2.0.3 is the latest distribution, and the one I&#8217;ve chosen to use.</p>
<p>With the Ubuntu packaged Tomcat, your default location for webapps is /var/lib/tomcat6/webapp, so you&#8217;ll want to download the nexus war and copy it to this directory.</p>
<pre class="brush:bash">sudo wget http://www.sonatype.org/downloads/nexus-2.0.3.war
sudo cp nexus-2.0.3.war /var/lib/tomcat6/webapps/nexus.war</pre>
<p>You now should be able to go to localhost:8080/nexus and see the Nexus home screen.  Additionally, you should be able to log in to the application with the default username/password admin/admin123.  I recommend changing this immediately.</p>
<h2>Proxying Nexus Through Apache</h2>
<p>I want to access Nexus not at localhost:8080/nexus, but rather nexus.my.home where my.home is the domain I use for my local network.  The server that currently is hosting Tomcat in my case is currently called server.my.home, and I already have this properly configured on my local DNS.  I am now going to create an alias for server.my.home called nexus.my.home.</p>
<p>To do this, I modify /etc/bind/zones/my.home.db and add the following line.</p>
<pre class="brush:text">nexus         IN      CNAME   server</pre>
<p>and then I restart bind.</p>
<pre class="brush:bash">sudo /etc/init.d/bind9 restart</pre>
<p>To check if my DNS name took hold correctly, I simply accessed my Tomcat instance over the DNS name and not localhost.  So try to navigate to nexus.my.home:8080/nexus</p>
<p>This brought me again to the Nexus home screen, so this was all configured correctly.</p>
<p>The next few steps involve a few moving pieces.  Essentially, incoming requests will come in through the Apache Web Server.  The Web Server will use the Apache Tomcat connector to forward the request over to Tomcat and have the request served.</p>
<p><a href="http://tomcat.apache.org/connectors-doc/">Apache Tomcat connector</a>, more commonly called mod_jk available, allows you to easily proxy Tomcat applications through Apache.  It needs to be installed separately from Apache in Ubuntu.  The following steps will install and enable it.</p>
<pre class="brush:bash">sudo apt-get install libapache2-mod-jk
sudo a2enmod jk
sudo /etc/init.d/apache2 restart</pre>
<p>With mod_jk enabled, I can now create a site for Nexus with the mod_jk connector enabled.  Create a Virtual Host configuration for you site that uses JkMount to &#8220;mount&#8221; all Tomcat contexts to an Apache path.  This file shold go in /etc/apache2/sites-available/nexus</p>
<p>Mine looks like this.</p>
<pre class="brush:xml">&lt;VirtualHost *&gt;
   ServerAdmin toms@hackrunner.com
   ServerName nexus.my.home

   &lt;IfModule mod_jk.c&gt;
      JkMount /* nexus_worker
   &lt;/IfModule&gt;

   ErrorLog /var/log/apache2/error.log
   # Possible values include: debug, info, notice, warn, error, crit,
   # alert, emerg.
   LogLevel warn
   CustomLog /var/log/apache2/access.log combined

&lt;/VirtualHost&gt;</pre>
<p>To enable this site, run the following command.  It will properly symlink your new site configuration into the list of enabled sites for Apache.</p>
<pre class="brush:bash">sudo a2ensite nexus</pre>
<p>The Apache Tomcat Connector uses a workers.properties configuration file.  Configuration can allow you to proxy to multiple Tomcat instances and load balance between them amongst several other features.  For my purposes, I&#8217;m going to just setup a new worker that will point to a specific VirtualHost in Tomcat.  The Ubuntu installation puts the system wide configuration file at /etc/libapache2-mod-jk/workers.properties.  I added the following lines to create a new ajp13 connector to the nexus.my.home Virtual Host.</p>
<pre class="brush:bash">#add nexus_worker to the list of active workers (ajp13_worker already was defined)
worker.list=ajp13_worker,nexus_worker

#define the new nexus_worker
worker.nexus_worker.port=8009
worker.nexus_worker.host=localhost
worker.nexus_worker.type=ajp13</pre>
<p>The final bit of configuration is to update Tomcat.  This requires updating the server.xml located at /etc/tomcat6/server.xml.</p>
<p>I uncommented the definition of the AJP 1.3 connector in the &lt;Server&gt; configuration (note how the port matches the worker configuration above)</p>
<pre class="brush:xml">&lt;Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /&gt;</pre>
<p>Finally, within Engine, I added a second host.  This host will capture all requests that come into Tomcat via the nexus.my.home domain name.  Tomcat will serve up apps from the directory specified by &#8220;appBase&#8221; and I additionally noted that the nexus.war file should actually be deployed as the root context.</p>
<pre class="brush:xml">&lt;Host name="nexus.my.home" appBase="nexus"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false"&gt;
   &lt;Context docBase="nexus.war" path=""/&gt;
&lt;/Host&gt;</pre>
<p>Now that the new host is added, we&#8217;ll need to create the directory for the new host and move Nexus there.</p>
<pre class="brush:bash">sudo mkdir /var/lib/tomcat6/nexus
sudo chown tomcat6:tomcat6 /var/lib/tomcat6/nexus
sudo mv /var/lib/tomcat6/webapps/nexus.war /var/lib/tomcat6/nexus/nexus.war
sudo rm -rf /var/lib/tomcat6/webapps/nexus*</pre>
<p>Everything should be set up now.  Simply restart Tomcat (will take a minute or so for Nexus to fully start up, so wait a bit) and Apache and you should be able to get to Nexus now at nexus.my.home.</p>
<p>Also note that only the applications deployed to the nexus context are proxied.  If you try to access the Tomcat manager apps, they will not be available through nexus.my.home, but they are still available via localhost:8080.</p>
<div id="attachment_380" class="wp-caption aligncenter" style="width: 711px"><a href="http://www.hackrunner.com/wp-content/uploads/2012/04/nexus.png"><img class=" wp-image-380 " title="Nexus" src="http://www.hackrunner.com/wp-content/uploads/2012/04/nexus.png" alt="Nexus Up and Running" width="701" height="310" /></a><p class="wp-caption-text">Nexus Up and Running</p></div>
<p>&nbsp;</p>
<p>So that&#8217;s it.  Shortly, I&#8217;ll have a follow up post on what to do with Nexus now that its installed.</p>
<p><a title="Installing Nexus on Ubuntu 11.10 and Tomcat 6 Part 2" href="http://www.hackrunner.com/2012/04/installing-nexus-on-ubuntu-11-10-and-tomcat-6-part-2/">Part 2</a> of this article is now available.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2012/04/installing-nexus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Places My Cat Shouldn&#8217;t Be: Making Pillows</title>
		<link>http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=places-my-cat-shouldnt-be-making-pillows</link>
		<comments>http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 17:22:12 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Places My Cat Shouldn't Be]]></category>
		<category><![CDATA[cat]]></category>
		<category><![CDATA[izzy]]></category>
		<category><![CDATA[making pillows]]></category>
		<category><![CDATA[pillows]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=328</guid>
		<description><![CDATA[My wife and I have a cat, Izzy, and since adopting her from the SPCA, we&#8217;ve been continuously amazed/surprised/horrified at the various places and situations we find her getting into.  I&#8217;ve had the idea for a while to add a section to this blog called Places My Cat Shouldn&#8217;t Be, documenting some of the more humorous moments [...]]]></description>
			<content:encoded><![CDATA[<p>My wife and I have a cat, Izzy, and since adopting her from the SPCA, we&#8217;ve been continuously amazed/surprised/horrified at the various places and situations we find her getting into.  I&#8217;ve had the idea for a while to add a section to this blog called <a title="Places My Cat Shouldn't Be" href="http://www.hackrunner.com/category/places-my-cat-shouldnt-be/">Places My Cat Shouldn&#8217;t Be</a>, documenting some of the more humorous moments we actually managed to catch on camera.  My wife made a few pillows recently and put this gallery together (along with captions), showing just how helpful Izzy can be be.  I decided to share it as the first entry in <a title="Places My Cat Shouldn't Be" href="http://www.hackrunner.com/category/places-my-cat-shouldnt-be/">Places My Cat Shouldn&#8217;t Be</a>.  Enjoy!</p>
<div id="attachment_335" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2659-e1310144144365.jpg"><img class="size-medium wp-image-335" title="IMG_2659" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2659-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">I like to help make pillows!  My favorite part is cutting the fabric.</p></div>
<div id="attachment_336" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2660-e1310144163529.jpg"><img class="size-medium wp-image-336" title="IMG_2660" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2660-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Tasty!</p></div>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2661-e1310144194359.jpg"><span id="more-328"></span><img class="aligncenter size-medium wp-image-337" title="IMG_2661" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2661-300x225.jpg" alt="" width="300" height="225" /></a></p>
<div id="attachment_338" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2662-e1310144224430.jpg"><img class="size-medium wp-image-338" title="IMG_2662" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2662-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Who me?  I&#39;m not causing any problems!</p></div>
<div id="attachment_339" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2663-e1310144263865.jpg"><img class="size-medium wp-image-339" title="IMG_2663" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2663-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">I think I need to take that camera from you to prevent you from collection more evidence of how &quot;helpful&quot; I am.</p></div>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2664-e1310144283418.jpg"><img class="aligncenter size-medium wp-image-340" title="IMG_2664" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2664-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2664-e1310144283418.jpg"></a><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2665-e1310144302546.jpg"><img class="aligncenter size-medium wp-image-341" title="IMG_2665" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2665-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2665-e1310144302546.jpg"></a><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2666-e1310144319708.jpg"><img class="aligncenter size-medium wp-image-342" title="IMG_2666" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2666-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2666-e1310144319708.jpg"></a><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2667-e1310144336107.jpg"><img class="aligncenter size-medium wp-image-343" title="IMG_2667" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2667-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2667-e1310144336107.jpg"></a><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2656-e1310144038465.jpg"><img class="aligncenter size-medium wp-image-332" title="IMG_2656" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2656-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2656-e1310144038465.jpg"></a><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2657-e1310144076830.jpg"><img class="aligncenter size-medium wp-image-333" title="IMG_2657" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2657-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2657-e1310144076830.jpg"></a><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2658-e1310144122442.jpg"><img class="aligncenter size-medium wp-image-334" title="IMG_2658" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2658-300x225.jpg" alt="" width="300" height="225" /></a></p>
<div id="attachment_329" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2653-e1310143883309.jpg"><img class="size-medium wp-image-329" title="IMG_2653" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2653-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">This pillow is quite comfortable!</p></div>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2654-e1310143919267.jpg"><img class="aligncenter size-medium wp-image-330" title="IMG_2654" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2654-300x225.jpg" alt="" width="300" height="225" /></a></p>
<div id="attachment_331" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2655-e1310143942758.jpg"><img class="size-medium wp-image-331" title="IMG_2655" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2655-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">My work here is done!</p></div>
<h1>Gallery</h1>

<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2659/' title='IMG_2659'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2659-150x150.jpg" class="attachment-thumbnail" alt="I like to help make pillows!  My favorite part is cutting the fabric." title="IMG_2659" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2660/' title='IMG_2660'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2660-150x150.jpg" class="attachment-thumbnail" alt="Tasty!" title="IMG_2660" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2661/' title='IMG_2661'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2661-150x150.jpg" class="attachment-thumbnail" alt="IMG_2661" title="IMG_2661" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2662/' title='IMG_2662'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2662-150x150.jpg" class="attachment-thumbnail" alt="Who me?  I&#039;m not causing any problems!" title="IMG_2662" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2663/' title='IMG_2663'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2663-150x150.jpg" class="attachment-thumbnail" alt="I think I need to take that camera from you to prevent you from collection more evidence of how &quot;helpful&quot; I am." title="IMG_2663" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2664/' title='IMG_2664'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2664-150x150.jpg" class="attachment-thumbnail" alt="IMG_2664" title="IMG_2664" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2665/' title='IMG_2665'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2665-150x150.jpg" class="attachment-thumbnail" alt="IMG_2665" title="IMG_2665" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2666/' title='IMG_2666'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2666-150x150.jpg" class="attachment-thumbnail" alt="IMG_2666" title="IMG_2666" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2667/' title='IMG_2667'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2667-150x150.jpg" class="attachment-thumbnail" alt="IMG_2667" title="IMG_2667" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2656/' title='IMG_2656'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2656-150x150.jpg" class="attachment-thumbnail" alt="IMG_2656" title="IMG_2656" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2657/' title='IMG_2657'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2657-150x150.jpg" class="attachment-thumbnail" alt="IMG_2657" title="IMG_2657" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2658/' title='IMG_2658'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2658-150x150.jpg" class="attachment-thumbnail" alt="IMG_2658" title="IMG_2658" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2653/' title='IMG_2653'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2653-150x150.jpg" class="attachment-thumbnail" alt="This pillow is quite comfortable!" title="IMG_2653" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2654/' title='IMG_2654'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2654-150x150.jpg" class="attachment-thumbnail" alt="IMG_2654" title="IMG_2654" /></a>
<a href='http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/img_2655/' title='IMG_2655'><img width="150" height="150" src="http://www.hackrunner.com/wp-content/uploads/2011/07/IMG_2655-150x150.jpg" class="attachment-thumbnail" alt="My work here is done!" title="IMG_2655" /></a>

]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2011/07/places-my-cat-shouldnt-be-making-pillows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Digital Identity with OpenID and WordPress</title>
		<link>http://www.hackrunner.com/2011/04/creating-a-digital-identity-with-openid-and-wordpress/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creating-a-digital-identity-with-openid-and-wordpress</link>
		<comments>http://www.hackrunner.com/2011/04/creating-a-digital-identity-with-openid-and-wordpress/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 20:05:22 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[single sign on]]></category>
		<category><![CDATA[sso]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=293</guid>
		<description><![CDATA[OpenID is an open standard for a distributed system that allows users to authenticate with a single identifier on sites across the internet.  For a while now, OpenID has promised to become the tool that lets internet users login to all sites using a single account, and recently, with many of the big web comapnies [...]]]></description>
			<content:encoded><![CDATA[<p><a title="OpenID" href="http://openid.net/"></a><a href="http://www.hackrunner.com/wp-content/uploads/2011/04/openid-logo.png"><img class="alignleft size-medium wp-image-310" title="OpenID" src="http://www.hackrunner.com/wp-content/uploads/2011/04/openid-logo-300x120.png" alt="OpenID" width="300" height="120" /></a>OpenID is an open standard for a distributed system that allows users to authenticate with a single identifier on sites across the internet.  For a while now, OpenID has promised to become the tool that lets internet users login to all sites using a single account, and recently, with many of the big web comapnies (<a href="http://code.google.com/apis/accounts/docs/OpenID.html">Google</a>, <a href="http://dev.aol.com/topic/openid">AOL</a>, <a href="http://openid.yahoo.com/">Yahoo</a>, <a href="https://www.myopenid.com/">MyOpenID</a>) becoming OpenID providers, and many smaller sites starting to support OpenID authentication, OpenID is coming into its own.  Yes, its still fragmented, yes there&#8217;s many sites that still don&#8217;t use it, but things are getting better, and for me, there&#8217;s enough value in it now, that I want to use my blog as my OpenID for my internet persona.</p>
<p>I have a couple unique requirements for what I&#8217;m trying to do, so let me set that up first.  I have a public online persona that I use for this blog and other sites online related to running and technology.  I have no illusions of privacy.  I am sure anyone who is determined enough can find out plenty of personal information from my activity, but in general, most people that come to this site are looking for content about the information I post.  I would rather not broadcast my personal information to all those people so I try and keep my public online accounts separate from my personal ones.</p>
<p>That being said, its a pain to manage multiple logins and passwords, log in and out of sites, and so on.  OpenID can be really useful with this task, and that&#8217;s what I&#8217;m trying to do: use my <a href="http://www.wordpress.org/">WordPress </a>blog at <a href="http://www.hackrunner.com">http://www.hackrunner.com</a> as my digital identity for public web activity and convert as many accounts over to it as possible.  BUT, I don&#8217;t always want to remember a second password for my public persona, so I&#8217;d still like to be able to login with my private personal OpenID, without broadcasting it to the world.</p>
<p>So here are my requirements:</p>
<ul>
<li>Set up my blog as an OpenID provider.</li>
<li>When authenticating at my blog, be able to login using OpenID authentication from another provider (i.e the OpenID I use for my personal activity).
<ul>
<li>I don&#8217;t necessarily want to do OpenID delegation here, since it will publicly broadcast my other OpenID.</li>
</ul>
</li>
<li>Be able to manage my user account settings on my blog, so I can switch between other OpenID providers I use to authenticate.
<ul>
<li>This gives me portability in the future if I decide to switch OpenID providers.</li>
</ul>
</li>
</ul>
<p>As usual, WordPress already has all the tools I need available in its <a href="http://wordpress.org/extend/plugins/">extensive plugin library</a>.  Here are the steps I followed to get this up and running.<br />
<span id="more-293"></span></p>
<h1>Install the Plugins</h1>
<p>To get OpenID working on my blog, I installed two plugins.  The first is the <a href="http://wordpress.org/extend/plugins/openid/">WordPress OpenID plugin</a> from <a href="http://diso-project.org/">DiSo Development Team</a>.  This plugin provides support for logging into WordPress using OpenID, managing OpenIDs, and using WordPress as an OpenID provider.  It also has support for authenticated comments using OpenID.  I&#8217;m not too concerned with the comments for now, but the main 3 features accomplish everything I&#8217;m looking for.</p>
<p>Installation was fairly straightforward.  I logged in as the admin user and installed the plugin directly from the dashboard.  In order for the plugin to provide OpenID provider services, the <a href="http://wordpress.org/extend/plugins/xrds-simple/">XRDS-Simple</a> plugin must also be installed.  The OpenID plugin also has a few required PHP libraries so after installing the two plugins, its best to test the configuration by going to <em>Settings &gt; OpenID</em> and clicking <em>Toggle More/Less</em> under the <em>Troubleshooting</em> section.  The report will tell you if you&#8217;re missing any required libraries, or if there are any configuration issues with the plugins.  Mine was ok right out of the box.</p>
<h1>Configure Open ID Provider</h1>
<p>After installing the plugins, you&#8217;ll want to configure your blog as an OpenID provider.  For my purposes, I am the only user of my blog (besides the admin user), so I want the main blog url (http://www.hackrunner.com) to be used as an OpenID that identifies me.</p>
<p>To do this, I logged in as the admin user.  The OpenID plugin puts its provider settings under <em>Settings &gt; OpenID</em>.</p>
<p>The first step is to select which types of users can be identified by WordPress.  For me, I only want my account to be identified from my site, and I&#8217;m an Editor, so I chose Editor checkbox for the <em>Enable OpenID</em> field.</p>
<p>Normally, WordPress will assign the user&#8217;s url as the OpenID provider.  For me, that&#8217;s http://www.hackrunner.com/author/tom/, but I want to use the main URL as my OpenID provider.  OpenID makes this pretty easy.  I just chose my username from the <em>Blog Owner</em> drop-down, and I could then use my main blog url as the OpenID identifier for my WordPress user.</p>
<p>So what did this actually do for me?  Now when I want to log in to another site that supports OpenID, I simply use the URL http://www.hackrunner.com/ to log in.  The authentication request will be forwarded over to my blog, where I can log in with my blog username and password.  So I&#8217;m halfway there.  I still want to make it so that instead of using my normal blog username and password when logging into my own WordPress site, I can log in with the OpenID that I normally use on most places on the internet (i.e. an OpenID for a yahoo account, or a gmail account).</p>
<p>If you&#8217;re curious what this plugin actually does, it adds a few tags to the &lt;head&gt; of the HTML of the root of my site.  You can see what they look like below.  These tags identify the URL of my WordPress blogs OpenID service, as well as identify that http://www.hackrunner.com/ actually delegates to my user&#8217;s OpenID page (this was from setting my username as the owner of the blog).</p>
<pre class="brush:html">&lt;link rel="openid2.provider" href="http://www.hackrunner.com/index.php/openid/server" /&gt;
&lt;link rel="openid2.local_id" href="http://www.hackrunner.com/author/tom/" /&gt;
&lt;link rel="openid.server" href="http://www.hackrunner.com/index.php/openid/server" /&gt;
&lt;link rel="openid.delegate" href="http://www.hackrunner.com/author/tom/" /&gt;</pre>
<h1>Configure OpenID Accounts</h1>
<p>Now I want to make it so that instead of remembering an additional strong password for my blog account, I want to be able to use the normal OpenID I use on other places of the web, but do so WITHOUT publicly broadcasting the other OpenID.</p>
<p>I could have set up my user account to delegate to a Google OpenID for example, but by doing so, that would change the openid.delegate link tag as shown above to the URL of my Google profile page.  That&#8217;s not really what I want, since anyone looking at the source of my website will see this implicit link to my Google account. I&#8217;ll avoid delegation in this case, but it is a very nice option if you don&#8217;t mind the link between accounts being public.</p>
<p>Also, I purposely do not set up an OpenID login for the admin user of my blog.  I only use the admin user for administrative tools, and I only access it from home with a strong password.  It is not a large hassle to use a login/password when I need the admin account, but it is entirely possible to also link the admin user to another OpenID.</p>
<p>So to set up my OpenID login, I logged into the WordPress dashboard as the user I want to create the OpenID login for.  I clicked on <em>Profile &gt; Your OpenIDs</em>, pasted the URL of the OpenID I wanted to use to login to my blog, and then hit <em>Add OpenID</em>.  The WordPress OpenID plugin also requires the URL in your user profile to be set to one of your OpenIDs, so I also added http://www.hackrunner.com/ as one of the OpenIDs so I could retain that URL in my profile.  You can add as many OpenIDs as you would like here.  Using any of them at the login page will log you into the same WordPress user account.</p>
<p>Once this was done, I logged out of my account to test the setup.  To test it, simply go back to the login screen.  In addition to asking for a username/password, the form also allows you to now paste an OpenID url.  If you put in the URL of the OpenID you just added to your account, it should now log you into WordPress.</p>
<p>Additionally, if you now try to login to a 3rd party site, and use the url of your blog, it will forward the request to your WordPress login page.  If you&#8217;re not already logged in, WordPress will prompt you to authenticate (which you can do using your normal OpenID now), and then WordPress will ask you to confirm that 3rd party site can be linked to your site.</p>
<p>This setup allows you to now use a personal OpenID to authenticate into you blog, and it also allows you to use your blog as an OpenID across the internet without exposing your personal OpenID.</p>
<p>As an added bonus, your blog&#8217;s OpenID is now portable.  If you want to stop using your Google OpenID, and use a Yahoo one, for example, just update the OpenIDs in your profile to reflect this.</p>
<h1>One Click Authentication</h1>
<div id="attachment_306" class="wp-caption alignright" style="width: 188px"><a href="http://www.hackrunner.com/wp-content/uploads/2011/04/open-id-selector.png"><img class="size-medium wp-image-306 " title="OpenID Selector" src="http://www.hackrunner.com/wp-content/uploads/2011/04/open-id-selector-178x300.png" alt="OpenID Selector" width="178" height="300" /></a><p class="wp-caption-text">WordPress Log In Screen with OpenID Selector</p></div>
<p>One rough edge of the WordPress OpenID plugin is that you must type or paste your OpenID to login, and in some cases, these URLs can be rather long.  In many cases, (Google, Yahoo, MyOpenID, etc.), the OpenID urls follow a standard naming convention.  <a href="http://wordpress.org/extend/plugins/wp-openid-selector/">WP OpenId Selector</a> from <a href="http://www.st2i.com/">ST2i</a> is a nice plugin that augments the OpenID login textbox with a few clickable buttons for the main OpenID provider.  I much prefer this one (or sometimes two or more) click interface to having to type in the OpenID url manually everytime.  The login form ends up looking like the screenshot at the right.</p>
<h1>Other Thoughts</h1>
<p>As I mentioned at the start, I&#8217;m under no impression that this really makes my hackrunner activity completely separate from my personal web activity, but I do think it strikes a nice balance on several points.</p>
<p>First, it gives me a nice balance between convenience and portability.  It allows me to remember one login/password (the one I use for my personal activity with my main OpenID provider) and still be able to login to my blog to create and edit posts.  If I ever want to switch the OpenID I use to login, WordPress lets me manage that, while still keeping http://www.hackrunner.com as the permanent OpenID identifier I will use for other places on the web.</p>
<p>Second, for me its a level of security I am comfortable with.  If my main OpenID is ever compromised, it means that people can now compromise my blog, but I do have the admin account locked down with a strong password that isn&#8217;t accessible with OpenID.  In a pinch, I could quickly log on as the admin, disable the OpenID authentication as well as all other accounts and shutoff any users who may have gained access through OpenID compromised authentications.</p>
<p>Finally, it gives me a better way of keeping my digital identity for hackrunner.com separate. I&#8217;m one step closer to having one single login for hackrunner, and another one for my personal stuff.  There&#8217;s still a ton of sites out there that don&#8217;t support OpenID for authentication, but its definitely becoming more prevalent, and I&#8217;m hoping this will set me up to manage my identity much more simply in the future.</p>
<p>I haven&#8217;t seen many articles or posts using WordPress and OpenID in this way (to login to WordPress with personal OpenID, but hide this personal OpenID when using WordPress as an OpenID provider).  Has anyone else out there done it this way?  Are there any hidden pitfalls I&#8217;m missing?</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2011/04/creating-a-digital-identity-with-openid-and-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IBM&#8217;s Watson takes on Jeopardy Champions</title>
		<link>http://www.hackrunner.com/2011/02/ibms-watson-takes-on-jeopardy-champions/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ibms-watson-takes-on-jeopardy-champions</link>
		<comments>http://www.hackrunner.com/2011/02/ibms-watson-takes-on-jeopardy-champions/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 16:58:38 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[brad rutter]]></category>
		<category><![CDATA[ibm]]></category>
		<category><![CDATA[jeopardy]]></category>
		<category><![CDATA[ken jennings]]></category>
		<category><![CDATA[watson]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=284</guid>
		<description><![CDATA[You may have seen a few commercials for it recently, but next week, from Feb. 14- Feb. 16, Jeopardy! will be airing a face-off pitting all-time greats Ken Jennings and Brad Rutter against a research computer built by IBM called Watson.  I make no claim to be an expert, but from some brief exposure in college, [...]]]></description>
			<content:encoded><![CDATA[<p>You may have seen a few commercials for it recently, but next week, from Feb. 14- Feb. 16, <a href="http://jeopardy.com/">Jeopardy!</a> will be airing a face-off pitting all-time greats <a href="http://www.ken-jennings.com/">Ken Jennings</a> and <a href="http://en.wikipedia.org/wiki/Brad_Rutter">Brad Rutter</a> against a research computer built by IBM called <a href="http://www-03.ibm.com/innovation/us/watson/">Watson</a>.  I make no claim to be an expert, but from some brief exposure in college, I have a general feel for how hard it is for computers to perform natural language processing just to understand the human language.  IBM is taking this one step farther by pairing advanced language processing with search algorithms to try and create the ultimate Jeopardy! champion.  From some of the videos I&#8217;ve seen online, it&#8217;s pretty impressive, and the showdown next week should be fairly entertaining.</p>
<p>The <a href="http://online.wsj.com/article/SB10001424052748703439504576116163439390834.html">Wall Street Journal has a good article</a> giving a very simple explanation of how Watson actually works, and the <a href="http://www.amazon.com/Final-Jeopardy-Machine-Quest-Everything/dp/0547483163">forthcoming book</a> will likely provide even more details on the story of Watson.  I&#8217;ll be tuning into Jeopardy! next week to see how things go.  My personal prediction is that Brad Rutter will take the win, but both Ken and Watson will put in good showings.  Watson&#8217;s Achilles heel will likely be a few botched categories and questions that put him in hole, but its exciting to see how much progress IBM has made with technologies like these by taking up the IBM Jeopardy! challenge.</p>
<p>A practice round of Watson playing is available on YouTube and embedded below.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2011/02/ibms-watson-takes-on-jeopardy-champions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple, Video Games, and Disruptive Markets</title>
		<link>http://www.hackrunner.com/2011/01/apple-video-games-and-disruptive-markets/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=apple-video-games-and-disruptive-markets</link>
		<comments>http://www.hackrunner.com/2011/01/apple-video-games-and-disruptive-markets/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 12:36:03 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[disruptive markets]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[nintendo]]></category>
		<category><![CDATA[sony]]></category>
		<category><![CDATA[video games]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=254</guid>
		<description><![CDATA[At lunch the other day, the conversation turned to Apple, and one of my co-workers posed the question, &#8220;Why hasn&#8217;t Apple released a video game system yet?&#8221; At the time, I was playing Angry Birds on another co-workers iPhone, and I waved the iPhone at him and responded &#8220;They have.&#8221;  He of course responded that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/01/125px-Apple-logo.png"><img class="alignleft size-full wp-image-270" title="Apple" src="http://www.hackrunner.com/wp-content/uploads/2011/01/125px-Apple-logo.png" alt="Apple" width="125" height="153" /></a>At lunch the other day, the conversation turned to Apple, and one of my  co-workers posed the question, &#8220;Why hasn&#8217;t Apple released a video game system yet?&#8221;  At the time, I was playing <a href="http://shop.angrybirds.com/">Angry Birds</a> on another co-workers iPhone, and I waved the iPhone at him and responded &#8220;They have.&#8221;  He of course responded that it isn&#8217;t really what he meant, but I thought a bit more about what Apple has done with its gaming strategy up till now, and they are actually positioned surprisingly well to pull in a huge chunk of the video game market over the next few years.<a href="http://www.hackrunner.com/wp-content/uploads/2011/01/AngryBirds_ScreenShot_Ingame_01.png"><img class="alignright size-thumbnail wp-image-274" title="Angry Birds" src="http://www.hackrunner.com/wp-content/uploads/2011/01/AngryBirds_ScreenShot_Ingame_01-150x150.png" alt="Angry Birds" width="200" height="150" /></a></p>
<p>Before I dive into the details, most of my argument is based on Clayton Christensen&#8217;s ideas around <a href="http://en.wikipedia.org/wiki/Disruptive_technology">disruptive innovation and low-end disruption.</a> In a nutshell, Christensen theorizes that most disruptive innovation occurs when established firms neglect certain market segments because they offer too low of a margin to entice the incumbents.  Innovators enter the low-end segments and the incumbents do not react, but overtime, the entrants overshoot the needs of the low-end markets and begin to pick up additional market segments.  Left unchecked, the entrants eventually overtake the market, driving the incumbents out completely.  Its a pattern that has repeated itself throughout history, and Apple may be repeating it again with the growing library of games it distributes on the App Store.<span id="more-254"></span></p>
<h1>Is Apple Disruptive in the Video Game Market?</h1>
<p>The video game market primarily consists of Nintendo, Sony, and Microsoft.  Their core business has been to build and manufacture consoles while licensing game development to third-party developers and making money off of the heavy licensing fees.  In some cases, the big companies also develop their own games, but in either case, their primary revenue streams come either directly, or indirectly from sales of games for their consoles that range from $30-$60.  In recent years, Sony, Nintendo, and Microsoft have each introduced online stores where smaller developers can also sell games with a reduced licensing cost.</p>
<p>It&#8217;s no secret that Apple has the App Store, an online market place where people can buy software for their iPhone, iPod, iPad, and now Mac computer, but they&#8217;ve done a few things differently than the big 3 in the video game market, and I believe their now set up to displace the existing video game console market as we know it.</p>
<h2>Focusing on Small Developers</h2>
<p>First of all, Apple has lowered the bar for entry and focused more on the little guys.  The big 3 video game companies have always had strong ties to their big developers, and the somewhat high barrier to entry for getting a game on one of their platforms is evidence of that.  The consoles tend to have expensive development kits, high licensing fees, and a steep learning curve.  Apple has focused more on independent developers with a free development kit, much lower licensing fees, and the simplified iOS with a well documented API that works across multiple devices (iPad,iPod,iPhone).  The result?  An immediate explosion on the number of applications in the App Store, specifically, a high number of games.  Most of these games have come from developers that Sony, Nintendo, and Microsoft would simply not have dealt with in the past or at best, given a second class status too.  Apple has created a platform targeted at these small developers and now has <a href="http://www.edibleapple.com/gaming-titles-for-ios-dwarf-gaming-titles-for-all-other-consoles-combined-going-back-5-years/">a library of games that rival&#8217;s the size of any other platform</a>.  Additionally, Apple has done so without turning away the big development shops.  The big development companies are still welcome to put their software on the App Store, and many have done so, being unable to ignore the shear number of iOS devices in consumers&#8217; hands.  The big video games have been more than happy to move forward with games solely from big-time developers, and Apple has come in and built a huge library of games by focusing on the neglected area of the market.  The App Store has now proved itself beyond just the needs of small developers and is starting to become attractive to the big-name developers as well.</p>
<h2>Lowering Price Expectations</h2>
<p>Apple has also changed the game when it comes to price.  As I&#8217;ve mentioned previously, the big 3&#8242;s core sales come from games in the $30-$60 range, but they&#8217;ve begun adding revenue by selling games on their online stores, the majority of which, in my experience, are in the $5-$15 range.  A large majority of the games on the App Store are $5 or less, and many of them are $.99 or even free.  Consumers who buy from the App Store now have an expectation that they can get a reasonable quality game at a cheap price.  It&#8217;s important to note that these consumers aren&#8217;t &#8220;gamers&#8221;.  Gamers will still plunk down money for a deeply immersive game that takes weeks to complete.  But gamer&#8217;s are only a small percentage of the market.  The people that want games that they can quickly pick up now can get their gaming fix, and get in on the cheap from the convenient App Store.  As Apple grows, Sony, Nintendo, and Microsoft will find it more and more difficult to grow their market segment to the general public unless they lower their prices for games targeted at casual gamers.  Apple has really hit the sweet spot by finding developers willing to sell games at a lower price, and a huge consumer base that wants, and now expects to buy them at a low price.</p>
<p>I glossed over the point in the previous paragraph, but there are quite a few games on the App Store that are FREE.  Yes, the pricing model is free.  There are a couple ways developers reach this price point.  In some cases, it is a short-term strategy to boost sales and get games onto top lists on the App Store.  In other cases, games are simply used as promotional tools for some other product.  Additionally, Apple has released an ad platform for the iOS that allows developers to make money off of ads in games while keeping the game free.  The free model has been a smashing success for Google and has been adopted in a number of forms on the Internet.  The verdict is still out as to if Apple&#8217;s ad platform will be successful, but if it is, they&#8217;ll have a huge head start on everyone else in monetizing &#8220;free&#8221; games through the use of ads, a strategy that the big 3 video game companies have chosen not to pursue.</p>
<h2>Changing the Device Paradigm</h2>
<p>The world used to be simple.  If you wanted to call someone, you got a telephone.  If you wanted to watch something, you got a television, and if you wanted to play games, you bought a video game console.  The consoles came at a high price, but they were highly specialized and let you play video games when other devices could not.  We&#8217;re riding a huge convergence wave right now, and the video game console manufacturers have tried to adapt by adding more features to their consoles.  Apple leap-frogged them entirely, however, by simply getting rid of the need for a console.  Technology has advanced to the point where you no longer need specialized technology to play the vast majority of games.  Sure, there&#8217;s still a need for consoles when you get to huge games with cutting-edge graphics, but not everyone wants them.  Now Apple has a number of devices that are multi-purpose and can play games.</p>
<p>In the past, consumers were faced with the question of if they wanted to play video games or not, and if they decided they did want to play them, they were faced with a high initial investment before they could play.  Now consumer&#8217;s are buying a phone anyway, and they simply have to choose if they want to pay a little bit extra for a full-featured device that also plays video games.  The high cost of of a console is removed entirely, which again is great for casual gamers.</p>
<p>That&#8217;s today though.  Mobile technology keeps getting better and better, and the gap between what a video game console can do, and what a mobile phone can do will continue to get smaller, and the convergence wave I mentioned before hasn&#8217;t broke yet.  We still have tvs, phones, cameras, and computers, but not for long.  Soon we&#8217;ll just be talking about &#8220;screens&#8221;.  Wherever you have a specialized device today, you&#8217;ll soon have a generic screen with access to everything.  Your tv will have access to the internet, games, office productivity software, etc., and your phone will have all the same stuff, just formatted for a different screen size and input device.  Apple is already well positioned for this convergence as well.  They already have the <a href="http://www.apple.com/iphone/">iPhone</a>, <a href="http://www.apple.com/appletv/">Apple TV</a>, <a href="http://www.apple.com/ipad/">iPad</a>,  and a traditional line of desktop and laptop computers.  They also have a similar OS that runs all of them, and software stores that allow you to purchase software online, quickly, easily, and at a low price.  There&#8217;s still some cleanup to be done, but it&#8217;s not hard to imagine a future where developers release software to the Apple store, and the software can be used on any Apple device, anywhere, and at any time.  Nintendo, Sony, and Microsoft have been happy to hang onto their consoles, only making small incremental improvements in each console generation.  They&#8217;ll need to let go of the model in the future if they want to compete with Apple for casual gamers, or get used to a niche market, serving the die-hard gamers.</p>
<h1>So What Does the Future Hold?</h1>
<p>I&#8217;m obviously going to put a huge disclaimer on this section that I can&#8217;t predict the future,  Any of the companies I have mentioned can change strategy, new companies can enter the market, and any number of factors can change the game quite quickly,  but I&#8217;ve got some ideas as to how this will play out.</p>
<h2>The Big 3 Video Game Console Manufacturers</h2>
<p>For the next generation of consoles, it seems like Microsoft, Sony, and Nintendo still haven&#8217;t gotten it.  They&#8217;re going to keep putting out hardware consoles that are specialized for video games, and they&#8217;ll miss the boat when it comes to the casual gamer market.  With the casual gamers gone, I&#8217;m not sure the market can support 3 big companies, and one of them will likely go the same way <a href="http://en.wikipedia.org/wiki/Sega">Sega</a> did, while the remaining two will stick around and servre niche markets in the gaming industry.  Each one has it&#8217;s strengths and weaknesses in how they can survive, but they are also hampered by a slow development cycle.  New consoles come out roughly every 5 years, which means that if one of the companies bets wrong on their next generation, its almost irrecoverable.</p>
<p>Sony currently leads the race when it comes to hardware.  They put out the console with the most power in the latest generation, and they have a good reputation for deep, immersive games that resonate with hardcore gamer.  If there&#8217;s one company that is best suited to remain and hit the gamer niche, it&#8217;s Sony.</p>
<p>Microsoft is actually the best equipped of the big 3 to ditch the console entirely and build a multi-device platform.  They have the knowledge and existing investment on devices within Microsoft, and with the right strategy and business partnerships, they probably could at least challenge Apple.  Unfortunately, I think the company moves too slowly, and with respect to video games, Microsoft will either become a pure-software player or exit the market entirely.</p>
<p>Nintendo has been happy to be an innovator over the last decade.  They were the first to introduce touch controls with the DS, and the first to introduce motion controls with the Wii.  Sony and Microsoft have proved to be anything but fast-followers, taking several years to release their own motion control devices, and Nintendo has relished their first-mover advantage.  Apple on the other hand, actually is a fast-follower.  They had touch and motion controls soon after Nintendo.  Nintendo is poised to innovate again, being the first to market with a 3D portable console with the <a href="http://www.nintendo.com/3ds">3DS in March</a>.  They can still be a niche competitor, focusing on early adopters who want a different kind of game play, but the piece of the pie that they compete for will be much smaller with many of the customer&#8217;s going to Apple.  Nintendo is also very strong in game design and likely could be quite successful as a pure-software player or by implementing a cross-platform strategy where many of their games also work on iOS or any other large, encompassing platform that takes over.</p>
<h2>Apple</h2>
<p>Apple seems to be on the right track.  In my opinion, they&#8217;re the first company out there to have a successful App Store on a large scale.  They will likely continue the trend.  As I mentioned previously, I believe their release of Apple TV and the Mac Store is the first in a number of steps of convergence.  Eventually there will be a single App Store where you can buy software, and it will work on all your devices, much like how an iPhone App works on an iPad.  The difference between an Apple computer, phone, and tv will slowly erode.  They&#8217;ll simply be different screens with different input devices, but they&#8217;ll run the same operating system and the same apps.  Apple will need to continue focusing on ease of use for developers to keep their library of apps strong and large, and they should continue to be a fast follower when it comes to new types of devices and inputs.  They have a quick development cycle and lots of resources, so they are well equipped to do so.  They&#8217;ll continue to put their own Apple spin on their products which will also act as a differentiator.  Overall, the future looks bright for Apple, both as an app distributor and as a platform for video games.</p>
<h2>And the Challenger</h2>
<p><a href="http://www.hackrunner.com/wp-content/uploads/2011/01/android_logo.gif"><img class="size-thumbnail wp-image-272 alignright" title="Android" src="http://www.hackrunner.com/wp-content/uploads/2011/01/android_logo-150x150.gif" alt="Android" width="150" height="150" /></a>I&#8217;ve been pretty quiet about Google so far.  With its <a href="http://www.android.com/">Android</a> platform, Google has followed the path Apple has set.  They now have a single platform that works on phones and tablets and a growing app store which a number of games.  It still hasn&#8217;t caught up with Apple, but it definitely has potential.  Additionally, Google is putting <a href="http://www.google.com/chromeos/">ChromeOS</a> out there as an OS for netbook computers, and <a href="http://www.google.com/tv/">GoogleTV</a> is out on a number of television sets.  Similar to what I see in the future for Apple, I believe Google will merge all of its media platforms into one OS and app store that works across all devices.  They will have a very similar offering to what Apple is creating, and it will be an interesting battle between the two for dominance in the market.</p>
<p>Google ha a slightly different strategy than Apple, however, and the differing strategies will likely play a part in determining who is going to take the market.  For one, Google is more open towards developers.  Apple tries to strike a balance between restrictions on what can be developed and quality in their app store.  Google tends to draw the line a little more liberally, and in general, there are fewer restrictions on the Android platform.  It&#8217;s easier to get development tools (that work on all platforms, not just the Mac), its easier to submit apps, and in general the submission process is thought to be more transparent.  Every few months there is a small bit of uproar about the restrictions on the App Store, and you here very little of the same on the Google side.  <a href="http://www.geekwithlaptop.com/google-admit-they-are-unhappy-with-android-app-sales">Apple&#8217;s store has a clear advantage in sales</a>, however, and it can be hypothesized that it is partly due to the greater perceived quality of the App Store&#8217;s offerings because of the restrictions Apple puts on it.</p>
<p>Google has also made the decision to stay out of the hardware business.  Instead, it focuses solely on the software platforms and sets up open standards so that many manufacturers can adopt and use the Google platform.  This means two things.  First, Google will see much higher adoption rates for its platform since.  The amount of Android phones sold has already surpassed the amount of iPhones sold.  Almost all of the major phone manufacturers have Android offerings, and they cross almost all segments of the market, allowing for consumers to choose low-cost or luxury Android offerings.  It also means that developing for Android means figuring out the fragmentation problem.  Just because an app works on one Android phone with a certain Android version does not mean it will work on another Android phone with the same version of Android.  Its a tough problem for developers and has the potential to drive them away completely if Google doesn&#8217;t provide a simplified solution.</p>
<p>Google is also focusing more on web based apps.  Especially with ChromeOS, there is more and more of a trend to clients and apps being dumb web browsers, and most of the software running on the web.  I&#8217;m not saying we&#8217;ll go back to the days of dumb terminals anytime soon, but there is a wave of centralization going on as the web becomes a viable platform for complex applications.  Google right now has a lead over Apple if this trend continues rapidly, and it could be a differentiator for Google.  Another way to look at this is to look at the company&#8217;s experience with web based offerings.  Google has a number of smashing successes when it comes to web offerings such as <a href="http://en.wikipedia.org/wiki/Gmail">Gmail</a>, <a href="http://en.wikipedia.org/wiki/Google_Docs">Google Docs</a>, <a href="http://en.wikipedia.org/wiki/Google_Reader">Google Reader</a>, along with a few questionable, but technically successful products such as <a href="http://en.wikipedia.org/wiki/Google_Buzz">Buzz</a> and<a href="http://en.wikipedia.org/wiki/Google_Wave"> Wave</a>.  Apple&#8217;s offerings on the web are fewer and far between with things like <a href="http://en.wikipedia.org/wiki/ITunes_Ping">iTunes Ping</a> making little overall impact.  Google does seem to have a clear advantage in its connected and social offerings, but Apple where Apple lacks, there are hundreds or even thousands of App Store developers that are filling the gap.</p>
<p>The final card Google has up its sleeve is that it is the king of the free model.  The vast majority of Google&#8217;s revenues come from advertising on its software that it gives to consumers for free.  They know how to get the model to work.  Apple has built a lead over video game manufacturers and other software shops by undercutting them with low-cost, quality software on the App Store, but Apple should be concerned that Google will come in and undercut Apple.  If I&#8217;m going to bet that anyone gets the &#8220;free&#8221; pricing model right, it will be Google, and consumers simply cannot pass up a quality offering at no cost.</p>
<p>Between Apple and Google, I think Google will win the battle in the end.  It will come down to who will be able to keep developers happiest and producing low-cost, quality software, which will be the biggest driver of adoption, use, and sales on the app stores.  Google&#8217;s openness and willingness to change and work with developers will be much better received than Apple&#8217;s constantly changing rejection policies.  Google will also find a way to solve the fragmentation problem (they&#8217;ve got plenty of smart people), and they&#8217;ll also be able to back their platforms with their own top-notch web offerings and a proven model for software supported by advertising revenue.  Apple will still be around, but they will be in a secondary role, much as they were to Microsoft for a number of years.  Apple still has a very good shot, but they&#8217;ll need to change their attitude and be more public and willing to adopt open standards, and I don&#8217;t see the company doing that until its too late.</p>
<h1>Synopsis</h1>
<p>Yes.  I&#8217;m long winded.  But in a few sentences, here&#8217;s my point.  The rise of the App Store has allowed Apple to enter the video game market.  They&#8217;ve done so in a segment largely ignored by the Big 3 (Nintendo, Sony, and Microsoft).  Apple has gained enough momentum and capabilities that  they&#8217;ll start taking a large chunk of the casual-gamer market from the Big 3.  The App Store model, working across all types of devices will prove to be the offering of the future for casual gamers.  Sony, Nintendo, and Microsoft each have a chance of staying in the market as a niche for true &#8220;gamers&#8221;, but it will likely end up that Sony remains as a hardcore gaming platform and Nintendo remains as a technological innovator. Apple won&#8217;t necessarily dominate the rest of the market though.  Google is copying and improving upon Apple&#8217;s offering, and because it has a more open policy and previous experience with free models on the web, it can quickly overtake Apple, leaving Apple to fill the role it once filled in the PC market, as a unique, luxury offering, but not a major player.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2011/01/apple-video-games-and-disruptive-markets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up a New SVN Repository</title>
		<link>http://www.hackrunner.com/2011/01/setting-up-a-new-svn-repository/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=setting-up-a-new-svn-repository</link>
		<comments>http://www.hackrunner.com/2011/01/setting-up-a-new-svn-repository/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 17:44:44 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[scm]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[vcs]]></category>
		<category><![CDATA[version conrol]]></category>
		<category><![CDATA[webdav]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=250</guid>
		<description><![CDATA[It&#8217;s been a while since I&#8217;ve had to set up a new SVN repository on my home network, so now that its time, I figured I write a quick post documenting the steps along the way. For those that may be unfamiliar with it, SVN is a commonly used version control system.  It allows users to manage [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a while since I&#8217;ve had to set up a new <a href="http://subversion.apache.org/">SVN</a> repository on my home network, so now that its time, I figured I write a quick post documenting the steps along the way.</p>
<p>For those that may be unfamiliar with it, SVN is a commonly used version control system.  It allows users to manage the changes to source code over time so that a user can quickly restore old versions, analyze change sets, and control how change sets are applied to a set of source code.  SVN is likely the de facto open source centralized version control system.  It grew up from the older <a href="http://savannah.nongnu.org/projects/cvs">CVS</a> project, but it should be noted that it is a centralized version control system.  There a number of distributed version control systems out there such as <a href="http://git-scm.com/">git</a>, <a href="http://mercurial.selenic.com/">Mercurial</a>, and <a href="http://bazaar.canonical.com/en/">Bazaar</a>, which are gaining adoption very quickly and provide a number of benefits for projects with many users.  For my home use, I&#8217;m the only user, and I&#8217;m familiar with the ins an outs of SVN, so I&#8217;ve stuck with it.</p>
<p>SVN is also one of the most well documented open source projects out there, primarily because of the excellent work that goes into the <a href="http://svnbook.red-bean.com/">SVN Book</a>.  The online content is freely available, and its essentially the same content that is published in the O&#8217;Reilly reference.  It is update often and is very comprehensive.  If you have any questions about SVN, I&#8217;d start there.</p>
<p>Now that I&#8217;ve gotten that out of the way, on to the content.  I want to set up an SVN Repository for a new project I&#8217;m working on.  There are a number of ways in which you can choose to organize SVN, but I generally follow the 1 project per repo model.  I use Apache and WebDav to connect to my SVN repos so that I can access them directly over http.  Assuming you already have SVN and Apache installed, there are really three quick parts to the setup.  Create the SVN Repo, Configure the WebDav connection, and Setup the SVN Repo.</p>
<h1>Create the SVN Repo</h1>
<p>To create the svn repo, you&#8217;ll make use of the svnadmin command line tool.  It provides a number of SVN mainteance functions including the create repository functionality.  I usually create the repository as root, and then after it is created update the permissions so that the web user is the owner and the group is the SVN group.  This allows both Apache and SVN processes access to the files.  The commands needed to set this up are below.</p>
<pre class="brush:bash">#create the new SVN repo
sudo svnadmin create /storage/svn/myNewRepo/

#change permissions on the new repo so that Apache and SVN can access it
sudo chown -R www-data.svn /storage/svn/myNewRepo/</pre>
<h1>Configure the WebDav Connection</h1>
<p>Creating the WebDav interface is also just as easy.  You&#8217;ll create a simple <a href="http://httpd.apache.org/docs/current/mod/core.html#location">Location</a> entry in your Apache configuration which defines the parameters needed for users and the SVN connection.  For me, I put the configuration in the default website on my SVN server (on Ubuntu its /etc/apache2/sites-available/default), and I use the Apache <a href="http://httpd.apache.org/docs/2.2/mod/mod_authn_file.html#authuserfile">AuthUserFile</a> to control users of the repo.  I have set up user accounts for other repos, so I&#8217;m just going to hook into the existing file.</p>
<p>The location information in my Apache file is shown below.  I add it directly the default VirtualHost listing for the server.</p>
<pre class="brush:text">&lt;Location /svn/myNewRepo&gt;
   DAV svn
   SVNPath /storage/svn/myNewRepo
   AuthType Basic
   AuthName "Subversion Repository"
   AuthUserFile /etc/apache2/passwords
   Require valid-user
&lt;/Location&gt;</pre>
<p>From there, its just a quick Apache restart with <em>sudo /etc/init.d/apache2 restart </em>and then you should be able to access the repository over HTTP in your browser by going /svn/myNewRepo on your server (i.e. http://server.my.home/svn/myNewRepo).  You should see a simple page listing the repository information, version 0 as the version number, and an empty directory since we haven&#8217;t added any content yet.</p>
<h1>Setup the SVN Repo</h1>
<p>Your svn repository is now ready to use.  Most repositories follow the general pattern of a trunk/branches/tags structure, so to make sure things are working, I&#8217;m going to create those directories using the svn command line client.  Thereare a number of ways to do this, but I&#8217;m just going to create one directory at a time directly on the server.  The commands look like this.</p>
<pre class="brush:bash">svn mkdir http://server.my.home/svn/myNewRepo/trunk --message "Creating the basic SVN structure for the project"
svn mkdir http://server.my.home/svn/myNewRepo/branches --message "Creating the basic SVN structure for the project"
svn mkdir http://server.my.home/svn/myNewRepo/tags --message "Creating the basic SVN structure for the project"</pre>
<p>And that is all that&#8217;s needed.  You can verify that it worked by going to the svn repo&#8217;s web address again and verifying that the list of folders has updated.  Typically you would then check out the SVN trunk and then start checking in your code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2011/01/setting-up-a-new-svn-repository/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Django 1.2.3 on Ubuntu 10.10</title>
		<link>http://www.hackrunner.com/2010/12/installing-django-1-2-3-on-ubuntu-10-10/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installing-django-1-2-3-on-ubuntu-10-10</link>
		<comments>http://www.hackrunner.com/2010/12/installing-django-1-2-3-on-ubuntu-10-10/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 07:23:12 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[10]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[django 1.2.3]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[ubuntu 10]]></category>
		<category><![CDATA[web framework]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=214</guid>
		<description><![CDATA[I&#8217;ve been toying around with some small ideas for websites, and I&#8217;ve been looking for some straightforward frameworks that would allow me to quickly prototype a site that could still be used, at least for moderate levels of traffic, in a production environment.  I decided to check out Django, a Python based web framework that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been toying around with some small ideas for websites, and I&#8217;ve been looking for some straightforward frameworks that would allow me to quickly prototype a site that could still be used, at least for moderate levels of traffic, in a production environment.  I decided to check out <a href="http://www.djangoproject.com/">Django</a>, a <a href="http://python.org/">Python</a> based web framework that supports a lot of out-of-the-box functionality and is easily extensible.</p>
<p>This post outlines the steps I took to install Django on test web server, which is currently running <a href="http://ubuntumaverickmeerkat.com/">Ubuntu 10.10 (Maverick Meerkat)</a>.</p>
<h1>Overview</h1>
<p>As is often the case, I like to configure my test system so that it is as close as possible to the production environment I eventually deploy to.  In many cases, that means deviating from Ubuntu&#8217;s distribution repositories and installing some packages from source.  In the case of Django, there is an <a href="http://www.turnkeylinux.org/django">appliance version of Ubuntu that supports Django</a>, but nothing official in the repositories.  So as usual, I&#8217;m back to installing my own version.  Before I started, I laid out a few of the requirements I would like to achieve.</p>
<ul>
<li>Use the latest stable version of Django (1.2.3)</li>
<li>Install Django in a shared location, but Django sites should be independent.</li>
<li>Each Django site should be in its own Apache VirtualHost, so as not to disturb the other sites I have running on my test server.</li>
<li>Each Django site should be easily maintained in source control and should not include any major artifacts from the Django library.  This will make the application portable, and will be helpful when I move it to other servers, such as production.</li>
</ul>
<p>I based most of my work on an <a href="http://jeffbaier.com/articles/installing-django-on-an-ubuntu-linux-server/">article on jeffbaier.com</a>,  but made some adjustments along the way to suit my needs, so I&#8217;m posting my steps for anyone else that might be following the same path.<br />
<span id="more-214"></span><br />
Conceptually, you can break down installing Django into the following steps:</p>
<ol>
<li>Retrieve and Install Django</li>
<li>Create and Configure a Django project</li>
<li>Configure Apache</li>
<li>Get coding on your new Django installation</li>
</ol>
<h1>Retrieve and Install Django</h1>
<p>In order to retrieve and install Django, I directly checked out the stable branch from Django&#8217;s SVN repository.  I put it in my /usr/share directory, as it is a shared library used by the system.  In addition to checking out the library, I set permissions so that it was owned by the www-data user (my apache user) and linked the Django package into my python library.  I also linked the django-admin.py script into my bin directory so that it is always available on the path.  The steps for doing this are illustrated below.</p>
<pre class="brush:bash"># check out version 1.2.3 of Django into my /usr/share directory and update permissions
sudo svn co http://code.djangoproject.com/svn/django/tags/releases/1.2.3/ /usr/share/django
sudo chown -R www-data:www-data /usr/share/django

# link Django package into the python library
sudo ln -s /usr/share/django/django /usr/lib/python2.6/dist-packages/django

# make django-admin.py available on the path
sudo ln -s /usr/share/django/django/bin/django-admin.py /usr/local/bin/django-admin.py</pre>
<p>If you are unsure of where Python is installed on your system, you can get this by running the following line.</p>
<pre class="brush:bash">python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"</pre>
<p>That&#8217;s all that&#8217;s needed.  You&#8217;re now ready to move on to creating your first Django project.</p>
<h1>Create and Configure a Django project</h1>
<h2>Set up the Database</h2>
<p>Before you start, you should set up a database for Django to use.  I use MySql, but there are a number of compatible databases and non-database backends that can be used with Django.  My database setup is pretty simple.  Just log into mysql as root</p>
<pre class="brush:bash">mysql -u root - p</pre>
<p>and then run the following commands</p>
<pre class="brush:sql">CREATE DATABASE mydjango;
CREATE USER 'mydjango'@'localhost' IDENTIFIED BY 'mydjango'
CREATE USER 'mydjango'@'%' IDENTIFIED BY 'mydjango'
GRANT ALL PRIVILEGES ON mydjango.* to 'mydjango'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON mydjango.* to 'mydjango'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;</pre>
<h2>Creating the Django Site</h2>
<p>Next up is creating the Django site.  Django provides an admin script for creating the project for you, so I only had to choose a directory for where the site would live, and set up the directory structure that I wanted to use.</p>
<p>For my purposes, I wanted my site to live under /var/www, but still be owned by me.  This would allow me eventually to check the site directory under /var/www directly into SVN.  That way, on my test system, I can work directly on the files on the server and check in changes directly to SVN.  Additionally, I can work remotely, and synch the latest changes onto the test server easily via an SVN up.</p>
<p>The directory structure I chose was a follows:</p>
<ul>
<li>/var/www/mydjango
<ul>
<li>django_projects &#8211; The directory I will create my projects in.  Using this model, my site can actually be made up of multiple django projects if needed.</li>
<li>django_templates &#8211; A directory of templates that all Django projects in my site will use.</li>
<li>media &#8211; A directory where common media (jpgs, gifs, pngs, etc.) will be stored.  These eventually will be accessed outside of the Django framework to reduce overhead.</li>
<li>admin_media &#8211; A directory that is actually a symbolic link back to the admin_media directory in the main Django library.  This allows the auto-generated admin module to use its resources.</li>
</ul>
</li>
</ul>
<p>The steps I followed for setting this up were</p>
<pre class="brush:bash">#create directories
sudo mkdir /var/www/mydjango/django_projects
sudo mkdir /var/www/mydjango/django_templates
sudo mkdir /var/www/mydjango/media

#link in the admin media
sudo ln -s /usr/share/django/django/contrib/admin/media /var/www/mydjango/admin_media

#set up ownership so I own the directory.  Make sure www-data still has rx access via group permissions
sudo chown -R tom:tom /var/www/mydjango</pre>
<p>The next step is to create a new django project.  Django comes with a django-admin.py script (which I&#8217;ve already added to the path) that allows you to easily setup a project.  This is just a two-liner, switch to right directory and create the project.</p>
<pre class="brush:bash">cd /var/www/mydjango/django_projects
django-admin.py startproject mydjango</pre>
<h2>Configuring Django</h2>
<p>With the script all our files have been created, the next step is to configure Django.  First you will modify the /var/www/mydjango/django_projects/mydjango/settings.py file.  I&#8217;ve included my file below, but the key areas you want to modify are:</p>
<ul>
<li>Add yourself in the ADMINS section</li>
<li>Add the correct database to the DATABASES section (my example shows mysql)</li>
<li>Set the TIME_ZONE for your server</li>
<li>Change MEDIA_ROOT to be the location on disk where your media will reside (the media directory we set up before)</li>
<li>Change MEDIA_URL to be the URL where media will be accessed from.</li>
<li>Change ADMIN_MEDIA_PREFIX to be the relative URL from the site root where the admin media will be accessed from.</li>
<li>Update the SECRET_KEY to something random (this is to randomize any hash and crypto functions for security purposes)</li>
<li>Update ROOT_URLCONF to reference the urls.py file in your project directory.</li>
<li>Add your templates directory (the one created earlier) to the TEMPLATE_DIRS list</li>
<li>Enable the admin interface in INSTALLED_APPS by uncommenting &#8216;django.contrib.admin&#8217;</li>
</ul>
<p>My final is shown below for reference.</p>
<pre class="brush:python"># Django settings for mydjango project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    ('TomS', 'toms@hackrunner.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'mydjango',                      # Or path to database file if using sqlite3.
        'USER': 'mydjango',                      # Not used with sqlite3.
        'PASSWORD': 'mydjango',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'America/NewYork'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = '/var/www/mydjango/media/'

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = 'http://mydjango.mydomain.com/media/'

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/admin_media/'

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'hg=dyltl9)pq$4n+aabdd&amp;+6o1yf3ipg1@@8wm(a9-e!ype&amp;d2'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

ROOT_URLCONF = 'mydjango.urls'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    "var/www/mydjango/django_templates/"
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)</pre>
<p>You&#8217;ll also want to update your urls.py to enable the admin urls.  Update your /var/www/mydjango/django_projects/mydjango/urls.py to match the file I have below.  The updates I made were to uncomment lines 4,5 and 15.</p>
<pre class="brush:python">from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^mydjango/', include('mydjango.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),
)</pre>
<p>The final step in configuring Django is to have Django auto-build your database to match all the default models that come with Django (users, groups, etc.).  Django provides a management script that makes this exceedingly easly.</p>
<pre class="brush:bash">cd /var/www/mydjango/django_projects/mydjango/
./manage.py syncdb</pre>
<h1>Configuring Apache</h1>
<p>The final step is to configure Apache.  As I mentioned previously, I wanted everything in a VirtualHost so as not to disturb the other web applications I have running on my test machine.  To do this, I created a new site descriptor as /etc/apache2/sites-available/mydjango.mydomain.home.  Some key setup notes to be aware of are below.  Everything else is pretty standard for an Apache vhost.</p>
<ul>
<li>The &lt;location &#8220;/&#8221;&gt; element is used to set python and specifically Django as the handler for all requests.  Note that I&#8217;m adding the location of my site to the PythonPath and I&#8217;m setting the path to my settings file as part of the environment.</li>
<li>The alias and additional &lt;location&gt; elements are used to overrie Django and allow Apache to server up the files directly.  The aliases are set up point to the directories created earlier for the Django site</li>
</ul>
<p>My final configuration file is shown below.</p>
<pre class="brush:plain">&lt;VirtualHost *&gt;

        RewriteEngine On

        ServerAdmin TomS@hackrunner.com

        ServerName mydjango.mydomain.home

        #set up Django as the default handler for the site
        &lt;location "/"&gt;
            SetHandler python-program

            PythonHandler django.core.handlers.modpython

            SetEnv DJANGO_SETTINGS_MODULE mydjango.settings

            PythonPath "['/var/www/mydjango/django_projects'] + sys.path"
        &lt;/location&gt;

        Alias /media /var/www/mydjango/media
        &lt;location "/media"&gt;
            SetHandler None
        &lt;/location&gt;

        Alias /admin_media /var/www/mydjango/admin_media
        &lt;location "/admin_media"&gt;
            SetHandler None
        &lt;/location&gt;

        &lt;locationmatch ".(jpg|gif|png)"&gt;
            SetHandler None
        &lt;/locationmatch&gt;

        ErrorLog /var/log/apache2/mydjango.mydomain.home-error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/mydjango.mydomain.home-access.log combined

&lt;/VirtualHost&gt;</pre>
<p>After that, I made sure that my domain name was correctly set up on my local DNS server (or you can use a local hosts file), then I enabled the site and reloaded Apache.</p>
<pre class="brush:bash">sudo a2ensite mydjango.mydomain.home
sudo /etc/init.d/apache2 reload</pre>
<p>I then navigated to http://mydjango.mydomain.home.  I immediately got the 404 page you see below, which means that Django is working, I just haven&#8217;t set up any views yet.</p>
<div id="attachment_232" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/12/django-404.png"><img class="size-medium wp-image-232 " title="Django 404 Page" src="http://www.hackrunner.com/wp-content/uploads/2010/12/django-404-300x139.png" alt="Django 404 Page" width="300" height="139" /></a><p class="wp-caption-text">Django is up and working, serving up a 404 page.</p></div>
<p>As a secondary test, I also went to http://mydjango.mydomain.home which showed the admin login screen below.</p>
<div id="attachment_233" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/12/django-admin.png"><img class="size-medium wp-image-233" title="Django Admin Login" src="http://www.hackrunner.com/wp-content/uploads/2010/12/django-admin-300x139.png" alt="Django Admin Login" width="300" height="139" /></a><p class="wp-caption-text">Django Admin module is also working</p></div>
<p>And that pretty much wraps it up.  Django is up and running and ready for development.  I&#8217;ll be giving Django a test drive.  If things go well, there will likely be some more blog posts on the topic soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2010/12/installing-django-1-2-3-on-ubuntu-10-10/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>7/17/2010 &#8211; 7/18/2010 Stroehmann Back on My Feet 20in24 Lone Ranger Ultra Marathon</title>
		<link>http://www.hackrunner.com/2010/08/backonmyfeet-20in24-lone-ranger/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=backonmyfeet-20in24-lone-ranger</link>
		<comments>http://www.hackrunner.com/2010/08/backonmyfeet-20in24-lone-ranger/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 00:57:51 +0000</pubDate>
		<dc:creator>TomS</dc:creator>
				<category><![CDATA[Running]]></category>
		<category><![CDATA[20in24]]></category>
		<category><![CDATA[24 hour race]]></category>
		<category><![CDATA[back on my feet]]></category>
		<category><![CDATA[lone ranger]]></category>
		<category><![CDATA[ultra marathon]]></category>

		<guid isPermaLink="false">http://www.hackrunner.com/?p=181</guid>
		<description><![CDATA[After several months of contemplating it, 1 semi-serious ankle injury, 6 solid weeks of mileage increases that took me far beyond anything I have ever been close to before, and a nice rewarding 2 week taper, the weekend of the Stroehmann Back on My Feet 20in24 Lone Ranger Ultra Marathon (hence force to be referred [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_182" class="wp-caption alignleft" style="width: 216px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/logo_lrg.png"><img class="size-full wp-image-182" title="20in24 Lone Ranger Ultra Marathon" src="http://www.hackrunner.com/wp-content/uploads/2010/08/logo_lrg.png" alt="20in24 Lone Ranger Ultra Marathon" width="206" height="142" /></a><p class="wp-caption-text">20in24 Lone Ranger Ultra Marathon</p></div>
<p>After several months of contemplating it, 1 semi-serious ankle injury, 6 solid weeks of mileage increases that took me far beyond anything I have ever been close to before, and a nice rewarding 2 week taper, the weekend of the <a href="http://stroehmann.bimbobakeriesusa.com/">Stroehmann</a> <a href="http://20in24.com/">Back on My Feet 20in24 Lone Ranger Ultra Marathon</a> (hence force to be referred to as the 20in24 Lone Ranger run) finally came.</p>
<p>To break that name down a bit, <a href="http://backonmyfeet.org/">Back on My Feet</a> is  a great charity that &#8220;promotes the self-sufficiency of homeless populations by engaging them  in running as a means to build confidence, strength and self-esteem.&#8221; Each year, BOMF puts on the <a href="http://20in24.com/">20in24</a> series of races as a fund-raising event.  The event consists of a number of relays and races in addition to the <a href="http://20in24.com/the-back-on-my-feet-lone-ranger-ultra-marathon.html">24 Hour Lone Ranger Ultra Marathon</a>.  <a href="http://stroehmann.bimbobakeriesusa.com/">Stroehmann</a> was the official sponsor this year.  Here&#8217;s the recap of the event and how I did in the Lone Ranger Ultra Marathon.<br />
<span id="more-181"></span></p>
<h1>The Preparation</h1>
<p><a href="http://www.hackrunner.com/2010/07/100-miles-and-freedom-5k">In a previous post</a>, I touched a bit on what my training looked like for the 20in24 Lone Ranger, but I&#8217;ll rehash it.  I  signed up for the run at the start of the year with a goal of running 50 miles.  At the time, I was mid way through <a href="http://www.hackrunner.com/2010/04/2010-yuengling-shamrock-marathon/">training for the Yuengling Shamrock Marathon</a> in late March.  The plan then was to complete the marathon, take a little bit of rest and then begin a slow ramp-up of mileage to get me prepared for the longer distance.  That plan was thrown out the window when<a href="http://www.hackrunner.com/2010/04/tyler-arboretum-10k-trail-run/"> I twisted my ankle a week after the marathon</a>.  After the ankle injury, I couldn&#8217;t run for close to a month.  I finally got back in the swing of things at the start of May and <a href="http://www.hackrunner.com/2010/06/spring-update-and-oddyssey-half-marathon/">spent most of the month getting back in shape enough to run a half-marathon</a>.</p>
<p>After completing the half-marathon, I regrouped around a 6 week plan (including taper) to see how long and by how much I could increase my weekly mileage. My plan was to run twice a day Monday-Friday, 3 times on Sunday, and use Saturday to finish off any runs I missed during the week.  I wanted to have a two week taper, and increase mileage every week over the 4 week period if possible.  If I felt over-trained, I would back off on mileage for one week, and then return to regular mileage increases.</p>
<p>As it turned out, I was able to do 4 solid weeks of mileage increases, which you can see below.</p>
<ul>
<li>6/7-6/12 – 15 Miles Long Day, 6′s and 4′s = 65 Miles Total</li>
<li>6/13-6/19 – 20 Miles Long Day, 7′s and 4′s = 75 Miles Total</li>
<li>6/20-6/26 – 25 Miles Long Day, 7′s and 5′s = 85 Miles Total</li>
<li>6/27-7/3 – 30 Miles Long Day, 9′s and 5′s, Extra 5 = 100 Miles Total</li>
</ul>
<p>Then I did my taper, still running up to 3 times on the weekend, but falling back to single runs during the week.</p>
<ul>
<li>7/4-7/10 – 20 Miles Long Day, 8&#8242;s = 60 Miles Total</li>
<li>7/11-7/14 – 15 Miles Long Day, 5&#8242;s, Thur/Fri off = 30 Miles Total</li>
</ul>
<p>The mileage build up wen surprisingly well.  I can&#8217;t say that I wasn&#8217;t sore most of the time, but after pushing through the first two weeks, I felt pretty comfortable at 85 miles and 100 miles.  My legs seemed to bounce back fine on short rest, and any fatigue I felt throughout the day usually disappeared a mile or two into each run.</p>
<p>The taper went smoothly.  I was a little bit antsy after cutting the number of runs per week almost in half, but it was a welcome rest.  Overall, I would&#8217;ve liked to have had more weeks of training leading up to the race, and likely, if I do the run next year, I&#8217;ll start incorporating the two-a-day runs as early as the start of May.  I would also consider trying to do more than 30 in a day during my peak week.  I feel like that would simulate the actual race conditions a bit better.</p>
<h1>The Check In and Pre-Race</h1>
<p>Before running the 20in24 Lone Ranger Run, all participants had to have their vitals checked.  I headed down on Friday evening to get checked out, and also to pick up all my race gear.  Gear pickup was first, and that was quick and easy.  Amongst the typical race papers and information guides, runners also received a running hat, an extremely nice <a href="http://www.underarmour.com/shop/us/en/">Under Armor shirt</a>, and a metallic water bottle.  Overall, a pretty good haul for any race, even some of the more expensive marathons.</p>
<div id="attachment_200" class="wp-caption alignright" style="width: 235px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3837.jpg"><img class="size-medium wp-image-200" title="Race Swag" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3837-225x300.jpg" alt="Race Swag" width="225" height="300" /></a><p class="wp-caption-text">The swag for this race included an awesome Under Armor shirt, a running hat, and nice metallic water bottle.</p></div>
<p>As quick and easy as check-in was, vitals were not.  Each runner had to get weight, heart rate/bp/respiration rate, and temperature checked.  To help with the ever growing line, each measurement was broken up into stations.  Weight and temperature went quick, and had almost no line.  Pulse, bp, and respiration rate took forever, even with two stations going, and everyone eventually ended up in those lines.  If I had one complaint about the race, it would have been the time it took waiting for these measurements.  We were all outside in the sun, and it was well above 90 degrees.  The last thing I wanted to do before the race the next day was stand around in the heat for an hour.  I passed the time chatting with other runners though, and all in all, it wasn&#8217;t too bad.  Given the choice between waiting for the vitals, and not having the excellent medical attention that they had at this race, I&#8217;m willing to live with the wait.</p>
<div id="attachment_199" class="wp-caption alignleft" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3806.jpg"><img class="size-medium wp-image-199" title="Pile-o'-stuff" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3806-300x225.jpg" alt="Pile-o'-stuff" width="300" height="225" /></a><p class="wp-caption-text">My Pile-o&#39;-stuff.  I probably overpacked just a bit.</p></div>
<p>After I had my vitals recorded, I headed home and made sure I had all my gear packed.  In hind-sight, I waaaay over-packed, as evident in my pile-o&#8217;-stuff in the photo.   Dinner was a nice bowl of pasta, and I was in bed by 10.  The next morning, I recruited my mom to drive me down to the start.  The 20in24 races are headquarted at <a href="http://www.fairmountpark.org/RECREATIONCENTER.ASP">Lloyd Hall Recreation Center</a> on Boat House Row.  The Lloyd Hall facilities are open to the race participants, and the indoor basketball court is opened up so all Lone Ranger and Platinum relay participants can set up their stuff and have a place to store gear and sleep.  In addition to this, all participants are welcome to set up a tent outdoors for the duration of the event.  I opted for both routes.  Knowing I would have some fans and pacers coming down throughout the event, I set up my tent outside, but also brought most of my food and a towel inside to claim some of the cooler, air-conditioned space in Lloyd Hall.</p>
<p>While I was getting my stuff set up, I was immediately struck by how different this felt from a normal race.  You could tell this wasn&#8217;t going to be your typical 5k where you&#8217;re in and out in under an hour.  Everyone was busy setting up their stuff, and it appeared almost routine for them to show up somewhere at 8:00 Saturday morning, tents, cots, sleeping bags, and food in tow, and set up a second home for the weekend.  There also seemed to be more of a sense of community.  After getting set up, most people were relaxing, stretching, and discussing strategies with other participants.  Outside, Tent City quickly formed.  Tents of all shapes and sizes ran up and down the green areas next to Lloyd hall.  A tip for anyone doing the race: don&#8217;t set up your tent to close to Lloyd Hall.  Once the race starts, they&#8217;ll be playing music fairly loudly all day and all night.  It makes for a great atmosphere for the race, but not so great a time when you want to relax in between laps.  I made that mistake, and if I&#8217;m back next year, I&#8217;ll set up a little further away from Lloyd hall.</p>
<div id="attachment_201" class="wp-caption alignleft" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3807.jpg"><img class="size-medium wp-image-201" title="Home Sweet Home" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3807-300x225.jpg" alt="Home Sweet Home" width="300" height="225" /></a><p class="wp-caption-text">Home Sweet Home - My tent that served as home-base for the weekend.</p></div>
<div id="attachment_202" class="wp-caption alignleft" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3817.jpg"><img class="size-medium wp-image-202" title="Tent City" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3817-300x225.jpg" alt="Tent City" width="300" height="225" /></a><p class="wp-caption-text">Participants set up tents all over the place.</p></div>
<div id="attachment_203" class="wp-caption alignleft" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3818.jpg"><img class="size-medium wp-image-203" title="Hammock" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3818-300x225.jpg" alt="Hammock" width="300" height="225" /></a><p class="wp-caption-text">Somebody even brought a hammock.  I wouldn&#39;t want to see myself getting in and out of that after 50 miles.</p></div>
<div id="attachment_204" class="wp-caption alignleft" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3824.jpg"><img class="size-medium wp-image-204" title="Lloyd Hall" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3824-300x225.jpg" alt="Lloyd Hall" width="300" height="225" /></a><p class="wp-caption-text">Many runners claimed a spot inside Lloyd Hall as well.</p></div>
<h1>The Race</h1>
<p>Once I had all my gear set up and settled in, I headed over to the starting line for the Lone Ranger pre-race meeting.  The race director outlined all of the rules and regulations, including how to get each lap counted, and heat-related race restrictions that could potentially go into effect.  The meeting was short, sweet, and to the point.  I got all the information I needed and got out of there.  It seemed like everything about the race (minus the previous nights check-in) was organized and extremely well planned, which is pretty amazing giving the complexity of the event (multiple relays, 24-hour races, etc.)</p>
<p>A little before 10:00 I headed back towards the start line.  There was some final race announcements before getting lined up.  The race director asked that Lone Ranger&#8217;s start well behind the relayers, a fair request I&#8217;d say given the pace most of us Lone Rangers would be going out in.  I settled in towards the back of the pack and waited for the gun.</p>
<div id="attachment_205" class="wp-caption alignright" style="width: 235px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3821.jpg"><img class="size-medium wp-image-205" title="Lap Distances" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3821-225x300.jpg" alt="Lap Distances" width="225" height="300" /></a><p class="wp-caption-text">Laps and distances were prominently marked at the start.</p></div>
<p><strong>Lap 1: </strong>The course starts at Lloyd hall, and then continues up to and around the front of the art museum before crossing the Schuykill and following Martin Luther King Drive.  I settled in to a nice pace slightly below 10:00 min/mi pace.  It was already starting to warm up, but things weren&#8217;t to bad yet.  It felt really good to be out and running after so much preparation, but I resisted the urge to even push the pace at all.  I was happy to see that each water stop had buckets of ice-soaked towels which really cooled me off when rolled up and tucked on my neck.</p>
<p>For the first lap, I really concentrated on a slow, controlled pace, as well as taking ample amounts of water and Gatorade in the rest stops.  Before I knew it I was already at the turn at Falls Bridge and was headed back towards the start.  There were roughly 3 rest stops going out to the bridge (including a big one with a fully equipped medical staff), and another 3 on the way back home.  All had ample food/drink (though I didn&#8217;t really notice the food until my last few laps) and amazing volunteers.  I finished up my first lap in 1:22, a little bit below 10:00 min/mi pace.  My plan was to take a short rest after every lap, so I checked out from the race after finishing the first lap, and headed out to say hi to my &#8220;crew&#8221; (currently my Mom was volunteering at the medical tent) and get some food from my food stash (PB&amp;J sandwiches and Cliff Bars).</p>
<p><strong>Lap 2: </strong>My initial plan was to finish a lap, then rest for a duration of 2 hours before starting the next lap.  I&#8217;d do this as long as I could hold it, with a goal of getting through 50 miles.  I felt pretty good and decided to adjust.  Instead, I grouped laps in sets of 2.  In between the first and second, I&#8217;d take a shorter rest, and then after the second lap, take a longer rest.  So after about 15 minutes of rest, I headed out for lap #2.</p>
<p>Lap #2 still felt really good, so I kept with much the same focus.  Keep a controlled pace, and drink a whole lot.  By the second lap, the race had really thinned out, and somewhere around the half-way point, I started thinking it would be really nice to have more music on the course.  It was about that time that I realized my iPod was in my back pocket.  After a good 5 minutes untangling the ear buds, I had some music to keep me rolling along.  Again I came in right around 10:00 min/mi pace for the lap.</p>
<p><strong>Lap 3:</strong> I took my longer rest after lap 2, and then headed out for lap #3 a little before 2:00.  I decided to walk until 2:00 to get a little extra mileage while I was still &#8220;resting&#8221; and then get back on my plan.  The hottest part of the day was quickly coming up, and I was taking the cold towels at almost every stop.</p>
<p>I still felt really good, and I came in at 1:25 for the lap, even with the walking.  About now I started to work out in my head what would be possible.  After lap 4, my sister would be coming down to pace me for 2 laps, which would put me past 50 miles.  Also, I knew my wife would be down the next morning to pace me through at least one lap.  50 was in the bag, and if during the night I could get another lap in, I&#8217;d be well on my way to breaking 100K, and if I managed to get 2 in, I would be looking at something like 75 miles.  100 miles still seemed completely insane, but the 75 mile goal looked promising.</p>
<p>Also, on this lap, it started to become more and more difficult to eat.  I was drinking a lot of Gatorade and water, but the PB&amp;J and Cliff bars just started to feel too dry.  I was still feeling good, but was really only nibbling between laps.  This would eventually catch up with me.</p>
<p><strong>Lap 4:</strong> I again had my short rest.  Lap 4 was the point in the race where I would be passing the 30 mile threshold.  The furthest I have ever run in 24-hours was 30 miles, so that meant I would be entering territory I had never been in before.  I felt good, but my legs were starting to tire on continuous 8-mile run segments.  For this lap, I decided to introduce 1/4 mile walk breaks every 3 miles.</p>
<p>The run-walk strategy got me through no problem, and I headed into the finish of the 4th lap well before 6:00, but at a slightly slower pace of 10:51 min/mi.  At the end of Lap 3, I had ordered out, asking my sister to pick me up a <a href="http://www.wawa.com/WawaWeb/Hoagies.aspx">Wawa Italian Hoagie</a> on her way down to pacing me.  I was getting really hungry, and something resembling a real dinner started sounding really good.  The food I had brought for the race was no longer appetizing at all.</p>
<p><strong>Lap 5:</strong> My sister was a bit late getting down to the race, but got there never-the-less.  I quickly wolfed down half of my hoagie whlie she got into her running gear.  We set out a bit after 6:00, so I was no longer on my 1 lap / 2 hr average, but the extra break was a welcome one.</p>
<p>It was great to have a pacer, and I really don&#8217;t think I would&#8217;ve made it as far as I did without my wife and sister helping me along.  For lap 5, I switched my run/walk strategy to 2 mile run / 1/4 mile walk.  My legs, while tired were holding up fine, but the lack of food had finally caught me.  Prior to &#8220;dinner&#8221;, I had started to feel nauseous and had a headache.  The extended break and food helped me to bounce back pretty quick, but by the half-way point of Lap 5 the feeling was back.  We trudged on in and finished the lap at a 10:48 pace.  I was now 1 lap away from hitting my goal with a good 13 hours in the race to go.  The only problem was, I just felt like crap.</p>
<p><strong>Lap 6:</strong> After finishing up the last lap, I sat down for a bit to rest.  I tried alternately sipping Gatorade and water to bounce back from that sick feeling, but neither seemed to help.  I tried laying down in my tent for a while, but I just sat there staring up at the (slightly spinning) top of the tent feeling worse.  Just a few laps ago, I was thinking 75 miles sounded good, and now I was questioning 50.  Finally I got up, and my mom basically force-fed me <a href="http://www.phillysoftpretzelfactory.com/">a soft-pretzel</a>.  It took a good 20-minutes to eat the thing.  My mouth kept drying out, and I was chewing for what felt like hours.  It really did help though.  Once I had it down, the nauseous feeling subsided.  My sister and I switched into our night gear (reflective vests and a head-lamp for me), and I checked back in.</p>
<p>On the way out on the lap, I had a bit of a cramp, likely from running while trying to digest the fgood I just ate.  It wasn&#8217;t too bad though, and it certainly felt better than the alternative of not eating.  The run-walk ratio was now 1 mile / 1/4 mile.  My GPS watch battery died after the last lap, and I wasn&#8217;t checking pace.  Plus, I was mostly beyond caring about pace at that point too.</p>
<p>Everything else aside, it was actually really nice running at night.  We would occasionally run past other Lone Rangers and offer some words of encouragement, and more frequently, the relayers would blow past up, still keeping up amazing paces throughout the night.  The night lap was nice and cool, and pretty peaceful, except for the rest stops.  The volunteers at the stops were better than ever, still being attentive to every runner, and still cheering everyone on.</p>
<p>We finished the lap, putting my mileage total over the 50 mile hump, and my cumulative time was just over 13 hours.  As I crossed the lap, the race volunteers gave me my 50-miler finisher&#8217;s award knowing I probably wouldn&#8217;t be making it to the 100-mile mark with 11 hours left.</p>
<div id="attachment_206" class="wp-caption alignleft" style="width: 310px"><a href="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3843.jpg"><img class="size-medium wp-image-206" title="Finisher's Award" src="http://www.hackrunner.com/wp-content/uploads/2010/08/IMG_3843-300x225.jpg" alt="Finisher's Award" width="300" height="225" /></a><p class="wp-caption-text">The finisher&#39;s award was a very cool marble plaque engraved with the race logo and the Philly skyline.</p></div>
<p><a href="http://20in24.com/the-back-on-my-feet-20in24-midnight-madness-run.html">The Midnight Madness run</a> would be starting soon, a single lap run in the opposite direction of the Lone Ranger&#8217;s that goes off at midnight.  Many of the participants were gathering, decked out in just about every piece of glow-in-the-dark material imaginable.</p>
<p>I was initially really looking forward to this, hoping the extra energy from the runners would make for a fun lap.  I was still feeling pretty bad, however, and I decided to call it quits for the night.  The new plan was to get down as much food as I could, get a few hours of sleep, and see what I can do in the morning when my wife would come down to pace me.  I happily munched on the remaining half of my hoagie while I watched the start of the Midnight Madness run.  After the runners were off, I set my alarm for 5:30 and headed off to the tent for some sleep.</p>
<p><strong>Lap 7:</strong> I slept reasonably well for a few hours.  The PA system was announcing relay legs all night, so that kept me up a bit, but not enough to rouse me before my alarm.  I got up around 5:30, and amazingly, felt pretty good.  My legs were a bit sore, but manageable, and I felt 100% better than when I finished the sixth lap.  My wife, in typical fashion, was way early, but this allowed us to get out on the course around 7:00 AM, giving us 3 hours before the end of the race.</p>
<p>I basically picked up right where I left off with the run a mile, walk a quarter mile plan.  Again, it was great to have a pacer.  We passed quite a few Lone Ranger&#8217;s who were still at it.  Pretty much all of them were walking and looking like they were in some serious suffering, so I felt a little bit guilty feeling as good as I was.  I was happy to provide some encouragement though.  The leader, Serge Arbona blew right past us about a mile in, and he still looked great.   Also during our seventh lap, we caught the tail end of the <a href="http://20in24.com/the-back-on-my-feet-pajama-loop-run.html">pajama loop (goes off at 5:30 am)</a>.  There were quite a few runners really decked out in pajama costumes, and again, everyone was very supportive.  Its a nice boost to have that when you&#8217;ve got 50 miles+ on your legs.  Other than that though, my wife and I finished up a mostly uneventful lap in time unknown.  It was roughly 9 hours after I finished my previous lap.</p>
<p>We both felt pretty good, and I was only a half lap short of the 100K mark, so after a brief rest, we decided to get out there again and go after 100K as the final goal.</p>
<p><strong>Lap 7 and 3/4:</strong> With an end in site, it was a lot easier to keep moving.  The run-walk plan stayed the same, and before we knew it, we had passed the 3rd water stop, where I picked up a partial-lap wrist band, officially getting me past 100K for results purposes.  We were about 3/4 of a mile short of a half-marathon for my wife, so we decided to keep on running up till that point, and then really call it quits&#8230; or at least start walking.</p>
<p>As we continued on, I was amazed to see familiar faces at the rest stops.  It seemed like some of the volunteers had been out all night.  According to the latest plan, we started walking after covering the half-marathon.  We still had a good 20-30 minutes left in the race, and we actually passed two additional rest stops while walking, further adding to my partial lap total.</p>
<p>At the last stop, we were informed that there were roughly 7 minutes left in the race, and another mile to the next partial lap checkpoint.  We decided to call it a day and wait for the pickup van.  We came across another runner, who amazingly enough had run the exact same distance as me, and had arrived only a minute or two earlier.  We both chatted about the race while we waited for our rescue vehicle.  The van swung by about 15 minutes after the official end of the race and brought us back to Lloyd Hall.  We picked up some other runners along the way, including the female winner (2nd overall), who ran an astounding 122 miles.  To top it all off, she still looked pretty fresh when we picked her up, like she would&#8217;ve kept going if the race got extended.</p>
<p>After a few minutes we were back at Lloyd Hall, and I got my official results.  <strong>24:00:00 duration and 65.222 miles.</strong> Well past my goal of 50 miles.</p>
<p>My GPS watch data is below.  And no, I was not delirious enough to take a short-cut through the Schuylkill.  That was just a blip in GPS reception during one of my laps.</p>
<h1>Closing Thoughts</h1>
<p>The experience I had at the Back on My Feet 20in24 Lone Ranger race was simply amazing.  Its hard to sum up how impressed I was with the event, the volunteers, the athletes, and everyone that came out to give support.  There&#8217;s so much that went on throughout the day, so I&#8217;m just going to list a couple random thoughts and moments that stick out in my mind.</p>
<ul>
<li>The volunteers were absolutely amazing.  Some of them were out there just as long as the runners, and their energy level never dropped.  On top of that, there was a constant flow of medical and emergency staff riding bikes in the opposite direction of the run.  Should anything have happened to me, even while alone, I&#8217;m confident medical staff would have been there within 5 minutes, even on the most remote parts of the course.  While its amazing what the athletes did, the volunteers were just as incredible.</li>
<li>Support crews are the best.  At various times throughout the race, I had my members of my family and friends down at the race volunteering, pacing me, and in general just giving support.  It really does a lot to keep you going when you have that much support.</li>
<li>The race seems like a logistical nightmare.  There are 4 different relays, an ultra marathon, and two 8.4 mile races all being run simultaneously.  Somehow though, everything went off without a hitch.  I&#8217;m simply in awe of the Back on my Feet team and what they managed to pull off.</li>
<li>Coverage of this race was great.  There was a <a href="http://twitter.com/20in24">twitter page</a>, <a href="http://www.facebook.com/#!/20in24?ref=ts">facebook page</a>, and <a href="http://blog.backonmyfeet.org/2010/07/22/third-annual-stroehmann-back-on-my-feet-20in24-extra-video/">official</a> <a href="http://blog.backonmyfeet.org/2010/07/21/media-for-the-third-annual-stroehmann-back-on-my-feet-20in24/">blog</a> <a href="http://blog.backonmyfeet.org/2010/07/20/photos-of-the-2010-stroehmann-back-on-my-feet-20in24/">posts</a>, in addition to the <a href="http://20in24.com/race-results.html">results on the official site</a>.  Part of the fun was following up on the coverage after the race was done.</li>
<li>My wife and I made the intro of the local news segment finishing up Lap #7.  Pretty cool.</li>
<li>The winners are just insane.  <a href="http://20in24.com/race-results.html">Serge Arbona and Sabrina Moran ran 146 and 122 miles respectively, each setting course records.</a></li>
<li>Ultra-runners  are a different breed, but the races they participate in just seem to have a different level of camaraderie than local 5ks.  Its like everyone knows the suffering they&#8217;re about to endure, and that brings everyone closer together.</li>
<li>Ron Horn, who runs <a href="http://pretzelcitysports.com/">Pretzel City Sports</a>, and was in charge of the timing had this to say at the start of the Midnight Madness run. (fairly liberal paraphrasing)  &#8220;There will be runners running the opposite direction of you on the course.  They have been running for 14 hours and will be going until dawn.  Cheer them on and tell them they look great.  They look like crap, but don&#8217;t tell them that.&#8221;  I&#8217;ll keep that in mind next time I&#8217;m out there and want to know what people really think.</li>
<li>Each quarter mile was marked on the course.  While this was helpful for measuring walk breaks, it also is its own type of torture.  Thinking at the start, &#8220;ok, one quarter-mile down, 199 to go&#8221;, just doesn&#8217;t seem fair.</li>
<li>You know you&#8217;ve run far when you completely outlast your fully charged GPS watch that usually lasts through the week on a single charge.</li>
<li>Next year (yup, I&#8217;m already planning on next year), I&#8217;ll be shooting for 75 miles.  The big fatal flaw I need to fix is food.  I&#8217;ll be experimenting with eating on the run a lot more during training, and I&#8217;ll be force-feeding myself along the way if I have to next year.</li>
<li>And I&#8217;ll need to remember for next year, I still had more in the tank.  I was back to running on Tuesday, and by Sunday was starting up a long run as training for a marathon in October.  I&#8217;ve felt worse after most marathons I&#8217;ve done, so maybe there&#8217;s something to the high-mileage weeks.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.hackrunner.com/2010/08/backonmyfeet-20in24-lone-ranger/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
