<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Equivalence</title>
	
	<link>http://www.equivalence.co.uk</link>
	<description>Technical Blog for Software Developers</description>
	<lastBuildDate>Wed, 24 Feb 2010 01:10:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Equivalence" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="equivalence" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>www.equivalence.co.uk</link><url>http://www.equivalence.co.uk/eq.png</url><title>Equivalence</title></image><item>
		<title>does your employer suck?</title>
		<link>http://www.equivalence.co.uk/archives/1686</link>
		<comments>http://www.equivalence.co.uk/archives/1686#comments</comments>
		<pubDate>Tue, 23 Feb 2010 22:47:14 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[startup]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[startups]]></category>
		<category><![CDATA[uk]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1686</guid>
		<description><![CDATA[So you slog your guts out each day programming away, typing faster and faster, writing tests and more test, refactor after refactor, then after five years you think to yourself: &#8220;Screw this! I&#8217;m doing all this work for Mr Somebody and I&#8217;m getting jack shit in return&#8221;. Then before you know it you&#8217;ve said those [...]]]></description>
			<content:encoded><![CDATA[<p>So you slog your guts out each day programming away, typing faster and faster, writing tests and more test, refactor after refactor, then after five years you think to yourself: &#8220;Screw this! I&#8217;m doing all this work for Mr Somebody and I&#8217;m getting jack shit in return&#8221;. Then before you know it you&#8217;ve said those inimitable words &#8220;I&#8217;m going to start my own business&#8221;.</p>
<p>Yeah yeah, we&#8217;ve all heard it before. The very next day you go back to typing, you end up getting married, you have kids, and you die.</p>
<p>If my business model was that I got a £1 (or $1 &#8211; I&#8217;m not fussy) for every developer I&#8217;ve heard say this then I&#8217;d currently be sitting in my winter home in Sydney Australia &#8211; rather than cycling my ass down to work every day in sub-zero temperatures. In fact, I&#8217;d have contributed much of my wealth from my own contributions.</p>
<p>So why do we do this? I mean, for sure, we developers certainly think we can run a business better than our employers &#8211; remember how you tell yourself that every day &#8211; so why do so few developers start their own?</p>
<p>To be honest, this is maybe not so much the case in the USA, or in Silicon Valley at least. The Valley seems to bring out the spirit in people to follow through with these ventures, so why can we not harness the same spirit here in the UK? </p>
<p>Over here people frequently talk about it but never do it, and yes I&#8217;m one of those people. We need more people doing it here in the UK. It can work as well. Check out <a href="http://www.red-gate.com/">Redgate Software</a>, they not only create great products, but they also <a href="http://blog.businessofsoftware.org/2009/08/the-accidental-incubator.html">help other startups</a>. It&#8217;s almost like Silicon Valley in Cambridge &#8211; OK, I took that one a little too far.</p>
<p>Realistically, to give our economy a brighter future, we need to improve things. I know everyone can&#8217;t do it, but everyone wants to work in a cool place that treats their staff well, right? So those who think they have got it <strong>stand-up</strong>. I&#8217;m sure their must be plenty of you?</p>
<p><strong>So the next time you are moaning about your job, spend the time thinking about a product or a service that would be great, get some balls and create your own &#8220;thing&#8221;</strong>. I know I&#8217;m going to &#8211; well I just made myself look like a fool with this rant if I don&#8217;t <strong>try</strong> and it&#8217;s kind of why I done it.</p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/8OriVAfk6uE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1686/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>the future is email</title>
		<link>http://www.equivalence.co.uk/archives/1646</link>
		<comments>http://www.equivalence.co.uk/archives/1646#comments</comments>
		<pubDate>Mon, 22 Feb 2010 02:15:48 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[future of email]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1646</guid>
		<description><![CDATA[In a recent podcast Jeff Attwood and Joel Spolsky were discussing the virtues of email. As a somewhat brief summary of the discussion I think it&#8217;s fair to summarise that Jeff hates email. As it happens I&#8217;m inclined to go along with him on this one, but possibly for different reasons.
From what I can gather, [...]]]></description>
			<content:encoded><![CDATA[<p>In a recent <a href="http://blog.stackoverflow.com/2010/02/podcast-83/">podcast</a> <a href="http://www.codinghorror.com">Jeff Attwood</a> and <a href="http://www.joelonsoftware.com">Joel Spolsky</a> were discussing the virtues of email. As a somewhat brief summary of the discussion I think it&#8217;s fair to summarise that Jeff <a href="http://www.codinghorror.com/blog/2008/11/is-email-efail.html">hates</a> <a href="http://www.codinghorror.com/blog/2009/09/email-the-variable-reinforcement-machine.html">email</a>. As it happens I&#8217;m inclined to go along with him on this one, but possibly for different reasons.</p>
<p>From what I can gather, the problem Jeff and Joel were describing with email is that we end up with an inbox full of emails that never get read or processed, and to allocate the time to process these mails and respond would be a job onto itself.  To be honest, I don&#8217;t suffer this problem quite as bad, mainly due to the fact that I do not receive in any shape or form the level of email that both of these guys do. As a result, it&#8217;s hard for me to appreciate the hate of email for the same reasons. However, I feel there is a far more toxic fallout to the email culture than that which is described.</p>
<p>It has come to my attention recently that many (large) organisations still use email as a way of providing an API to their service. What do I mean by this? Well, in this digital age it is often the case that a web application uses the API provided by another web service to interact with it. For example, if I want to receive a list of the tweets that I&#8217;ve made, the twitter API allows me to do this by accessing a given URL, and returns the data in the format of my choosing. Similarly, I can also publish a tweet by posting data to a given URL. This is all rather nice  &#8211; everything is communicated over good old HTTP allowing easy integration with other services.</p>
<p>However, many firms that are not technologically aware are using email as a mechanism for inter app communication. I don&#8217;t want to bash individual companies here but the ones I have personally dealt with are multi-national companies with profits in the billions. Yet despite such profits margins their software systems look like something seen in <a href="http://www.imdb.com/title/tt0086567/">War Games</a>. To perform any communication with these systems you send an email, and responses are returned to you via the magic of an automated email. Thus, you have to parse the email body and/or parse an email attachment to get the response data. It&#8217;s as if Web 2.0 passed like an amoeba in the night without these companies so much as blinking.</p>
<p>You may say that it must work for these companies to be making the profit margin they do. However, as customers, we are paying thousands on development costs to integrate with these systems &#8211; in many cases we have no choose in the matter. At the end of the day these companies are slowly falling behind and if they are choosing not to innovate at this level, I personally don&#8217;t hold out too much hope for innovation on a wider scale. This kind of strategy no longer works, Google and other such companies have long since blown this way of doing business out the water. No-ones&#8217;s saying the death of the non-innovators is going to be quick!</p>
<p>So what is the message I&#8217;m trying to get across? Well first, email for this style of inter app communication isn&#8217;t really helping anyone. If you are thinking about doing something like this, please think again. Also, on a more general note, can companies that fail to innovate survive in this technology driven society? It&#8217;s obviously hard to answer this question with definite authority, but going by gut feeling and history, it doesn&#8217;t look good. </p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/qjaFcCm1qZo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1646/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>idiot’s guide to linux on amazon ec2 – part 2</title>
		<link>http://www.equivalence.co.uk/archives/1578</link>
		<comments>http://www.equivalence.co.uk/archives/1578#comments</comments>
		<pubDate>Wed, 13 Jan 2010 00:34:26 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[Amazon EC2]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[thin]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1578</guid>
		<description><![CDATA[In Part 1 I covered how to remove the root login, create a new user, and add this user to the list of sudoers on an linux ec2 instance. In this section I will cover how I got Ruby on Rails, MySQL, Nginx and Thin working together on the Ubuntu instance.
First up, I think it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.equivalence.co.uk/archives/1521">Part 1</a> I covered how to remove the root login, create a new user, and add this user to the list of sudoers on an linux ec2 instance. In this section I will cover how I got <a href="http://rubyonrails.org/">Ruby on Rails</a>, <a href="http://mysql.com">MySQL</a>, <a href="http://nginx.org">Nginx</a> and <a href="http://code.macournoyer.com/thin/">Thin</a> working together on the <a href="http://www.ubuntu.com/">Ubuntu</a> instance.</p>
<p>First up, I think it&#8217;s worth taking a moment to explain what Nginx and Thin actually are, as they are maybe not as well known as the others.</p>
<p>Nginx is a very fast web/proxy server developed by <a href="http://sysoev.ru/en/">Igor Sysoev</a>.  According to wikipedia it currently runs, amongst others, the Wordpress and Github websites.</p>
<p>Thin is a ruby web server that &#8220;glues together 3 of the best Ruby libraries in web history&#8221;[1]:</p>
<blockquote><ol>
<li>the Mongrel parser, the root of Mongrel speed and security</li>
<li>Event Machine, a network I/O library with extremely high scalability, performance and stability</li>
<li>Rack, a minimal interface between webservers and Ruby frameworks</li>
</ol>
</blockquote>
<p>Right on to the job at hand and first up was getting <code>apt-get</code> working!</p>
<p>To my surprise (but probably widely known) the Ubuntu ec2 instance did not come with <a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool"><code>apt</code></a> pre-configured &#8211; unlike <code>yum</code> on a Fedora instance I had previously used. Instead you first have to run <code>apt-get update</code> to download the list of package locations. Now that we&#8217;ve done this we can get to work installing the other bit of software required.</p>
<p><strong>MySQL</strong><br />
The first thing we need to install are the MySQL client and server. To do this run the commands:</p>
<p><code>sudo apt-get install mysql-server</code><br />
<code>sudo apt-get install mysql-client</code></p>
<p>Then you need to make sure that the root password for MySQL is set to something secure. This can be done using:</p>
<p><code>sudo mysqladmin -u root a_good_secure_password</code></p>
<p><strong>Ruby</strong><br />
Now it&#8217;s time to install Ruby on Rails. First we need to install ruby, rake, rubygems, and a couple of other useful packages. The following commands should add the required binaries to your path:</p>
<p><code>sudo apt-get install rubygems</code><br />
<code>sudo apt-get install build-essential</code><br />
<code>sudo apt-get install rake</code><br />
<code>sudo apt-get install ruby-full</code></p>
<p>We can now use <code>gem</code> to install rails:</p>
<p><code>sudo gem install rails</code></p>
<p>As we will be using MySQL you probably also want to install the MySQL client development library in order to get the ruby gem to build/install correctly. This can be done by running:</p>
<p><code>sudo apt-get install libmysqlclient15-dev</code></p>
<p>Obviously the version of the libmysqlclient will depend on the MySQL version that you are using. Finally we can install the mysql gem by running:</p>
<p><code>sudo gem install mysql</code></p>
<p><strong>Nginx and Thin</strong><br />
To install the nginx package we run the command:</p>
<p><code>sudo apt-get install nginx</code></p>
<p>Nginx then needs to be started so we run:</p>
<p><code>sudo /etc/init.d/nginx start</code></p>
<p>By default the package should also add the entries required to restart nginx if the instance is rebooted &#8211; you can always check by looking in the /etc/rcX.d directory (where X is the run-level number).</p>
<p>Now it&#8217;s time to install thin:</p>
<p><code>sudo apt-get install thin</code></p>
<p><strong>Creating application config files for Thin and Nginx</strong><br />
It is a good idea to create config files that can be used to restart your thin clusters. To do this we use the <code>thin config</code> command. Now, let&#8217;s assume the app is called <code>myapp</code> and so we run the following command:</p>
<p><code>sudo thin config -C /etc/thin/myapp.yaml -c ~user/www/myapp --servers 3 -e production</code></p>
<p>This creates a thin config file /etc/thin/myapp.yaml that starts 3 instances of the rails application found in ~user/www/myapp using the production environment. By default it will start the first server on port 3000 and the next on 3001, and so on. Should you wish to specify the port you can supply it with the -p option, i.e. -p 6666.</p>
<p>You can now start your thin clients using:</p>
<p><code>sudo /etc/init.d/thin start -C myapp.yaml</code></p>
<p>It&#8217;s worth noting that if you don&#8217;t specify the -C option <code>thin</code> will use the config files found in <code>/etc/thin</code> and start the thin clients for each config file found in this directory.</p>
<p>As we want to use nginx as a proxy to our thin client instances we must create a nginx config file for our application. An example of such a config file is shown below:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">upstream myapp <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    server 127.0.0.1:<span style="color: #000000;">3000</span>;
    server 127.0.0.1:<span style="color: #000000;">3001</span>;
    server 127.0.0.1:<span style="color: #000000;">3002</span>;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
server <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    listen   <span style="color: #000000;">80</span> default;
    server_name example.co.uk;
&nbsp;
    access_log <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myapp<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>access.log;
    error_log <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myapp<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>error.log;
&nbsp;
    root   <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myapp<span style="color: #000000; font-weight: bold;">/</span>public<span style="color: #000000; font-weight: bold;">/</span>;
    index  index.html;
&nbsp;
    location <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
        <span style="color: #666666; font-style: italic;">#auth_basic &quot;Please supply login details&quot;;</span>
        <span style="color: #666666; font-style: italic;">#auth_basic_user_file /home/user/www/myapp/public/protect.passwd;</span>
        proxy_set_header  X-Real-IP  <span style="color: #007800;">$remote_addr</span>;
        proxy_set_header  X-Forwarded-For <span style="color: #007800;">$proxy_add_x_forwarded_for</span>;
        proxy_set_header Host <span style="color: #007800;">$http_host</span>;
        proxy_redirect off;
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>-f <span style="color: #007800;">$request_filename</span><span style="color: #000000; font-weight: bold;">/</span>index.html<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
            rewrite <span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> $<span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>index.html;
            <span style="color: #7a0874; font-weight: bold;">break</span>;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>-f <span style="color: #007800;">$request_filename</span>.html<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
            rewrite <span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> $1.html;
            <span style="color: #7a0874; font-weight: bold;">break</span>;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>-f <span style="color: #007800;">$request_filename</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
            proxy_pass http:<span style="color: #000000; font-weight: bold;">//</span>myapp;
            <span style="color: #7a0874; font-weight: bold;">break</span>;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
    <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></td></tr></table></div>

<p>Lines 1-5 set up the proxy for our thin clients that we started on ports 3000-3002. The values that you include here obviously depend on the number of clients that you started and the ports they are running on. The rest of the file is dedicated to setting up the web server with the majority of settings being pretty self explanatory, so I&#8217;ll only highlight the important bits.</p>
<p>First, we see that the server waits for requests on port 80 and the domain used for this site is example.co.uk (lines 8-9). It&#8217;s worth noting that hosting a subdomain, say subdomain.example.co.uk, is as easy as replacing example.co.uk in line 9 with subdomain.example.co.uk.  Lines 20-23 take care of things like forwarding the real IP address to rails as well as some other set up required for https. Finally the remaining lines in the file check to see if an index.html file is available at the url specified and if so displays displays it (lines 25-28), serve static files straight up (lines 30-33), and finally if the file specified by the url does not exit on the file system it sets headers and proxies for our thin clients and passes it on.</p>
<p>As a side note, lines 18 and 19 that are commented out enable basic http authentication in nginx. You can uncomment out these lines if you require this feature. The password file for http auth can be generated using the apache util <code>htpasswd</code> &#8211; you will need to install the package that contains the htpasswd utility.</p>
<p>The config file (let&#8217;s call it <code>myapp</code>) is placed in <code>/etc/nginx/sites-available</code>, and finally a sim link is set up between the <code>sites-available</code> directory to the <code>sites-enabled</code> directory to enable the website:</p>
<p><code>sudo ln -s sites-available/myapp sites-enabled/myapp</code></p>
<p>That&#8217;s it. All we need to do now is restart nginx (<code>/etc/init.d/nginx restart</code>) and assuming your config is ok the site should now be up and running. (If nginx is already running and you want to parse the config without restarting you can always get the pid of the nginx process, <code>ps aux | egrep '(PID|nginx)'</code>, and run <code>sudo kill -HUP PID</code> &#8211; in fact this is all you actually need to do to get your site up and running)</p>
<p>[1] The Thin homepage &#8211; <a href="http://code.macournoyer.com/thin/">http://code.macournoyer.com/thin/</a></p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/mvEQbBIo6yA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1578/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>idiot’s guide to linux on amazon ec2 – part 1</title>
		<link>http://www.equivalence.co.uk/archives/1521</link>
		<comments>http://www.equivalence.co.uk/archives/1521#comments</comments>
		<pubDate>Tue, 15 Dec 2009 01:30:31 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[Amazon EC2]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[rabbitmq]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1521</guid>
		<description><![CDATA[Recently I&#8217;ve had the opportunity of setting up a Linux instance on Amazon EC2 for use with Ruby on Rails, MySQL, Nginx and Rabbit MQ. I suspect much of what I will document is obvious to many but hopefully some of you may find it useful, especially, if like me, you are totally inexperienced with [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I&#8217;ve had the opportunity of setting up a Linux instance on <a href="http://aws.amazon.com/ec2">Amazon EC2</a> for use with <a href="http://rubyonrails.org">Ruby on Rails</a>, <a href="http://www.mysql.com">MySQL</a>, <a href="http://nginx.org">Nginx</a> and <a href="http://www.rabbitmq.com">Rabbit MQ</a>. I suspect much of what I will document is obvious to many but hopefully some of you may find it useful, especially, if like me, you are totally inexperienced with setting up a Linux server.</p>
<p>As it turns out I&#8217;ll probably document this over a couple of posts as it took up a bit more time and space than I first anticipated. In this first part I will cover, logging in as the root user, adding a new user, generating their ssh key, adding the user to the list of sudoers, and finally disabling root login via ssh. I&#8217;ll update this article with links to the other parts as I create them (<a href="http://www.equivalence.co.uk/archives/1521">Part 2</a>).</p>
<p>Right, first things first, some background info. Rightly or wrongly we required the server to do more than one thing, hence the list of items to install. So to reduce this number I picked an image with RabbitMQ pre-installed &#8211; as setup of this was uncharted territory for me. A consequence of this choice was that it pushed us down the path of <a href="http://www.ubuntu.com">Ubuntu</a> and the latest version which is currently 9.10. So let&#8217;s get to it.</p>
<p>The goal here is to disable remote root login, and in doing so we need to create a new user, and give him the ability to <a href="http://en.wikipedia.org/wiki/Sudo">sudo</a> commands. To do that we first need to login to our new EC2 image &#8211; which took me a little time to figure out! This can be done from Windows using <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">putty</a>. However, we must first use <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">puttygen</a> to generate a putty ssh auth key (putty doesn&#8217;t understand the key generated by Amazon) from your Amazon keypair which can be found in the AWS Management Console under Key Pairs.  Check out <a href="http://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide/index.html?putty.html">this link</a> for further information.</p>
<p>Now on to the real work.</p>
<p><strong>Adding a user and generating their ssh key</strong><br />
Follow the process below to add a new user and generate an ssh key for this user.</p>
<ol>
<li>Login as root using method described above</li>
<li>Run <code>adduser webuser</code> &#8211; where <code>webuser</code> is the name of the user we are adding. Fill in the details including the password of this user.</li>
<li>Type <code>su webuser</code> &#8211; to run a shell as this user without logging out</li>
<li>Execute <code>ssh-keygen -t dsa</code> from this users home directory</li>
<li>Rename the file <code>~/.ssh/id_dsa.pub</code> to <code>~/.ssh/authorized_keys</code></li>
<li>Take a copy of the generated private key (should be in <code>~/.ssh/id_dsa</code>) and copy it to your local machine</li>
<li>Now use puttygen to generate the ssh key from <code>id_dsa</code></li>
<li>Finally login using putty and the new key &#8211; you should only have to specify your username when logging in.</li>
</ol>
<p><strong>Adding your new user to the list of sudoers</strong><br />
This is a very basic sudoers setup as we are only adding a single sudo user to the <code>/etc/sudoers</code> file. I know you can do way more complicated things with this but what is documented here was sufficient for our needs. So let&#8217;s get on with it.</p>
<ol>
<li>Login as <code>root</code></li>
<li>Run <code>visudo</code> &#8211; this is an editor for the sudoers file to stop multiple people editing the file at the same time</li>
<li>Locate the lines below in the editor<br />
<blockquote><p><code># User privilege specification<br />
root    ALL=(ALL) ALL</code></p></blockquote>
<p>and change this to </p>
<blockquote><p><code># User privilege specification<br />
root    ALL=(ALL) ALL<br />
webuser    ALL=(ALL) ALL</code></p></blockquote>
</li>
<li>If you would like to allow the user to sudo without having to supply a password then you need to add the following line as well:<br />
<blockquote><p><code>webuser ALL=NOPASSWD: ALL</code></p></blockquote>
</li>
<li>Now save the file and exit &#8211; ensure that the changes are saved to <code>/etc/sudoers</code></li>
</ol>
<p><strong>Disabling root login</strong></p>
<ol>
<li>Login as <code>webuser</code></li>
<li>Run <code>sudo vi /etc/ssh/sshd_config</code> &#8211; you can replace <code>vi</code> with another editor if you please, I&#8217;ve heard <code>nano</code> might be a little more friendly to windows users!</li>
<li>Find the line <code>PermitRootLogin </code>and change it to:<br />
<blockquote><p><code>PermitRootLogin no</code></p></blockquote>
<p>If I remember correctly in the instance I was using there was more than one line with <code>PermitRootLogin</code> so it may be worth check for this yourself.
</li>
<li>As a side note, should you wish to allow login using passwords rather than using a ssh key (this maybe what users familiar with shared hosting are used to) you can enable this by changing the relevant line in <code>sshd_config</code> to:<br />
<blockquote><p><code>PasswordAuthentication yes</code> </p></blockquote>
</li>
<li>Finally, restart <code>sshd</code> by running <code>sudo /etc/init.d/ssh restart</code> </li>
</ol>
<p>You should now be able to login in using <code>webuser</code>, and <code>sudo</code> commands as <code>webuser</code> that require to be run as <code>root</code>. Additionally, <code>root</code> login from a remote server has also been disabled. </p>
<p>There may be better ways to do the above, but what I&#8217;ve documented works. I may also be missing stuff, if so, let me know and I will update this. Well, that&#8217;s it for now. Check back soon for Part 2 which will be on it&#8217;s way shortly.</p>
<p><strong>Update</strong>: <a href="http://www.equivalence.co.uk/archives/1521">idiot&#8217;s guide to linux on amazon ec2 &#8211; part 2</a></p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/77Xw5mudXJM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1521/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>academics don’t care and industry doesn’t have the time</title>
		<link>http://www.equivalence.co.uk/archives/1501</link>
		<comments>http://www.equivalence.co.uk/archives/1501#comments</comments>
		<pubDate>Mon, 07 Dec 2009 01:29:29 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[computer industry]]></category>
		<category><![CDATA[future of programming]]></category>
		<category><![CDATA[programming languages]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1501</guid>
		<description><![CDATA[I&#8217;ve been reading some interviews recently (Coders at Work) and one interviewee (I can&#8217;t remember who, but I think it was Fran Allen) suggested that in the last 20 years programming languages have not progressed leaps and bounds as they appeared to in the early days. Are they right?
Personally, I think this might be a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading some interviews recently (<a href="http://www.codersatwork.com/">Coders at Work</a>) and one interviewee (I can&#8217;t remember who, but I think it was <a href="http://en.wikipedia.org/wiki/Frances_E._Allen">Fran Allen</a>) suggested that in the last 20 years programming languages have not progressed leaps and bounds as they appeared to in the early days. Are they right?</p>
<p>Personally, I think this might be a good call. How different are the currently programming languages from C? OK, today&#8217;s popular duo, Java and C#, have garbage collection and thus we don&#8217;t have to deal with those troublesome pointers. Then again, both <a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)">LISP</a> and <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk </a>have had garbage collection for a long long time. C# has lambda expressions, and other higher-level functions, but then again this stuff was around in LISP since day dot. It&#8217;s almost as if the &#8220;C-style&#8221; languages are battling to catch up with things like LISP &#8211; which is a language I&#8217;ve never used other than for some emacs hacking. However, LISP has been around since 1959, so why has it taken so long for people to realise that many of its features are incredibly useful? Have we been held back by the fact that most academics don&#8217;t really care too much about this kind of stuff, and so don&#8217;t push it, and industry is too busy telling us something needs to be done last week?</p>
<p>First, I know that there are academics who do care about this stuff but I don&#8217;t think there are enough. And by virtue of being an academic, they are not exposed to many of the problems that are faced by your every-day software developer, and as such, maybe they don&#8217;t see the future so well. Thus is it up to industry to innovate at this level? If it is, I don&#8217;t see us moving too far forward from our current situation in the next few years. Why?</p>
<p>Well, most small to medium sized software houses are not exactly making money in significantly large quantities to warrant throwing it away on research that some other company making similar software will use to create a similar/better product. So instead of spending money pushing forward the state of the art, you would be insane not to spend that money on making a better product. This combined with crazy schedules, does not leave much in the way of time for forward thinking.</p>
<p>So it appears that we need to rest our hopes on the large enterprises like Microsoft, Google, et al. It&#8217;s fair to say that these companies invest a significant amount on money in research, some of which goes toward trying to make programming languages better (<a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/">F#</a> and <a href="http://golang.org/">Go</a> for example). However taking these two languages as examples we see that F# doesn&#8217;t appear to push that many boundaries, and I can&#8217;t comment too much on Go, as I&#8217;ve not looked at it closely, but it also doesn&#8217;t seem to include too many radical switches. Maybe radical does not sit well with shareholders, I dunno.</p>
<p>The thing is, I&#8217;m not professing to contain much insight on this either, and I&#8217;m not even sure I know what I mean by a radical switch. I just know it doesn&#8217;t appear that academia or industry are moving this forward quick enough &#8211; if the last 20 years is anything to go by. The only remaining vehicle for change is the programming &#8220;community&#8221; as a whole, but how much traction we can have is debatable. That said, we do need to move in a different direction, I&#8217;m sure of that, and maybe things like multi-core processors may force us kicking and screaming in that new direction. However maybe the problem is even deeper than this, and a switch away from the whole Von Neumann architecture is required. Who knows? Well, I hope someone does!</p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/_ZO9AZsEzLY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1501/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>battling with the back button</title>
		<link>http://www.equivalence.co.uk/archives/1481</link>
		<comments>http://www.equivalence.co.uk/archives/1481#comments</comments>
		<pubDate>Wed, 14 Oct 2009 00:21:46 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Back Button]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1481</guid>
		<description><![CDATA[Recently, and also a few months back, I had a long drawn battle with the browser back button. There just seems to be something intrinsically broken with the web model using AJAX and that pesky button. In fact, even without AJAX, the back button in combination with form data seems to cause more than enough [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, and also a few months back, I had a long drawn battle with the browser back button. There just seems to be something intrinsically broken with the web model using AJAX and that pesky button. In fact, even without AJAX, the back button in combination with form data seems to cause more than enough problems on its own. Consider my latest fight below.</p>
<p>My task was to repopulating a form when the user clicks on the back button. For those not familiar with the problem at hand,  when a user clicks on the back button the page displayed is rendered from cache, and no request is made to the server. The actual page displayed when the back button is clicked may be in various states depending on both the browser being used, and the way this page was constructed in the first place, i.e. if it was rendered in stages with AJAX/JavaScript requests or just once when the page was loaded.</p>
<p>A simple, or not so simple, way to repopulate the form is by performing an AJAX call when the DOM loads, and either rendering the part of the page again and sending HTML in the response, or sending the form values back using JSON, etc.</p>
<p>Here I&#8217;m going to consider the first of these suggestions, but the problem I faced applies equally to the second (I think!). Let&#8217;s suppose that we make a request to the URL <code>http://equivalence.co.uk/Step1/Index</code> and that we are following some kind of wizard where we have &#8220;Previous&#8221; and &#8220;Next&#8221; buttons to navigate between the steps. Furthermore, let&#8217;s assume that the page rendered by default when accessing <code>Step1/Index</code> contains a form. Now suppose that we click the &#8220;Next&#8221; button and navigate to our new URL, say <code>http://equivalence.co.uk/Step2/Index</code>, and on this page we decide to hit the back button. As I described previously, on reloading Step1 we make an AJAX call back to the server, and importantly, we send the request to the same URL as the page we are currently on, i.e. <code>Step1/Index</code>.</p>
<p>When receiving this request on the server we check whether it&#8217;s an AJAX request or a simple GET then render accordingly. It&#8217;s probably reasonable to ask why the hell I was doing this, well if the server received an AJAX request there was no need to render the whole document again as I am only interested in the form element, but on the GET request I wanted to render the whole page.</p>
<p>However, this is where I ran into a little problem. Now suppose that we click the &#8220;Next&#8221; button again to move to <code>Step2/Index</code> and once again hit the back button. What is displayed? </p>
<p>Well as a surprise to me it was only the form, i.e. the response returned by the AJAX call, not the full page, no HTML head, nothing, just the form. Now that I have seen this behaviour, I totally understand why this is happening; the browser checks for the most up-to-date data sent for this URL, which in my case corresponds the AJAX request when the back button was hit previously. For some reason I just didn&#8217;t expect this &#8211; incidentally this was the behaviour on Firefox, I&#8217;m not sure what happens in the other browsers. As a result, when I was making the AJAX call I had to change it to make the call to &#8220;Step1/Index2&#8243; instead, now everything worked fine &#8211; I think maybe supplying a random get parameter to the original URL may also have worked. </p>
<p>So there we go, that&#8217;s it! Exciting post? Maybe not! Hopefully this helps someone though. It&#8217;s always something to bear in mind.</p>
<p>PS I&#8217;ve ended up with the weirdest problem ever whilst typing this entry in Google Chrome, it&#8217;s somehow messed up the keyboard mapping. As an example the top row on a QWERTY keyboard types as &#8220;azertyuiop^$&#8221; and you have to press shift to get the numbers. Strange.</p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/a5f_at3qPCI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1481/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>the mark of sucessful software</title>
		<link>http://www.equivalence.co.uk/archives/1446</link>
		<comments>http://www.equivalence.co.uk/archives/1446#comments</comments>
		<pubDate>Fri, 18 Sep 2009 00:20:54 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[lists]]></category>
		<category><![CDATA[development methodologies]]></category>
		<category><![CDATA[software cost]]></category>
		<category><![CDATA[software quality]]></category>
		<category><![CDATA[sucessful software]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1446</guid>
		<description><![CDATA[Right, so I&#8217;ve been thinking about this for a while now. It&#8217;s a question that has been contemplated more times than anyone cares to remember, and still we have no good way of achieving the goal that it sets out. A quick search on Amazon will probably yield a thousand books on the subject &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Right, so I&#8217;ve been thinking about this for a while now. It&#8217;s a question that has been contemplated more times than anyone cares to remember, and still we have no good way of achieving the goal that it sets out. A quick search on Amazon will probably yield a thousand books on the subject &#8211; each and every one making you think the next is the holy grail. So am I going to tell you the question?? Well I suppose I must.</p>
<p>What is successful software? I&#8217;m sure the exact definition of this is subject to opinion and means different things to different people. Therefore all I can do is bore you with the details of what I think makes successful software:</p>
<ol>
<li><strong>Software that the end user is happy with</strong> &#8211; a no brainer, if no one wants to buy or use it then you may as well give up. Happiness encompasses how the software looks, the user experience, and the functionality.</li>
<li><strong>Software that is finished to schedule</strong> &#8211; no one likes to wait, from management to clients, and even developers. Software that is late causes stress on everyone. Scheduling is hard and it has to be realistic. The end result of cramming and cutting corners is poor quality.</li>
<li><strong>Software of high quality</strong> &#8211; you can finish on time but if it doesn&#8217;t do what it needs to do in a manner the user expects, or simply is littered with bugs, then there is not much to be cheerful about. It has been documented ([1]) that bugs caught early can mean 1 hours spent now can save up to 3 to 10 hours later. As a result bugs caught after release cost between 40-50% more. This is always worth keeping in mind.</li>
<li><strong>Software that is cost effective</strong> &#8211; achieving all three things above but at a cost which prevents profit does not make sense. Costs are important and developers should also be mindful of this &#8211; even for internal software.</li>
<li><strong>The developers are happy and proud</strong> &#8211; I&#8217;m sure there are many employers that would be happy if they got software that satisfied the first four criteria but couldn&#8217;t give shit how their employees felt or what it took (out) of them. Stressed out employees are no good, they will only leave, and sooner rather than later you will find that you can no longer attract those employees that are smart and get things done. It&#8217;s surprising how easy it is to keep people happy without spending a lot of money.</li>
<li><strong>The management are happy and proud</strong> &#8211; if all the above is achieved at the expense of a stressed out, worn out, nerve shattered manager, then the same problems that arise with unhappy developers can be seen in management with the same negative results.</li>
</ol>
<p>Now that we have a definition of successful software we can ask the natural question of how to achieve this. As I mentioned earlier, there are more books that I care to read telling me how to do this. Yet I feel none of them can apply in every situation. They all preach some methodology from the latest fad to the decidedly idiotic. If any one of these methodologies actually conclusively worked, there would not be as many books. I&#8217;m convinced that the truth lies somewhere in between them all and depends not only on the organisation, but on the people involved. So surely those involved in creating the software may have a better perspective on what will work than the author of a book? (This is not to say you can&#8217;t steal ideas that you have read and apply them in a suitable manner.)</p>
<p>I have my opinions on what I think would work for me, and is something that I can probably document in a follow up post. For the moment I will leave this with the statement that don&#8217;t be frightened to break rules and invent your own when something is not working. This is the only way we can make our software more successful.</p>
<p>[1] Rapid Development &#8211; Steve McConell</p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/EwFapeN-ZsU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1446/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>sticking with what you know</title>
		<link>http://www.equivalence.co.uk/archives/1405</link>
		<comments>http://www.equivalence.co.uk/archives/1405#comments</comments>
		<pubDate>Thu, 27 Aug 2009 00:03:18 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[programming language]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1405</guid>
		<description><![CDATA[There comes a time in every programmers life when they have to learn new things and step out the box. Yeah it&#8217;s difficult, for sure. It&#8217;s all too easy to create the latest application in your software empire, using a language you&#8217;ve been developing in for the last 10 years. However, the real problem is [...]]]></description>
			<content:encoded><![CDATA[<p>There comes a time in every programmers life when they have to learn new things and step out the box. Yeah it&#8217;s difficult, for sure. It&#8217;s all too easy to create the latest application in your software empire, using a language you&#8217;ve been developing in for the last 10 years. However, the real problem is thinking this is the only choice. When is it time to abandon this certitude?</p>
<p>First, we cover the forced abandonment. This is when you are pushed kicking and screaming into pastures new, whether you like it or not, i.e. the new job. Here, not only is the new language curve ball thrown (viciously), but you also get whole new set of business rules into the bargain. So what do you do? You program the new language like the old one, only translating the syntax in your head. This is not the best way to learn a language though. Why? Well consider those C programmers trying to program imperatively in Java, Java programmers in JavaScript, C++ programmers in Ruby, and so on. When there is a change in paradigm this mapping strategy just doesn&#8217;t work &#8211; a similar situation exists with languages that contain a more powerful expression set. It also encourages the behaviour where people learning enough to get the job done, without understanding what is really happening, or that there may have been a better way using &#8220;unmappable&#8221; language&#8217;s features. A better approach would be to write something small, and new, that allows you to explore the language&#8217;s features. I&#8217;m sure most people can think of something they could write. Furthermore, if you can make it useful to other people, or even your new employer, then everyone&#8217;s a winner! This is something <a href="http://www.equivalence.co.uk/archives/78">I touched on before</a>.</p>
<p>For many people though, this is the only time they will ever consider abandoning. This is sad, and a poor characteristic in a programmer.  And to be honest, I just don&#8217;t understand it. That&#8217;s not to say that I don&#8217;t accept that people just do programming as a job, then go home and don&#8217;t think about it. However, it&#8217;s like most things in life, it&#8217;s nice to progress?</p>
<p>As a programmer there will also be other signs that the tide is turning, and you don&#8217;t have to be too alert to spot these. Previously I wrote &#8220;<a href="http://www.equivalence.co.uk/archives/78">Perl is Dead, Long Live&#8230;Perl?</a>&#8221; and being a big Perl fan it was sad to see the language apparently dying, so I know what it&#8217;s like. Some signs to look out for may be:</p>
<ul>
<li>the language features are not moving on (Java watch your back) &#8211; the people who created it no longer care,</li>
<li>the community surrounding the language is dwindling &#8211; the people who use it no longer care,</li>
<li>there is little in the way of choice when selecting libraries/frameworks &#8211; the experts have fled,</li>
<li>other programmers have never heard of it &#8211; there is no buzz,</li>
<li>jobs using it are few and far between &#8211; businesses have given up on it, the death kneel.</li>
</ul>
<p>However, this is all not to say that you give up on your language just because it&#8217;s no longer cool &#8211; popularity is by no means a great indicator that something will suit your needs. It need not be the case that you give up on your language of choice, instead it could be that you contribute and drag the language forward. But be careful with this one.</p>
<p>Finally, any decent employer will want to see that you are continually developing your skill set &#8211; their business needs are continually evolving, so why aren&#8217;t you? You are much more likely to land a better job if you contribute to your own education in some way. It looks good and it&#8217;s also something to talk about.</p>
<p>So go out and learn something new today, and stop sticking with what you know.</p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/7iFWDkWuKpU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1405/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>the cost of developing software</title>
		<link>http://www.equivalence.co.uk/archives/1376</link>
		<comments>http://www.equivalence.co.uk/archives/1376#comments</comments>
		<pubDate>Sun, 09 Aug 2009 20:46:22 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[charities]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[charity]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software developers]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1376</guid>
		<description><![CDATA[I had the opportunity (or misfortune!) to visit an organisation recently whose computer systems are somewhat shambolic. They understand that their systems are not in a good shape, but as this is not their core business, spending money on it is really not what they want to be doing. In fact, it wasn&#8217;t a business [...]]]></description>
			<content:encoded><![CDATA[<p>I had the opportunity (or misfortune!) to visit an organisation recently whose computer systems are somewhat shambolic. They understand that their systems are not in a good shape, but as this is not their core business, spending money on it is really not what they want to be doing. In fact, it wasn&#8217;t a business at all, it was a charity.</p>
<p>This is a real dilemma for such an organisation. Vast sums of money tend to be hard to come by for most charities, and explaining to donators that you spent their cash on an IT system probably doesn&#8217;t look great either! But boy, do they need a new system.</p>
<p>The current system is essentially an old school Access database and nothing much else. This would not be a problem if it actually worked OK, but it doesn&#8217;t. The system was created around 10 years ago and no longer fits the &#8220;business&#8221; model. Sure, you eventually get what you need from it, but everything takes around 10 clicks, it doesn&#8217;t work with the latest MS Office, forms take 30s to 1 minute to load, the output frequently has to be adapted manually and frustration with the system is high.</p>
<p>Understandably, they are frightened of change though. Not change induced by moving away from their old system, but change as in how much change will they get from £10k to get a new system developed. Nothing I would suspect.</p>
<p>This is not good. But hey, we programmers need to eat, so we can&#8217;t expect to do stuff like this for nothing, right?. Maybe charities just need to get real with this situation. You either pay up and get the system you need, or you don&#8217;t have a system at all. Screw the inefficiencies created by the absence of such systems and also to the people who are affected. This is just the world that we live in. Eat or be eaten. I mean who wants to sit and develop software and not get paid for it?</p>
<p>Mmmmmm, well loads of people. We must be one of the only industries that give away our time for nothing, and for no reason other that we love doing it so much. So maybe instead of wasting our time developing another new open source web framework in whatever language, it might just be a great idea to develop the software for these charities. Sure, it ain&#8217;t going to be as exciting, but it may be much more rewarding.</p>
<p>Has this been done before? I dunno. I can&#8217;t find much after a quick search. However, if it has been attempted, I certainly don&#8217;t know about it and I suspect neither do lots of other developers. If someone has heard of something similar please leave a comment with the details.</p>
<p>The undertaking of such a task would by no means be plain sailing. It would require lots of input from the staff at charities and their volunteers &#8211; because as the software developers we ultimately need to know what to develop. This is achievable though, right? And in the era of open communication afforded to us by the internet, there may never have been a better time. If open source projects can work, then I see no reason why this idea should not be possible, it just needs momentum.</p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/_c5F8wtjGZA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1376/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>programming just isn’t that hard!</title>
		<link>http://www.equivalence.co.uk/archives/1323</link>
		<comments>http://www.equivalence.co.uk/archives/1323#comments</comments>
		<pubDate>Fri, 31 Jul 2009 00:19:13 +0000</pubDate>
		<dc:creator>Gregg</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[good practices]]></category>
		<category><![CDATA[sucessful software]]></category>

		<guid isPermaLink="false">http://www.equivalence.co.uk/?p=1323</guid>
		<description><![CDATA[Programmers at times can take themselves, and their abilities, a little too seriously. The fact is that programming, in general, is just not that difficult. Sure, there are parts of it that are tricky but, at the risk of over generalising, the capabilities required by your run of the mill programmer are not that high. [...]]]></description>
			<content:encoded><![CDATA[<p>Programmers at times can take themselves, and their abilities, a little too seriously. The fact is that programming, in general, is just not that difficult. Sure, there are parts of it that are tricky but, at the risk of over generalising, the capabilities required by your run of the mill programmer are not that high. Are you sure I hear you say?</p>
<p>Well plucking figures right out the air I&#8217;d say that around 90% of applications involve a simple CRUD model. So what we are essentially doing is gathering data, processing data, and writing this data to the database. Two-thirds of this process is pretty simple, i.e. gathering the data and writing it to the database, this leaves the possibilities for hardness in the processing data phase.</p>
<p>Again in most situations the processing of data is pretty simple with no complex db manipulation or algorithmic mind games. Consider your typical web application for example. The processing of data is minimal, with little to no algorithmic work involved at all &#8211; I mean with Twitter there is literally nothing to do. Google on the other hand has lots to do: it has to make those search results shine. This is not to say that developing Twitter is simple, as the scaling issues will make your head hurt. However, scaling problems are only going to affect a very very small number of sites out there, but due to their ubiquity they are the ones we hear most about.</p>
<p>If all this programming nonsense is so easy then surely it&#8217;s difficult to make bad software?</p>
<p>Nope. The fact is that the only people who care what the code looks like are other developers. The code underneath could be shitter than an incredibly shitty shit and the end user wouldn&#8217;t know. As long as it carries out the task that they require the software to do, in a reasonably efficient and user friendly way, no one really cares. Oh apart from other developers.</p>
<p>Obviously nice structured code, that is easy to understand, free of bugs, and a maintenance dream is a good building block. However, it is by no means a guarantee that you are on to a winner. Marketing, user experience and coolness are all equally important, actually, they are probably much more important. I obviously can&#8217;t say for sure but I would imagine there are plenty of successful software products that are badly written but tick these boxes &#8211; maybe even most successful products, as they are free from the burden of the studious programmer.</p>
<p>So, essentially what I&#8217;m trying to say is that despite programming not being that difficult there are many other more important factors that contribute to the success of a software product. Many software products do their job, but the one that will be successful is the one that does it well.</p>
<p>All this is not to say that programming well is not important. On the contrary, it&#8217;s important to other developers who you work with and that is not to be underestimated. This is a topic for discussion another time though!</p>
<p>Finally, for those non-programmers out there, don&#8217;t start shouting &#8220;If it&#8217;s so simple why does it take so long&#8221;? Well just because something is easy it does mean there are not lots of easy things to do. I mean, hammering a nail into a piece of wood is pretty simple, right? But if I asked you to hammer 10 million nails into a bit of wood it would take you a long time. Remember this marketers and project managers.</p>
<img src="http://feeds.feedburner.com/~r/Equivalence/~4/JnAjaFpRnMk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.equivalence.co.uk/archives/1323/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 0.552 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-02-24 01:10:15 -->
