<?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>Skin of Stars</title>
	<atom:link href="http://skinofstars.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://skinofstars.com</link>
	<description>Kevin Carmody on machines, media and miscellanea.</description>
	<lastBuildDate>Tue, 06 Jul 2010 21:35:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<cloud domain='skinofstars.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>All the latest updates</title>
		<link>http://skinofstars.com/2010/07/all-the-latest-updates/</link>
		<comments>http://skinofstars.com/2010/07/all-the-latest-updates/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 21:24:28 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Oxford]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[oxford]]></category>
		<category><![CDATA[universe]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://skinofstars.com/?p=713</guid>
		<description><![CDATA[I&#8217;ve had many jobs. My full CV is unprintable in a comfortable digest. Though all were useful in their own way, it was still a means to an end. Rock superstardom&#8230; so four years ago I decided to retool in what was then a time devouring hobby. So far, things have been going pretty well. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had many jobs. My full CV is unprintable in a comfortable digest. Though all were useful in their own way, it was still a means to an end. Rock superstardom&#8230; so four years ago I decided to retool in what was then a time devouring hobby. So far, things have been going pretty well. I got a decent degree and have had two awesome jobs in a row, the second of which I still happily work at (<a href="http://whiteoctober.co.uk">whiteoctober</a>).</p>
<p>I&#8217;ve been keeping my head down for some time now. I&#8217;ve really been wanting to get good at what I&#8217;m doing before I start to think of other things. But I&#8217;m happy to say that recently I&#8217;m starting to &#8216;get it&#8217; with many of the techs that I&#8217;m using. I know I still have sooo much to learn, but it&#8217;s a good feeling to be making progress.</p>
<p>Oh yeah, I use Ubuntu for both work and play now. Good times <img src='http://skinofstars.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hmm, what else is new&#8230; I move in a couple of weeks, to a place in Headington. At the moment there are five of us living in a four bedroom house in East Oxford. It&#8217;s fun and communal and all, but I&#8217;m really looking forward to moving in with just myself and Emily. You should check her blog by the way: <a href="emilychiang.wordpress.com">emilychiang.wordpress.com</a>.</p>
<p>Actually, I think that&#8217;s it for now. Take care.</p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2010/07/all-the-latest-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Script for RSS auto-discovery and OPML file generation</title>
		<link>http://skinofstars.com/2010/03/php-script-rss-auto-discovery-opml-file/</link>
		<comments>http://skinofstars.com/2010/03/php-script-rss-auto-discovery-opml-file/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 19:21:40 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Programming & Design]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[opml]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://skinofstars.com/?p=369</guid>
		<description><![CDATA[Hey All, I recently got a reasonable size list of blog URLs. What I wanted was to import all these into a feed reader (via OPML). There seemed to be a lack of conversion scripts for batch URL-&#62;find RSS link-&#62;feed reader import file (I may be wrong, please let me know if I am , [...]]]></description>
			<content:encoded><![CDATA[<p>Hey All,</p>
<p>I recently got a reasonable size list of blog URLs. What I wanted was to import all these into a feed reader (via OPML). There seemed to be a lack of conversion scripts for batch URL-&gt;find RSS link-&gt;feed reader import file (I may be wrong, please let me know if I am <img src='http://skinofstars.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , so I made one in PHP. I guess this is like an automatic-blogroller. I have just used this as a command line script, I&#8217;m not recommending you use this in &#8216;the wild&#8217; as one might say, I have made little concession to security as I had a trusted list of URLs.</p>
<p>There are basically three steps to this</p>
<ol>
<li>Take an input file of newline seperated URLs, in my case blogs.</li>
<li>Find (auto-discover) associated RSS feed of each blog URL</li>
<li>Output an OPML file that you can use to import into a feed reader</li>
</ol>
<p>What it does:</p>
<ul>
<li>Takes a well formed list of newline separated URLs of blogs and turns it into an OPML</li>
<li>If the URL source doesn&#8217;t contain a &lt;link&gt; to an RSS feed in the head it doesn&#8217;t add it to the OPML</li>
<li>Detects the &lt;title&gt; and adds that to the OPML text field, or uses the URL if &lt;title&gt; isn&#8217;t present</li>
</ul>
<p>What it doesn&#8217;t:</p>
<ul>
<li>Check the RSS feed is validated XML</li>
<li>Any other checking really <img src='http://skinofstars.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Come with any sort of warranty/guarantee</li>
</ul>
<p>Some of the key functions are from <a href="http://keithdevens.com/weblog/archive/2002/Jun/03/RSSAuto-DiscoveryPHP">Keith Devens</a> work. Thanks.<br />
<span id="more-369"></span><br />
Without any further ado, here is the script:</p>
<pre>&lt;?php
/*
 * @author @skinofstars Kevin Carmody
 * GPLv3 - http://www.gnu.org/copyleft/gpl.html
 *
 * this is really a command line app with no flags
 * for turning a bunch ofurls into an OPML file
 *
 * 1.takes input file of newline seperated urls, normally blogs
 * 2.finds (autodiscovery) associated rss of each url
 * 3.outputs an OPML file for you to use in a feed reader
 */

// file config
$inputFile = "/path/to/URLlist.txt";
$outputFile = "/path/to/blogroll.opml";

// OPML config
$opmlTitle = "Some Select Blogs";
$opmlOwnerName = "Kevin Carmody";
$opmlOwnerEmail = "kevin@skinofstars.com";

/** no need to edit after this <img src='http://skinofstars.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  **/
$inHandle = @fopen($inputFile, "r");//read-only
$outHandle = @fopen($outputFile, "a");//append

if ($inHandle &amp;&amp; $outHandle) {
	$headerOut = opmlHeader($opmlTitle,$opmlOwnerName,$opmlOwnerEmail);
	fwrite($outHandle,$headerOut);

	while (!feof($inHandle)) {
		$buffer = fgets($inHandle, 4096);
		$source = getFile($buffer);
		$rssURL = getRSSLocation($source, $buffer);
		$rssTitle = htmlentities(getTitleAlt($source));
		if($rssURL){
			if($rssTitle){
				$entryOut = opmlEntry($rssURL,$rssTitle);
				fwrite($outHandle,$entryOut);
			} else {
				$entryOut = opmlEntry($rssURL,$rssURL);
				fwrite($outHandle,$entryOut);
			}
			//echo ".";//uncomment to print a dot to screen on each success, nice for seeing progress
		} else {
			echo "Fail on: ".$buffer;
		}
	}
	$footerOut = opmlFooter();
	fwrite($outHandle,$footerOut);

	fclose($inHandle);
	fclose($outHandle);
} else {
	if(!$inHandle){
		echo 'not got a handle on input file: '.$inputFile."\n";
		die;
	}
	if(!$outHandle){
		echo 'not got a got handle on output file: '.$outputFile."\n";
		die;
	}
}

echo "\nAll done <img src='http://skinofstars.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> \n";

/**
 * basic opml header
 * @param string $opmlTitle
 * @param string $opmlOwnerName
 * @param string $opmlOwnerEmail
 * @return string
 */
function opmlHeader($opmlTitle,$opmlOwnerName,$opmlOwnerEmail){
	$oheader = "&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;\n"
	."&lt;opml version=\"1.1\"&gt;\n"
	."	&lt;head&gt;\n"
	."		&lt;title&gt;".$opmlTitle."&lt;/title&gt;\n"
	."		&lt;dateCreated&gt;".date("r")."&lt;/dateCreated&gt;\n"
	."		&lt;ownerName&gt;".$opmlOwnerName."&lt;/ownerName&gt;\n"
	."		&lt;ownerEmail&gt;".$opmlOwnerEmail."&lt;/ownerEmail&gt;\n"
	."		&lt;/head&gt;\n"
	."	&lt;body&gt;\n";
	return $oheader;
}

/**
 * just returns a test footer
 * @return string
 */
function opmlFooter(){
	$ofooter = "  &lt;/body&gt;\n"
	."&lt;/opml&gt;";
	return $ofooter;
}

/**
 * creates an XML entry for the OPML file
 * @param string $feedURL
 * @param string $feedTitle
 * @return string
 */
function opmlEntry($feedURL,$feedTitle){
	$outline = "    &lt;outline text=\"".$feedTitle."\" type=\"rss\" xmlUrl=\"".$feedURL."\"/&gt;\n";
	return $outline;
}

/**
 * returns the page title extracted from source
 * @param string $html
 * @return string
 */
function getTitleAlt($html) {
	if (preg_match('/&lt;title&gt;(.*?)&lt;\/title&gt;/is',$html,$found)) {
		$title = $found[1];
		return $title;
	} else {
		return;
	}
}

/**
 * http://keithdevens.com/weblog/archive/2002/Jun/03/RSSAuto-DiscoveryPHP
 * public domain
 */
function getFile($location){
	$ch = curl_init($location);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: close'));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_TIMEOUT, 15);
	$response = curl_exec($ch);
	curl_close($ch);
	return $response;
}

/**
 * http://keithdevens.com/weblog/archive/2002/Jun/03/RSSAuto-DiscoveryPHP
 * public domain
 */
function getRSSLocation($html, $location){
	if(!$html or !$location){
		return false;
	}else{
		#search through the HTML, save all &lt;link&gt; tags
		# and store each link's attributes in an associative array
		preg_match_all('/&lt;link\s+(.*?)\s*\/?&gt;/si', $html, $matches);
		$links = $matches[1];
		$final_links = array();
		$link_count = count($links);
		for($n=0; $n&lt;$link_count; $n++){
			$attributes = preg_split('/\s+/s', $links[$n]);
			foreach($attributes as $attribute){
				$att = preg_split('/\s*=\s*/s', $attribute, 2);
				if(isset($att[1])){
					$att[1] = preg_replace('/([\'"]?)(.*)\1/', '$2', $att[1]);
					$final_link[strtolower($att[0])] = $att[1];
				}
			}
			$final_links[$n] = $final_link;
		}
		#now figure out which one points to the RSS file
		for($n=0; $n&lt;$link_count; $n++){
			if(strtolower($final_links[$n]['rel']) == 'alternate'){
				if(strtolower($final_links[$n]['type']) == 'application/rss+xml'){
					$href = $final_links[$n]['href'];
				}
				if(!$href and strtolower($final_links[$n]['type']) == 'text/xml'){
					#kludge to make the first version of this still work
					$href = $final_links[$n]['href'];
				}
				if($href){
					if(strstr($href, "http://") !== false){ #if it's absolute
						$full_url = $href;
					}else{ #otherwise, 'absolutize' it
						$url_parts = parse_url($location);
						#only made it work for http:// links. Any problem with this?
						$full_url = "http://$url_parts[host]";
						if(isset($url_parts['port'])){
							$full_url .= ":$url_parts[port]";
						}
						if($href{0} != '/'){ #it's a relative link on the domain
							$full_url .= dirname($url_parts['path']);
							if(substr($full_url, -1) != '/'){
								#if the last character isn't a '/', add it
								$full_url .= '/';
							}
						}
						$full_url .= $href;
					}
					return $full_url;
				}
			}
		}
		return false;
	}
}</pre>
<p>Though this was really a one time hit for me it may well be useful to others. Please let me know if you can think of ways to improve it and I will update accordingly.</p>
<p>Thanks,<br />
Kevin</p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2010/03/php-script-rss-auto-discovery-opml-file/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Moving hosted SVN, the trials and the tribulations</title>
		<link>http://skinofstars.com/2010/02/moving-hosted-svn-the-trials-and-the-tribulations/</link>
		<comments>http://skinofstars.com/2010/02/moving-hosted-svn-the-trials-and-the-tribulations/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 22:55:15 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming & Design]]></category>
		<category><![CDATA[hostedsvn]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[systems]]></category>

		<guid isPermaLink="false">http://skinofstars.com/?p=365</guid>
		<description><![CDATA[Over the last few weeks Mike Robinson and I have discussed and decided an SVN restructuring for improving our build and deployment processes. I would encourage you to read a bit more about that (and various other geekness) at his blog. So I&#8217;ve spent this week moving our company hosted SVN from Beanstalk to Springloops. [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last few weeks <a href="http://akamike.net/">Mike Robinson</a> and I have discussed and decided an SVN restructuring for improving our build and deployment processes. I would encourage you to read a bit more about that (and various other geekness) at his blog.</p>
<p>So I&#8217;ve spent this week moving our company hosted <strong>SVN</strong> from <strong>Beanstalk</strong> to <strong>Springloops</strong>. I feel I&#8217;ve been swinging between hell and zen, but the learning has been awesome. As a summary of what I&#8217;ve found I thought I&#8217;d give a quick walk through how I did it.</p>
<p><span id="more-365"></span><br />
Most of this stuff was the usual <a href="http://subversion.apache.org/faq.html#dumpload">dump/load cycle</a>, but there are a couple of things which needed some extra attention.</p>
<p>Firstly, both Beanstalk and Springloops have the ability to export and import SVN dumps via easy-to-use web interfaces. This really could be as easy as download, upload. Try that first.</p>
<p>We had a couple of problems though. Previously we had a mishmash of company repos and project repos; these had to be merged and sorted. We also had different usernames on each system(!) which meant that during an import previous commits were not matched to current system users.  The author attribute needed to be updated for all previous revisions.</p>
<p>This was all done on OS X, but should be applicable to any Unix-like with the appropriate libraries, etc.  So we&#8217;ve got our dump from Beanstalk, now we just need to create a local repository to do our work on (always work on a backup!!).</p>
<pre>$ svnadmin create --pre-1.4-compatible newrepo</pre>
<p>We use the pre 1.4 compatible flag to overcome files system changes within SVN between versions. These changes can potentially cause errors (svn: Expected FS format &#8217;2&#8242;; found format &#8217;3&#8242;) when <a href="http://svnbook.red-bean.com/en/1.0/re23.html">propset</a>-ting revision histories, in my case, author/committer names.</p>
<p>Next job, import your dump file.</p>
<pre>$ svnadmin load newrepo &lt; dumpfile</pre>
<p>If you&#8217;re looking to do the merging, as I was, then you want to make yourself a directory in your repository (usual &#8216;svn mkdir&#8217; commands) and then load it in the following fashion:</p>
<pre>$ svnadmin load newrepo --parent-dir myfolder &lt; seconddumpfile</pre>
<p>Ok, we&#8217;ve done our merging, now we&#8217;re going to update our author histories.  Now the SVN manual gives you information on doing this one version at a time with a propset.  It also talks about other recursive actions such as deleting files, which isn&#8217;t our concern.  For changing authors, I found a tidy script called <a href="http://svn.apache.org/repos/asf/subversion/trunk/contrib/server-side/svn-tweak-author.py">svn-author-tweak.py</a> from CollabNet.</p>
<p>If you want to give your repository a check before you upload it, just checkout to a local test.</p>
<pre>$ svn co file:///path/to/newrepo /path/to/test/repo</pre>
<p>Once that&#8217;s done, dump the file.</p>
<pre>$ svnadmin dump newrepo &gt; my.dumpfile</pre>
<p>Upload</p>
<p>???</p>
<p>Profit</p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2010/02/moving-hosted-svn-the-trials-and-the-tribulations/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Has it really been that long?</title>
		<link>http://skinofstars.com/2010/01/has-it-really-been-that-long/</link>
		<comments>http://skinofstars.com/2010/01/has-it-really-been-that-long/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 22:05:31 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Programming & Design]]></category>
		<category><![CDATA[BBC]]></category>
		<category><![CDATA[me]]></category>
		<category><![CDATA[movabletype]]></category>
		<category><![CDATA[mt]]></category>
		<category><![CDATA[skinofstars]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://skinofstars.com/?p=361</guid>
		<description><![CDATA[Hello all, it&#8217;s been a while. The Skinofstars site has been languishing in disuse for some time now. Like I&#8217;m sure many others, I&#8217;ve found the transition to micoblogging is all too easy. Sometimes though, one wants to write something a little longer and long gaps are not helpful when you finally think of something. [...]]]></description>
			<content:encoded><![CDATA[<p>Hello all, it&#8217;s been a while. The Skinofstars site has been languishing in disuse for some time now. Like I&#8217;m sure many others, I&#8217;ve found the transition to micoblogging is all too easy. Sometimes though, one wants to write something a little longer and long gaps are not helpful when you finally think of something. So I guess I&#8217;m just posting to get rid of some writers block really.</p>
<p>For the six months since my last post (my, that is a long time!) I&#8217;ve been working at <a href="http://studiolift.com">Studio Lift</a> in Reading. There are five of us; two designers, two coders and a multi-talented boss. We fill our days making like <a href="http://www.ciarb.org/">this</a> and like <a href="http://www.williamfiennes.com/">this</a> (bad linking! <img src='http://skinofstars.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  using <a href="http://www.movabletype.com">Movable Type</a>. This is the same blogging platform that is used by the BBC, The Guardian, ReadWriteWeb and various others. It comes in both Commercial and Open Source offerings and is perhaps one of the most venerable of blogging systems.</p>
<p>Does that mean I&#8217;m going to talk tech now?&#8230; sure (jump?). Movable Type (mt) has just released its 5th version. This places more emphasis on managing multiple blogs within a site structure. Very useful if you&#8217;ve ever tried to manage multiple blog instances (how many blogs do you think The Guardian has?). There is also a new emphasis on social communication (see <a href="http://www.movabletype.com/motion/">Motion</a>).</p>
<p>The system is written in Perl but because the publishing is static files you can drop pretty much any scripting language in without any problems. My current language of choice for server-side is PHP. You hook your language in with mt using their own markup derived syntax, and to be honest for a simple blog you never have to touch another language. Let&#8217;s look at an example which will iterate over a collection of the last five entries:</p>
<p>&lt;mt:Entries lastn=&#8221;5&#8243;&gt;<br />
&lt;h2&gt;&lt;mt:EntryTitle /&gt;&lt;/h2&gt;<br />
&lt;p&gt;&lt;mt:EntryBody /&gt;&lt;/p&gt;<br />
&lt;/mt:Entries&gt;</p>
<p>There is documentation, with my favourite page being the <a href="http://www.movabletype.org/documentation/appendices/tags/">tag reference</a>, but otherwise there certainly isn&#8217;t the same breadth of documentation as you would find with something like WordPress. Perhaps the strong ties with the commercial side of the software, it was increasingly license prudish at the Open Source blogging party, has been a hindrance to a warm and fuzzy community embrace. Still, some big media hitters use it so they&#8217;ve certainly got something right.</p>
<p>Well, as I said, I work in Reading and my crappy car&#8217;s wiper motor has broken so I&#8217;ve got to get up early and catch a bus. It&#8217;s been nice to talk to you again. Thanks for putting up with my tech chatter, I expect that you&#8217;ll get variation soon enough as we head towards the General Election <img src='http://skinofstars.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Night Night.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">http://www.williamfiennes.com/</div>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2010/01/has-it-really-been-that-long/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A Website Apart</title>
		<link>http://skinofstars.com/2009/06/a-website-apart/</link>
		<comments>http://skinofstars.com/2009/06/a-website-apart/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:22:07 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming & Design]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://skinofstars.com/?p=338</guid>
		<description><![CDATA[Hey all, just a quick one today. I just had a job interview and I was asked the question &#8220;which design websites do I frequent&#8221;? I ummed and erred a little before mentioning Digg and Slashdot. Not very design focused I know (except maybe Digg&#8217;s design section). I also said that I trawl the blogs [...]]]></description>
			<content:encoded><![CDATA[<p>Hey all, just a quick one today. I just had a job interview and I was asked the question &#8220;which design websites do I frequent&#8221;? I ummed and erred a little before mentioning Digg and Slashdot. Not very design focused I know (except maybe Digg&#8217;s design section). I also said that I trawl the blogs for Ideas, which is true. I neglected to mention one of my favourite sites though, one which each and every one of you should have in your Feed Reader: <a href="http://www.alistapart.com/">A List Apart</a>. I love that site and I felt a little ashamed for forgetting it, so as penance I am reminding you all to check it out.</p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2009/06/a-website-apart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Final Degree Results</title>
		<link>http://skinofstars.com/2009/06/final-degree-results/</link>
		<comments>http://skinofstars.com/2009/06/final-degree-results/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 20:04:26 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Oxford]]></category>
		<category><![CDATA[Education]]></category>

		<guid isPermaLink="false">http://skinofstars.com/?p=333</guid>
		<description><![CDATA[Well if you&#8217;re not going to blog about your degree results, what are you going to blog about? Firstly, I want to say that I&#8217;m happy to do it in the three year time period. I know that is what is normally expected, but I know so many people that are having to take extra [...]]]></description>
			<content:encoded><![CDATA[<p>Well if you&#8217;re not going to blog about your degree results, what are you going to blog about? Firstly, I want to say that I&#8217;m happy to do it in the three year time period. I know that is what is normally expected, but I know so many people that are having to take extra semesters or even years that I&#8217;m happy to have just got on with it so I&#8217;m able to move on to other things. Anyway, let&#8217;s cut to the chase;</p>
<p>I got a First Class Honours BSc in Multimedia Systems and Communication, Media and Culture.</p>
<p>Shocked I was. Smiling, but shocked. I knew that it was mathematically possible, but I was really just aiming to get a good 2:1. Perhaps that be seen as aiming low, but I didn&#8217;t come to university to flog myself every night for a grade. Yes I wanted to do well, but what I really wanted was to spend the time thinking and learning more generally. I wanted to learn many things and being at university, in a learning environment, I could spend time discovering so many other things. For example, I developed a somewhat nasty habit of wanting to learn Linux stuff. Not just the technical system management but also how open source as an idea can be used in so many aspects of life&#8230; Anyway, the point is that I wasn&#8217;t targeting a First, my target was to do everything well, just good and solid with treats thrown in here and there and still time to live a little.</p>
<p>I saw the grades themselves first before I knew the final result and I knew it was looking good. Nothing was below B+ and I had a nice collection of As. I was pleased to see my dissertation had got an A, I knew the coding was pretty good but I felt my sociological investigation of open source development had been a little weak. I&#8217;d also got 100% on my final web design module, which is unheard of (I suspect the tutor may have had some explaining to do there!) so I felt good for the 2:1. I checked my percentage and saw 68.7% (the boundaries are 40%=3rd, 50%=2:2, 60%=2:1 and 70%=1st). How tantalisingly  close, within 2% of a First. I did as anyone would do and promptly posted what I believed to be my result to Twitter. Feeling pleased I decided to have a look around the results pages a little when I came across the line stating your degree result, &#8220;First Class Honours&#8221;. I could do little more than point and look at my girl Emily who&#8217;d also just got her results, a 2:1 in Linguistics. </p>
<p>Well as it turns out, if you score four or more B+ or above in your final semester (my final year was 5 As and 3 B+s) then they lower the bar for a First to 69%. I&#8217;m guessing this is to allow for improvement over the two years. And of course we can&#8217;t have decimals points in the percentage, they need to be rounded.. up in my case. I got a First within a margin of 0.7% (they round up all)! Twitter needed an update! With exclamation marks!!!</p>
<p>For one thing, the narrow margin certainly means I&#8217;m not complacent in the result. I know I could have done better and probably should have done. But it certainly makes the future look a little brighter. I don&#8217;t expect prospective employers to be pulling my arm off, but when looking at future Masters I know that I will now have a greater choice. The biggest bonus though is how proud my family are, my Mum said she had a little cry. Not too bad a result for someone who left school at 16. Guess I need to hire a gown now.</p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2009/06/final-degree-results/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Latest Web Design</title>
		<link>http://skinofstars.com/2009/05/latest-web-design/</link>
		<comments>http://skinofstars.com/2009/05/latest-web-design/#comments</comments>
		<pubDate>Mon, 04 May 2009 15:00:28 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Oxford]]></category>
		<category><![CDATA[Programming & Design]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://skinofstars.com/?p=309</guid>
		<description><![CDATA[Hey All, Just thought I would tell you all about a new site that I&#8217;ve created for homework. It&#8217;s for an Oxford based band called Branch Immersion, a three piece acoustic outfit, some friends of mine. The site is hosted on the uni servers at the moment but I expect we&#8217;ll host it here at [...]]]></description>
			<content:encoded><![CDATA[<p>Hey All,</p>
<p>Just thought I would tell you all about a new site that I&#8217;ve created for homework. It&#8217;s for an Oxford based band called Branch Immersion, a three piece acoustic outfit, some friends of mine. The site is hosted on the uni servers at the moment but I expect we&#8217;ll host it here at SkinOfStars towers soon enough once they&#8217;ve bought their domain name and I&#8217;ve ported the static pages to WordPress.</p>
<p>This is an original design and I must be honest, one I am very proud of. Please check it out at the temporary address (I&#8217;ll update with the final address later):</p>
<p><span style="text-decoration: line-through;"><a href="http://wwwusers.brookes.ac.uk/06021836/u75131">http://wwwusers.brookes.ac.uk/06021836/u75131</a></span></p>
<p><a href="http://skinofstars.com/branch_immersion">http://skinofstars.com/branch_immersion</a></p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2009/05/latest-web-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One Day Blog Hack</title>
		<link>http://skinofstars.com/2009/04/one-day-blog-hack/</link>
		<comments>http://skinofstars.com/2009/04/one-day-blog-hack/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 21:19:59 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming & Design]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://localhost/slog/?p=290</guid>
		<description><![CDATA[I've decided to do a blog hack in a day and here you see the result. I was struggling with Drupal as a blogging platform, and frankly an anything platform, so I decided to move to the decidedly easier Wordpress.]]></description>
			<content:encoded><![CDATA[<p>Hey All,</p>
<p>I&#8217;ve decided to do a blog hack in a day and here you see the result. I was struggling with Drupal as a blogging platform, and frankly an anything platform, so I decided to move to the decidedly easier WordPress. I&#8217;m not saying there is anything wrong with Drupal, it&#8217;s a great platform. The problem is that it&#8217;s built for so many tricks that you have to give it a real shove when you want something simple. For example, handling images. On a content sytem one would have thought that would be an obvious feature, but with drupal you have to go get a plugin. Madness I tell you! Not that getting WordPress means I&#8217;ll be bloggin frantically, but it makes life a lot easier.</p>
<p>So here is how I got from Drupal 6 to WordPress 2.7 in a day:</p>
<p>1. Backup the Drupal database &amp; import the data into WordPress</p>
<p>Moving around between platforms is quite common, so you&#8217;ll often find a script to aid you in moving database info from one structure to another. WordPress has many such scripts built in for many platforms, but for Drupal I got my assistance from <a href="http://www.mikesmullin.com/development/migrate-convert-import-drupal-5-to-wordpress-27/">Mike Smullin</a>. I had to make some minor changes, for example I added this SQL statement to change my Drupal post_type &#8216;story&#8217; to WordPress&#8217;s &#8216;post&#8217;</p>
<p>UPDATE wp_posts SET post_type = REPLACE(post_type,’story’,&#8217;post’);</p>
<p>Pretty easy stuff really. If you&#8217;re going to do it yourself, make sure you do it locally on backup copies. I hosed a few before I got it right.</p>
<p>2.Theme Hack</p>
<p>Ahh yes, the inevitable theme quandry. I had thought about what I wanted Skinofstars.com to look like for a while, but I wanted to do it reasonably quickly as I hate it when these things hang around. My layout plan was simple enough. Only one or two blog posts on the front page with info on my other nettyness, like tweets. I also knew that I&#8217;d want access to other pages (as you find in the Further section.. not sure on that name).  So I searched some WordPress themes and came across <a href="http://5thirtyone.com/grid-focus">Grid Focus</a>. It seemed to have the right level of minimalism that I was looking for as well as reasonably suitable layout. In order for it to work for me though I had to make a few hacks including some JQuery magic to include my further section (hope you like the transitions) and some layout hacks for the differences between a narrow and wide content column (you&#8217;ll see if you view this in single/comments mode).</p>
<p>3. Content Update</p>
<p>Probably one of the most time consuming parts. Much of my old content was Uncategorised for no reason and lacked any tags. Many posts from back in the Blogger days didn&#8217;t even have a title. I went through almost all of them  (I&#8217;ve taken a break from the 1996 stuff) and finally managed to put these years of outpourings into some kind of order.</p>
<p>4. Update to server</p>
<p>Well, that&#8217;s just a bit of FTP and MySQL. Job done.</p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2009/04/one-day-blog-hack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boxfire 1</title>
		<link>http://skinofstars.com/2009/03/boxfire-1/</link>
		<comments>http://skinofstars.com/2009/03/boxfire-1/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 00:53:39 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Oxford]]></category>
		<category><![CDATA[boxfire]]></category>
		<category><![CDATA[Education]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I'm preemptively titling this post as Boxfire 1 as I know there is more info to come. My dissertation produced a website, or should I say that I have produced a website for my dissertation. Either way, it's a collaborative news filter for Oxford that relies on user interaction to find the most important news story for the area. Please try it out and tell me what you think:

http://boxfire.co.uk]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m preemptively titling this post as Boxfire 1 as I know there is more info to come. My dissertation produced a website, or should I say that I have produced a website for my dissertation. Either way, it&#8217;s a collaborative news filter for Oxford that relies on user interaction to find the most important news story for the area. Please try it out and tell me what you think:</p>
<p><a href="http://boxfire.co.uk">http://boxfire.co.uk</a></p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2009/03/boxfire-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby On Rails, RSS and Atom feed parsing with Feed Normalizer and subsequent storage</title>
		<link>http://skinofstars.com/2009/03/ruby-on-rails-rss-and-atom-feed-parsing-with-feed-normalizer-and-subsequent-storage/</link>
		<comments>http://skinofstars.com/2009/03/ruby-on-rails-rss-and-atom-feed-parsing-with-feed-normalizer-and-subsequent-storage/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 02:47:10 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Programming & Design]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubyonrails]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I've battled for days on this, but I now finally know how to parse feeds and store them in a database in Ruby On Rails. This won't be of much interest to the casual reader, but if you are scouring the web for an answer (as I was) then you will probably find this very useful:

<code>
class Feed < ActiveRecord::Base
  require_association 'post'
  require 'feed-normalizer'
  require 'open-uri'
  require 'rss/2.0'
<code>
  belongs_to :user
  has_many :posts, :dependent => :destroy
<code>
#put some other stuff here for feed validation etc
<code>
  def refresh_all
    refresh(Feed.find(:all))
  end
<code>
  def refresh(feeds)
    feeds.each do &#124;feed&#124;
      rss = FeedNormalizer::FeedNormalizer.parse open(feed.uri)
      rss.entries.each  do &#124;item&#124;
      post = Post.new(:feed_id => feed.id)
      post.link = item.url or raise "post has no link tag"
      post.title = item.title or "no title"
      post.content = item.content or "no text"
      post.created_at = item.date_published if item.date_published
      post.save
    end
  end
<code>
end
</code>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve battled for days on this, but I now finally know how to parse feeds and store them in a database in Ruby On Rails. This won&#8217;t be of much interest to the casual reader, but if you are scouring the web for an answer (as I was) then you will probably find this very useful:</p>
<p><code><br />
class Feed &lt; ActiveRecord::Base<br />
require_association 'post'<br />
require 'feed-normalizer'<br />
require 'open-uri'<br />
require 'rss/2.0'<br />
<code><br />
belongs_to :user<br />
has_many :posts, :dependent =&gt; :destroy<br />
<code><br />
#put some other stuff here for feed validation etc<br />
<code><br />
def refresh_all<br />
refresh(Feed.find(:all))<br />
end<br />
<code><br />
def refresh(feeds)<br />
feeds.each do |feed|<br />
rss = FeedNormalizer::FeedNormalizer.parse open(feed.uri)<br />
rss.entries.each  do |item|<br />
post = Post.new(:feed_id =&gt; feed.id)<br />
post.link = item.url or raise "post has no link tag"<br />
post.title = item.title or "no title"<br />
post.content = item.content or "no text"<br />
post.created_at = item.date_published if item.date_published<br />
post.save<br />
end<br />
end<br />
<code>end</code></code></code></code></code></code></p>
<p>end</p>
]]></content:encoded>
			<wfw:commentRss>http://skinofstars.com/2009/03/ruby-on-rails-rss-and-atom-feed-parsing-with-feed-normalizer-and-subsequent-storage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
