<?xml version="1.0"?>
<rss version="0.92"><channel><title><![CDATA[Tim Hastings - NonHostile (because there's no need)]]></title><link><![CDATA[http://www.nonhostile.com/]]></link><description><![CDATA[Weblog and collection of geeky articles.]]></description><language><![CDATA[en-gb]]></language><generator><![CDATA[NonHostile Blog - http://www.nonhostile.com/]]></generator><pubDate><![CDATA[11 Sep 2010 18:29:59 GMT]]></pubDate><lastBuildDate><![CDATA[8 Feb 2012 20:35:32 GMT]]></lastBuildDate><item><title><![CDATA[How to HTTP POST JSON using PHP]]></title><link><![CDATA[http://www.nonhostile.com/howto-http-post-json-using-php.asp?src=rss]]></link><pubDate><![CDATA[11 Sep 2010 18:29:59 GMT]]></pubDate><description><![CDATA[<p>The PHP snippet encodes $input as JSON and makes a HTTP POST operation to a given URL.</p>
<p>The response is also decoded from JSON back to a native PHP data type.</p>

<pre>   /* POST JSON encoded version of $input to $url */
   /* By Tim Hastings, http://www.nonhostile.com/howto-http-post-json-using-php.asp */
   function JsonPost($url, $input) {

      // encode and prepare headers
      $json = json_encode($input);
      $contentLength = strlen($json);
      $headers = "Content-type: application/json\r\nContent-Length: {$contentLength}\r\n";
                			
      // populate the options,
      $options = array(
         'http' => array(
         'method' => 'POST',
            'header' => $headers,		
            'ignore_errors' => true,
            'content' => $json
         )
      );

      // create context
      $context = stream_context_create($options);
      $fp = @fopen($url, 'rb', false, $context);
      if (!$fp) {

         // failed here
         $resp = null;

      } else {

         // get the response and decode
         $resp = stream_get_contents($fp);
         $resp = json_decode($resp, true);

         // close the response
         fclose($fp);

      }

      // decode JSON response
      return $resp;

   }
</pre>
]]></description></item><item><title><![CDATA[Javascript ForEach Key Value Iteration Like PHP]]></title><link><![CDATA[http://www.nonhostile.com/howto-javascript-foreach-key-value-like-php.asp?src=rss]]></link><pubDate><![CDATA[11 Sep 2010 17:58:36 GMT]]></pubDate><description><![CDATA[<p>Whilst getting started with <a href="http://nodejs.org/">node.js</a> I found myself needing lots of simple Javascript snippets equivalent to common PHP snippets.</p>
<p>Believe it or not, it took me too long for my liking to find the Javascript equivalent to PHP's foreach so I thought I'd put up another version.</p>
<br>

<p>In PHP, key/value iteration looks like this:</p>

<pre>   foreach ($myArray as $key => $value) {
      // use $key and $value here
   }
</pre>

<p>In Javascript, key/value iteration looks like this:</p>

<pre>   for (key in myArray) {
      var value = myArray[key];
      // use key and value here
   }
</pre>

<p>Happy Javascripting :-)</p>
<br>]]></description></item><item><title><![CDATA[HTTP Posting some JSON using curl]]></title><link><![CDATA[http://www.nonhostile.com/howto-http-post-json-using-curl.asp?src=rss]]></link><pubDate><![CDATA[11 Sep 2010 17:44:17 GMT]]></pubDate><description><![CDATA[<p>Increasingly I find I am posting JSON all over the place.</p>
<p>This linux snippet comes in handy for doing this.</p>

<pre>    curl http://example.com/script \
         -H "content-type: application/json" -d "{ \"woof\": \"bark\", \"de\": \"do doo\" }"
</pre>

<p>Hope this helps :-)</p>
<br>]]></description><category>linux</category></item><item><title><![CDATA[Sending HTTP DELETE with curl]]></title><link><![CDATA[http://www.nonhostile.com/howto-http-delete-using-curl.asp?src=rss]]></link><pubDate><![CDATA[25 Jun 2010 11:34:27 GMT]]></pubDate><description><![CDATA[<p>The need arose today to issue a bulk set of HTTP DELETE operations against our applicaiton's REST-based API.</p>
<p>It took me a little digging to find out how to use curl to do this, so here it is:</p>

<pre>    curl -X DELETE http://localhost/example/    
</pre>

<p>Loving curl!</p>
<p>It is quickly becoming one of my favourite command line tools.</p>
<br>]]></description></item><item><title><![CDATA[How to Install Node.js on Ubuntu]]></title><link><![CDATA[http://www.nonhostile.com/howto-install-node-js-ubuntu.asp?src=rss]]></link><pubDate><![CDATA[27 May 2010 19:50:14 GMT]]></pubDate><description><![CDATA[<p>After reading a lot about <a href="http://nodejs.org/">node.js</a> recently, I decided to give it a whirl.</p>
<p>Having just built a clean desktop install of <a href="http://www.ubuntu.com/">Ubuntu 10.4</a> I had the ideal environment.</p>
<p>Here are the steps to get it up and running.</p>
<p>First, start a super user console session</p>

<pre>    sudo -i -- and enter password to elevate privileges
</pre>

<p>Now, setup the pre-requisites for compilation and test execution:</p>

<pre>    apt-get install g++ curl libssl-dev apache2-utils
</pre>

<p>Next, download, unpack and build:</p>
<pre>
    wget http://nodejs.org/dist/node-v0.4.5.tar.gz
    gunzip node-v0.4.5.tar.gz
    tar -xf node-v0.4.5.tar
    cd node-v0.4.5/
    ./configure
    make
    make install
</pre>

<p>Finally, to run the tests:</p>

<pre>    make test
</pre>

<p>That's it, you're done. Happy noding!</p>
<br>]]></description></item><item><title><![CDATA[VB.Net: How to Format unicodePwd for Active Directory LDIF Script for LDAP Import]]></title><link><![CDATA[http://www.nonhostile.com/howto-format-unicodepwd-ldif-active-directory.asp?src=rss]]></link><pubDate><![CDATA[22 Oct 2009 20:34:03 GMT]]></pubDate><description><![CDATA[<p>If you are doing LDAP integration work with Active Directory and you want to update a user's password via an LDIF script you need to specify the password attribute in a very specific way.</p>

<p>The sequence of steps is this:</p>
<ul>
<li>Surround the password with speech marks, "like this"</li>
<li>Covert to bytes using the Unicode character encoding - a two byte code page which pads the low ASCII characters with 0</li>
<li>Encode using Base 64</li>
</ul>

<p>So something like <strong>password</strong> becomes <strong>IgBzAGUAYwByAGUAdAAiAA==</strong></p>

<p>This all sounds well and good, here's a code sample:</p>

<pre class="csharpcode">
    <span class="kwrd">Public</span> <span class="kwrd">Function</span> FormatPassword(<span class="kwrd">ByVal</span> password <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> <span class="kwrd">String</span>

        <span class="kwrd">If</span> password <span class="kwrd">Is</span> <span class="kwrd">Nothing</span> <span class="kwrd">Then</span> <span class="kwrd">Throw</span> <span class="kwrd">New</span> ArgumentNullException(<span class="str">"password"</span>, <span class="str">"password cannot be nothing"</span>)

        <span class="rem">' enclose in speech marks</span>
        password = <span class="kwrd">String</span>.Format(<span class="str">""</span><span class="str">"{0}"</span><span class="str">""</span>, password)

        <span class="rem">' convert to bytes with unicode encoding</span>
        <span class="kwrd">Dim</span> bytes() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = Encoding.<span class="kwrd">Unicode</span>.GetBytes(password)

        <span class="rem">' convert to base 64</span>
        <span class="kwrd">Dim</span> base64 <span class="kwrd">As</span> <span class="kwrd">String</span> = Convert.ToBase64String(bytes)
        <span class="kwrd">Return</span> base64

    <span class="kwrd">End Function</span></pre>

<p>Some sample passwords:</p>

<pre>    admin     IgBhAGQAbQBpAG4AIgA=
    root      IgByAG8AbwB0ACIA
    password  IgBwAGEAcwBzAHcAbwByAGQAIgA=
    apple     IgBhAHAAcABsAGUAIgA=
    banana    IgBiAGEAbgBhAG4AYQAiAA==
    pencel    IgBwAGUAbgBjAGkAbAAiAA==</pre>

<h2>LDIF Set Password Script</h2>

<p>To use this encoded password in an LDIF script, you will need to create LDIF fragments like this:</p>

<pre>    dn: cn=timhastings,ou=Users,dc=example,dc=com
    changetype: modify
    replace: unicodePwd
    unicodePwd:: IgBwAGEAcwBzAHcAbwByAGQAIgA=</pre>

<p>The double-colon is required on the unicodePwd attribute as it identifies that the data which follows is Base64 encoded.</p>

<p>To import this into Active Directory, you will need to use the <strong>ldifde</strong> command line too.</p>

<h2>Password Policy</h2>

<p>You must make sure your passwords meet the strength and history requirements of the systems password policy, otherwise you will receive the following error message:</p>

<pre>    The server side error is: 0x52d Unable to update the password.
    The value provided for the new password does not meet the length, complexity, or history requirements of the domain.
    The extended server error is: 0000052D: SvcErr: DSID-031A11E5, problem 5003 (WILL_NOT_PERFORM), data 0</pre>

<h2>ldifde Secure Connection</h2>

<p>When settings passwords, Active Directory insists you use a secure connection otherwise you will get an Unwilling To Perform error like this:</p>

<pre>    Add error on entry starting on line 1: Unwilling To Perform
    The server side error is: 0x1f A device attached to the system is not functioning.
    The extended server error is:            
    0000001F: SvcErr: DSID-031A11E5, problem 5003 (WILL_NOT_PERFORM), data 0</pre>

<p>To specify a secure connection to LDAP, use ldifde like this:</p>

<pre>    ldifde -i -f -h -v myscript.ldf</pre>

<p>I hope this helps!</p>
<br>
]]></description></item><item><title><![CDATA[How to Find Which Process has a File Open on Linux]]></title><link><![CDATA[http://www.nonhostile.com/howto-find-which-process-has-file-open-linux.asp?src=rss]]></link><pubDate><![CDATA[22 Oct 2009 20:08:39 GMT]]></pubDate><description><![CDATA[<p>A number of times I have found myself unable to access a file because some other process is writing to it.</p>
<p>Usually lock files which are used to prevent multiple instances of the same program from running at the same time, or to guard against multiple operations running at the same time that would interfere with each other.</p>
<p>The Linux command which comes to the rescue is called <strong>lsof</strong> which I guess is short for "list of open files"</p>
<p>It can be used in several different ways:</p>

<h2>List All Open Files</h2>
<pre>    lsof</pre>
<p>This will list all the God damn files open on your system. There will be lots of other interesting things listed which are not files, things like pipes and network sockets. This is because on Linux, everything is abstracted to a file, even the keyboard.</p>
<p>The output from lsof can be piped to grep to search for bits of file names.</p>
<pre>    lsof | grep pony</pre>
<p>This will perform a very crude search for any file name, path or process with anything to do with 'pony'</p>

<h2>List All Open Files for a Given Process (by PID)</h2>
<p>For example:</p>
<pre>    lsof -p 12345</pre>
<p>Lists all file handles currently held by process 12345</p>

<h2>lsof headings</h2>
<p>By default, the lsof output looks like this (without headings)</p>
<pre>mysqld    30353     mysql  219u      REG        8,2 5976322292    6652117 /mnt/mysql/tagwalk/msg.MYD
mysqld    30353     mysql  220u      REG        8,2  672237472    6652170 /mnt/mysql/tagwalk/tag.MYD
mysqld    30353     mysql  221u      REG        8,2  672237472    6652170 /mnt/mysql/tagwalk/tag.MYD
mysqld    30353     mysql  222u      REG        8,2 5976322292    6652117 /mnt/mysql/tagwalk/msg.MYD
(cmd)     (pid)     (user) (handle)  (type) (device)(size/offset) (node)  (path)</pre>

<p>From left-to-right, the columns are:</p>
<ul>
<li>Command (first 9 characters)</li>
<li>Process ID (PID)</li>
<li>User</li>
<li>File Descriptor and Access Mode: r=read, w=write, u=read/write</li>
<li>Type: REG=Regular File, PIPE=Pipe, IPv4=TCP/IP socket (everything's a file remember!)</li>
<li>Device: In this case, I'm not sure what "8,2" means</li>
<li>File Size or Offset (if relevant)</li>
<li>Node: The node number of this file (an internal file system thing)</li>
<li>Name: The file name and path of the open file</li>
</ul>

<p>Hope this helps!</p>
<br>]]></description><category>linux</category></item><item><title><![CDATA[MonoAmi: Mono 2.2 Amazon EC2 Image - Hosting for ASP.Net In The Cloud]]></title><link><![CDATA[http://www.nonhostile.com/mono-2-2-hosting-asp-net-amazon-ec2.asp?src=rss]]></link><pubDate><![CDATA[17 Jan 2009 23:15:00 GMT]]></pubDate><description><![CDATA[<img src="http://www.nonhostile.com/photos/2008-06/monobutton-1.png" style="width: 40px; height: 48px; padding-right: 8px; padding-bottom: 8px; float: left;">
<p>This week, the Mono team released version 2.2 of the framework (<a href="http://www.mono-project.com/Release_Notes_Mono_2.2">release notes</a>).</p>

<p>I have created a new Amazon EC2 image with Mono 2.2 installed on Amazon's Fedora 8 image.</p>
<p>This new image supersedes the previous versions I created for 1.9.1 and 2.0.</p>
<p>Here's is a link to this image's <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1998&categoryID=202">page</a> in the EC2 resource centre.</p>
<br>

<style type="text/css">
pre.pre331 { background: #f0f0ff; border: 2px dashed #c0c0cc; padding: 1em; }
</style>

<p>The EC2 AMI and manifest path are:</p>

<pre class="pre331">ami-dc8760b5
nonhostile-mono2-2-i386/image.manifest.xml</pre>

<p>Once you start this instance, you can browse to its public DNS name to see the XSP test sites.</p>
<p>This instance is intended to serve web applications or run console based applications or services; it does not have any kind of graphical interface.</p>
<br>

<strong>Ingredients</strong><br>
This instance was made from:
<ul>
<li>Amazon’s Fedora 8 base image (ami-5647a33f v1.08)
<li>Latest updates via yum
<li>Apache 2.2.9 installed via yum
<li>Apache and mod_mono are configured to serve the XSP 'test' files from the web site's root in /etc/httpd/conf/httpd.conf (at the bottom)
</ul>

<p>The following have been compiled and installed from the <a href="http://ftp.novell.com/pub/mono/sources-stable/">Mono 2.2 stable sources</a> with the --prefix=/usr</p>

<ul>
<li>mono-2.2
<li>mono-basic-2.2
<li>mod_mono-2.2
<li>libgdiplus-2.2
<li>xsp-2.2
</ul>

<strong>Sample Projects</strong><br>
<p>The sample ASP.Net files for 1.0 and 2.0 are installed at this root:</p>

<pre class="pre331">/usr/lib/xsp/test</pre>

<p>The Apache config (/etc/httpd/conf/httpd.conf) file has been configured to serve an ASP.Net application from this location.</p>
<p>You can edit the Apache configuration file using vim. Use Ctrl-D in vim to page-scroll down.</p>

<pre class="pre331">vim /etc/httpd/conf/httpd.conf</pre>

<pre class="pre331">
# Set mono as the handler
SetHandler mono

# Configure a 'root' web application to run from root
MonoApplications root "/:/usr/lib/xsp/test"
MonoServerPath root /usr/bin/mod-mono-server2
&lt;Location /&gt;
  MonoSetServerAlias root
&lt;/Location&gt;
</pre>

<strong>Configuring your own ASP.Net applications</strong><br>
<p>To serve your own ASP.Net applications from this instance, you need to store the files somewhere, for example, /mnt/MyApp, then modify the MonoApplications directive at the bottom of the Apache configuration file.</p>

<pre class="pre331">MonoApplications root "/:/mnt/MyApp"</pre>

<p>Good luck and happy Mono developing!</p>
<br>

<strong>Links</strong><br>
<ul>
<li><a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1998&categoryID=202">Mono AMI</a>: documentation at Amazon community directory
<li><a href="http://www.mono-project.com/Release_Notes_Mono_2.2">Mono 2.2 Release Notes</a>
<li><a href="http://www.mono-project.com/">Mono</a>: The Mono homestead sporting a new look
<li><a href="http://www.mono-project.com/Mod_mono">mod_mono</a>: Documentation on configuring mod_mono
<li><a href="http://qwoot.net/other/vim_shortcuts.htm">VIM Shortcuts</a>: For help using vim
<li><a href="http://twitter.com/timhastings">Twitter</a>: My twitter link if you want to keep in touch
</ul>

<p><img src="http://www.nonhostile.com/img/delicious.small.gif"/> <a href="http://del.icio.us/post" onclick="document.location = ('http://del.icio.us/post?v=4&noui&jump=close&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)); return false;">bookmark this on del.icio.us</a></p>

&copy; 2009 Copyright Tim Hastings<br>
<br>

]]></description><category>ec2</category><category>aws</category><category>linux</category><category>mono</category></item><item><title><![CDATA[ASP Fix: XML transformNodeToObject - Not implemented (80004001)]]></title><link><![CDATA[http://www.nonhostile.com/fix-xml-transformnodetoobject-not-implemented.asp?src=rss]]></link><pubDate><![CDATA[16 Dec 2008 11:53:23 GMT]]></pubDate><description><![CDATA[<p>From time to time, my web host changes some aspect of the server that this weblog is hosted on. The code that runs this site is written in classic ASP which means it is hosted on IIS. Recently another configuration change took place, presumably one of Microsoft's many hot fixes or an upgrade to a new version of Windows or IIS.</p>

<p>The following error started to appear tagged onto the bottom of every web page:</p>

<pre>    msxml3.dll error '80004001'
    Not implemented</pre>

<p>Behind the scenes, this site use XML and XSL to separate the site's data from its layout, in the middle somewhere is a line of code which performs an XSLT transformation on the XML DOM into the HTML output which gets squirted out into the response.</p>

<pre class="csharpcode">
    <span class="rem">' method to transform the response (with errors)</span>
    <span class="kwrd">public</span> <span class="kwrd">sub</span> TransformToResponse_Old(xml, xsl)
        xml.transformNodeToObject xsl, Response
    <span class="kwrd">end sub</span></pre>

<p>Somewhere in the depths of ASP or IIS, a change has occurred which has dropped the IStream support of the classic ASP response object (I presume looking at the symptoms).</p>

<p>The fix introduces an intermediate stream to receive the XSLT transformation, and then send that to the response. This method also sets the response code page to be UTF8, which this site uses.</p>

<pre class="csharpcode">
    <span class="rem">' method to transform the response (without errors)</span>
    <span class="kwrd">public</span> <span class="kwrd">sub</span> TransformToResponse_New(xml, xsl)

        <span class="rem">' By Tim Hastings, www.nonhostile.com</span>
        <span class="rem">' prepare stream to receive transformation</span>
        <span class="kwrd">dim</span> outputStream
        <span class="kwrd">Set</span> outputStream = Server.CreateObject(<span class="str">"ADODB.Stream"</span>)
        outputStream.Open 
        outputStream.Charset = <span class="str">"UTF-8"</span>
        outputStream.Type = 1 <span class="rem">' adTypeBinary</span>

        <span class="rem">' transform and output to stream</span>
        xml.transformNodeToObject xsl, outputStream
        
        <span class="rem">' set character-set</span>
        Response.CharSet = <span class="str">"UTF-8"</span>
        Response.ContentType = <span class="str">"text/html"</span>        
        Session.CodePage = 65001
        
        <span class="rem">' rewind the stream and send to response</span>
        outputStream.Position = 0
        Response.BinaryWrite outputStream.Read()
                                
        <span class="rem">' finished with the stream</span>
        outputStream.Close
        <span class="kwrd">set</span> outputStream = <span class="kwrd">Nothing</span>

    <span class="kwrd">end</span> <span class="kwrd">sub</span>
</pre>

<p>Hope this helps!</p>
<br>]]></description></item><item><title><![CDATA[Yay! Photo Booth!]]></title><link><![CDATA[http://www.nonhostile.com/page000332.asp?src=rss]]></link><pubDate><![CDATA[14 Oct 2008 21:02:32 GMT]]></pubDate><description><![CDATA[Without question, my favourite feature of the iMac is the integrated camera and photo booth application.<br>
Everyone loves it!<br>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo007.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo007-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/Photo004.jpg"><img src="http://www.nonhostile.com/photos/2008-10/Photo004-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo029.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo029-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo051.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo051-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo052.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo052-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo084.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo084-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo092.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo092-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo096.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo096-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo098.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo098-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo103.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo103-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo109.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo109-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo127.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo127-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo139.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo139-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo142.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo142-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo145.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo145-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo147.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo147-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo157.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo157-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo162.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo162-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/photo169.jpg"><img src="http://www.nonhostile.com/photos/2008-10/photo169-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-10/Photo175.jpg"><img src="http://www.nonhostile.com/photos/2008-10/Photo175-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

<table>
<tr>
</tr>
</table>
<br>

]]></description></item><item><title><![CDATA[MonoAmi: Mono 2.0 Amazon EC2 Image - Cloud Hosting for ASP.Net]]></title><link><![CDATA[http://www.nonhostile.com/mono-2-0-asp-net-amazon-ec2.asp?src=rss]]></link><pubDate><![CDATA[8 Oct 2008 01:12:18 GMT]]></pubDate><description><![CDATA[<img src="http://www.nonhostile.com/photos/2008-06/monobutton-1.png" style="width: 40px; height: 48px; padding-right: 8px; padding-bottom: 8px; float: left;">
<p>On Monday, <a href="http://www.go-mono.com/archive/2.0">Mono 2.0 was released</a> by the Mono Development team. This release has been in-progress for a couple of years and is a major step forward in the mission to run .Net on Linux and other platforms. If you check out the release notes you can see there's a bus load of new features supported; including Linq!</p>
<br>

<style type="text/css">
pre.pre331 { background: #f0f0ff; border: 2px dashed #c0c0cc; padding: 1em; }
</style>

<p>To make it as easy to use Mono 2.0 in Amazon EC2 cloud I have built a new version of the image I created with <a href="http://www.nonhostile.com/mono-on-amazon-ec2.asp">Mono 1.9.1</a> a couple of months ago.</p><br>

<p><span style="background: #ffff00;"><strong>Update:</strong> a <a href="http://www.nonhostile.com/mono-2-2-hosting-asp-net-amazon-ec2.asp">Mono 2.2 AMI</a> is available</strong></p><br>

<p>The EC2 AMI and manifest path are:</p>

<pre class="pre331">ami-b627c3df
nonhostile-mono2-i386/image.manifest.xml</pre>

<p>Once you start this instance, you can browse to its public DNS name to see the XSP test sites.</p>
<p>This instance is intended to serve web applications or run console based applications or services; it does not have any kind of graphics interface.</p>
<br>

<strong>Ingredients</strong><br>
This instance was made from:
<ul>
<li>Amazon’s Fedora 8 base image (ami-2b5fba42 v1.07)
<li>Latest updates via yum
<li>Apache 2.2.6 installed via yum
<li>Apache and mod_mono are configured to serve the XSP 'test' files from the web site's root in /etc/httpd/conf/httpd.conf (at the bottom)
</ul>

<p>The following have been compiled and installed from the Mono 2.0 stable sources with the --prefix=/usr</p>

<ul>
<li>mono-2.0
<li>mono-basic-2.0
<li>mod_mono-2.0
<li>libgdiplus-2.0
<li>xsp-2.0
</ul>

<strong>Sample Projects</strong><br>
<p>The sample ASP.Net files for 1.0 and 2.0 are installed at this root:</p>

<pre class="pre331">/usr/lib/xsp/test</pre>

<p>The Apache config (/etc/httpd/conf/httpd.conf) file has been configured to serve an ASP.Net application from this location.</p>
<p>You can edit the Apache configuration file using vim. Use Ctrl-D in vim to page-scroll down.</p>

<pre class="pre331">vim /etc/httpd/conf/httpd.conf</pre>

<pre class="pre331">
# Set mono as the handler
SetHandler mono

# Configure a 'root' web application to run from root
MonoApplications root "/:/usr/lib/xsp/test"
MonoServerPath root /usr/bin/mod-mono-server2
&lt;Location /&gt;
  MonoSetServerAlias root
&lt;/Location&gt;
</pre>

<strong>Configuring your own ASP.Net applications</strong><br>
<p>To serve your own ASP.Net applications from this instance, you need to store the files somewhere, for example, /mnt/MyApp, then modify the MonoApplications directive at the bottom of the Apache configuration file.</p>

<pre class="pre331">MonoApplications root "/:/mnt/MyApp"</pre>

<p>Good luck and happy Mono developing!</p>
<br>

<strong>Links</strong><br>
<ul>
<li><a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1755&categoryID=101">Mono AMI</a>: documentation at Amazon community directory
<li><a href="http://www.go-mono.com/archive/2.0">Mono 2.0 Release Notes</a>
<li><a href="http://www.mono-project.com/">Mono</a>: The Mono homestead sporting a new look
<li><a href="http://www.mono-project.com/Mod_mono">mod_mono</a>: Documentation on configuring mod_mono
<li><a href="http://qwoot.net/other/vim_shortcuts.htm">VIM Shortcuts</a>: For help using vim
<li><a href="http://twitter.com/timhastings">Twitter</a>: My twitter link if you want to keep in touch
</ul>

<p><img src="http://www.nonhostile.com/img/delicious.small.gif"/> <a href="http://del.icio.us/post" onclick="document.location = ('http://del.icio.us/post?v=4&noui&jump=close&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)); return false;">bookmark this on del.icio.us</a></p>

&copy; 2008 Copyright Tim Hastings<br>
<br>

]]></description></item><item><title><![CDATA[MySQL Replication between Amazon EC2 Instances - How To Setup Replication in The Cloud]]></title><link><![CDATA[http://www.nonhostile.com/howto-mysql-replication-amazon-ec2-aws.asp?src=rss]]></link><pubDate><![CDATA[2 Oct 2008 01:10:08 GMT]]></pubDate><description><![CDATA[<p>The article discusses how to setup MySQL Replication between two Amazon EC2 instances.</p>
<p>It walks you though setting up replication for an empty database server. Adding a slave to a server already full of data is a different article.</p>
<p>It is assumed that you already know the basics of starting EC2 instances, connecting to them via SSH and editing files in Linux using vi/vim etc.</p>
<p>For this tutorial, I am using the Amazon built machine image <strong>ami-2b5fba42</strong> which is Fedora 8 base image.</p>
<br>

<strong>Overview</strong><br>
<p>In this tutorial, we will:</p>
<ul>
<li>Launch two EC2 instances, a Master and a Slave
<li>Install MySQL Server and tools onto each machine (must be the same version of MySQL on both)
<li>Configure MySQL on each so that each has a unique server ID and keeps its data in an EC2 friendly place
<li>Create a user on the master for replication and configure the slave to use it.
<li>Synchronize the master/slave replication logs
<li>Test it all works
</ul>

<strong>Configuring the MySQL Master</strong> (shown in blue)<br>
<p>The steps for configuring the master are as follows:

<ul>
<li>Launch an EC2 instance using your favourite method (I like the <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609">ElasticFox</a> Firefox extension)
<li>Install MySQL Server and Client Tools (via Yum)
<li>Edit /etc/my.cnf to alter the data folder and edit replication settings
<li>Configure MySQL to run at boot (in case we restart the instance)
<li>Start MySQL and configure to run at boot
<li>Create a MySQL user for replication
</ul>

<style type="text/css">
pre.master { background: #f0f0ff; border: 2px dashed #c0c0cc; padding: 1em; }
pre.slave { background: #f0fff0; border: 2px dashed #c0ccc0; padding: 1em; }
</style>

<p>First, launch an instance of the Fedora machine, and connect using SSH.</p>
<p>This gives us a base Fedora instance.</p>
<p>Next, install MySQL and configure it to start when the machine boots (in case we decide to restart it)</p>

<p>Install MySQL Server and tools:</p>
<pre class="master">yum install -y mysql mysql-server</pre>

<p>Rename the old config file (if you're interested in keeping it) and edit the /etc/my.cnf:</p>
<pre class="master">mv /etc/my.cnf /etc/my.cnf.old
vi /etc/my.cnf</pre>

<p>To look something like this:</p>
<pre class="master">[mysqld]

# replication settings for MASTER
server-id               = 1

# data folder
datadir                 = /mnt/mysql

# switch on binary logging (required for replication)
log-bin                 = mysql-bin

# system stuff
user                    = mysql
socket                  = /var/lib/mysql/mysql.sock

[mysqld_safe]
log-error               = /var/log/mysqld.log
pid-file                = /var/run/mysqld/mysqld.pid</pre>

<p>Now we can configure MySQL to start at boot, start it now and connect.</p>

<pre class="master">chkconfig --level 2345 mysqld on
service mysqld start
mysql</pre>

<p>Now we can create a replication user account:</p>

<pre class="master">GRANT REPLICATION SLAVE ON *.* TO '<cite>ReplicationUser</cite>' IDENTIFIED BY '<cite>ReplicationPassword</cite>';
FLUSH PRIVILEGES;</pre>

<p>We're done. Next, the slave...</p>

<br>

<strong>Configuring the MySQL Slave</strong> (shown in green)<br>
<p>
<p>This is an almost identical sequence of steps, with a couple of minor differences.</p>

<ul>
<li>Start another Amazon instance in the same availability zone (if you want speed and no bandwidth cost) or in a separate zone if you are more concerned about availability.
<li>Install MySQL Server and Client Tools (via Yum)
<li>Edit /etc/my.cnf to alter the data folder and edit replication settings
<li>Configure MySQL to run at boot (in case we restart the instance)
<li>Start MySQL and configure to run at boot
<li>Tell the MySQL Slave who/where the Master is (using internal DNS name)
<li>Start replication on the slave
</ul>

<p>Once the slave instance is running, connect using SSH and install MySQL and tools (just like the master):</p>
<pre class="slave">yum install -y mysql mysql-server</pre>

<p>Rename the old config file (if you're so inclined) and edit the /etc/my.cnf:</p>
<pre class="slave">mv /etc/my.cnf /etc/my.cnf.old
vi /etc/my.cnf</pre>

<p>To look like this:</p>

<pre class="slave">[mysqld]

# replication settings for SLAVE
server-id               = 2

# data folder
datadir                 = /mnt/mysql

# switch on binary logging (not essential but handy if you want to replicate from this slave in the future)
log-bin                 = mysql-bin

# system stuff
user                    = mysql
socket                  = /var/lib/mysql/mysql.sock

[mysqld_safe]
log-error               = /var/log/mysqld.log
pid-file                = /var/run/mysqld/mysqld.pid</pre>

<p>Now we can configure MySQL to start at boot, start the service going and connect:</p>
<pre class="slave">chkconfig --level 2345 mysqld on
service mysqld start
mysql</pre>

<p>On the Master, we need to determine the binary log's starting position. This is the byte offset that our Slave should start reading from. On the master, type the following:</p>

<pre class="master">mysql&gt; SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      319 |              |                  | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
</pre>

<p>Next, we want to connect the SLAVE to the MASTER. For this, we need the replication user details we created earlier and the internal (or private) DNS name for the MASTER, this should be available from ec2-dim or the ElasticFox instances list. We also need the file and position we get from the master in the step above. This is done with the MySQL <a href="http://dev.mysql.com/doc/refman/5.0/en/change-master-to.html">CHANGE MASTER</a> command:</p>

<pre class="slave">CHANGE MASTER TO
   MASTER_HOST='<cite>domU-11-22-33-44-55-66.compute-1.internal</cite>',
   MASTER_USER='<cite>ReplicationUser</cite>',
   MASTER_PASSWORD='<cite>ReplicationPassword</cite>',
   MASTER_LOG_FILE='<cite>mysql-bin.000003</cite>',
   MASTER_LOG_POS=<cite>319</cite>;</pre>

We can now start the slave's replication process:

<pre class="slave">START SLAVE;</pre>

<br>

<strong>Testing To See If Replication Is Working</strong><br>
<p>Now replication is working, we can issue commands against the Master, and check to see if the Slave replicates the result.</p>
<p>To do this, use two terminals side by side, one connected to the Master and one to the Slave.

<pre class="master">mysql&gt; CREATE DATABASE HelloWorld;
Query OK, 1 row affected (0.00 sec)

mysql> use HelloWorld
Database changed
mysql> CREATE TABLE Message (Content VARCHAR(100) NOT NULL PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO Message (Content) VALUES ('Howdy slave');
Query OK, 1 row affected (0.00 sec)</pre>

<p>On the Slave, we can now verify if the changes made to Master have been replicated:</p>
<pre class="slave">mysql> SELECT * FROM HelloWorld.Message;
+-------------+
| Content     |
+-------------+
| Howdy slave | 
+-------------+
1 row in set (0.00 sec)

</pre>

<p>Congratulations! You have a working replication.</p>
<br>

<strong>Summary</strong><br>
<p>There are a number of things you can use your slave for:</p>
<ul>
<li><strong>Taking backups without locking the Master:</strong> If you cannot afford the downtime on your Master to take a backup (backups must lock tables/databases for consistency) you can use STOP SLAVE to pause replication while you take a backup from the Slave. Resuming replication will pickup where it left off. This prevents the master from slowing down or having to lock tables while a consistent backup is taken.</p>
<li><strong>As part of a scale out strategy:</strong> You can modify your application to read data from one of a number of available slaves. This is suitable for read intensive applications with slow-changing data.
<li><strong>As a replication master:</strong> You can daisy-chain slaves off other slaves in either a long bus configuration or in a tree style hierarchy. Just because you can seems to be a good enough reason to me.
<li><strong>Run tests against <cite>like live</cite> data:</strong> If you break the replication link, you have a complete copy of your live databases to test your latest version against.
<li><strong>As a stunt-double</strong> Should disaster strike, and something bad happen to your master, you can change you application to use the Slave instead. If you enabled binary logging on the slave, then you are already in a position to attach new slaves to that and promote it to the new master. How easily your application can switch over to the new master is a design issue you must consider when encountering problems connecting to the master.
</ul>

<strong>Handy Links</strong><br>

<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/replication-configuration.html">MySQL Replication Documentation</a>
<li><a href="http://aws.amazon.com/ec2/">Amazon EC2</a>
<li><a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609">Elasticfox</a> Firefox Extension
<li><a href="http://twitter.com/timhastings">Twitter</a>: My twitter link if you want to keep in touch
</ul>

<p><img src="http://www.nonhostile.com/img/delicious.small.gif"/> <a href="http://del.icio.us/post" onclick="document.location = ('http://del.icio.us/post?v=4&noui&jump=close&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)); return false;">bookmark this on del.icio.us</a></p>

&copy; 2008 Copyright Tim Hastings<br>
<br>



]]></description></item><item><title><![CDATA[Quotes, Wisdom and Snippets]]></title><link><![CDATA[http://www.nonhostile.com/page-quotes-wisdom-and-snippets.asp?src=rss]]></link><pubDate><![CDATA[4 Sep 2008 00:34:06 GMT]]></pubDate><description><![CDATA[<p>Here's another round-up of quotes, wisdom and snippets...</p>


<h2>On succeeding</h2>
<ul>
<li>Whether you think you can or think you can't - you are right. [Henry Ford]</li>
<li>Anything worth having is worth fighting for.</li>
<li>Your most unhappy customers are your greatest source of learning. [Bill Gates]</li>
<li>If you’re trying to go south and you find yourself walking north, it’s always best to turn around. “We’ve walked this far already” isn’t a good enough reason to continue heading in that direction.</li>
<li>Around the time of Caesar, there was a European tribe that, when the assembly horn blew, always killed the last warrior to reach his assigned place, and no one enjoyed fighting this tribe.</li>
<li>My wife would rather have a ticket for one fur coat, than a ticket that gave her two or nothing. [Warren Buffet]</li>
<li>Son, you can do whatever you set your mind to. There's no shame in doing any job, the best you can hope for is that you enjoy it.</li>
<li>Defender's dilema: The guard must keep watch continuously, while the prisoner only needs to escape once.</li>
<li>Fall seven times, stand up eight. [Japanese proverb]</li>
<li>Let a hundred flowers blossom. [Chairman Mao]</li>
<li>Everyone chooses more or less what kind of events will happen to them by their conscious patterns of blocking and yielding.</li>
<li>Optimism makes you plan for success, pessimism makes you plan for failure. [Tim Hastings]</li>
</ul>


<h2>On the creative process</h2>
<ul>
<li>The first draft of anything is shit. [Hemingway]</li>
<li>Easy reading is damn hard writing. [Hawthorne]</li>
<li>No one has to see your failures unless you add vanity to folly and exhibit them. [Robert McKee]</li>
<li>The key to great writing is to leave out the boring bits that people skip. [Elmore Leonard]</li>
</ul>


<h2>On getting things done</h2>
<ul>
<li>A good plan, violently executed now, is better than a perfect plan next week.</li>
<li>Only put off until tomorrow what you are willing to die having left undone.</li>
<li>Worry often gives a small things a big shadow. [Swedish proverb]</li>
<li>Nothing of value comes easy.</li>
</ul>

<h2>On economics</h2>
<ul>
<li>Markets can remain irrational longer than you can remain solvent. [John Maynard Keynes]</li>
<li>If you owe the bank $100 that's your problem. If you owe the bank $100 million, that's the bank's problem. [JP Getty]</li>
<li>It is generally agreed that casinos should, in the public interest, be inaccessible and expensive. And perhaps the same is true of Stock Exchanges. [John Maynard Keynes]</li>
<li>OCTOBER: This is one of the peculiarly dangerous months to speculate in stocks in. The others are July, January, September, April, November, May, March, June, December, August, and February. [Mark Twain]</li>
<li>Save a little money each month and at the end of the year you'll be surprised at how little you have. [Ernest Haskins]</li>
<li>The safe way to double your money is to fold it over once and put it in your pocket. [Frank Hubbard]</li>
</ul>

<h2>On technology</h2>
<ul>
<li>Any sufficiently advanced technology is indistinguishable from magic. [Arthur C. Clarke]</li>
<li>It's a poor sort of memory that only works backwards. [White Queen, Through the Looking-Glass]</li>
</ul>


<h2>On software development</h2>
<ul>
<li>You can be Date Driven or Feature Driven but not both.</li>
<li>Normalize until it hurts, denormalize until it works.</li>
<li>I have wasted so much of my life making futile web apps that nobody really cares about. [Paras Chopra, <a href="http://www.paraschopra.com/blog/personal/are-you-guilty-of-not-solving-worlds-problems.htm">Are you guilt of not solving the world's problems?</a>]</li>
<li>But user content usually follows the 80/20/1 rule, 80% browse, 20% interact (comment), and 1% contribute (add albums). [Dan McGrady, <a href="http://dmix.ca/2008/06/7-reasons-why-my-social-music-site-never-took-off/">7 Reasons Why My Social Music Site Never Took Off</a>]</li>
<li>Good judgement comes from experience, and experience comes from bad judgement.</li>
<li>Premature optimization is the root of all evil. [Knuth] ...but... Belated pessimization is the leaf of no good.
[Lattanzi]</li>
<li>Tesler's Law of Conservation of Complexity: You cannot reduce the complexity of a given task beyond a certain point. Once you've reached that point, you can only shift the burden around. [Larry Tesler]</li>
<li>Jakob’s Law of the Internet User Experience: Users spend most of their time on other sites. This means that users prefer your site to work the same way as all the other sites they already know.</li>
</ul>


<h2>On everything else</h2>
<ul>
<li>Everything you will ever need to know about medicine: Air goes in and out. Blood goes round and round. Oxygen is good. [from <a href="http://www.msnbc.msn.com/id/21643646/">What we learn from the dying</a>]</li>
<li>Better to keep your mouth shut and appear a fool than to open it and remove all doubt [Mark Twain]</li>
<li>You should not be judged by your looks, but you will.</li>
</ul>


<p>Here are some <a href="http://www.nonhostile.com/page000264.asp">previous</a> <a href="http://www.nonhostile.com/page000202.asp">quote</a> dumps.<br>Enjoy!</p><br>
<span class="copyright">&copy; Copyright 2008 Tim Hastings (all rights reserved)</span><br><br>
]]></description></item><item><title><![CDATA[Sunshine? Quick, out!!]]></title><link><![CDATA[http://www.nonhostile.com/page000328.asp?src=rss]]></link><pubDate><![CDATA[28 Aug 2008 23:57:22 GMT]]></pubDate><description><![CDATA[After a crap-tastic summer (weather wise) we were granted a brief reprieve from the rain, so quick get out in the sunshine!<br>
So lets play a game called <cite>splash Daddy</cite>.<br>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03819mod.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03819mod-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03818mod.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03818mod-sm.jpg" border="0" height="120" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03820mod2.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03820mod2-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03816.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03816-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03804.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03804-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>

<br>
Then, the new sheriff walked in town...<br>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03803.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03803-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03794mod.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03794mod-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03795.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03795-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03800mod.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03800mod-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>

<br>
Meanwhile, back at the ranch...<br>
<br>
As you can clearly see here; Ryan's been a busy boy.<br>
He's mastered standing up.<br>
Got walking sorted.<br>
Climbing down from the settee - done that.<br>
And he can get several stairs up. Good lad!<br>
<br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC04017.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC04017-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC04047.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC04047-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03992.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03992-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03707.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03707-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03721.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03721-sm.jpg" border="0" height="120" width="90"></a></td>
</tr>
</table>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC04025.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC04025-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03806.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03806-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC04068.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC04068-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03655.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03655-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03643.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03643-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-08/DSC03648.jpg"><img src="http://www.nonhostile.com/photos/2008-08/DSC03648-sm.jpg" border="0" height="120" width="90"></a></td>
</tr>
</table>

<br>


]]></description></item><item><title><![CDATA[Reading University Radstock Reunion - 10 Years In The Making]]></title><link><![CDATA[http://www.nonhostile.com/page-university-reading-reunion.asp?src=rss]]></link><pubDate><![CDATA[31 Jul 2008 00:55:47 GMT]]></pubDate><description><![CDATA[Give or take a week or two ago it was the 10 year anniversary of the graduation of most of my uni mates. A plan was formulated to have a reunion – what a good idea. During my time in Reading I made some really great friends and it was an absolute delight to regroup and revisit our university and retrace some of our steps. We managed to get all six of the Radstock Road house mates from 1996-97 for the weekend, plus Tom (a honorary house mate). Simon and Gary didn't make the main outing, by Simon caught up with Rob, Lox and John on the Sunday afternoon.
<br><br>

I cannot think of a more fitting tribute to my university friends than to plagiarise some of their photographs, and it gives me great pleasure to so. So here are some photos taken from our reunion weekend, intermingled with some others.
<br><br>

On Saturday, we headed onto the Whiteknights campus and gave the Cybernetics and Computer Science department a visit. Here we can clearly see the three computer scientists outside their department. It is humbling to see the origins of three industry titans. We can also see Lorenzo coveting a girly-frame bike (his was stolen from this spot). We then walked from campus to our old house passing Child's Hall on the way stopping to salute the spot where we had been collectively dis'sed years earlier (Jon and Rob's body language says it all).
<br><br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock-sm.jpg" border="0" height="80" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock13.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock13-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock15.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock15-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/IMG_1688.jpg"><img src="http://www.nonhostile.com/photos/2008-07/IMG_1688-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/CIMG5180.jpg"><img src="http://www.nonhostile.com/photos/2008-07/CIMG5180-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

Covering old ground in good time, we quickly passed famous landmarks such as Cemetery Junction and Mr Cod. Allowing us to negotiate London Road and return to our old homestead of Radstock Road. Oddly, very little had changed, in fact, our old fridge was outside in our house's front garden.
<br><br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/CIMG5181.jpg"><img src="http://www.nonhostile.com/photos/2008-07/CIMG5181-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/IMG_1692.jpg"><img src="http://www.nonhostile.com/photos/2008-07/IMG_1692-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

Here's a mixture of old and new photos from our neighbourhood.
<br><br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/pic0012.jpg"><img src="http://www.nonhostile.com/photos/2008-07/pic0012-sm.jpg" border="0" height="80" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/pic0006.jpg"><img src="http://www.nonhostile.com/photos/2008-07/pic0006-sm.jpg" border="0" height="80" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/pic0022.jpg"><img src="http://www.nonhostile.com/photos/2008-07/pic0022-sm.jpg" border="0" height="120" width="80"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/house4-1.jpg"><img src="http://www.nonhostile.com/photos/2008-07/house4-1-sm.jpg" border="0" height="120" width="78"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/pic0009.jpg"><img src="http://www.nonhostile.com/photos/2008-07/pic0009-sm.jpg" border="0" height="80" width="120"></a></td>
</tr>
</table><table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/CIMG5186.jpg"><img src="http://www.nonhostile.com/photos/2008-07/CIMG5186-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/CIMG5189.jpg"><img src="http://www.nonhostile.com/photos/2008-07/CIMG5189-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock18.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock18-sm.jpg" border="0" height="120" width="90"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/IMG_1701.jpg"><img src="http://www.nonhostile.com/photos/2008-07/IMG_1701-sm.jpg" border="0" height="120" width="90"></a></td>
</tr>
</table>
<br>

After the nostalgia, we continued our walk into town where we visited some more old favourites (The Purple Turtle, The George Hotel, The Hobgoblin), we also met up with Tom, and by sheer chance, bumped into Curt and Keith at the Hobgoblin who were friends from GARP – a setting where many of the Radstock house mates first met. I think John won his pound back on the human fruit-machine.
<br><br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/IMG_1713.jpg"><img src="http://www.nonhostile.com/photos/2008-07/IMG_1713-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock25.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock25-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/CIMG5203.jpg"><img src="http://www.nonhostile.com/photos/2008-07/CIMG5203-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/CIMG5200.jpg"><img src="http://www.nonhostile.com/photos/2008-07/CIMG5200-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock33.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock33-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock35.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock35-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock30.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock30-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/IMG_1723.jpg"><img src="http://www.nonhostile.com/photos/2008-07/IMG_1723-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/radstock36.jpg"><img src="http://www.nonhostile.com/photos/2008-07/radstock36-sm.jpg" border="0" height="90" width="120"></a></td>
</tr>
</table>
<br>

I think that a measure of great friendship is that after years of separation you can pick up where you left off. I had forgotten how much common ground I shared with these guys and how much history we had. I have not laughed as much as I did this weekend for a very long time. Good times!
<br><br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/Allhouse.jpg"><img src="http://www.nonhostile.com/photos/2008-07/Allhouse-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/ALL2.jpg"><img src="http://www.nonhostile.com/photos/2008-07/ALL2-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/pic0007x.jpg"><img src="http://www.nonhostile.com/photos/2008-07/pic0007x-sm.jpg" border="0" height="83" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/pic0019x.jpg"><img src="http://www.nonhostile.com/photos/2008-07/pic0019x-sm.jpg" border="0" height="83" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/pic0003x.jpg"><img src="http://www.nonhostile.com/photos/2008-07/pic0003x-sm.jpg" border="0" height="83" width="120"></a></td>
</tr>
</table>
<br>

What I found fascinating was to hear how each of our lives had developed since we parted. It was great to hear about new things, reassuring to see hairlines and waistlines, but also amazing that here are the same people I knew, but now in totally different contexts. Just as they all know me and know I've changed there are also constants; despite 10 years, some things have not changed...
<br><br>

<table>
<tr>
<td><a href="http://www.nonhostile.com/photos/2008-07/CIMG5213.jpg"><img src="http://www.nonhostile.com/photos/2008-07/CIMG5213-sm.jpg" border="0" height="90" width="120"></a></td>
<td><a href="http://www.nonhostile.com/photos/2008-07/TimSleep.jpg"><img src="http://www.nonhostile.com/photos/2008-07/TimSleep-sm.jpg" border="0" height="80" width="120"></a></td>
</tr>
</table>

<br>]]></description></item></channel></rss>

