<?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>Ed&#039;s World &#187; Web</title>
	<atom:link href="http://www.jellard.co.uk/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jellard.co.uk</link>
	<description>Bringing data into real life in a meaningful way</description>
	<lastBuildDate>Fri, 14 May 2010 15:00:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MythTweet &#8211; Twitter MythTV recordings</title>
		<link>http://www.jellard.co.uk/2010/03/mythtweet-twitter-mythtv-recordings/</link>
		<comments>http://www.jellard.co.uk/2010/03/mythtweet-twitter-mythtv-recordings/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 21:32:39 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[mythtv]]></category>
		<category><![CDATA[mythTweet]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=164</guid>
		<description><![CDATA[In the move to put as much of my house onto twitter as possible, MythTV was the next victim.  I&#8217;d previously made a PHP script that sent MSN alerts, but now I don&#8217;t use MSN, it needed a revamp.

I knocked up a small PHP script that grabs the backend status, finds what is being [...]]]></description>
			<content:encoded><![CDATA[<p>In the move to put as much of my house onto twitter as possible, MythTV was the next victim.  I&#8217;d previously made a PHP script that sent MSN alerts, but now I don&#8217;t use MSN, it needed a revamp.</p>
<p><img src="http://www.jellard.co.uk/wp-content/uploads/2010/03/Screenshot-1.png" alt="MythTweet" /></p>
<p>I knocked up a small PHP script that grabs the backend status, finds what is being recorded or watched, compares with the previous run, and sends a message to twitter using wget.</p>
<p>To use it, grab the <a href="http://www.jellard.co.uk/wp-content/uploads/2010/03/mythTweet.phps">script</a>, change the username/password variables, chmod +x it, and then add it to your &#8220;Startup Applications&#8221; or equivalent if you&#8217;re not using Ubuntu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2010/03/mythtweet-twitter-mythtv-recordings/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Handwritten post-it notes generated from Google Calendar</title>
		<link>http://www.jellard.co.uk/2010/02/handwritten-post-it-notes-generated-from-google-calendar/</link>
		<comments>http://www.jellard.co.uk/2010/02/handwritten-post-it-notes-generated-from-google-calendar/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 20:44:26 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[GD]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scouts]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=186</guid>
		<description><![CDATA[ I&#8217;ve recently created a new website for my scout group, Highfield Scouts, and have put up a google calendar.  More out of a challenge than a real need, I&#8217;ve knocked up a script that uses the Google Data API for PHP to query my calendar feed, grab the next event, and make a [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2010/02/scouts4.jpg" style="float: left; margin: 10px;" alt="Scouts" /> I&#8217;ve recently created a new website for my scout group, <a href="http://www.highfieldscouts.org.uk">Highfield Scouts</a>, and have put up a google calendar.  More out of a challenge than a real need, I&#8217;ve knocked up a script that uses the <a href="http://code.google.com/apis/calendar/data/1.0/developers_guide_php.html">Google Data API for PHP</a> to query my calendar feed, grab the next event, and make a fake handwritten postit note.  The script runs every hour to keep the images up to date.</p>
<p>I&#8217;ve made a little markup system so that the whole postit can be a link, and the time and location can be overridden (child protection malarky &#8211; can&#8217;t just put a time and location for some things!)</p>
<p>It&#8217;s all written in PHP, using the GD graphics features to put the text on a background image.  If you&#8217;re interested in the code, comment, and I&#8217;ll give it to you (if you link to me!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2010/02/handwritten-post-it-notes-generated-from-google-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Allowing Firefox to access local javascript files</title>
		<link>http://www.jellard.co.uk/2010/02/allowing-firefox-to-access-local-javascript-files/</link>
		<comments>http://www.jellard.co.uk/2010/02/allowing-firefox-to-access-local-javascript-files/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 11:43:23 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=177</guid>
		<description><![CDATA[If you have HTML/javascript files sitting on your harddisk and you want to open them in firefox and actually use the javascript, you need to change one simple setting.
First, go to about:config (just type it in the address bar and hit enter)
Then filter for &#8220;origin&#8221;.
Change &#8220;security.fileuri.strict_origin_policy&#8221; to false.
You should now be able to use local [...]]]></description>
			<content:encoded><![CDATA[<p>If you have HTML/javascript files sitting on your harddisk and you want to open them in firefox and actually use the javascript, you need to change one simple setting.</p>
<p>First, go to about:config (just type it in the address bar and hit enter)</p>
<p>Then filter for &#8220;origin&#8221;.</p>
<p>Change &#8220;security.fileuri.strict_origin_policy&#8221; to false.</p>
<p>You should now be able to use local javascript files.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2010/02/allowing-firefox-to-access-local-javascript-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improved Google mail number of unread emails script</title>
		<link>http://www.jellard.co.uk/2010/01/improved-google-mail-number-of-unread-emails-script/</link>
		<comments>http://www.jellard.co.uk/2010/01/improved-google-mail-number-of-unread-emails-script/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 12:20:17 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ambient light]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=173</guid>
		<description><![CDATA[Since writing &#8220;Get number of unread posts from google mail&#8221;, I realised that I didn&#8217;t care about a lot of emails that I get on a regular basis, things like ebuyer emails, stock-market alerts etc.  I only want to be notified when I&#8217;ve got emails from real people.
By applying a &#8220;Newsletters&#8221; label on GMail [...]]]></description>
			<content:encoded><![CDATA[<p>Since writing <a href="http://www.jellard.co.uk/2009/11/get-number-of-unread-posts-from-google-mail/">&#8220;Get number of unread posts from google mail&#8221;</a>, I realised that I didn&#8217;t care about a lot of emails that I get on a regular basis, things like ebuyer emails, stock-market alerts etc.  I only want to be notified when I&#8217;ve got emails from real people.</p>
<p>By applying a &#8220;Newsletters&#8221; label on GMail to all automated messages by filtering messages, I can now see how many unread emails I have, then subtract the number of unread newsletters I have, and flash the ambient light that number of times.</p>
<p>Grab <a href="/wp-content/uploads/getGoogleMail.sh">getGoogleMail.sh</a>, change the usernames and passwords, and change &#8220;Newsletters&#8221; to whatever your google label is.  Then use the $count variable to do whatever you want.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2010/01/improved-google-mail-number-of-unread-emails-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hampshire Twittering Traffic-Jams &#8211; SMS alerts &#8211; @hants_motorway</title>
		<link>http://www.jellard.co.uk/2010/01/hampshire-twittering-traffic-jams/</link>
		<comments>http://www.jellard.co.uk/2010/01/hampshire-twittering-traffic-jams/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 09:17:54 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[hants_motorway]]></category>
		<category><![CDATA[traffic]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=130</guid>
		<description><![CDATA[Something that drives me nuts is every so often there&#8217;ll be an accident on the M3 or M27 and the entire surrounding area will be flooded with people trying to avoid the deadlock, only to find they&#8217;re on a tiny road with thousands of other people.  Yes, I could check the traffic websites each [...]]]></description>
			<content:encoded><![CDATA[<p>Something that drives me nuts is every so often there&#8217;ll be an accident on the M3 or M27 and the entire surrounding area will be flooded with people trying to avoid the deadlock, only to find they&#8217;re on a tiny road with thousands of other people.  Yes, I could check the traffic websites each morning, or do some intelligent parsing of traffic RSS feeds, but the first option requires effort before 9am (not going to happen), and the second option is never going to be reliable enough &#8211; it&#8217;d be too hard to programmatically determine how bad the conditions on the road really are.</p>
<p><a href="http://twitter.com/hants_motorway"><img src="http://www.jellard.co.uk/wp-content/uploads/2010/01/hants_motorway1.png" alt="Twitter feed" /></a></p>
<p><span id="more-130"></span></p>
<p>What I really want is a text message telling me which junctions on the M27 and M3 are delayed and roughly what their speed are.  While I don&#8217;t actually use the motorways to get to work, if they&#8217;re gridlocked, the surrounding country-roads tend to also be gridlocked, so this should work.  My house already texts me thanks to twitter, so that part of the system is easy, and has the bonus of other people can use it.</p>
<p>After discovering a site that gives average speeds between junctions, cogs started to whir.  Unfortunately the site doesn&#8217;t provide a nice feed, but that wasn&#8217;t going to stop me.</p>
<p>A few hours of Java hacking later, <a href="http://twitter.com/hants_motorway">@hants_motorway</a> was born.</p>
<p>Every 20 minutes, between 7am-10am and 4pm-7pm, the speeds of each junction between J2-J12 on M27 and J4-J14 on M3 are recorded in a database, and compared against the speed of that junction at that time in the previous month.  If it is less than 45%, it assumes there&#8217;s a delay and puts a message on Twitter.  When the list of junctions delayed change, or the delays end, another message is put on Twitter.</p>
<p>I&#8217;ve setup my personal account (<a href="http://twitter.com/ejellard">@ejellard</a>) to follow @hants_motorway and to text me each update.</p>
<p>I&#8217;m hoping that this means that those driving from the Southampton area to some location near Winchester won&#8217;t have to sit in stupid amounts of traffic.  I obviously can&#8217;t guarantee it&#8217;s accuracy, and no doubt my house will have a power-cut or network outage the one day it would be useful, but it shouldn&#8217;t give false-positives (or negatives, depending which way you look at it).  Let me know what you think, and if there are any better ways of doing this.</p>
<p><a name="graph"></a><br />
And purely because I can, here&#8217;s an &#8220;interesting&#8221; graph of road speeds of different junctions along the M3:<br />
<img src="http://chart.apis.google.com/chart?cht=r&#038;chs=400x400&#038;chdl=J1|J10|J11|J12|J2|J3|J4|J4A|J5|J6|J7|J8|J9&#038;chd=t:64,66,69,60,60,69,68,65,68,69,69,68,68,69,69,69,69,66,68,68,67,70,67,68,64|63,63,62,61,62,65,65,54,34,34,46,65,67,67,68,68,68,66,67,68,68,67,66,65,63|63,62,61,60,62,65,64,49,35,38,51,65,66,66,67,67,65,63,65,67,66,66,65,65,63|64,62,61,63,63,66,65,48,38,44,61,66,67,66,66,66,66,63,65,67,66,67,66,66,64|67,70,70,68,68,68,68,61,49,41,51,67,69,69,68,66,68,63,63,63,68,70,70,69,67|62,62,62,64,66,67,66,47,41,43,61,68,68,69,69,69,68,65,66,69,69,68,67,65,62|62,62,62,64,66,67,66,46,41,43,62,69,68,69,69,69,68,66,67,69,69,68,67,65,62|69,67,69,68,69,70,69,55,44,49,66,69,70,70,70,70,69,67,68,70,70,69,69,69,69|68,67,64,66,68,69,70,69,68,69,70,69,70,70,70,70,70,69,69,70,69,69,69,69,68|68,67,64,66,68,69,70,69,69,70,70,69,70,70,70,70,70,69,69,70,69,69,69,69,68|66,64,64,63,64,66,67,65,67,69,69,69,69,69,70,69,69,69,69,70,69,69,67,68,66|64,62,62,63,65,66,67,64,67,68,68,69,69,69,69,69,69,68,69,69,69,69,68,67,64|64,62,63,63,65,67,67,64,66,67,67,68,69,69,69,69,69,68,69,69,69,68,68,67,64&#038;chco=0000FF,00FF00,00FFFF,FF0000,FF00FF,FFFF00,000088,008800,008888,880000,880088&#038;chxt=x&#038;chxl=0:|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23" alt="M3 Roadspeeds" /></p>
<p>And the M27:<br />
<img src="http://chart.apis.google.com/chart?cht=r&#038;chs=400x400&#038;chdl=J10|J11|J12|J2|J3|J4|J5|J7|J8|J9&#038;chd=t:67,64,65,64,61,62,66,61,42,59,67,66,68,68,68,68,68,63,65,68,67,67,68,68,67|65,64,62,61,60,62,66,58,49,62,67,67,68,68,68,68,68,64,65,68,67,67,67,66,65|64,64,62,61,62,63,64,60,58,61,63,64,64,64,65,65,64,59,61,65,64,64,65,63,64|65,64,63,63,65,67,68,67,68,69,69,69,69,69,69,69,69,68,69,69,69,68,67,67,65|65,62,62,62,64,66,68,66,62,64,68,68,68,69,69,69,69,68,69,68,68,68,66,66,65|63,60,59,59,60,63,66,63,56,58,66,66,67,67,67,68,67,65,66,67,65,65,64,63,63|67,65,62,63,61,62,65,64,58,61,69,67,68,66,67,68,64,56,65,69,68,68,68,67,67|67,65,62,63,61,62,65,64,58,61,69,67,68,66,67,68,64,56,65,69,68,68,68,67,67|66,66,63,62,62,63,65,64,58,58,69,69,69,69,69,69,67,59,63,69,69,68,68,68,66|67,66,64,64,63,64,67,65,59,61,68,69,69,69,69,69,67,62,64,69,68,68,68,68,67&#038;chco=0000FF,00FF00,00FFFF,FF0000,FF00FF,FFFF00,000088,008800,008888,880000,880088&#038;chxt=x&#038;chxl=0:|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23" alt="M27" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2010/01/hampshire-twittering-traffic-jams/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Web based photo galleries &#8211; the unusable and the reasonable</title>
		<link>http://www.jellard.co.uk/2009/11/web-based-photo-galleries-the-unusable-and-the-reasonable/</link>
		<comments>http://www.jellard.co.uk/2009/11/web-based-photo-galleries-the-unusable-and-the-reasonable/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 23:22:37 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[photo gallery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scouts]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=112</guid>
		<description><![CDATA[So, after yesterday&#8217;s Pinewood Derby with funky racing traffic lights, I looked for a simple, quick photo album tool to display the photos, and stumbled on Piwigo, which looked reasonable and the whole &#8220;Simple powerful&#8221; philosophy seemed to match what I wanted.  So, I downloaded the single php installer script, which automagically downloads the latest [...]]]></description>
			<content:encoded><![CDATA[<p>So, after yesterday&#8217;s Pinewood Derby with funky <a href="http://www.jellard.co.uk/2009/11/scout-racing-lights-naturally-arduino-powered/">racing traffic lights</a>, I looked for a simple, quick photo album tool to display the photos, and stumbled on <a href="http://piwigo.org/" target="_blank">Piwigo</a>, which looked reasonable and the whole &#8220;Simple powerful&#8221; philosophy seemed to match what I wanted.  So, I downloaded the single php installer script, which automagically downloads the latest version and installs everything.  So far, so good.</p>
<p>Now to actually create an album.  Yes, pretty easy. Upload a file, not so easy, but doable.  Get that file to be shown &#8211; next to impossible.  This is the worlds most convoluted software I have ever seen!  To get a photo to be shown, you first have to syncronise, then go and create thumbnails &#8211; but wait, by default the synchronise does a dummy run, so go back and tick a tick-box.  Grr, really not usable.  So, I tried looking at the documentation (which goes against my beliefs of websites should never, ever, need any help &#8211; they should be usable) and even that is appauling!  It&#8217;s a wiki with a very poor navigation structure (if there is any structure), so impossible to find anything useful.  Turn to the forums to find others having the same problem, and being told to read the instructions&#8230;</p>
<p>Right, rant over, software uninstalled.</p>
<p><a href="http://www.plogger.org/" target="_blank">Plogger</a> was the next on the list, the demo looked clean and simple &#8211; just what I needed (PHP/MySQL based).  Installed it in a couple of minutes, saw a test album had been created for me so uploaded a photo and job done &#8211; it was there!  Then spent the next hour cropping and adjusting the photos, uploaded them, and bob&#8217;s your uncle, I have a nice and simple photo gallery for the scouts!  The styling is very minimal, it&#8217;s designed to be part of a larger site, although there is one style that&#8217;s a little less minimal which I&#8217;ve gone for as there&#8217;s no &#8220;larger site&#8221; for this.</p>
<p>So steer clear of piwigo, and let me know if you have any recommendations&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2009/11/web-based-photo-galleries-the-unusable-and-the-reasonable/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Get number of unread posts from google mail</title>
		<link>http://www.jellard.co.uk/2009/11/get-number-of-unread-posts-from-google-mail/</link>
		<comments>http://www.jellard.co.uk/2009/11/get-number-of-unread-posts-from-google-mail/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 16:08:40 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ambient light]]></category>
		<category><![CDATA[gmail]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=84</guid>
		<description><![CDATA[Here&#8217;s a simple bash script that gets the number of unread messages, and runs a command that does something with that.  In my case, a java program that puts a message on a MQTT topic, which indirectly flashes an ambient light.
 

#!/bin/bash
while (true)
do

rm atom
rm atom_process

wget https://gmail.google.com/gmail/feed/atom --user=XXXXX --password=XXXXX 2&#38;&#62;1  /dev/null

cat atom &#124; grep [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a simple bash script that gets the number of unread messages, and runs a command that does something with that.  In my case, a java program that puts a message on a MQTT topic, which indirectly flashes an ambient light.</p>
<p><code> </code></p>
<p><code></p>
<pre style="font-size: 9px">#!/bin/bash
while (true)
do

rm atom
rm atom_process

wget https://gmail.google.com/gmail/feed/atom --user=XXXXX --password=XXXXX 2&amp;&gt;1  /dev/null

cat atom | grep fullcount &gt; atom_process
count=`sed -n -e 's/.*&gt;\(.*\)&lt;.*/\1/p' atom_process`

java -jar /home/ed/rrd/MQTTRunner.jar mpc_google 3 $count
sleep 60

done</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2009/11/get-number-of-unread-posts-from-google-mail/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to tweet from your website with your own tinyurl URL shortening service</title>
		<link>http://www.jellard.co.uk/2009/10/how-to-tweet-from-your-website-with-your-own-tinyurl-url-shortening-service/</link>
		<comments>http://www.jellard.co.uk/2009/10/how-to-tweet-from-your-website-with-your-own-tinyurl-url-shortening-service/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 19:51:39 +0000</pubDate>
		<dc:creator>Ed</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tinyurl]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.jellard.co.uk/?p=55</guid>
		<description><![CDATA[As this is my first post about Magic Hat, a little introduction.  Magic Hat is a site for magicians to learn magic, with over 50 thousand users.  I started it in 2004, and since then have gradually (or not so gradually) being changing it.  We&#8217;re now at the 8th major redesign.  [...]]]></description>
			<content:encoded><![CDATA[<p>As this is my first post about Magic Hat, a little introduction.  Magic Hat is a site for magicians to learn magic, with over 50 thousand users.  I started it in 2004, and since then have gradually (or not so gradually) being changing it.  We&#8217;re now at the 8th major redesign.  It started as a good way to learn PHP/MySQL/HTML, so I didn&#8217;t touch any content management systems, and wrote the entire first 3 versions with linux&#8217;s best text editor, vim!  I then treated myself to using Eclipse, which saves a lot of work &#8211; Ctrl + Space and your website&#8217;s done (I wish!).  Then I chucked in a phpBB forum, modified it and my site so that they&#8217;re nicely integrated.  Finally, I changed to using smarty templates, which has made changing the look of the site in the last few versions significantly easier &#8211; would highly recommend it.</p>
<p>So, you&#8217;ve probably gathered that I&#8217;ll happily reinvent the wheel many times over, but hopefully for a good result.  Magic Hat is very dynamic and has lots of complicated features that I don&#8217;t think would have been feasible to get working in something like WordPress without having to learn and change most of WP.</p>
<p>I&#8217;ve setup the Magic Hat forums to tweet every time someone posts, but I didn&#8217;t really want to use tinyurl/bit.ly as I&#8217;d like to keep magichat.co.uk in the links.  So, here&#8217;s some code that creates the smallest possible hash.</p>
<p><span id="more-55"></span></p>
<pre><code style="font-size: 9px;">$letters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
function getHash($i) {
        $string = "";
        while ($i &gt;= strlen($letters)) {
                $string = substr($letters, $i % strlen($letters), 1) . $string;
                $i = floor($i / strlen($letters));
        }
        $string = substr($letters, $i, 1) . $string;
        return $string;
}
function getNumFromHash($string) {
        $letters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $k = 0;
        $count = 0;
        for ($j = strlen($string) - 1; $j &gt;= 0; $j--) {
                $letter = substr($string, $j, 1);
                $indexOfLetter = strpos($letters, $letter);
                $k += $indexOfLetter * pow(strlen($letters), $count);
                $count++;
        }
        return $k;
}
</code></pre>
<p>So, whenever I want to twitter something, I stick an entry in a database table with the URL and text contents.  I grab the auto incrementing ID from the primary key, and pass it into getHash().  Then I run this:</p>
<pre><code style="font-size: 9px;">$twitters = sql_array("SELECT id, message, link FROM twitter WHERE sent = 0 ORDER BY id");
if (count($twitters[0]) &gt; 0) {
        foreach ($twitters as $t) {
                $linkLength = 0;
                $link = "";
                $message = $t['message'];
                if (strlen($t['link']) &gt; 0) {
                        $link = "http://magichat.co.uk/w/".function_getHash($t['id']);
                        $linkLength = strlen($link) + 1;
                        $message = substr($message, 0, 140 - $linkLength);
                        $message .= " ".$link;
                }
                $message = urlencode($message);
                $ch = curl_init('http://twitter.com/statuses/update.json');
                curl_setopt ($ch, CURLOPT_POST, true);
                curl_setopt ($ch, CURLOPT_POSTFIELDS, 'status='.$message);
                curl_setopt($ch, CURLOPT_USERPWD, 'magichatuk:PASSWORD');
                curl_setopt($ch, CURLOPT_VERBOSE, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
                $response = curl_exec($ch);
                curl_close($ch);
                sql_update("twitter", "sent = 1", "id = ".$t['id']);
        }
}</code></pre>
<p>sql_array and sql_update are a couple of functions that I&#8217;ve written to do stuff with the database, and cache results etc.</p>
<p>The code ensures the full URL is present by shrinking the text if need be.</p>
<p>This line in my .htaccess file directs everything starting /w/ to tinyurl.php</p>
<pre><code style="font-size: 9px;">RewriteRule ^w/(.+)    /tinyurl.php?hash=$1</code></pre>
<p>tinyurl.php:</p>
<pre><code style="font-size: 9px;">
$string = $_GET['hash'];
$k = getNumFromHash($string);
$url = sql_result("link", "ma_twitter", "id = $k");
sql_update("ma_twitter", "hits = hits + 1", "id = $k");
header("Location:http://www.magichat.co.uk".$url);
</code></pre>
<p>And the job&#8217;s done!  Doing it this way (without using tinyurl) means that you can jump to #anchors on the page.</p>
<p>See it in action at <a href="http://twitter.com/magichatuk">http://twitter.com/magichatuk</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jellard.co.uk/2009/10/how-to-tweet-from-your-website-with-your-own-tinyurl-url-shortening-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
