<?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>Academe Computing</title>
	<atom:link href="http://academe.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>http://academe.co.uk</link>
	<description>Academe Computing - Web applications our speciality</description>
	<lastBuildDate>Mon, 14 May 2012 16:24:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Virtualisation: Replacting a SugarCRM site on a laptop</title>
		<link>http://academe.co.uk/2012/05/virtualisation-replacting-a-sugarcrm-site-on-a-laptop/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=virtualisation-replacting-a-sugarcrm-site-on-a-laptop</link>
		<comments>http://academe.co.uk/2012/05/virtualisation-replacting-a-sugarcrm-site-on-a-laptop/#comments</comments>
		<pubDate>Mon, 14 May 2012 15:32:27 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[SugarCRM]]></category>
		<category><![CDATA[Virtualisation]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=278</guid>
		<description><![CDATA[We have set up a SugarCRM server on a cloud service for a client. This is great for the client, as they have offices around the world. The problem is that some of the locations they wanted to access the site were out in the jungle &#8211; quite literally in the jungle with not so [...]]]></description>
			<content:encoded><![CDATA[<p>We have set up a SugarCRM server on a cloud service for a client. This is great for the client, as they have offices around the world. The problem is that some of the locations they wanted to access the site were out in the jungle &#8211; quite literally <em>in the jungle</em> with not so much as a banana tree Internet access point.</p>
<p>Luckily they could get away with read-only access at these locations, so the trick is being able to take the live SugarCRM application with all its data, and running it on a PC.</p>
<p>The path of least resistance was to run the CRM application in virtual machine on the laptops. The live application is about 1 GByte in size, runs on Linux, uses PHP 5.3 and MySQL.</p>
<p>So, we have an application that runs on a cloud-based virtual server, and also want to run that same server on a PC under Windows. My first thought was that the cloud-based virtual server could simply be picked up, i.e. cloned, and dropped onto the PC. That was the first hurdle &#8211; finding a cloud service where we could clone the server and download the clone. We could not find one, however.</p>
<p>Although cloud servers use virtualisation and servers can be cloned in the cloud, those clones were not something we could download and run locally. I suspect it has more to do with client lock-in than with the technology. We could install our own virtualisation layer on top of our cloud server, but that would mean a whole new level to manage &#8211; another operating system, with all its upgrade, configuration and security issues to handle. So that, unfortunately, was out.</p>
<p>So as far as cloning the application is concerned, we would be copying the scripts (using rcync) and exporting the database, then loading it all up on a local machine. That is not too much of a hassle as it can all be scripted.</p>
<p>So that takes us to the target machine: Linux on a PC.</p>
<p>I looked at <a href="https://www.virtualbox.org/" target="_blank">VirtualBox</a>, with is true Open Source, free and runs on just about anything. It works impressively, and can be installed on just about any host operating system, so will work in the field on Windows laptops or Macs. I did find it was a bit of a resource hog, however, so not sure how it would work on an older PC.</p>
<p>I did not want to get involved in setting up and configuring an OS to host the SugarCRM application from scratch, so looked around for ready-built virtual servers. <a href="http://virtualboximages.com/" target="_blank">VirtualBoxImages.com</a> had a tidy array of virtual servers to download, and I tried a couple. None quite hit the mark though: PHP5.3, simple to install a PHP application, and no need for a GUI. Most provided a full GUI, which was just overkill. I want a virtual machine I can send to an end user, get them to run the machine, then access the application through a web browser on their machines. It needed to be simple, and <em>just work</em> without any messing around in the GUIs of the guest operating system.</p>
<p>Given this, and my concern about resources, I kept looking around at other virtual machine solutions. I eventually stumbled on <a href="http://www.vmware.com/uk/" target="_blank">VMware</a>. This has been around for a long time, and due to its commercial nature I kind of dismissed it for cost reasons. However, the VMware Player is free to install and use. If you have a VMware image of a machine, then you can run it up on a PC with little bother.</p>
<p>So where to get a suitable VMware image? This is where I stumbled on <a href="http://bitnami.org/" target="_blank">Bitnami</a>. This service provides ready-made Operating System images, and additional &#8220;stacks&#8221; that sit on top of them. The OSs are stripped down to just what is necessary to run the stacks. The stacks are applications set up to install on the OSs with the minimum of effort.</p>
<p>In my case I had the &#8220;stack&#8221; &#8211; a live SugarCRM application, and just needed the base OS. There is a nice one called <a href="http://bitnami.org/stack/lampstack" target="_blank">LampStack</a>, which is a Ubuntu OS with PHP 5.3, MySQL, and a collection of other goodies ready to run most PHP applications. It is all bundled up into a VMware image so it can be dropped in and <em>just works</em> &#8211; and it really does. It took a couple of hours (with some excellent help from the Bitnami community) to get the full production copy of SugarCRM running on the LampStack virtual machine on my laptop.</p>
<p>Resource-wise it works great too, and is no slower then the production application on the cloud server, while just ticking over on the CPU. It is eating about 4Gbyte of disk space so far, but that is not an issue &#8211; everything these days is <em>massive</em>.</p>
<p>I&#8217;m going to roll this out to the client this week, as they are going to be flying out to the jungles (Honduras, Mexico, Cuba, and a far other far-flung locations) within the next few weeks. Taking the CRM with them, so they can manage the day-to-day business while out there, is now going to be possible.</p>
<p>In all, a lovely solution using some fantastic work from the Open Source community.</p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/05/virtualisation-replacting-a-sugarcrm-site-on-a-laptop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arduino &#8211; cycling through colours of the rainbow</title>
		<link>http://academe.co.uk/2012/04/arduino-cycling-through-colours-of-the-rainbow/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arduino-cycling-through-colours-of-the-rainbow</link>
		<comments>http://academe.co.uk/2012/04/arduino-cycling-through-colours-of-the-rainbow/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 13:54:27 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Hardware Hacking]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=254</guid>
		<description><![CDATA[To demonstrate the colours of the rainbow, I wanted to knock up a quick Arduino project that allowed any colour of the rainbow to be selected. The user input was simply a potentiometer, and the output was to be three LEDs &#8211; a red, green and blue. Working out how to map the potentiometer value [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/File:Rainbow_At_Maraetai_Beach_New_Zealand.jpg"><img class="size-thumbnail wp-image-264 alignright" title="Rainbow At Maraetai Beach New Zealand" src="http://academe.co.uk/content/blogs.dir/1/files/2012/04/Rainbow_At_Maraetai_Beach_New_Zealand-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>To demonstrate the colours of the rainbow, I wanted to knock up a quick Arduino project that allowed any colour of the rainbow to be selected.</p>
<p>The user input was simply a potentiometer, and the output was to be three LEDs &#8211; a red, green and blue.</p>
<p>Working out how to map the potentiometer value (0 to 1023) onto brightnesses for each of the three LEDs was the main task. Looking around, there is a common algorithm listed here:</p>
<p><a title="Converting to RGB" href="http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB" target="_blank">http://en.wikipedia.org/wiki/HSL_and_HSV</a></p>
<p>This algorithm turns values of hue, saturation and brightness into RGB intensities. Many Arduino projects implement this algorithm, an example of which can be found here:</p>
<p><a href="http://eduardofv.com/read_post/179-Arduino-RGB-LED-HSV-Color-Wheel-" target="_blank">http://eduardofv.com/read_post/179-Arduino-RGB-LED-HSV-Color-Wheel-</a></p>
<p>Without exception, all these projects implement a <em>colour wheel</em>. A colour wheel pulls in (on full saturation) any combination of any two primary colours. So it starts off with 100% red, then fades into 100% green (with yellow produced en-route) which then fades into 100% blue (with cyan on the way). It then fades back into 100% red, visiting magenta half-way between red and blue.</p>
<p>But hold on &#8211; the rainbow does not contain magenta. If may be a nice colour for mood lighting, but to show the colours of the rainbow, it just would not do.</p>
<p>The following diagram from Wikipedia shows how the colour wheel hue maps onto the RGB intensities. The function listed in the above project takes a value for the hue between 0 and 255, with 0 being red on the left of the colour wheel bar, and 255 being the red on the far right.</p>
<p><a href="http://academe.co.uk/content/blogs.dir/1/files/2012/04/451px-HSV-RGB-comparison.svg_.png"><img class="aligncenter size-medium wp-image-255" title="Hue to RGB" src="http://academe.co.uk/content/blogs.dir/1/files/2012/04/451px-HSV-RGB-comparison.svg_-300x220.png" alt="" width="300" height="220" /></a>Being a wheel, the bar above wraps around &#8211; the red at each end is the same colour. Rainbows don&#8217;t wrap like this &#8211; red is at one end, and blue is at the other end. This range covers 240° of the colour wheel as seen above.</p>
<p>So, with a hue in the colour wheel being represented in the range 0 to 255, or 0° to 360°, if we are to reduce the range to 0°-240°, then this would be represented by a range of 0 to 170 in the algorithm.</p>
<p>So in the Arduino project, a potentiometer range of 0-1023 is converted to a hue range of 0-170. Turning the potentiometer through its full range then gives a colour output covering the full range of the colours of a rainbow.</p>
<p>However, there is another twist. The rainbow does not stop at red and blue at each end. It carries on through infra-red and ultra-violet, neither of which we can see. So to demonstrate the colour range of a rainbow fully, we need to start at total darkness at both ends of the scale, fading up into red at one end, and fading from blue to darkness at the other end.</p>
<p>So this is what I am aiming for. The saturation (S) is set to 100%, as is the brightness (V). These are two settings that would affect the output as a whole. A saturation of less than 100% would &#8220;bleed&#8221; other colours through, which a rainbow would never do. A brightness of less than 100% would not be useful here &#8211; it would be like looking at a rainbow with a pair of neutral sub-glasses on: it would still be a rainbow.</p>
<p style="text-align: center;"><a href="http://academe.co.uk/content/blogs.dir/1/files/2012/04/Rainbow-RGB.zip"><img class="aligncenter size-medium wp-image-260" title="Rainbow-RGB" src="http://academe.co.uk/content/blogs.dir/1/files/2012/04/Rainbow-RGB-300x222.png" alt="" width="300" height="222" /></a></p>
<p>We can do this using the brightness parameter of the HSV-to-RGB converter, rather than messing around with its innards. That way we can easily switch between colour wheel and rainbow to show how they differ.</p>
<p>Here is the code so far, which is work-in-progress. You can switch between colour-wheel and rainbow modes by setting pin 12 to either 0V or +5V.</p>
<pre class="brush:cpp">/*
 Rainbow

 Take a tricolour LED through the colours of the rainbow using an analogue input.

 The circuit:
 * TBC

 Created 21 April 2012
 By Jason Judge

 This example code is in the public domain.

 */

// The three primary colour LEDs, driven as analgue outputs (actually PWM, but
// close enough for our analogue eyes).

const int ledPinRed = 11;    // Red LED connected to analogue out pin
const int ledPinGrn = 10;    // Green LED connected to analogue out pin
const int ledPinBlu = 9;     // Blue LED connected to analogue out pin

const int modeSwitchPin = 12;

// The Hue potentiometer goes on an analogue pin, taking the pin from
// 0V to 5V.

const int potPinHue = 0;

// Constants to define the ranges.

const int hueRedLow = 0;
const int hueRedHigh = 255;
const int hueBlue = 170;

// The size of the angle of one sector (1/6 of a colour wheel), and of a complete
// cycle of the colour wheel.

const int angleMin = 0;
const int angleSector = 60;
const int angleMax = 360;

const int brightMin = 0;
const int brightMax = 255;

// Work variables.

// The potentiometer value is mapped to the range 0 to 360 (degrees).
int potValueHue;

// The hue is the range 0 (red) to 170 (blue) in rainbow
// mode or 255 (red) in colour wheel mode.
// The brightness ranges from 0 (dark) to 255 (full brightness)

int hue, brightness;

// The saturation is fixed at 255 (full) to remove blead-through of different
// colours.
// It could be linked to another potentiometer if a demonstration of hue
// is desired.

const int saturation = 255;

// The brightess of each LED (0 to 255).

unsigned int r, g, b;

void setup()  {
    // Still need to set a baud rate, even for USB.
    Serial.begin(9600);

    // Set LED pins to output.
    pinMode(ledPinRed, OUTPUT);
    pinMode(ledPinGrn, OUTPUT);
    pinMode(ledPinBlu, OUTPUT);

    // Poteniometer analogue pin is an input.
    pinMode(potPinHue, INPUT);

    // TODO: mode switch in a digital input.
    pinMode(modeSwitchPin, INPUT);
}

void loop()  {
    // The Hue potentiometer value is mapped to degrees - 0 to 360 - for convenience.
    potValueHue = map(analogRead(potPinHue), 0, 1023, 0, 360);

    // Control the mode using a physical switch.

    if (digitalRead(modeSwitchPin)) {
        // Rainbow colour mode (infra-red to ultra-violet - well invisible to invisible <img src='http://academe.co.uk/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .

        // The hue ranges from red (0) at 60 degrees to blue (170) at 300 degrees.
        hue = constrain(map(potValueHue, angleSector, angleMax - angleSector, hueRedLow, hueBlue), hueRedLow, hueBlue);

        // Brightness - fade up 0-60 degrees
        brightness = constrain(map(potValueHue, angleMin, angleSector, brightMin, brightMax), brightMin, brightMax);

        // Brightness fade down 300-360 degrees
        brightness = brightness - constrain(map(potValueHue, angleMax - angleSector, angleMax, brightMin, brightMax), brightMin, brightMax);
    } else {
        // Colour wheel mode (red to red, wrapped around in a cycle).

        hue = map(potValueHue, angleMin, angleMax, hueRedLow, hueRedHigh);

        // The brightness is fixed at full for the colour wheel. This could be
        // linked to another poteniometer if that is a concept you wish to
        // demonstrate.
        brightness = 255;
    }

    // Do the conversion.
    HSBToRGB(hue, saturation, brightness, &amp;r, &amp;g, &amp;b);

    analogWrite(ledPinRed, r);
    analogWrite(ledPinGrn, g);
    analogWrite(ledPinBlu, b);

    Serial.print(" bright=");
    Serial.print(brightness);
    Serial.print(" hue=");
    Serial.print(hue);
    Serial.print(" red=");
    Serial.print(r);
    Serial.print(" green=");
    Serial.print(g);
    Serial.print(" blue=");
    Serial.print(b);
    Serial.println("");
    delay(50);
}

// This function taken from here:
// http://eduardofv.com/read_post/179-Arduino-RGB-LED-HSV-Color-Wheel-

void HSBToRGB(
    unsigned int inHue, unsigned int inSaturation, unsigned int inBrightness,
    unsigned int *oR, unsigned int *oG, unsigned int *oB )
{
    if (inSaturation == 0)
    {
        // achromatic (grey)
        *oR = *oG = *oB = inBrightness;
    }
    else
    {
        unsigned int scaledHue = (inHue * 6);
        unsigned int sector = scaledHue &gt;&gt; 8; // sector 0 to 5 around the color wheel
        unsigned int offsetInSector = scaledHue - (sector &lt;&lt; 8);	// position within the sector         unsigned int p = (inBrightness * ( 255 - inSaturation )) &gt;&gt; 8;
        unsigned int q = (inBrightness * ( 255 - ((inSaturation * offsetInSector) &gt;&gt; <img src='http://academe.co.uk/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> )) &gt;&gt; 8;
        unsigned int t = (inBrightness * ( 255 - ((inSaturation * ( 255 - offsetInSector )) &gt;&gt; <img src='http://academe.co.uk/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> )) &gt;&gt; 8;

        switch( sector ) {
        case 0:
            *oR = inBrightness;
            *oG = t;
            *oB = p;
            break;
        case 1:
            *oR = q;
            *oG = inBrightness;
            *oB = p;
            break;
        case 2:
            *oR = p;
            *oG = inBrightness;
            *oB = t;
            break;
        case 3:
            *oR = p;
            *oG = q;
            *oB = inBrightness;
            break;
        case 4:
            *oR = t;
            *oG = p;
            *oB = inBrightness;
            break;
        default:    // case 5:
            *oR = inBrightness;
            *oG = p;
            *oB = q;
            break;
        }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/04/arduino-cycling-through-colours-of-the-rainbow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Helping friends fix their computer, remotely using join.me</title>
		<link>http://academe.co.uk/2012/04/helping-friends-fix-their-computer-remotely-using-join-me/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=helping-friends-fix-their-computer-remotely-using-join-me</link>
		<comments>http://academe.co.uk/2012/04/helping-friends-fix-their-computer-remotely-using-join-me/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 10:34:41 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=249</guid>
		<description><![CDATA[I originally saw this on BBC Click and it has been invaluable since then. The site allows you to take control of a relative&#8217;s PC (let&#8217;s face it &#8211; mum or dad&#8217;s PC) remotely. You can see what is happening, move the mouse, click in stuff and operate the keyboard, giving you full control to [...]]]></description>
			<content:encoded><![CDATA[<p>I originally saw this on <a title="Webscape: Get remote computer support from friends " href="http://news.bbc.co.uk/1/hi/programmes/click_online/9682226.stm" target="_blank">BBC Click</a> and it has been invaluable since then.</p>
<p>The site allows you to take control of a relative&#8217;s PC (let&#8217;s face it &#8211; mum or dad&#8217;s PC) remotely. You can see what is happening, move the mouse, click in stuff and operate the keyboard, giving you full control to make those necessary tweaks and updates. Obviously the machine needs to be working enough to get Internet access, but there is still a lot that can be done using this tool.</p>
<p>The main issue I see with it, is explaining to the remote party what they need to do. <a href="https://join.me/" target="_blank">The website</a> has quite a visual front page, that can confuse some people a lot. They also deliver different front pages to different people. I&#8217;m not sure whether this is some kind of A/B testing, but trying to work out whether people are on the right site and describing the links they need to click on, is very difficult when their description does not match what you can see. Some of the flashy messages they put on the front page also sound very spammy, so I often doubt they have got to the right site when they read out the, &#8220;have fun join your friends&#8221; message that is bizarrely put up there for some people. That is just something to be aware of.</p>
<p>Overall though, I would recommend giving it a try.</p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/04/helping-friends-fix-their-computer-remotely-using-join-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CultureCode Hack &#8211; some project notes</title>
		<link>http://academe.co.uk/2012/04/culturecode-hack-some-project-notes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=culturecode-hack-some-project-notes</link>
		<comments>http://academe.co.uk/2012/04/culturecode-hack-some-project-notes/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 23:08:05 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=241</guid>
		<description><![CDATA[I attended the CultureCode Hack run by CodeWorks on the 24/25 March 2012. I will blog about my personal experience at the event in good time. Or, when I can find some time. In the meantime I will offer some notes on the project that I worked on, specifically the technical aspects of it. The [...]]]></description>
			<content:encoded><![CDATA[<p>I attended the <a href="http://www.culturecode.co.uk/events/hack" target="_blank">CultureCode Hack </a>run by <a href="http://codeworks.net" target="_blank">CodeWorks</a> on the 24/25 March 2012. I will blog about my personal experience at the event in good time. Or, when I can find some time. In the meantime I will offer some notes on the project that I worked on, specifically the technical aspects of it.</p>
<p>The project involved taking book loan data from Newcastle Libraries, and plotting the distance those books were taken to the homes of the borrowers. The idea was to look for patterns in the data that were not obvious in any other form, to see if it could be used to help distribute the books between the libraries in a more relevant way.</p>
<p>I worked mainly on the front end (graphical visualisation) while Peter Bull <a href="https://twitter.com/#%21/RoguePlanetoid">@RoguePlanetoid</a> worked on the back end (ASP.net data delivery).</p>
<p>One of the first things I needed to decide, was what visualisation library we were going to use. I had never used any before, so needed to chose the one that would offer the least resistance to learning.</p>
<p>The three main contenders were:</p>
<ul>
<li>Processing (JavaScript port being processing.js)</li>
<li>Raphaël</li>
<li>Paper.js</li>
</ul>
<p>All three seem to do much the same thing. The main differentiating features we identified are:</p>
<ul>
<li>Processing is driven from its own language. The other two are driven from JavaScript by using and manipulating JavaScript objects directly.</li>
<li>Raphaël supports older browsers than the other two. This was not particularly important to us. However, Raphaël does not support Android due to the way it relies on SVG. This was a little more important.</li>
<li>Raphaël and Paper.js both support object-base interaction. By clicking on a visual object, it is easy to interact with it. This is much more difficult in Processing.</li>
<li>Paper.js and Processing both use canvas, so will support IE from 9 onwards.</li>
</ul>
<p>In the end paper.js won. Putting a quick visualisation together that worked across all the browsers we were using and did not involve learning too many new languages and language constructs, is why it stood out.</p>
<p>One thing all three had in common was the difficulty in finding worked examples. Nearly all example code we found were compact and certainly showed the frameworks off, but were seldom commented to explain what they did and how they worked. That was a shame, as it slowed down our learning somewhat. People <em>were</em> kind enough to put examples up for us to see, but five more minutes to add half a dozen lines of comments would have really added the cherry on the top.</p>
<p>This excellent article gives a great summary of these packages, comparing features in a very visual way, while getting right to the bottom line of why you would chose one over another:</p>
<p><a href="http://coding.smashingmagazine.com/2012/02/22/web-drawing-throwdown-paper-processing-raphael/" target="_blank">http://coding.smashingmagazine.com/2012/02/22/web-drawing-throwdown-paper-processing-raphael/</a></p>
<p>[to be continued]</p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/04/culturecode-hack-some-project-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up an iPhone on an SME Server</title>
		<link>http://academe.co.uk/2012/04/setting-up-an-iphone-on-an-sme-server/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=setting-up-an-iphone-on-an-sme-server</link>
		<comments>http://academe.co.uk/2012/04/setting-up-an-iphone-on-an-sme-server/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 22:25:06 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=237</guid>
		<description><![CDATA[The SME Server is a Linux distribution that sets up a server providing email, file sharing and authentication services. When used as a mail server, it provides SMTP and IMAP mail services over SSL. Connecting an iPhone to this server involves a couple of unintuitive steps, which are documented here: http://help.yahoo.com/l/us/yahoo/smallbusiness/bizmail/mobile/mobile-11.html When it [erroneously IMO] [...]]]></description>
			<content:encoded><![CDATA[<p>The SME Server is a Linux distribution that sets up a server providing email, file sharing and authentication services. When used as a mail server, it provides SMTP and IMAP mail services over SSL.</p>
<p>Connecting an iPhone to this server involves a couple of unintuitive steps, which are documented here:</p>
<p><a href="http://help.yahoo.com/l/us/yahoo/smallbusiness/bizmail/mobile/mobile-11.html" target="_blank">http://help.yahoo.com/l/us/yahoo/smallbusiness/bizmail/mobile/mobile-11.html</a></p>
<p>When it [erroneously IMO] fails to connect to the server using SSL, and asks if you want to connect to the server without SSL, you need to answer &#8220;yes&#8221;. This is the only way to break out of the setup endless loop. Then you can go back in and switch SSL on and update the SMTP ports.</p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/04/setting-up-an-iphone-on-an-sme-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is github?</title>
		<link>http://academe.co.uk/2012/03/what-is-github/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=what-is-github</link>
		<comments>http://academe.co.uk/2012/03/what-is-github/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 18:10:51 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=227</guid>
		<description><![CDATA[I has asked today what github is, after bringing it up in discussion concerning files that have come out of CultureCode hack this weekend. I suspect this will not be the last time I&#8217;m asked, so thought it an ideal subject to post about. So here is a brief discussion for absolute beginners, hopefully with [...]]]></description>
			<content:encoded><![CDATA[<p>I has asked today what github is, after bringing it up in discussion concerning files that have come out of CultureCode hack this weekend. I suspect this will not be the last time I&#8217;m asked, so thought it an ideal subject to post about. So here is a brief discussion for absolute beginners, hopefully with all the jargon taken out:</p>
<p>git is a system for storing files. Those files are stored in a database on your local machine, and that gives it some special properties: the files can be versioned. That means changes to the files can be recorded by the database, and so you have a complete history of all the changes that have been made.</p>
<p>The database you have on your machine is called a <em>git repository</em>. Even though you manage your local files in your local database, its reach is much further than that. You can synchronise the changes in your git repository with a remote git repository. Other people can share that repository, so you can see the changes that each of you makes.</p>
<p>When git repositories are synchronized (e.g. when you push all the changes in your repository to the central repository) git will ensure that all the changes are merged together nicely, but will also ensure that any changes can be picked apart and undone if necessary.</p>
<p>It can get pretty complicated if you look at it too deeply, but usually works smoothly. Essentially it allows many people, all distributed over a wide geographic area, to work on one central set of files, i.e. one project &#8211; usually a software project. However, it allows those different people to manage their changes locally, without affecting anyone else, and them the changes can be merged together at a time of everyone&#8217;s choosing.</p>
<p>So, different can be working on different parts of a large project, each perhaps making many changes, but pull all those parts together in one place as each part is, in turn, completed.</p>
<p>The central repository is where github comes in. github is one of the first, and the most famous of the git repositories available on the Internet. As well as the basic git functionality that you would use on your own machine, it has many additional features and tools that make collaboration with large teams of developers very easy.</p>
<p>github provides free public repositories for open source projects. So long as the code being managed in the repository is available on an open source licence, and is free for anyone to look at and download any time they like, then the repository is free. Private repositories are also available with a subscription cost.</p>
<p>Here, for example, is the initial data put up by Alistair for the CultureCode hack:</p>
<p><a title="CultureCode-Data github repository" href="https://github.com/alistairuk/CultureCode-Data" target="_blank">https://github.com/alistairuk/CultureCode-Data</a></p>
<p>Anyone can download that data and use it. You can then make changes to it, and request that those changes be pushed back to Alistair&#8217;s repository (but that would be a decision that Alistair would made, since he is the owner of that repository).</p>
<p>It needs to be mentioned that git is a <em>distributed change management or code control</em> system. Everyone working on a project will take a copy of the whole of the central repository, and when working on that repository that they have copied, they are essentially working independently.  They do not have to push their changes back to the central repository, and even if they do, the repository owner does not have to accept those changes (assuming the pusher has not already been given permission to push anything they like already).</p>
<p>This gives both support to sub-projects to develop code without falling over each other&#8217;s feet, and also the ability for a solid product (e.g. a software application) to be put together without accepting changes that may break it.</p>
<p>In summary:</p>
<ul>
<li><em>git</em> allows lots of people to work on a software project from different locations, at the same time.</li>
<li><em>github</em> provides public repositories where the software projects can be hosted and shared.</li>
<li>A <em>git repository</em> is a lot cleverer than simply a shared network folder, because it tracks changes and supports the merging of changes in very clever ways.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/03/what-is-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating an HTML signature in Mozilla Thunderbird</title>
		<link>http://academe.co.uk/2012/03/creating-an-html-signature-in-mozilla-thunderbird/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creating-an-html-signature-in-mozilla-thunderbird</link>
		<comments>http://academe.co.uk/2012/03/creating-an-html-signature-in-mozilla-thunderbird/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 23:13:12 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[Email]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=222</guid>
		<description><![CDATA[Mozilla Thunderbird email client allows you to create a signature for each identity you have created. The signature can be either plain text, or HTML, which can include various formatting. The box that Thunderbird provides to type your signature into, is a tiny little thing. The best way to create the signature, is not to [...]]]></description>
			<content:encoded><![CDATA[<p>Mozilla Thunderbird email client allows you to create a signature for each identity you have created. The signature can be either plain text, or HTML, which can include various formatting. The box that Thunderbird provides to type your signature into, is a tiny little thing. The best way to create the signature, is not to try to use that little box for entering it.</p>
<p>These are the steps you should follow to create a simple HTML signature:</p>
<ol>
<li>Start writing a new email by clicking the &#8220;Write&#8221; button.</li>
<li>In the blank email form that comes up, enter the signature of your choice. Use the text formatting buttons to get it looking how you like it &#8211; font sizes, colours, bold, italic etc.</li>
<li>Once the signature looks right, select it using the mouse.</li>
<li>The non-intuitive step involves selecting Insert-&gt;HTML from the top menu of the email. This will open a small window showing the HTML of the signature you selected.</li>
<li>Select all the HTML in the window, and copy it (press Ctrl-C from the keyboard or right-click the mouse and select &#8220;Copy&#8221;).</li>
<li>Close the &#8220;Insert HTML&#8221; box by cancelling it.</li>
<li>Go back to the main Thunderbird window and select Tools-&gt;Account Settings from the top menu.</li>
<li>Select the account on the left-hand side of the &#8220;Account Settings&#8221; window for which you want to set the signature. You will see the &#8220;Signature text&#8221; box with the &#8220;Use HTML&#8221; tickbox above it.</li>
<li>Tick the &#8220;Use HTML&#8221; box.</li>
<li>Click in the &#8220;Signature text&#8221; box then paste the signature &#8211; either Ctrl-V using the keyboard or right-click then &#8220;Paste&#8221; using the mouse.</li>
<li>Click &#8220;OK&#8221; to close the &#8220;Account Settings&#8221; window.</li>
<li>Now try creating a new email. The signature should appear, with &#8220;&#8211;&#8221; just before it.</li>
</ol>
<p>If you need to change the signature or tweak it, then go back to step 1. Each time you will start with the last signature you created as a starting point.</p>
<p>You can even include an image or logo in the signature if you wish. You can link to an image on your local hard drive or copy and paste an image into the signature. Either way will work, even though they operate in different ways. When you copy the HTML, just make sure you copy it all exactly as it appears in the Insert-&gt;HTML box. It will appear to be complicated codes, but that is what carries the formatting and the images.</p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/03/creating-an-html-signature-in-mozilla-thunderbird/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>List crontabs for all linux users</title>
		<link>http://academe.co.uk/2012/03/list-the-crontabs-for-all-users/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=list-the-crontabs-for-all-users</link>
		<comments>http://academe.co.uk/2012/03/list-the-crontabs-for-all-users/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 11:08:09 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=216</guid>
		<description><![CDATA[We had a problem with Plesk, allowing a hacker to set up cron processes on our Linux server as various users. After cleaning a few up, I used this command to list the cron tables for all users: # awk -F: '{print $1}' /etc/passwd &#124; xargs -l1 crontab -lu 2&#62;/dev/null &#160; It&#8217;s a handy command [...]]]></description>
			<content:encoded><![CDATA[<p>We had a problem with Plesk, allowing a hacker to set up cron processes on our Linux server as various users. After cleaning a few up, I used this command to list the cron tables for all users:</p>
<pre># awk -F: '{print $1}' /etc/passwd | xargs -l1 crontab -lu 2&gt;/dev/null</pre>
<p>&nbsp;</p>
<p>It&#8217;s a handy command to keep in your toolbox.</p>
<p>What it does, is take the first field &#8211; the username &#8211; from the passwd file, then pass each username to the crontab command to list the table. xargs is used to pass the usernames one at a time, since crontab only accepts one username.</p>
<address> </address>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/03/list-the-crontabs-for-all-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>qmhandle.pl &#8211; manage qmail queues</title>
		<link>http://academe.co.uk/2012/02/qmhandle-pl-manage-qmail-queues/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=qmhandle-pl-manage-qmail-queues</link>
		<comments>http://academe.co.uk/2012/02/qmhandle-pl-manage-qmail-queues/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 10:25:10 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=212</guid>
		<description><![CDATA[This tool has been a life-saver on our hosting servers many times. If your mail queues fill up with spam &#8211; perhaps incoming, or perhaps after your server has been hacked (timthumb - that caught a lot of people), then spam can be deleted from the outgoing queue. For example, to remove all mail from [...]]]></description>
			<content:encoded><![CDATA[<p>This tool has been a life-saver on our hosting servers many times. If your mail queues fill up with spam &#8211; perhaps incoming, or perhaps after your server has been hacked (<a href="http://rogerwheatley.com/security-alert-timthumb-vulnerability-fix-available/">timthumb </a>- that caught a lot of people), then spam can be deleted from the outgoing queue.</p>
<p>For example, to remove all mail from the outgoing queue with the word &#8220;c@sino&#8221; in the subject, use this command:</p>
<pre>   qmhandle.pl -S'c@sino'</pre>
<p>Perhaps delete all mail that is stuck in the queue from user &#8220;mym3ds@spammer.com&#8221;:</p>
<pre>   qmhandle.pl -f'mym3ds@spammer.com'</pre>
<p>Remember that last one is a regular expression, so escape any special characters.</p>
<p>Showing the state of the queues:</p>
<pre>   qmhandle -s</pre>
<p>Then listing what is in those queues:</p>
<pre>   qmhandle -l | more</pre>
<p>The qmhandle.pl script can be found here, but may well be already installed on your server, especially if you use <a href="http://www.parallels.com/products/plesk/">Plesk</a> to manage your server:</p>
<p><a href="http://sourceforge.net/projects/qmhandle/">http://sourceforge.net/projects/qmhandle/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/02/qmhandle-pl-manage-qmail-queues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SugarCRM: Permissions issue importing updated records</title>
		<link>http://academe.co.uk/2012/02/sugarcrm-permissions-issue-importing-updated-records/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sugarcrm-permissions-issue-importing-updated-records</link>
		<comments>http://academe.co.uk/2012/02/sugarcrm-permissions-issue-importing-updated-records/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 17:56:58 +0000</pubDate>
		<dc:creator>acadadmin</dc:creator>
				<category><![CDATA[Data Migration]]></category>
		<category><![CDATA[SugarCRM]]></category>

		<guid isPermaLink="false">http://academe.co.uk/?p=208</guid>
		<description><![CDATA[I got this error while importing updated email addresses for existing contact records: The record could not be updated due to a permissions issue This happened for just ten records out of three thousand, and I was logged in as an administrator, so there should not have been any real privilege issues. The answer was [...]]]></description>
			<content:encoded><![CDATA[<p>I got this error while importing updated email addresses for existing contact records:</p>
<blockquote><p>The record could not be updated due to a permissions issue</p></blockquote>
<p>This happened for just ten records out of three thousand, and I was logged in as an administrator, so there should not have been any <em>real</em> privilege issues.</p>
<p>The answer was that the records being updated had been deleted in the CRM. SugarCRM was attempting to create new contact records with the IDs supplied, but the old deleted records were still there in the database, preventing the new records from being created.</p>
<p>&nbsp;</p>
<p><strong>The record could not be updated due to a permissions issue</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://academe.co.uk/2012/02/sugarcrm-permissions-issue-importing-updated-records/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

