<?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>Conceptric &#187; Computing</title>
	<atom:link href="http://www.conceptric.co.uk/category/computing/feed" rel="self" type="application/rss+xml" />
	<link>http://www.conceptric.co.uk</link>
	<description>Ideas and Applications</description>
	<lastBuildDate>Fri, 12 Aug 2011 13:00:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Working with Git and Subversion</title>
		<link>http://www.conceptric.co.uk/working-with-git-and-subversion.htm</link>
		<comments>http://www.conceptric.co.uk/working-with-git-and-subversion.htm#comments</comments>
		<pubDate>Wed, 10 Jun 2009 11:58:35 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[processes]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=191</guid>
		<description><![CDATA[I've got a local copy of the Subversion repository under Git, so I thought I should talk about my workflow.]]></description>
			<content:encoded><![CDATA[<p>Last time I <a href="http://www.conceptric.co.uk/importing-a-remote-subversion-repository-with-git.htm">created a local Git repository</a>, in which I could have several <code>svn/</code> prefixed branches and one <code>master</code> which is linked to the remote <code>trunk</code>.</p>

<h3>The Git work environment.</h3>

<p>Working with Git is quite different to using Subversion. The actual contents of the project directory change to reflect the currently active branch: the directory contains a whole repository, not a checked out copy. Don&#8217;t get alarmed when files start disappearing only to reappear again when you switch branch.</p>

<p>I also noticed that I interacted with the version control less frequently when editing, delete, and create files. The interaction is saved until you&#8217;re ready to commit, making the process feel more seamless. I occasionally used to get into trouble by deleting files via the <abbr title="Operating System">OS</abbr>, rather that using the Subversion command.</p>

<p>For the majority of the time, I&#8217;ll use the <a href="http://www.kernel.org/pub/software/scm/git/docs/">Git commands</a>, as I&#8217;m working in a Git repository. The <code>git svn</code> functionality is only needed as a Git interface with Subversion.</p>

<h3>Getting ready to work.</h3>

<p>I like the <code>master</code> branch to always reflects the current <code>trunk</code> until I choose to update it, so all my commits are made from other working branches.</p>

<p>I start by checking out a branch based on <code>master</code> to use as a base from which to work. I&#8217;ve imaginatively called it <code>basework</code> in this example, and as a branch of <code>master</code> it is linked to the same remote branch: <code>trunk</code>.</p>

<p><code class="terminal oddlines">git branch -a</code></p>

<p>should display all your branches in the repository.</p>

<p><samp class="stdout">jkw@mac> git branch -a
* basework
  master
  svn/trunk
jkw@mac>
</samp></p>

<p>I work in increments based on stories, that&#8217;s another post, so I actually create a story branch from <code>basework</code>, that can be merge back into this parent upon completing the story. This helps cope with changes in the remote codebase.</p>

<h3>Creating my working branches.</h3>

<p>It&#8217;s a good idea to check that <code>basework</code> is up to date with the remote Subversion <code>trunk</code> before branching:</p>

<p><code class="terminal oddlines">git svn rebase</code></p>

<p>This will either update the local repository with the remote changes, or tell you that the current branch is already up to date.</p>

<p>I&#8217;m now in a position to create my story branch:</p>

<p><code class="terminal oddlines">git checkout -b inwork</code></p>

<p>The <code>-b</code> option is used to create a new branch and then switch to it. Without this option the same command is used to move between branches.</p>

<p>This same process was used to create <code>basework</code>.</p>

<p>I have my working repository structure, and I&#8217;m currently working on my story branch, see the asterisk.</p>

<p><samp class="stdout">jkw@mac> git branch -a
  basework
* inwork
  master
  svn/trunk
jkw@mac>
</samp></p>

<h3>The local commit.</h3>

<p>You can see details of the changes to the local working branch using the <code>git status</code> command:</p>

<p><samp class="stdout">jkw@mac> git status</p>

<h1>On branch inwork</h1>

<p>nothing to commit (working directory clean)
james@cybermac1> git st</p>

<h1>On branch inwork</h1>

<h1>Changed but not updated:</h1>

<h1>(use &#8220;git add/rm <file>&#8230;&#8221; to update what will be committed)</h1>

<h1>(use &#8220;git checkout &#8212; <file>&#8230;&#8221; to discard changes in working directory)</h1>

<p>#</p>

<h1>modified:   footer.php</h1>

<h1>deleted:    images/feed-icon-64.png</h1>

<h1>modified:   style.css</h1>

<p>#</p>

<h1>Untracked files:</h1>

<h1>(use &#8220;git add <file>&#8230;&#8221; to include in what will be committed)</h1>

<p>#</p>

<h1>includes/category-1.inc.php</h1>

<p>no changes added to commit (use &#8220;git add&#8221; and/or &#8220;git commit -a&#8221;)
jkw@mac> 
</samp></p>

<p>To add the new file show in the example to those being tracked:</p>

<p><code class="terminal oddlines">git add includes/category-1.inc.php</code></p>

<p>If I wanted to add all of the untracked files, I could use the <code>-A</code> option instead of individually naming them.</p>

<p>Now all the files are staged, the time comes to commit them to the local Git repository:</p>

<p><code class="terminal oddlines">git commit -a <em>-m "A message to describe the changes."</em></code></p>

<p>Leaving the <code>-m</code> option off will cause Git to request comments using whichever editor is defined in your configuration files.</p>

<p>I now the story is complete, and all the changes committed to the <code>inwork</code> branch, it&#8217;s time to commit them to Subversion.</p>

<h3>The remote commit.</h3>

<p>I start the remote commit process by switching to the <code>basework</code> branch:</p>

<p><code class="terminal oddlines">git checkout basework</code></p>

<p>Next I check that the remote codebase hasn&#8217;t changed, or update the changes:</p>

<p><code class="terminal oddlines">git svn rebase</code></p>

<p>I&#8217;ll merge <code>inwork</code> into <code>basework</code>:</p>

<p><code class="terminal oddlines">git merge inwork</code></p>

<p>I use my text editor to manually fix conflicts that arise. Git tells you where to find them by marking up the code. This is followed by another local commit, at which point the merge is complete.</p>

<p>Now I can try a dry run of the remote commit:</p>

<p><code class="terminal oddlines">git svn dcommit -n</code></p>

<p>It&#8217;s the <code>-n</code> option that makes this a dry run: nothing has been committed yet. It shows you the local versions to be bulk committed if you choose to go ahead. To actually perform the commit, remove the <code>-n</code>, and re-run the command, it may take a while if you&#8217;ve been busy.</p>

<h3>Verifying the remote commit.</h3>

<p>This is where leaving the <code>master</code> branch untouched pays off. <code>basework</code> has been committed to the remote <code>trunk</code>, whilst <code>master</code> still reflects the pre-commit <code>trunk</code>.</p>

<p>I switch to <code>master</code>, which should contain none of my new work, and update it from the remote <code>trunk</code>:</p>

<p><code class="terminal oddlines">git svn rebase</code></p>

<p>It should have changed to match <code>basework</code>, and if so the previous commit worked.</p>

<h3>Cleaning up.</h3>

<p>I&#8217;ve verified the commit: I have <code>master</code> and <code>basework</code> branches that are identical, so <code>inwork</code> is no longer needed, I&#8217;ll delete it:</p>

<p><code class="terminal oddlines">git branch -d inwork</code></p>

<p>Deleting a child branch of a different parent is a little dangerous, so if you&#8217;re not in <code>basework</code> you&#8217;ll get a warning. Either switch to <code>basework</code> and try again, or re-running the command with the <code>-D</code> option.</p>

<p>If I&#8217;ve finished work on this project, I&#8217;d delete the <code>basework</code> branch too, but if I&#8217;m going to continue, I&#8217;d use it to create another working branch, and I&#8217;ve gone full circle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/working-with-git-and-subversion.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Importing a remote Subversion repository with Git</title>
		<link>http://www.conceptric.co.uk/importing-a-remote-subversion-repository-with-git.htm</link>
		<comments>http://www.conceptric.co.uk/importing-a-remote-subversion-repository-with-git.htm#comments</comments>
		<pubDate>Thu, 04 Jun 2009 12:02:38 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git svn]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=189</guid>
		<description><![CDATA[To start this series about teaming Git with Subversion, I need to create a local copy of the Subversion Repository.]]></description>
			<content:encoded><![CDATA[<p>Lets get the obvious stuff over with, create a directory in which to initialise the local git repository.</p>

<p><code class="terminal">mkdir myproject
cd myproject
</code></p>

<p>The initialisation itself is pretty simple, just remember to point Git at the correct url for your Subversion repository, and watch the communication protocols.</p>

<p><code class="terminal oddlines">git svn init -s --prefix=svn/ svn+ssh://svn.repository.com/svn/<em>myproject</em></code></p>

<p>The <code>-s</code> option tells the repository to expect the typical trunk, branches and tags structure of a Subversion project. You can specify the location of your trunk, branches and tags using the <code>-T</code>, <code>-b</code>, and <code>-t</code> respectively.</p>

<p>Using the <code>--prefix</code> option is handy, ensuring that the remote directories will be prefixed with <code>svn/</code>. This makes it clear which are Subversion and which git branches later.</p>

<p>All that remains is to checkout all of the information relating to your project from the Subversion repository.</p>

<p><code class="terminal oddlines">git svn fetch</code></p>

<p>Depending on the size of the project, this could take a while, it&#8217;s downloading the entire project history from the remote repository.</p>

<p>I word of warning you about the strangeness that can ensue if the remote repository contains any tags. They will be imported as git branches, and you may find the local master branch pointing to something other that the remote <code>trunk</code>.</p>

<p>These <a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html"><code>git svn</code> commands</a>, and all the others, are pretty well documented. Now I&#8217;ve got a Git repository, in the next post I&#8217;ll to describe my normal workflow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/importing-a-remote-subversion-repository-with-git.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advantages of a Git and Subversion blend</title>
		<link>http://www.conceptric.co.uk/advantages-of-a-git-and-subversion-blend.htm</link>
		<comments>http://www.conceptric.co.uk/advantages-of-a-git-and-subversion-blend.htm#comments</comments>
		<pubDate>Sat, 30 May 2009 19:48:23 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git svn]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=187</guid>
		<description><![CDATA[I've had time to try Git with my remote Subversion repositories, using the <code>git svn</code> commands, and I wouldn't go back. To start this small series, I'll try to explain the enthusiasm.]]></description>
			<content:encoded><![CDATA[<p>Using <a href="http://git-scm.com/">Git</a> as a front-end to Subversion provides more comprehensive version control and flexibility in the way I work, especially for a laptop user. Everything is under active version control, with or without a connection to the remote Subversion repository.</p>

<p>Branching and merging is quick and simple, and as a result I find I do this far more often than when using Subversion alone. I also commit changes more frequently: it&#8217;s far quicker than using a remote repository, even when not off-line.</p>

<p>This sort of functionality is vital to successful version control, and I think it promotes better practice, as long as you&#8217;re only committing working software. All the local Git commits will later be bulk committed to the remote repository. However they all retain their identity as separate versions, so discipline is important, we wouldn&#8217;t want anyone finding broken code.</p>

<p>I could get all this from Git alone, but the combination retains Subversion vendor branching and the deployment advantages of my existing Subversion / Capistrano set up. I&#8217;m going to try <a href="http://github.com/">GitHub</a>, or my own remote Git repository, and exploiting the Capistrano support for Git, but at the moment why reinvent the wheel?</p>

<p>I prefer to work on the command line, and that&#8217;s the approach this series will take, but <a href="http://quiteuseful.co.uk/post/97148287/git-guis">GUIs are available for Git</a>, try typing <a href="http://www.kernel.org/pub/software/scm/git/docs/git-gui.html"><code>git gui</code></a> to check out the one bundled.</p>

<p>I use this approach for anything I need version controlled, including my Curriculum vitae/Resume, but before try this out for yourself you&#8217;re going to need to check out a local copy of that remote Subversion repository&#8230; I&#8217;ll cover that next time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/advantages-of-a-git-and-subversion-blend.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing applications for the Web</title>
		<link>http://www.conceptric.co.uk/testing-applications-for-the-web.htm</link>
		<comments>http://www.conceptric.co.uk/testing-applications-for-the-web.htm#comments</comments>
		<pubDate>Fri, 24 Apr 2009 17:22:21 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=173</guid>
		<description><![CDATA[I'm a fan of Test-Driven Development because I enjoy the freedom that a comprehensive test suite provides: without it I tend to feel that I'm walking through a minefield.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve spent more time on web development using PHP frameworks recently, and I&#8217;m realising just how difficult it is to provide the sufficient code coverage, avoiding that feeling that I&#8217;m about to step on a mine.</p>

<p>My experiences got me thinking about what I needed to code confidently. As a minimum, I need to know that everything works before committing code to version control, but security comes with regular testing, and this is no use unless everything is covered.</p>

<p>Based on web development frameworks using the nearly ubiquitous <abbr title="Model View Controller">MVC</abbr> design pattern, the logic and side effects at each <a href="http://www.webopedia.com/quick_ref/app.arch.asp">application tier</a> must be tested, and I came up with this list.</p>

<ol>
<li>The Database tier schema, whether <abbr title="Relational Database Management System">RDBMS</abbr>, <abbr title="eXtensible Markup Language">XML</abbr> or anything else.</li>
<li>Data Access logic is usually implemented in models, but often uses built-in features of the framework, such as ActiveRecord.</li>
<li>Business logic is encapsulated in the models, libraries, and sometimes controllers.</li>
<li>Presentation logic at the server comprising controllers and their respective views.</li>
<li>Presentation and business logic at the client tier implemented by <abbr title="Document Object Model">DOM</abbr> scripting, mostly in JavaScript.</li>
<li>The actual data presentation at the client tier based on XHTML and CSS.</li>
</ol>

<p>I&#8217;ve tried to order it from inside the application, working out from the data tier to the client, and it&#8217;s quite a list; I&#8217;d be interested to hear what I&#8217;ve missed.</p>

<p>Since this is a huge topic, I hope to write a series of posts isolating specific areas as I encounter them, and comparing tools and approaches. The first will look at how a few development frameworks in popular languages appear to measure up.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/testing-applications-for-the-web.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodeIgniter test coverage</title>
		<link>http://www.conceptric.co.uk/codeigniter-test-coverage.htm</link>
		<comments>http://www.conceptric.co.uk/codeigniter-test-coverage.htm#comments</comments>
		<pubDate>Fri, 17 Apr 2009 11:27:49 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[simpletest]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=167</guid>
		<description><![CDATA[I'm still not happy with the code coverage I can get even with SimpleTest fully integrated with CodeIgniter.]]></description>
			<content:encoded><![CDATA[<p>I like to use libraries; they move the business logic outside of the CodeIgniter <abbr title="Model View Controller">MVC</abbr> framework, where they and their associated test suites can be made independent. Since libraries can be reused in many CodeIgniter projects this maintains their portability, yet it&#8217;s simple to integrate them into the whole application test suite, where they can be run from the browser using a custom controller.</p>

<p>Unfortunately, testing anything other than libraries and models is difficult because there&#8217;s no way to access the another important type of object: controllers. CodeIgniter positively encourages using controllers to implement business logic, consequently not being able to test them is a serious anomaly.</p>

<p>Integrating a front-end testing framework, such as <a href="http://seleniumhq.org/">Selenium</a>, might be the solution, but does that properly test the controller code? I don&#8217;t think it does; the target there is the presentation tier at the browser.</p>

<p>The lack of good <a href="http://en.wikipedia.org/wiki/Code_coverage">code coverage</a> bothers me a lot, but I continue to struggle on with CodeIgniter because I&#8217;ve found other PHP frameworks to be just as lacking. Is this a general problem with frameworks? I&#8217;m tempted to try <a href="http://rubyonrails.org/">Ruby on Rails</a> next to find out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/codeigniter-test-coverage.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What is Information Technology?</title>
		<link>http://www.conceptric.co.uk/what-is-information-technology.htm</link>
		<comments>http://www.conceptric.co.uk/what-is-information-technology.htm#comments</comments>
		<pubDate>Fri, 13 Mar 2009 16:03:32 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Personal Perspectives]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[devices]]></category>
		<category><![CDATA[information technology]]></category>
		<category><![CDATA[ubiquitous computing]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=155</guid>
		<description><![CDATA[I don't like the label &#8220;IT&#8221;. It's just too vague in practice, and too focused in the minds of the public. What does the term mean to you?]]></description>
			<content:encoded><![CDATA[<p>Ask people about <abbr title="Information Technology">IT</abbr>, and most immediately think of their computer at work, but what actually falls under this banner?</p>

<blockquote title="the definition of IT from Wikipedia" cite="http://en.wikipedia.org/wiki/Information_technology">Information technology (IT), as defined by the Information Technology Association of America (ITAA), is <cite>&#8220;the study, design, development, implementation, support or management of computer-based information systems, particularly software applications and computer hardware.&#8221;</cite> IT deals with the use of electronic computers and computer software to convert, store, protect, process, transmit, and securely retrieve information.</blockquote>

<p>This covers an ever increasing amount of ground: smartphones, MP3 players, games consoles, software for any <a href="http://en.wikipedia.org/wiki/Computing_platform">platform</a>, <abbr title="Automated Teller Machine">ATM</abbr>s, and even the checkout at the supermarket are examples of the breadth of IT.</p>

<p>In my experience, IT means PCs, and mainly Windows,  to most people. When these go wrong, it&#8217;s a work department called “IT” they expect to help… or not: hence the association.</p>

<p>The strange thing is that they don&#8217;t associate it with the mobile phone in their pocket, or any of the <a href="http://en.wikipedia.org/wiki/Ubiquitous_computing">devices that have become ubiquitous</a> at home. How long is it going to be before everything uses “<cite>electronic computers and computer software to convert, store, protect, process, transmit, and securely retrieve information</cite>”?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/what-is-information-technology.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gaining a technological advantage</title>
		<link>http://www.conceptric.co.uk/gaining-a-technological-advantage.htm</link>
		<comments>http://www.conceptric.co.uk/gaining-a-technological-advantage.htm#comments</comments>
		<pubDate>Tue, 17 Feb 2009 16:17:10 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Personal Perspectives]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Society]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[intelligence]]></category>
		<category><![CDATA[problem solving]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=149</guid>
		<description><![CDATA[Since the earliest times humans have used technology, by making tools, to increase their own effectiveness and productivity. From flint flakes to microchips this process has remained unchanged, but as technology becomes more complex is there a limit to the rate of these gains?]]></description>
			<content:encoded><![CDATA[<p>Complex technology is difficult for the average human being to grasp; without some idea of what it is and how it works, it&#8217;s difficult to use effectively.</p>

<p>For example, the ubiquitous Microsoft Office offers great productivity features; such as <a href="http://office.microsoft.com/en-us/products/HA010192301033.aspx">macros</a>, <a href="http://office.microsoft.com/en-us/excel/HA010346321033.aspx?pid=CH010714011033">pivot tables</a> and database connectivity. However once trained few office workers will ever use them. They can&#8217;t conceive of the situations in which these tools can be helpful: these problems are too hard.</p>

<p>By comparison a flint flake, or a modern steel knife, is readily understood: it&#8217;s sharp so you can cut things with it. What&#8217;s more, simple experimentation will show just about anyone how.</p>

<p>That&#8217;s the key: complex tools are designed for complex problems. So what if I&#8217;m only expecting the user to, well&#8230; use the tool, not solve the problem? Someone else will have to make the software, or the stone tool. There are two approaches to using technology to decouple humanity from the problem.</p>

<h3>Simple interface.</h3>

<p>Technology can be encapsulated to present the user with a simple interface.</p>

<p>In this case the user has little or no idea how the problem is solved, but is better aware of what can be done and how to instruct the device to do it. The field of <a href="http://en.wikipedia.org/wiki/Human-computer_interaction">Human-Computer Interaction</a> (<abbr title="Human-Computer Interaction">HCI</abbr>) is focused on pursuing this approach.</p>

<p>The underlying technology may be capable of far more than the relatively simple interface is capable of communicating. Again, the human user is the limiting factor, but at least the design case problem has been solved by someone else.</p>

<h3>Substitute the user.</h3>

<p>The technology could be freed of dependence on human intervention.</p>

<p>Most examples of automation seek to do this, relying on relatively capable human minds to provide the programming framework.</p>

<p>This can be combined with weak <a href="http://www.open2.net/nextbigthing/ai/ai_in_depth/in_depth.htm">artificial intelligence</a>, so that the machine is capable of making minor decisions to overcome difficulties: for example the <a href="http://en.wikipedia.org/wiki/Competitions_and_prizes_in_artificial_intelligence#Games">chess playing computer</a> or robots capable of avoiding obstacles.</p>

<h3>Dividing humanity.</h3>

<p>Use of these approaches has been accelerating since the advent of industrialisation. Technological problem solving is really applied by an ever shrinking proportion of the humanity. The remainder are present as sentient regulators to check the machine does as the manual says it should.</p>

<p>Does this mean that the average skill level of the human race is actually falling, or just being placed into fewer hands and heads?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/gaining-a-technological-advantage.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When frameworks are too friendly</title>
		<link>http://www.conceptric.co.uk/when-frameworks-are-too-friendly.htm</link>
		<comments>http://www.conceptric.co.uk/when-frameworks-are-too-friendly.htm#comments</comments>
		<pubDate>Thu, 29 Jan 2009 16:50:43 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[content management system]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[skills]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=141</guid>
		<description><![CDATA[High quality Content Management Systems and development frameworks are everywhere, but are they all trying to be too friendly and flexible?]]></description>
			<content:encoded><![CDATA[<p><a href="http://drupal.org/project/Modules">Drupal modules</a> and <a href="http://wordpress.org/extend/plugins/">WordPress plugins</a> offer a huge range of functionality that&#8217;s easily integrated. <a href="http://codeigniter.com/">CodeIgniter</a> provides a clear program structure with plenty of utility functions within easy reach.</p>

<h3>Positive experiences.</h3>

<p>The most frequently touted benefit frameworks have to offer is minimising the time taken to code and deploy a software solution. Given my interest in Agility, this is an attraction, reducing the time to market.</p>

<p>Another solid development practice is code reuse in the form of software components, and frameworks have a place amongst them. This approach offers the reliability and security inherent in widely used and tested code. Remember to choose popular software though, or this benefit disappears.</p>

<h3>On the downside.</h3>

<p>Applications developed using frameworks have to carry significant excess baggage in the form of unused features. This raises two main issues: your codebase will be unnecessarily large, and underused blocks of code are a breeding ground for hidden exploits and errors.</p>

<p>Frameworks are designed to function in a specific way, some with more flexibility than others. This much you&#8217;d expect, after all it&#8217;s the essence of a framework, but what if it doesn&#8217;t provide everything you need? For example, I&#8217;ve spent hours trying to integrate <a href="http://www.simpletest.org/">SimpleTest</a>, a <a href="http://en.wikipedia.org/wiki/Unit_testing">unit testing</a> suite, to produce satisfactory results with CodeIgniter. My unit tests run well for my own libraries, but I&#8217;m still unhappy with the test coverage imposed by CodeIgniter&#8217;s <abbr title="Model-View-Controller">MVC</abbr> implementation.</p>

<p>Finally, they say practice makes perfect, but does reliance on any framework reduce developer skill? This isn&#8217;t a problem if everything is pre-packaged in your chosen tool, but what if a client wants something that isn&#8217;t included?</p>

<h3>Too good to ignore.</h3>

<p>That said, I&#8217;ve found all of these software very useful and there are far too many advantages to ignore them. But I often find myself fighting these same tools, frustrated at they&#8217;re eagerness to help me do something in a way I don&#8217;t want it done. I guess the key is to understand which is the right tool for the current job: the ultimate skill for a developer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/when-frameworks-are-too-friendly.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What Git does best.</title>
		<link>http://www.conceptric.co.uk/what-git-does-best.htm</link>
		<comments>http://www.conceptric.co.uk/what-git-does-best.htm#comments</comments>
		<pubDate>Tue, 18 Nov 2008 20:55:40 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=122</guid>
		<description><![CDATA[I've succumbed to the lure of the cool kids version control. GIT has advantages and disadvantage over my current favourite, Subversion.]]></description>
			<content:encoded><![CDATA[<p>I run several remote Subversion repositories and connect using SSH over the Internet. Having local version control for those times I don&#8217;t have an ADSL connection was the main reason I looked at Git.</p>

<p>There&#8217;s a good <a href="http://blog.macromates.com/2008/git-bundle/">TextMate bundle to support Git</a>, but to be honest I&#8217;ve mostly used the command-line.</p>

<h3>Weaknesses.</h3>

<p><a href="http://svnbook.red-bean.com/en/1.0/ch07s04.html">Vendor branching</a> is possible, <a href="http://sourceware.org/frysk/build/git-fu.html">but awkward</a>. I frequently use vendor drops of WordPress, SimpleTest and a number of other libraries. There may be a good way of doing this, but I haven&#8217;t found it online&#8230; yet.</p>

<p>I miss the <a href="http://svnbook.red-bean.com/en/1.0/ch07s03.html">svn:externals</a> functionality, especially in applications that use a lot of plugins: WordPress in particular. Subversion allows me to define particular tagged versions of these to be pulled from their repositories during deployment without needing to bother controlling them myself.</p>

<h3>Strengths.</h3>

<p>Branch merging when trying out new ideas is a dream. I created a new branch, refactored huge sections of the codebase, and merged it all back together flawlessly. With Subversion this would have been a lot slower and more problematic. Git&#8217;s simply great for those investigatory spikes.</p>

<h3>The verdict for Git.</h3>

<p>I&#8217;ve yet to seriously try Git to interface with my remote Subversion repositories, using the &#8216;git svn&#8217; series of commands. Having local copies of these, whilst still being able to use remote Subversion would be very useful. I&#8217;ve found using remote Subversion repositories easy, but trying to push a Git repository to Subversion is not so easy. I&#8217;m also going to try deploying from a Git repository using Capistrano in the near future.</p>

<p>It strikes me that Git is best at programmer related activities and weakest in those of interest to administrators deploying applications. I shall certainly continue to use it, but alongside Subversion.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/what-git-does-best.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code ignition</title>
		<link>http://www.conceptric.co.uk/code-ignition.htm</link>
		<comments>http://www.conceptric.co.uk/code-ignition.htm#comments</comments>
		<pubDate>Sun, 16 Nov 2008 12:53:11 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[trials]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=111</guid>
		<description><![CDATA[Whilst developing a relatively simple application for managing my budgets, I've decided to experiment with a few different frameworks. With so many to choose from, how do I feel about going for CodeIgniter?]]></description>
			<content:encoded><![CDATA[<p>CodeIgniter is billed as being a lightweight PHP <abbr title="Model - View - Controller">MVC</abbr> framework. Now I&#8217;m not a big fan of PHP, despite using WordPress and Drupal, but I intend to run this application on a Synology <abbr title="Network Attached Storage">NAS</abbr>, so PHP is the only game in town.</p>

<h3>Changing the Architecture.</h3>

<p>I&#8217;m not a keen on the idea of dumping all my code in the web server root directory, so I tested the framework flexibility by rearranged the application structure a little.</p>

<p><pre class="code">
    -rw-r--r--   1 Capfile
    drwxr-xr-x  14 application
    drwxr-xr-x   3 config
    drwxr-xr-x  13 system
    drwxr-xr-x   5 public
</pre></p>

<p>Once these locations were updated in the application configuration files it all worked perfectly. The reasons for doing this sort of thing have been <a href="http://capsizedesigns.com/blog/2008/06/getting-started-with-codeigniter-part-5-loose-ends/">documented elsewhere</a>, and I agreed with them from this security standpoint, however this structure also fits better with <a href="http://www.conceptric.co.uk/capistrano-works.htm">Capistrano deployment</a>.</p>

<h3>A positive first impression.</h3>

<p>The Views deal with the presentation logic, and I like the fact that embedding PHP within the HTML is the default, instead of a complex templating system. It&#8217;s not the cleanest approach, but I prefer to have full control over my HTML.</p>

<p>As for the Controllers, the implementation is quite intuitive and you can build a friendly set of URLs with a little help from <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> and the <a href="http://codeigniter.com/user_guide/libraries/uri.html"><code>URI</code> class</a>.</p>

<p>The form validation is a great feature that I found easy to implement within the Controllers and Views. I&#8217;ve centralised my validation rules in the global configuration file <a href="http://codeigniter.com/user_guide/libraries/form_validation.html#savingtoconfig">suggested in the documentation</a>, but haven&#8217;t got the automatic rule group feature to work yet.</p>

<p>The <code>Model</code> class is used to represent a single database table. I&#8217;m used to mapping tables with a Class in this way, but normally each instance would represent a row of data. CodeIgniter <code>Models</code> implement the <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton design pattern</a>, only one instance per class, from which the <code>Database</code> class methods can be called.</p>

<p>The <code>Database</code> class provides the data access layer and a good set of robust methods which return an array of <code>stdClass</code> instances representing the resulting data rows. These arrays are then forwarded to the View, where the instance variables can be directly accessed. This is quick and easy, but not very <abbr title="Object Oriented Programming">OOP</abbr>.</p>

<h3>Implementation reservations.</h3>

<p>I believe that the Model should be capable of running as a stand-alone application, once equipped with any interface, even the command-line. It&#8217;s this level of autonomy that results from the MVC design pattern: substitute a different Controller and View and it&#8217;ll still work the same way on a different platform.</p>

<p>Controllers reacting to events, whilst Views shouldn&#8217;t have direct, mutable access to instance variables. The Model should encapsulate both the data and the business logic, not something that can be effectively achieved with Singletons alone. Indeed CodeIgniter blurs this distinction by making Models optional and allowing data manipulation directly in the Controllers.</p>

<p>I&#8217;ve implemented my preferred approach by providing my own classes to replace the <code>stdClass</code>. They don&#8217;t extend the CodeIgniter <code>Model</code> class, but are instantiated within those that do, encapsulating data and business logic; including Object&#8211;relational data mapping and <acronym title="Create - Read - Update - Delete">CRUD</acronym> functionality.</p>

<p>It works well, but I&#8217;m concerned that by introducing a more rigourous approach I&#8217;m losing some of the advantages of the framework. May be I would be better to take CodeIgniter at face value, as a flexible, if a little dirty, rapid development environment that works.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/code-ignition.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why I like to be Agile</title>
		<link>http://www.conceptric.co.uk/why-i-like-to-be-agile.htm</link>
		<comments>http://www.conceptric.co.uk/why-i-like-to-be-agile.htm#comments</comments>
		<pubDate>Fri, 07 Nov 2008 20:25:11 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Computing]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=109</guid>
		<description><![CDATA[I've practised traditional project management techniques in Heavy Engineering, studied their use in Software Engineering, and found problems throughout. Why am I so interested in Agile techniques?]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s face the reality that no matter how clear the project goals seemed at inception, they rarely look the same by the end. I&#8217;ve worked on projects where the whole scope of the project changed between the initial planning phase and the start of the technical work. What&#8217;s more the timescale tends to shift on a daily basis and your management keep &#8216;borrowing&#8217; your resources for other vital work. This is the primary reason why I now prefer a more responsive approach; essential in a unstable world!</p>

<p>The Agile approach is more adaptable with respect to three key project variables; only the last of which, in my experience, is considered flexible in the waterfall world of engineering.</p>

<ul>
<li>Scope.</li>
<li>Time.</li>
<li>Resources.</li>
</ul>

<h3>Scope contraction.</h3>

<p>Scope flexibility is something of a taboo subject. Scope is something that is added to in both a controlled manner &#8212; providing additional revenue &#8212; or uncontrolled creep. But the point of any project is delivering something that achieves the customers business goals. This is not necessarily the product that they, or the development team, initially envisaged.</p>

<p>One uncomfortably overspent project lead to the realisation that I could have achieved the business objective well under budget by actually drastically reducing the scope. It wouldn&#8217;t have delivered exactly what the customer expected, but it would easily have achieved their goal.</p>

<p>Which is more important, expectation or results? If you have a customer representative on the team it&#8217;s much easier to explain your rationale, and the chances are they&#8217;ll like the idea of results with less work as much as you do.</p>

<h3>Timescales.</h3>

<p>If you have a customer that doesn&#8217;t mind when you deliver, you&#8217;re a rare and lucky project manager, though you&#8217;ll never actually finish anything; deadlines do provide focus. So set plenty of deadlines, that&#8217;s what iterations and releases are about.</p>

<p>Try to answer the most pressing question as quickly as possible. Leave refinements and those ever present scope changes to the next iteration, it&#8217;s probably only a few days away.</p>

<p>This rapid cycle provides useful results, whilst allowing the flexibility to quickly change direction without that wasteful churn: just tidy this up a bit then I&#8217;ll be with you.</p>

<h3>And the resources?</h3>

<p>I&#8217;m afraid the project manager has to earn their money too. Line management will always have the urge to reassign any of your key people they feel aren&#8217;t being fully employed. It&#8217;s important to emphasise that the productivity of any team depends on preventing this happening.</p>

<p>Agile teams don&#8217;t strictly segregate workload on the basis of job descriptions, that&#8217;s why you need versatile individuals. Unfortunately, these are exactly the type of individuals that those managers will want to steal away. Removing the demarcation of tasks will help ensure everyone is kept busy and that work is conducted using the minimum number of people.</p>

<h3>Better than the Waterfall.</h3>

<p>I&#8217;ve found actual project goals shift too frequently for effective use of the Waterfall approach to project management. Using iterations within this framework always felt unnatural; how do you decide how may there will be and when will you actually deliver something?</p>

<p>An Agile approach perversely leaves me feeling more in control by worrying less about control. There are a huge array of Agile software development techniques, many of which can be adapted to other engineering disciplines.</p>

<p>For Software Engineering, I would recommend reading <a href="http://www.amazon.co.uk/Art-Agile-Development-James-Shore/dp/0596527675/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1226088721&#038;sr=8-1"><cite>The Art of Agile Development</cite></a>. The <a href="http://www.agilealliance.org/home">Agile Alliance</a> promote the use of Agile techniques, so take a look at the <a href="http://www.agilemanifesto.org/"><cite>Manifesto for Agile Software Development</cite></a> upon which it&#8217;s all based.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/why-i-like-to-be-agile.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is computer literacy?</title>
		<link>http://www.conceptric.co.uk/what-is-computer-literacy.htm</link>
		<comments>http://www.conceptric.co.uk/what-is-computer-literacy.htm#comments</comments>
		<pubDate>Wed, 29 Oct 2008 15:52:14 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Computing]]></category>
		<category><![CDATA[Personal Perspectives]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[people]]></category>
		<category><![CDATA[skills]]></category>
		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=87</guid>
		<description><![CDATA[We all gratuitously refer to computer literacy, but what level of capability does this represent and how do you get it?]]></description>
			<content:encoded><![CDATA[<p>Those reading this blog may be surprised how many people are out there that aren&#8217;t computer literate. No matter how good the software interface, someone encountering a keyboard and mouse for the first time will not figure it out without a lot of help.</p>

<p>This came to my attention a few years ago when my Mother decided to learn how to use a computer. Once she retired she needed to keep up with the technology she&#8217;d avoided for years. I actually think it was a great idea; retirement often increases the perception that the world is leaving you behind. She&#8217;d never used a typewriter: why are those letters in such a strange place? The mouse was a huge challenge to hand–eye co–ordination.</p>

<p>She enrolled on <a href="http://www.clait2006.co.uk/">CLAiT</a> Level 1, and she&#8217;s made great progress, but I doubt she&#8217;d claim to be comfortable enough to be able to try something completely new without a lot of support. She can surf the Web, check and send basic email and do a little word processing, but that&#8217;s about it. It&#8217;s more than enough for her needs, but a business is going to need a little more.</p>

<p>The point is that there are a lot of younger people still in the workforce that are in much the same position to my Mother. They are often encouraged to undertake <a title="European Computer Driving License" href="http://www.bcs.org/server.php?show=nav.5829">ECDL</a> training as shown on the <a href="http://www.bcs.org/server.php?show=nav.7060">BCS website</a>:</p>

<blockquote cite="http://www.bcs.org/server.php?show=nav.7060">The European Computer Driving Licence® (ECDL) is the internationally recognized qualification which enables people to demonstrate their competence in computer skills.

The record breaking ECDL is the fastest growing IT user qualification in over 125 countries.

ECDL is designed specifically for those who wish to gain a benchmark qualification in computing to enable them to develop their IT skills and enhance their career prospects.</blockquote>

<p>The problem I have is that I&#8217;ve encountered people with these qualifications, and others, purporting to be ‘Microsoft Excel Expert Users’, and they haven&#8217;t even figured out that a spreadsheet IS a big calculator! This can&#8217;t be entirely due to the course content, so why are these people allowed to pass this qualification: it has to be in the assessment and a reluctance to fail anyone.</p>

<p>So as an employer facing a knowledge based economy — according to the UK government — where success is based on the skills of your employees, how do you decide which candidates are fit for purpose? My experience is that you can&#8217;t rely on these benchmarking qualifications.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/what-is-computer-literacy.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My sequential diploma</title>
		<link>http://www.conceptric.co.uk/my-sequential-diploma.htm</link>
		<comments>http://www.conceptric.co.uk/my-sequential-diploma.htm#comments</comments>
		<pubDate>Sat, 25 Oct 2008 17:13:11 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Personal Perspectives]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[distributed computing]]></category>
		<category><![CDATA[open university]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=84</guid>
		<description><![CDATA[Another Open University course completed having raised my awareness of the nightmare of true concurrent programming. There has to be an easier way?]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m still working towards an <abbr title="Open University">OU</abbr> <a href="http://www3.open.ac.uk/courses/bin/p12.dll?Q01D12">Diploma in Computing</a>, and taking my time about it, hence the title. Despite this theme, my last module in developing concurrent distributed systems &#8212; catchy title, but accurate  &#8212; opened up the world of concurrency, and the ease with which truly parallel applications can be developed using modern tools. Ha, as far as I can tell Java is pretty good in the concurrent minefield of a mutable state environment, but limited IDEs are the equivalent of wandering into it with a blindfold.</p>

<p>The problem is trying to decide which of these mutable resources are likely to be accessed in a concurrent fashion, provide locks to enforce mutual exclusivity; ensuring no other processes is working from an intermediate, invalid state; and all without becoming deadlocked. Traditional debugging and even test&#8212;driven approaches aren&#8217;t much help, because the errors are dependent on the order in which the processes are scheduled to be executed; not very repeatable, and certainly not controllable.</p>

<p>So the course left me itching to have a go, but aware that concurrent object oriented development needs to be done in the right language, oh, and very carefully. A little reading around the topic lead me to the idea of immutable state development.</p>

<p>Now in <acronym title="Object Oriented Programming">OOP</acronym> terms an immutable state is not very helpful, nothing much ever happens. We rely on the software state being stored in the attributes of all those objects, and actions being driven by the exchange of messages between them. But in the <a href="http://en.wikipedia.org/wiki/Functional_programming">functional programming paradigm</a> an immutable state is implicit, since the state is stored in the way functions execute each other, and themselves, no data is actually stored in variables. This means that processes can be executed in any order without any danger of seeing an invalid state: no need for any locking and a much simpler programming job!</p>

<p>I&#8217;ve only just started investigating these ideas, but with the thrust of computing performance in the direction of multiple processors, either on a single machine or via the &#8216;cloud&#8217;, it seems that concurrent, parallel programming may be very important in the future. A couple of languages I want to check out are <a href="http://www.erlang.org/">Erlang</a> and <a href="http://clojure.org/">Clojure</a>. Finally, I found the <a href="http://podcast.rubyonrails.org/">Ruby on Rails Podcast</a> <a href="http://podcast.rubyonrails.org/programs/1/episodes/erubycon-jim-weirich">interview with Jim Weirich</a> an interesting perspective on the programming.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/my-sequential-diploma.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The device I want</title>
		<link>http://www.conceptric.co.uk/the-device-i-want.htm</link>
		<comments>http://www.conceptric.co.uk/the-device-i-want.htm#comments</comments>
		<pubDate>Fri, 05 Sep 2008 13:13:41 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Personal Perspectives]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[devices]]></category>
		<category><![CDATA[distributed computing]]></category>

		<guid isPermaLink="false">http://www.jameswhinfrey.co.uk/?p=70</guid>
		<description><![CDATA[We're surrounded by smartphones, PDAs and laptops, many are fantastic already, but it'll take something more to part me from my money.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve played with the iPhone, the best handheld device interface I&#8217;ve come across by a large margin, and it would probably be my device of choice at the moment. However, there&#8217;s still a lot of functionality missing before such a device could oust both my mobile phone and laptop.</p>

<p>Here&#8217;s the near future dream; they can get a lot wilder.</p>

<p>I&#8217;m working on my latest project on the train, in a tunnel, whilst I travel to a meeting with a client. I reach a critical part where I need to see the big picture, so I find transfer the output to an LCD display in a coffee bar at the station.</p>

<p>It&#8217;s not going smoothly, and I decide I could use some help, so I call a few colleagues and arrange a conference in 15 minutes time. Once we&#8217;re all virtually present, it&#8217;s early remember, I&#8217;d show them the problem by sharing my display output via the network. Each using our own devices we work together, version controlled and still conferencing, until we crack the problem.</p>

<p>I thank everyone and leave for the Client&#8217;s office. Once there I transfer the presentation of the key project details to a large TV in the conference room and send a hardcopy to the printer in the office.</p>

<p>Oh&#8230; and all seamlessly without wires. Of course, this is a picture of the utopia of perfect interoperability and security, but what are the chances?</p>

<h4>Interoperability.</h4>

<p>The device layer interface is a key feature, with transparent support a wide selection of drivers and protocols, I don&#8217;t want to have to get involved. As many devices aren&#8217;t wireless enabled at the moment, have poor device driver support, or use proprietary communication protocols, this is a real challenge.</p>

<h4>Getting input.</h4>

<p>Input is probably still the good old keyboard and pointing device, of which there are several approaches for those who don&#8217;t mind carrying extra kit.</p>

<ul>
    <li>Fabric keyboards that can be folded away, like the <a href="http://www.just-mobileonline.com/products_communicationseries_2.html">Just Mobile RoKy&#178;</a>.</li>
    <li>Projected light keyboards like the <a href="http://www.virtual-laser-keyboard.com">I-Tech Virtual Laser Keyboard</a> are compact and lightweight.</li>
    <li>The pointing is easier, a wide range of Bluetooth mice and other devices already exist.</li>
</ul>

<p>And for those that do?</p>

<ul>    
    <li>Traditional mobile phone keyboard. I hate this, I&#8217;m too old to be any good and have an aversion to developing arthritis in my thumbs.</li>
    <li>Touch screen keyboards, the Apple iPhone is the best implementation I&#8217;ve come across.</li>
    <li>Stylus on touch screen for handwriting recognition as used by Palm.</li>
    <li>Or just being able to use any input device I find lying around, wireless of course.</li>
</ul>

<p>There are other options like voice recognition, cameras, and detecting eye movements which could find wider use in the future. I&#8217;d like a direct mental link, so I can just think what I want to do, but I&#8217;d probably end up with a nasty brain wiping piece of malware!</p>

<h4>Displaying output.</h4>

<p>Displaying output raises important issues surrounding the usability of the actual user interface, after all, I&#8217;m proposing to go from working on a typical PDA size display to a 40 inch TV! I want to make the best use of the visible area on any given device, whilst avoiding 4 inch high characters.</p>

<p>The experience of designing for different web browsers, screen resolutions, and colour maps could be leveraged for this new platform.  CSS can be targeted at different media types and such an approach could be adopted throughout the new system.</p>

<h4>Staying mobile.</h4>

<p>Power management is vital for extended mobile operation and I&#8217;d like to be able to work normally for several days at least.</p>

<p>This may be achieved by longer battery life or a totally different energy storage or generation technology. Fuel cells, solar panels or even nuclear power could be used; though even I&#8217;d be a bit concerned about carrying around a nuclear reactor. What if the fuel cell ran on a range of organic feed stocks, just like I do? I could recharge my computer at the same time as myself in any restaurant.</p>

<p>Wireless recharging could be an option, maybe inductive charging such as <a href="http://www.wildcharge.com/">WildCharge pad</a>. I&#8217;d prefer my device to selectively recharge at any opportunity, and from any source, so that I don&#8217;t have to be in any particular place or make any conscious decision. The device could decide to top-up from a nearby power cable, the sun as I walk around, or even using the heat of a warm day. Again, I don&#8217;t want to know it&#8217;s happening or how.</p>

<h4>How long?</h4>

<p>Much of the software architecture and implementation technologies already exist to make my dream device a reality, the real work is in perfecting the hardware at a cost that makes loss or damage acceptable; it&#8217;s portable remember. At the current rate of development I suspect I won&#8217;t have to wait too long for the device itself. But the legacy issues for hardware interoperability?</p>

<p>Ultimately it&#8217;s my guess that computing and the Internet will become indivisible; not sticking my neck out too much since for many of us it already is. If some of the wilder concepts of <a href="http://en.wikipedia.org/wiki/Pervasive_computing">ubiquitous computing</a> come to pass I won&#8217;t need a single device anyway, I&#8217;ll just pick up computing resources whenever I need them from the environment surrounding me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/the-device-i-want.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capistrano works!</title>
		<link>http://www.conceptric.co.uk/capistrano-works.htm</link>
		<comments>http://www.conceptric.co.uk/capistrano-works.htm#comments</comments>
		<pubDate>Mon, 04 Aug 2008 13:52:10 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.jameswhinfrey.co.uk/?p=66</guid>
		<description><![CDATA[Effective version control and Capistrano managed deployment has hugely enhanced my workflow and quality.]]></description>
			<content:encoded><![CDATA[<p>Deploying even my simplest web applications was a complicated matter:</p>

<ol>
<li>Log in as a privileged user.</li>
<li>Create the domain deployment directory.</li>
<li>Export the application code from Subversion.</li>
<li>Update the file ownership and privileges.</li>
</ol>

<p>For WordPress I also had to export code for each theme or plug&#8212;in to the required locations. So I decided to improve the situation. I&#8217;ve changed the way my WordPress sites are handled in Subversion; haven&#8217;t moved to <a href="http://git.or.cz/">Git</a> yet like the rest of the world, and I am using <a href="http://www.capify.org/">Capistrano</a> to manage the deployment.</p>

<p>Capistrano is a Ruby based remote task manager, the most commonly used tasks being for web application deployment. Obviously the original target was Ruby on Rails, but many people use it for PHP. It uses Secure Shell (SSH) as the preferred method for logging into remote servers; all communication is then encrypted.</p>

<p>What follows isn&#8217;t a full set of instructions on deploying PHP with Capistrano, <a href="http://www.hostingrails.com/forums/wiki_thread/46">HostingRails.com</a> provide a useful piece and you should look at the <a href="http://manuals.rubyonrails.org/read/chapter/97">Capistrano manual</a>, these are my thoughts. May be something more detailed might come later&#8230; but no promises.</p>

<h3>Managing the source code.</h3>

<p>The Subversion repository for each blog project uses a <a href="http://svnbook.red-bean.com/en/1.1/ch07s05.html">vendor branch</a> of the WordPress source code and  svn:externals properties to import the required themes and plug&#8212;ins from their respective repositories.</p>

<p>WordPress updates are integrated into the vendor branch and then into any of my projects without disturbing any custom code changes. For merging changes I can strongly recommend using the svn_load_dirs.pl script, it allows you to maintain file history and makes the whole process easier.</p>

<h3>And now deploy.</h3>

<p>I currently have my main Subversion and Web servers on the same machine, leaving me with the option to use the local <code>file://</code> protocol to retrieve the application files. I wanted to make my deployment script more universal so that I could use it for the production and development platforms.</p>

<p>The obvious choice was the <code>svn+ssh://</code> protocol I normally use, but in addition to SSH, I use public key authorisation with passphrases for all of my servers. A frequent problem was that Capistrano didn&#8217;t like asking for passphrases for remote machines.</p>

<p>Since the repository and deployment machines are one in the same, I can use SSH forwarding to provide a recursive tunnel by defining the following in the <em>deploy.rb</em> script.</p>

<p><pre>
<code>set :user, "me" </code>
<code>ssh_options[:forward_agent] = true</code>
</pre></p>

<p>The variable <code>user</code> tells Capistrano which user has SSH access and the <code>forward_agent</code> option allows the same SSH credentials for the tunnel to the Subversion server. Now , if your svn user is different from the ssh user you&#8217;ll need to add another couple of things:</p>

<p><pre>
<code>set :svn_user, username</code>
<code>set :repository, "--username #{svn_user} svn+ssh://hostname/repository/#{application}/trunk"</code>
</pre></p>

<p>These variables enabled me to use the default deployment tasks for my application, there&#8217;s no need to override them, just use the <code>before_</code> and <code>after_</code> hooks to define additional functionality.</p>

<h3>The result.</h3>

<p>I have two WordPress blogs deployed on my server using Capistrano and Subversion for remote control, including custom themes and third&#8212;party plugins. I&#8217;ve already redeployed to incorporate changes and everything has worked perfectly.</p>

<p>Next&#8230; Drupal?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/capistrano-works.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not more options</title>
		<link>http://www.conceptric.co.uk/not-more-options.htm</link>
		<comments>http://www.conceptric.co.uk/not-more-options.htm#comments</comments>
		<pubDate>Thu, 19 Apr 2007 16:04:21 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Personal Perspectives]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[data security]]></category>
		<category><![CDATA[disaster recovery]]></category>
		<category><![CDATA[synology]]></category>

		<guid isPermaLink="false">http://www.jameswhinfrey.co.uk/not-more-options.htm</guid>
		<description><![CDATA[Would you believe it! Just when I think I&#8217;ve nearly, I mean just about, sort of made my mind up, Synology bring out a new product line. I&#8217;ve noticed that they&#8217;ve introduced a two drive NAS, with RAID 1 and iTunes server. It&#8217;s called the DS-207 and it&#8217;d be compatible with my existing DS-101g+ for [...]]]></description>
			<content:encoded><![CDATA[<p>Would you believe it! Just when I think I&#8217;ve nearly, I mean just about, sort of made my mind up, <a href="http://www.synology.com/enu/products/index.php">Synology</a> bring out a new product line. I&#8217;ve noticed that they&#8217;ve introduced a two drive <abbr title="Network Attached Storage">NAS</abbr>, with <abbr title="Redundant Array of Inexpensive Disks">RAID</abbr> 1 and iTunes server. It&#8217;s called the DS-207 and it&#8217;d be compatible with my existing DS-101g+ for local <abbr title="Local Area Network">LAN</abbr> based backup.</p>

<p>So it looks like it&#8217;s going to be one of those coupled with a secure online backup service and DVD-R backups of RAW image files, very big and expensive to upload, in the fireproof safe.</p>

<p>Still waiting on the Mac support from online backup providers though.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/not-more-options.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Managing data</title>
		<link>http://www.conceptric.co.uk/managing-data.htm</link>
		<comments>http://www.conceptric.co.uk/managing-data.htm#comments</comments>
		<pubDate>Tue, 03 Apr 2007 16:05:33 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Personal Perspectives]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[data security]]></category>
		<category><![CDATA[disaster recovery]]></category>
		<category><![CDATA[synology]]></category>

		<guid isPermaLink="false">http://www.jameswhinfrey.co.uk/managing-data.htm</guid>
		<description><![CDATA[I&#8217;m a worried man&#8230; I know it&#8217;s hard to believe, but I am. What are you worried about I hear you say. My electronic data or course. I&#8217;ve recently realised just how much data there is and how important it&#8217;s become. I&#8217;ve got data relating to work, finance, friends, family, music and images all of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a worried man&#8230; I know it&#8217;s hard to believe, but I am. What are you worried about I hear you say. My electronic data or course. I&#8217;ve recently realised just how much data there is and how important it&#8217;s become. I&#8217;ve got data relating to work, finance, friends, family, music and images all of which is extremely important to my continuing well being.</p>

<p>I run a small network at home with all of these data on a single drive sitting inside a <a href="http://www.synology.com/">Synology</a> DS-101g+ <abbr title="Network Attached Storage"><abbr title="Network Attached Storage">NAS</abbr></abbr>. There&#8217;s an old 80GB external USB hard drive attached to it, onto which the <abbr title="Network Attached Storage">NAS</abbr> content is incrementally backed up at night.</p>

<p>The Synology <abbr title="Network Attached Storage">NAS</abbr> has been great since is replaced a Linux server when the cooling fans failed. However, that incident coupled with a laptop drive crash has got me wondering whether my current approach is good enough. After all, can I afford to lose the data I&#8217;ve created between the daily backup and what if the house burned down? On top of this, the last time my server lost a fan I couldn&#8217;t access my files and why are these things always a non-standard, hard to get sizes?</p>

<p>So I&#8217;m wondering whether to take the following steps:</p>

<pre><code>&lt;ul&gt;
    &lt;li&gt;Set up a Synology DS-106, the 101g+ has been replaced, as my primary file server.&lt;/li&gt;
    &lt;li&gt;Configure the new &lt;abbr title="Network Attached Storage"&gt;NAS&lt;/abbr&gt; to backup to the old one each night, providing redundancy.&lt;/li&gt;
    &lt;li&gt;Make regular copies of all the files on DVD-R, storing them in a fireproof safe or a remote self storage locker.&lt;/li&gt;
    &lt;li&gt;Consider secure online storage for critical files only as it&amp;#8217;s not cheap, but could be configured to back them up whenever they change.&lt;/li&gt;
&lt;/ul&gt;
</code></pre>

<p>The problems are that a failure between backups could lose me a days work and finding an online backup service for a networked Mac is not as easy as it should be. With reference to the former, if I was producing a lot of commercial data I&#8217;d install a good <abbr title="Redundant Array of Inexpensive Disks">RAID</abbr> system. As for the latter, they&#8217;re all promising to have Windows and Mac support soon, honest.</p>

<p>I don&#8217;t bother backing up the individual machines, a Mac mini and a Windows laptop, because I enjoy spending a whole day rebuilding them if something goes wrong. A cloned copy of these drives might be a worthwhile exercise, even if it isn&#8217;t kept totally up to date.</p>

<p>All this is telling me to spend some money, but will I get away with it??</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/managing-data.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

