<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.3" -->
<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/"
	>

<channel>
	<title>Tom Anthony</title>
	<link>http://www.tomanthony.co.uk/blog</link>
	<description>Making sites that are easy to find, and easy to use.</description>
	<pubDate>Tue, 04 Sep 2007 11:48:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.3</generator>
	<language>en</language>
			<item>
		<title>Caching Google Maps Geocoder Results</title>
		<link>http://www.tomanthony.co.uk/blog/caching-google-maps-geocoder-results/</link>
		<comments>http://www.tomanthony.co.uk/blog/caching-google-maps-geocoder-results/#comments</comments>
		<pubDate>Wed, 21 Mar 2007 19:46:28 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Web</category>
	<category>APIs/Mashups</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/caching-google-maps-geocoder-results/</guid>
		<description><![CDATA[After my post Geocoding UK Postcodes with Google Maps API I&#8217;ve had a few people contact me about caching geocoding results back to a server, for subsequent pages.
It&#8217;s a good question - Google&#8217;s geocoder permits you to make 50,000 queries a day, which sounds like a lot. However, that is only 35 a minute, which [...]]]></description>
			<content:encoded><![CDATA[<p>After my post <a href="http://www.tomanthony.co.uk/blog/geocoding-uk-postcodes-with-google-map-api/">Geocoding UK Postcodes with Google Maps API</a> I&#8217;ve had a few people contact me about caching geocoding results back to a server, for subsequent pages.</p>
<p>It&#8217;s a good question - Google&#8217;s geocoder permits you to make 50,000 queries a day, which sounds like a lot. However, that is only 35 a minute, which if you sustain for more than a few minutes, kicks in the limit (apparently&#8230;). So you might be interested in caching your results.</p>
<p>If you aren&#8217;t fussed about UK geocoding, you can access the regular Google geocoder using HTTP, as documented in the <a href="http://www.google.com/apis/maps/documentation/#Geocoding_HTTP_Request">Google Maps Documentation</a>. </p>
<p>However, if you want to temporarily cache results collected by the client (as per my UK geocoding example linked to above), you need to send them back over an AJAX connection, and that is what this article discusses. Although aimed at using the UK geocoding technique, a lot of this tutorial will be applicable to results via the normal Google Javascript geocoder.</p>
<p>So this short tutorial is going to do is show you how once a postcode has been translated into longitude and latitude, the result can be sent back to your server to be temporarily stored in a database. Then we are going to look at how we can query our own database before we query Google&#8217;s, for each result.</p>
<p>Note: I&#8217;m told it used to be in Google&#8217;s Terms that you couldn&#8217;t store geocoding results, but it doesn&#8217;t appear to be that way now. However, we are only going to store them temporarily, so we don&#8217;t have to hit Google&#8217;s server repeatedly for the same query.</p>
<p>If you are eager just to see how this all will work, you can go straight to the <a href="http://www.tomanthony.co.uk/demo/cache_geocode_results/">demo page</a>.</p>
<p>So, lets get going&#8230;</p>
<p><a id="more-14"></a></p>
<h2>Getting started</h2>
<p>To begin with, we need to create our Google map page, and get our UK geocoder working. If you&#8217;ve not done so yet, take a look at the <a href="http://www.tomanthony.co.uk/blog/geocoding-uk-postcodes-with-google-map-api/">UK Postcoder Geocoder tutorial</a> and get that setup.</p>
<p>We are going to make only a couple of changes to the Javascript files, but firstly we need some PHP, and a MySQL database to store the results in. At this point, if you are confident with your server side scripting, go ahead and use ASP and MSSQL or anything else that takes your fancy; just remember to asjust the calsl we&#8217;ll add to the Javascript accordingly.</p>
<h2>Make the database</h2>
<p>We need to make a database in order to store our cached results. We will have 1 table, which will have 5 fields: <code>id, postcode, latitude, longitude</code> and <code>data_added</code>. <code>id</code> is our primary key, you can ignore it. The other fields should be fairly self evident.</p>
<p>You can use this SQL to create your table once you&#8217;ve setup a database:</p>
<blockquote><p>
<code><br />
CREATE TABLE `postcodes` (<br />
&nbsp;&nbsp;`id` int(11) NOT NULL auto_increment,<br />
&nbsp;&nbsp;`postcode` text NOT NULL,<br />
&nbsp;&nbsp;`latitude` float NOT NULL default &#039;0&#039;,<br />
&nbsp;&nbsp;`longitude` float NOT NULL default &#039;0&#039;,<br />
&nbsp;&nbsp;`date_added` datetime default NULL,<br />
&nbsp;&nbsp;PRIMARY KEY&nbsp;&nbsp;(`id`)<br />
)<br />
</code>
</p></blockquote>
<p>We need the <code>date_added</code> field simply as we are only storing the results temporarily, in our case for 24 hours. After a result is 24 hours old, we ignore it; I&#8217;ll leave it as an exercise to the reader to write code to clean up their old results.</p>
<h2>Write the PHP to write</h2>
<p>Now we need to store results in our shiny new table; so we are going write <code>cache.php</code> which writes a retrieved result to the database. It is pretty short and sweet, here is the code:</p>
<blockquote><p><code>&lt;?php<br />
&nbsp;<br />
&nbsp;&nbsp;$db = @ mysql_connect(&#039;localhost&#039;, &#039;DBUSER&#039;, &#039;DBPASSWORD&#039;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if (!$db) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;Sorry, database error!&quot;);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;mysql_select_db(&#039;DBNAME&#039;,$db);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;$sql = &quot;INSERT into `postcodes` (&nbsp;&nbsp;`postcode` ,&nbsp;&nbsp;`latitude` ,&nbsp;&nbsp;`longitude` ,&nbsp;&nbsp;`date_added` ) VALUES (UPPER(&#039;&quot; . mysql_real_escape_string($_GET[&#039;postcode&#039;]) . &quot;&#039;),&nbsp;&nbsp;&#039;&quot; . mysql_real_escape_string($_GET[&#039;latitude&#039;]) . &quot;&#039;,&nbsp;&nbsp;&#039;&quot; . mysql_real_escape_string($_GET[&#039;longitude&#039;]) . &quot;&#039;, NOW( ))&quot;;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if ($result = mysql_query($sql))<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;Success&quot;;<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;Problem&quot;;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
?&gt;<br />
</code>
</p></blockquote>
<p>It just connects to the database, and sends one SQL query. Note we use <code>UPPER()</code> to ensure all postcodes are written to the database in upper case, we don&#8217;t want to be storing cached copies for both upper and lower case.</p>
<p>Don&#8217;t forget to change DBUSER, DBPASSWORD and DBNAME to the correct values; your database user, password and your database name.</p>
<p>If you have problems, you can access this file directly, and it should say &#8220;Problem&#8221; if it has a problem!</p>
<h2>Write the PHP to read</h2>
<p>Ok, we now have the PHP code to write results to the database, we just need to be able to retrieve them. For this we need <code>geocode.php</code>, another small PHP script.</p>
<p>Lets dive straight in with the code:</p>
<blockquote><p><code>&lt;?php<br />
&nbsp;&nbsp;header(&quot;Content-Type: text/xml&quot;);<br />
?&gt;<br />
&lt;locations&gt;<br />
&lt;?php<br />
&nbsp;<br />
&nbsp;&nbsp;$db = @ mysql_connect(&#039;localhost&#039;, &#039;DBUSER&#039;, &#039;DBPASSWORD&#039;);<br />
&nbsp;<br />
&nbsp;&nbsp;if (!$db) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;Sorry, database error!&quot;);<br />
&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;mysql_select_db(&#039;DBNAME&#039;,$db);<br />
&nbsp;<br />
&nbsp;&nbsp;$sql = &quot;SELECT * FROM&nbsp;&nbsp;`postcodes` WHERE `postcode` = UPPER(&#039;&quot; . $_GET[&#039;postcode&#039;] . &quot;&#039;) AND `date_added` &gt;&nbsp;&nbsp;DATE_SUB(NOW(), INTERVAL 1 DAY)&quot;;<br />
&nbsp;<br />
&nbsp;&nbsp;if ($result = mysql_query($sql))<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (mysql_num_rows($result) &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$location = mysql_fetch_array($result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;\t&lt;location postcode=&#039;&quot; . $location[&#039;postcode&#039;] . &quot;&#039; latitude=&#039;&quot; . $location[&#039;latitude&#039;] . &quot;&#039; longitude=&#039;&quot; . $location[&#039;longitude&#039;] . &quot;&#039; date_added=&#039;&quot; . $location[&#039;date_added&#039;] .&quot;&#039; /&gt;\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;<br />
?&gt;<br />
&lt;/locations&gt;<br />
</code>
</p></blockquote>
<p>The <code>&lt;locations&gt;</code> tags are because we are outputting XML. Eeek! XML! Don&#8217;t be scared, it is very simple, the actualy output we send to the browser looks something like this:</p>
<blockquote><p><code>&lt;locations&gt;<br />
&nbsp;&nbsp;&lt;location postcode=&#039;W1B 2EL&#039; latitude=&#039;51.5144&#039; longitude=&#039;-0.141959&#039; date_added=&#039;2007-03-21 19:04:25&#039; /&gt;<br />
&lt;/locations&gt;<br />
</code>
</p></blockquote>
<p>We then do a simple SQL query to grab matching results that were added in the last day, and output the first one (there should only be one) into our little XML document. That wasn&#8217;t so bad, right?</p>
<h2>Adjusting the Javascript</h2>
<p>Ok, we have PHP that reads and writes to a database with our results; which just means we need to adjust our Javascript. Currently our code queries Google and then uses the result, all we want to do is add a couple of steps to this process.</p>
<p>We want to query our own database first, and if we find a result, then great, we use that. If we don&#8217;t find a result, then we want to query Google, as before; we&#8217;ll also want to write the result from Google back to our cache, for use with future queries.</p>
<p>To achieve all of this, we are going to add 2 new functions, and we are going to make a couple of modifications to one of our current functions.</p>
<p>First we will add <code>createRequest()</code> which is a common function for AJAX applications. It just creates and AJAX request object, depending on your browser. This tutorial isn&#8217;t designed to be an AJAX tutorial, so if you need help understanding this function, you should find plenty of helpful tutorials on the web.</p>
<p>Here it is:</p>
<blockquote><p><code>function createRequest() {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;// create an Ajax Request<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;var ajaxRequest;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ajaxRequest = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);<br />
&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;catch (e1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ajaxRequest = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (e2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ajaxRequest = new XMLHttpRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;return ajaxRequest;<br />
}<br />
</code>
</p></blockquote>
<p>The object this creates will simple enable us to send requests back to the web server, via Javascript, and receive the reply; perfect for querying our cache.</p>
<p>We already have a function <code>usePointFromPostcode()</code> that queries Google, we just need a middleman to try our cache first. This challenge is answered by the might and brave <code> usePointFromPostcodeViaCache()</code> function:</p>
<blockquote><p><code>function usePointFromPostcodeViaCache(postcode, callbackFunction) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;map.clearOverlays();<br />
&nbsp;&nbsp;var ajax_connection = createRequest();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;ajax_connection.open(&#039;get&#039;, &quot;geocode.php?postcode=&quot; + postcode);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;// setup the function to deal with the reply<br />
&nbsp;&nbsp;ajax_connection.onreadystatechange = function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (ajax_connection.readyState == 4) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var xmlDoc = ajax_connection.responseXML;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var markers = xmlDoc.documentElement.getElementsByTagName(&quot;location&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (markers.length &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var resultLat = markers[0].getAttribute(&#039;latitude&#039;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var resultLng = markers[0].getAttribute(&#039;longitude&#039;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var resultDate = markers[0].getAttribute(&#039;date_added&#039;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var point = new GLatLng(resultLat,resultLng);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&quot;result&quot;).innerHTML = &quot;Result for &quot; + postcode + &quot; came from cache. It was last cached on &quot; + resultDate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callbackFunction(point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usePointFromPostcode(postcode, callbackFunction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;ajax_connection.send(null);<br />
}<br />
</code>
</p></blockquote>
<p>We clear any current markers, just for the sake of this tutorial, so you an query the same postcode over and over.</p>
<p>Then we setup our AJAX request, and write our callback function (for AJAX newbies, this is just the function that is called when a result is received from the webserver). This function parses the XML, and checks to see if we have any results by checking <code>markers.length</code>.</p>
<p>If we have no results, we call <code>usePointFromPostcode()</code>, which queries Google, as before. If we do get a result, then we handle it exactly as we do in <code>usePointFromPostcode()</code> when we get a result from Google; we make a <code>GLatLng</code> object and pass it to our designated callback function.</p>
<p>Lastly, having set this up, we actually send the request. Phew! Almost there.</p>
<p>Finally, we need to add a couple of lines to <code>usePointFromPostcode()</code> to write retrieved results to our cache. Between the lines <code>var point = new GLatLng(resultLat,resultLng);</code> and <code>callbackFunction(point);</code> add this code:</p>
<blockquote><p><code>document.getElementById(&quot;result&quot;).innerHTML = &quot;Result for &quot; + postcode + &quot; came from Google.&quot;;<br />
&nbsp;&nbsp;var ajax_connection = createRequest();<br />
&nbsp;&nbsp;ajax_connection.open(&#039;get&#039;, &quot;cache.php?postcode=&quot; + postcode + &quot;&amp;latitude=&quot; + resultLat + &quot;&amp;longitude=&quot; + resultLng);<br />
&nbsp;&nbsp;ajax_connection.send(null);<br />
</code>
</p></blockquote>
<p>This sends an AJAX request, just to send the result to the cache. We need no callback function for this AJAX request, as we don&#8217;t need to examine the response.</p>
<p>You&#8217;ll notice in this function and the previous one we&#8217;ve added a line writing a comment to a &#8216;result&#8217; element on our page. This is just so you can see in your working example, or on the <a href="http://www.tomanthony.co.uk/demo/cache_geocode_results/">demo</a> page where the result is coming from. So we need to add this element to the index.php file, which is 2 minutes work. Last hurdle I promise, lets go&#8230;</p>
<h2>Update index.php</h2>
<p>Wherever you like add to your HTML file this code:</p>
<blockquote><p><code>&lt;p id=&quot;result&quot;&gt;&lt;/p&gt;<br />
</code>
</p></blockquote>
<p>The very last thing to do is, in your HTML file, change all instances of <code>usePointFromPostcode()</code> to <code>usePointFromPostcodeViaCache()</code> or we will continue to query Google without checking our cache first.</p>
<p>You can check this all works on the <a href="http://www.tomanthony.co.uk/demo/cache_geocode_results/">demo page</a>. If you can&#8217;t think of a Postcode, try &#8216;SP4 7DE&#8217; to see Stonehenge!</p>
<h2>Final words</h2>
<p>This tutorial has kinda blitzed through the AJAX stuff, I know; but I wanted to focus on the task at hand. If you go and read a couple of AJAX tutorials, you shouldn&#8217;t find what is being done here too complicated. Having said that, post any questions in the comments, and I&#8217;ll do my best to answer.</p>
<p>Also, to keep it simple I&#8217;ve cut some corners here. Some examples are:</p>
<p>1) This code caches results across different visitors. If you have visitors who maintain long sessions and redo the same queries, you&#8217;d probably also want to cache them in a Javascript array so no repeat remote queries were necessary.</p>
<p>2) There is no thought to security given here; it is possible for someone to fill your cache up with junk (though they&#8217;d need to do it every 24 hours).</p>
<p>3) This is aimed particularly towards UK results. If you aren&#8217;t bothered about UK results, you could query your database, as we are doing, and if the result is missing, then your server could use the HTTP geocoder to get the result directly from Google to pass back to you. However, this technique will working for you too (you just need to modify it a bit).</p>
<p>However, hopefully it will be enough to get the people who&#8217;ve to get going with their projects.</p>
<p>Have fun with it, and please do post comments if you have questions (or just to say hi!:).</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/google+maps" rel="tag">google maps</a>, <a href="http://technorati.com/tag/api" rel="tag">api</a>, <a href="http://technorati.com/tag/Web+2.0" rel="tag"> Web 2.0</a>, <a href="http://technorati.com/tag/javascript" rel="tag"> javascript</a>, <a href="http://technorati.com/tag/caching" rel="tag"> caching</a>, <a href="http://technorati.com/tag/Web-Services" rel="tag"> Web-Services</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/caching-google-maps-geocoder-results/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Geocoding UK Postcodes with Google Map API</title>
		<link>http://www.tomanthony.co.uk/blog/geocoding-uk-postcodes-with-google-map-api/</link>
		<comments>http://www.tomanthony.co.uk/blog/geocoding-uk-postcodes-with-google-map-api/#comments</comments>
		<pubDate>Sun, 04 Mar 2007 18:20:47 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Web</category>
	<category>APIs/Mashups</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/geocoding-uk-postcodes-with-google-map-api/</guid>
		<description><![CDATA[Notice: As a few people have pointed out, this announcement from Google means the technique I describe below is no longer needed. Thanks Google!
Google Maps API provides a geocoding feature, for finding the latitude and longitude of places or addresses; but it does not work for UK postcodes. This is thanks to Royal Mail who [...]]]></description>
			<content:encoded><![CDATA[<p><b>Notice:</b> As a few people have pointed out, <a href="http://googlemapsapi.blogspot.com/2007/07/uk-geocoding-now-available-in-maps-api.html">this announcement</a> from Google means the technique I describe below is no longer needed. Thanks Google!</p>
<p>Google Maps API provides a geocoding feature, for finding the latitude and longitude of places or addresses; but it does not work for UK postcodes. This is thanks to Royal Mail who have a copyright on the data, and are very restrictive with their (expensive) licenses for it.</p>
<p>There are various solutions out there for using 3rd party services and importing the data to be used with Google Maps, or for using community built databases for the info. However, I&#8217;ve had a few people ask me about doing it just though Google.</p>
<p>It is possible &#8212; Google AJAX Search API does provide geocoding for UK postcodes. We need to use the two APIs in harmony to achieve our result.</p>
<p>So here it is.</p>
<p><a id="more-13"></a></p>
<h2>Step by step</h2>
<p>I&#8217;ll assume you already know how to use Google Maps API, and you came here just looking how to add geocoding for the UK.</p>
<h4>Step 1.</h4>
<p>Grab a two API keys, if you already have your Google Maps API key, just grab an AJAX search key. You can get them here:</p>
<p><a href="http://www.google.com/apis/maps/signup.html">http://www.google.com/apis/maps/signup.html</a></p>
<p><a href="http://code.google.com/apis/ajaxsearch/signup.html">http://code.google.com/apis/ajaxsearch/signup.html</a></p>
<h4>Step 2.</h4>
<p>Google will give you a sample page, you need to stick your two API keys at the top of the page, followed by a reference to your Javascript file:</p>
<blockquote><p><code>&lt;script src=&quot;http://maps.google.com/maps?file=api&amp;v=2&amp;key=*KEY*&quot;<br />
type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&nbsp;<br />
&lt;script src=&quot;http://www.google.com/uds/api?file=uds.js&amp;v=1.0&amp;key=*KEY*&quot;<br />
type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&nbsp;<br />
&lt;script src=&quot;gmap.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
</code>
</p></blockquote>
<p>Ensure the reference to your Javascript file comes after the two API keys.</p>
<h4>Step 3.</h4>
<p>In addition to the Google Maps API stuff, you need to stick a reference to Google local search at the top of your Javascript file:</p>
<blockquote><p>
<code>var localSearch = new GlocalSearch();<br />
</code>
</p></blockquote>
<p>You can grab my Javascript file right <a href="http://www.tomanthony.co.uk/demo/geocode_uk_postcode/gmap.js">here</a>, but remember you&#8217;ll need to change the API keys.</p>
<h4>Step 4.</h4>
<p>The key to this Geocoder is only a single function:</p>
<blockquote><p>
<code>function usePointFromPostcode(postcode, callbackFunction) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;localSearch.setSearchCompleteCallback(null, <br />
&nbsp;&nbsp;&nbsp;&nbsp;function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (localSearch.results[0]) {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var resultLat = localSearch.results[0].lat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var resultLng = localSearch.results[0].lng;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var point = new GLatLng(resultLat,resultLng);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callbackFunction(point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;Postcode not found!&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;localSearch.execute(postcode + &quot;, UK&quot;);<br />
}<br />
</code>
</p></blockquote>
<p>It takes 2 arguments; <code>postcode</code> is the postcode you want to look for, and <code> callbackFunction</code> is the function you wish to run on the results.</p>
<p>Why is it necessary to do it this way? It is the way AJAX, and thus Google AJAX Search API, works - the request is sent, and a callback function is designated to handle the results returned, when they are ready. </p>
<p>In our case, the callback function can do whatever you want with the results, which will come in the format of a <code>GLatLng</code> (often just called a point); I&#8217;ve supplied 2 sample functions, <code> placeMarkerAtPoint</code> and <code>setCenterToPoint</code> which do pretty much what they sound like they do.</p>
<h4>Step 5.</h4>
<p>Putting aside accessibility and graceful degradation for the sake of simplicity in this tutorial, the last step we need is just to add some hooks into our Javascript:</p>
<blockquote><p>
<code>&lt;input type=&quot;text&quot; id=&quot;postcode&quot; size=&quot;10&quot; /&gt;<br />
&lt;input type=&quot;submit&quot; value=&quot;Place Marker&quot; onclick=&quot;javascript:<br />
usePointFromPostcode(document.getElementById(&#039;postcode&#039;).value, placeMarkerAtPoint)&quot; /&gt;<br />
</code>
</p></blockquote>
<p>We have a field for inputting a postcode, and I&#8217;ve added a button for placing a marker there. Where I have <code>placeMarkerAtPoint</code> you can put a reference to your own function, or you can even add a function right in there, like this:</p>
<blockquote><p>
<code>&nbsp;&nbsp;&lt;input type=&quot;submit&quot; value=&quot;Do whatever&quot; onclick=&quot;javascript:<br />
&nbsp;&nbsp;usePointFromPostcode(document.getElementById(&#039;postcode&#039;).value,<br />
&nbsp;&nbsp;&nbsp;&nbsp;function (point) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#039;Latitude: &#039; + point.lat() + &#039;\nLongitude: &#039; + point.lng());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})&quot; /&gt;<br />
</code>
</p></blockquote>
<h2>Demo</h2>
<p>If you are coming in from an RSS reader, either visit this blog post on the site, or see the <a href="http://www.tomanthony.co.uk/demo/geocode_uk_postcode/">demo page</a>.</p>
<p>	Postcode: <input type="text" id="postcode" size="10" /><br />
	<input type="submit" value="Place Marker" onclick="javascript:usePointFromPostcode(document.getElementById('postcode').value, placeMarkerAtPoint)" /><br />
	<input type="submit" value="Center Map" onclick="javascript:usePointFromPostcode(document.getElementById('postcode').value, setCenterToPoint)" /></p>
<div id="map" style="width: 500px; height: 300px"></div>
<p><script src="http://maps.google.com/maps?file=api&#038;v=2&#038;key=ABQIAAAA0jNoc89uwkdl4LgfM9KldRRiKve6JGS7u_Ryr84nOMdV8_I6oxT2bBrU1PUkF3dX7EBzDf0LW8QFBw" type="text/javascript"></script><br />
<script src="http://www.google.com/uds/api?file=uds.js&#038;v=1.0&#038;key=ABQIAAAA0jNoc89uwkdl4LgfM9KldRRiKve6JGS7u_Ryr84nOMdV8_I6oxT2bBrU1PUkF3dX7EBzDf0LW8QFBw" type="text/javascript"></script><br />
<script src="http://www.tomanthony.co.uk/demo/geocode_uk_postcode/gmap.js" type="text/javascript"></script></p>
<h2>Conclusion</h2>
<p>Until Royal Mail sort get their act together, and relax the licensing agreement, hopefully this will help people who want a &#8216;pure&#8217; Google solution and hadn&#8217;t come across this option. Please use the comments section to let me know if you are using this, or if you have any improvements or suggestions. </p>
<p>Technorati Tags: <a href="http://technorati.com/tag/postcode" rel="tag">postcode</a>, <a href="http://technorati.com/tag/google+maps" rel="tag">google maps</a>, <a href="http://technorati.com/tag/api" rel="tag">api</a>, <a href="http://technorati.com/tag/Web+2.0" rel="tag"> Web 2.0</a>, <a href="http://technorati.com/tag/Web-Services" rel="tag"> Web-Services</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/geocoding-uk-postcodes-with-google-map-api/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Grow up, Mashup!</title>
		<link>http://www.tomanthony.co.uk/blog/grow-up-mashup/</link>
		<comments>http://www.tomanthony.co.uk/blog/grow-up-mashup/#comments</comments>
		<pubDate>Fri, 15 Sep 2006 22:21:33 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Web</category>
	<category>APIs/Mashups</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/grow-up-mashup/</guid>
		<description><![CDATA[BBC News Map Mashup
Is 2006 the Year of the Mashup? I think not. Mashups are at the stage that DHTML was at before it matured into Web 2.0 - lots of bells and whistles, but little real meat. 2006 will see people acclimatise themselves to the principles and technology, and maybe the best thought out [...]]]></description>
			<content:encoded><![CDATA[<div class="right"><img src="http://www.tomanthony.co.uk/blog/images/bbc_news_map.jpg" class="bordered" alt="Screenshot of BBC News Map Mashup" width="225px" height="188px" /><br /><small><a href="http://www.benedictoneill.com/content/newsmap/">BBC News Map Mashup</a></small></div>
<p>Is 2006 the Year of the Mashup? I think not. Mashups are at the stage that DHTML was at before it matured into Web 2.0 - lots of bells and whistles, but little real meat. 2006 will see people acclimatise themselves to the principles and technology, and maybe the best thought out mashups will become established. But it will be 2007 that will truly be the Year of the Mashup.</p>
<p><a href="http://www.programmableweb.com/">Programmableweb.com</a> currently tracks 979 mashups, and 269 APIs, and shows a rate of 2.7 new mashups per day, so mashups are obviously very popular, so what&#8217;s the problem?</p>
<p><a id="more-12"></a></p>
<h3>Who uses them?</h3>
<p>How many mashups do you use, on average, everyday? How many of these were to actually achieve something (entertainment counts) and not just exploring what was out there? Now, as the sort of person reading this blog, you&#8217;re answer is likely much higher than the general internet populace; their answer is very likely zero.</p>
<p>The fact is: most people don&#8217;t know know what a mashup is (not that they need to to use one), don&#8217;t ever use them, and don&#8217;t know to look for them.</p>
<p>The use of APIs has become very well established, and many people are interacting with Google Map, Amazon Affiliate Stores, and Flickr streams as they browse the web, going about their business. APIs are mature and being used in creative, and most importantly powerful &#038; useful ways.</p>
<h3>Grow up, Mashup!</h3>
<p>Mashups are yet to achieve the same level of maturity; they are very cool, a lot of fun and some are useful (especially in niche areas). However, I believe that 2007 will see mashups become mainstream; they will travel the path that DHTML travelled to become Web 2.0. They will shed their glamour and glitz, stop trying to show off with party tricks, and they will start to become incredibly powerful tools.</p>
<p>The large, and ever growing, streams of data provided by APIs can only go one route: tying the data together to improve and refine the way we get things done. We are already seeing people playing with this concept, but the unwashed masses of the internet are yet to reaps the benefits. What&#8217;s going to change this?</p>
<h3>What did you do today?</h3>
<p>While there are some mashups out there now which will become more established, and whose use will become widespread, there still seems to be very few of any real use. I don&#8217;t use any mashups, because there is nothing I want to do where a mashup provides an easier way to do something.</p>
<p>Normally any &#8216;problem&#8217; they &#8217;solve&#8217; (matching news to a location on a map) is something I can do myself without the overhead and complexity (read the news story).</p>
<h3>Learning from the past.</h3>
<p>DHTML used to make pigeons fly round the screen as they followed my cursor, would make page elements jump around, my window wiggle and lots of other silly things to show off, while it was also doing something useful (i.e showing me the shipping address area once I said I wanted to ship elsewhere) which largely went unnoticed.</p>
<p>Mashups are the same - they do solve a problem, but they have a lot of stuff I simply don&#8217;t need going on. What we need are <b>mashlets</b>, smaller version of the same things, that solve our problem while staying out of our way. Ideally they would be integrated into my workflow (webmail, CMS, blog, host website, or desktop applications) to be there when I needed data combined to assist me.</p>
<p>My webmail may be able to map an invitation I&#8217;ve received, or otherwise use a microformat attachment that has arrived. Lastminute.com might show me a map of geo-coded photos when I am looking at holiday locations. Maybe my address book will allow me to <a href="http://www.interfax.net/en/dev/">Interfax</a> a map of directions from a contacts location to mine for a meeting? There is a veritable plethora of possibilities.</p>
<h3>Where next?</h3>
<p>Mashups are here to stay, whatever form or name they end up taking. Maybe my idea of mashlets will make it, maybe not. In all likelihood there will be some large scale mashups that become established and popular. But one things is sure, mashups need to grow up before they grow out.</p>
<p>Where do you see mashups going? What mashups do you think will be going strong this time next year?</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/mashups" rel="tag">mashups</a>, <a href="http://technorati.com/tag/mashup" rel="tag">mashup</a>, <a href="http://technorati.com/tag/Web+2.0" rel="tag"> Web 2.0</a>, <a href="http://technorati.com/tag/Web-Services" rel="tag"> Web-Services</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/grow-up-mashup/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>All d.Constructed out.</title>
		<link>http://www.tomanthony.co.uk/blog/all-dconstructed-out/</link>
		<comments>http://www.tomanthony.co.uk/blog/all-dconstructed-out/#comments</comments>
		<pubDate>Sun, 10 Sep 2006 12:26:16 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Web</category>
	<category>Conferences</category>
	<category>APIs/Mashups</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/all-dconstructed-out/</guid>
		<description><![CDATA[d.Construct 2006 is over and it seems a great deal of fun was had by all.
Lots of people have commented on the day as a whole, so I&#8217;ll save repeating what they have said. To read them check out Technorati or Aral Balkan has made a list.
Overall, I had an fantastic time down in Brighton, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://2006.dconstruct.org/">d.Construct 2006</a> is over and it seems a great deal of fun was had by all.</p>
<p>Lots of people have commented on the day as a whole, so I&#8217;ll save repeating what they have said. To read them check out <a href="http://technorati.com/tag/dconstruct06">Technorati</a> or Aral Balkan has <a href="http://aralbalkan.com/727">made a list</a>.</p>
<p>Overall, I had an fantastic time down in Brighton, the presentations were both fun and informative and I had a great time at the after party, meeting some awesome people who I really hope to meet again.</p>
<p>An extra bonus of the day was I won a prize for the <a href="http://www.tomanthony.co.uk/blog/morse-decoded/">Morse Code</a> message I left for the <a href="http://2006.dconstruct.org/podcast/">podcast</a>. I won several books, provided by <a href="http://www.apress.com/">Apress</a>, all of which will be very useful.</p>
<p>On a side note: The Mac to PC ratio was about 9:1, which was much higher than expected. I&#8217;ve always been an Apple fan,  and worked for <a href="http://www.ambrosiasw.com/news/">Ambrosia Software</a> for a number of years before moving to the web industry, so it was great to see the glowing Apples everywhere I looked. <img src='http://www.tomanthony.co.uk/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Technorati Tags: <a href="http://technorati.com/tag/dconstruct06" rel="tag">dconstruct06</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/all-dconstructed-out/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Morse decoded!</title>
		<link>http://www.tomanthony.co.uk/blog/morse-decoded/</link>
		<comments>http://www.tomanthony.co.uk/blog/morse-decoded/#comments</comments>
		<pubDate>Thu, 07 Sep 2006 14:17:17 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Conferences</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/morse-decoded/</guid>
		<description><![CDATA[If you&#8217;ve been listening to the d.Construct podcast prior to the Brighton based web conference, you&#8217;ll know that Jeremy Keith got a strange Odeo message he pondered might be morse code.
Well, that one wasn&#8217;t, but Jeremy appealed for more Odeo messages, so I thought it would be fun to send him a real one.

You can [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve been listening to the <a href="http://2006.dconstruct.org/podcast/">d.Construct podcast</a> prior to the Brighton based <a href="http://2006.dconstruct.org/">web conference</a>, you&#8217;ll know that Jeremy Keith got a strange Odeo message he pondered might be morse code.</p>
<p>Well, that one wasn&#8217;t, but Jeremy appealed for more Odeo messages, so I thought it would be fun to send him a real one.</p>
<p><a id="more-10"></a></p>
<p>You can hear it <a href="http://odeo.com/a/CTA1yt0pMXQdVeF32FmZD10t74laG4UJ07ly5yS5">here</a>. I completely cheated and used <a href="http://www.winmorse.com/">this program</a> to create the sound file.</p>
<p>Jeremy was stumped, and <a href="http://adactio.com/journal/1174/">appealed</a> for assistance. Stuart Langridge was one of those to <a href="http://www.kryogenix.org/days/2006/09/07/decoding-morse-the-computer-way">decode the morse</a>, which he did in a very neat way with a custom Python script, after converting the sound file. Very cool!</p>
<p>The message wasn&#8217;t terribly exciting, it was more about the challenge of decoding it. But for those interested:</p>
<blockquote><p>
Hi. Tom Anthony here. On the podcast you sounded like you really wanted a Morse message, or any message for that matter. Well, here you go. BTW I am so winning the golf.
</p></blockquote>
<p>Technorati Tags: <a href="http://technorati.com/tag/dconstruct06" rel="tag">dconstruct06</a>, <a href="http://technorati.com/tag/dconstruct" rel="tag"> dconstruct</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/morse-decoded/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>d.Construct - A geek golf tournament!</title>
		<link>http://www.tomanthony.co.uk/blog/dconstruct-a-geek-golf-tournament/</link>
		<comments>http://www.tomanthony.co.uk/blog/dconstruct-a-geek-golf-tournament/#comments</comments>
		<pubDate>Thu, 07 Sep 2006 03:54:16 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Web</category>
	<category>Conferences</category>
	<category>APIs/Mashups</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/dconstruct-a-geek-golf-tournament/</guid>
		<description><![CDATA[So, the 2006 d.Construct conference is very almost here.
I&#8217;ve seen various other posts about the conference. But they seem to be missing the most important aspect of the conference&#8230;
The geek golf tournament!
Yes, this is incredibly exciting - there is a geek golf tournament at the conference after party (sponsored by Snipperoo).
My schedule for tomorrow actually [...]]]></description>
			<content:encoded><![CDATA[<p>So, the <a href="http://2006.dconstruct.org/">2006 d.Construct</a> conference is very almost here.</p>
<p>I&#8217;ve seen <a href="http://dougclinton.wordpress.com/2006/09/04/technology-checklist-for-dconstruct/">various</a> <a href="http://allinthehead.com/retro/300/from-barcamp-to-dconstruct">other</a> <a href="http://www.leftbrained.co.uk/archive/2006/09/01/scotland-reprezent">posts</a> <a href="http://dsingleton.co.uk/pre-construct-2006/2006/09/05/">about</a> the conference. But they seem to be missing the most important aspect of the conference&#8230;</p>
<p>The geek golf tournament!</p>
<p>Yes, this is incredibly exciting - there is a geek golf tournament at the conference after party (sponsored by <a href="http://www.snipperoo.com/">Snipperoo</a>).</p>
<p>My schedule for tomorrow actually looks like this:</p>
<p>9am: Practice Mini Golf.<br />
4pm: Drive to Brighton.</p>
<p>To prove I&#8217;m not kidding, tomorrow I&#8217;ll be uploading some photos of my practice.</p>
<p><b>Update:</b> Here are a couple of photos of my golf practice!</p>
<p><a href="http://www.tomanthony.co.uk/blog/images/dconstruct_golf1.jpg"><img src="http://www.tomanthony.co.uk/blog/images/dconstruct_golf1.jpg" width="300" alt="Tom lines up the all important putt." /></a></p>
<p></p>
<p><a href="http://www.tomanthony.co.uk/blog/images/dconstruct_golf2.jpg"><img src="http://www.tomanthony.co.uk/blog/images/dconstruct_golf2.jpg" width="300" alt="Tom just looking 'cool'" /></a></p>
<p>Technorati Tags: <a href="http://technorati.com/tag/dconstruct06" rel="tag">dconstruct06</a>, <a href="http://technorati.com/tag/dconstruct" rel="tag"> dconstruct</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/dconstruct-a-geek-golf-tournament/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Top 10 links to get started with SEO</title>
		<link>http://www.tomanthony.co.uk/blog/top-10-links-to-get-started-with-seo/</link>
		<comments>http://www.tomanthony.co.uk/blog/top-10-links-to-get-started-with-seo/#comments</comments>
		<pubDate>Wed, 06 Sep 2006 02:42:15 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Web</category>
	<category>SEO/SEM</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/top-10-links-to-get-started-with-seo/</guid>
		<description><![CDATA[If you want to get into search engine optimisation/marketing (SEO / SEM) then you need to quickly accept this fact: You are going to read. A lot.
You maybe are not in charge of 10 sites, do not have a long list of clients whose websites you work on, but are simply trying a DIY approach [...]]]></description>
			<content:encoded><![CDATA[<p>If you want to get into search engine optimisation/marketing (SEO / SEM) then you need to quickly accept this fact: You are going to read. A lot.</p>
<p>You maybe are not in charge of 10 sites, do not have a long list of clients whose websites you work on, but are simply trying a DIY approach to getting your site better ranked in the search engines. However, when you search for &#8220;How do I rank better in Google?&#8221;, you are likely overwhelmed by the amount of information; SEO companies, blog posts, articles, forums, news articles and more.</p>
<p>So I&#8217;ve compiled this list of articles in the hope that at least some of budding students of search will find it. This is by no means all you need; SEO is ever evolving and you need to keep up to date (there are plenty of good blogs to help with that, which is another list for another time), but this list of 10 resources that will get you off the ground.</p>
<p><a id="more-8"></a></p>
<p><b>Overview / Introduction:</b></p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Search_engine_optimization">A description and history of SEO</a><br />This wikipedia entry is great for people who need an introduction to what SEO is before they go about learning it.
<li><a href="http://www.seomoz.org/beginners.php">Beginner&#8217;s Guide to SEO</a><br />A fantastic and thorough guide to all you need to get started.</li>
<li><a href="http://www.456bereastreet.com/archive/200502/basics_of_search_engine_optimisation/">Basics of search engine optimisation</a><br />A great, to the point, list of stuff you need to consider.</li>
</ul>
<p><b>Link building:</b></p>
<ul>
<li><a href="http://www.stuntdubl.com/2005/08/31/link-training/">10 Tips to Train a Link Developer</a><br />An annotated list of ideas and resources for learning link building.</li>
<li><a href="http://www.yourseoplan.com/link-building-letter.html">Sample Link Building Campaign Letter</a><br />A brilliant link building letter template.</li>
</ul>
<p><b>Keyword research:</b></p>
<ul>
<li><a href="http://www.wordtracker.com/keyword-research-guide.html">Keyword Research Guide</a><br />Wordtracker is far from the only tool you need for keyword research, but their guide is a good, if lengthy for a beginner, introduction to the topic.</li>
</ul>
<p><b>Code:</b></p>
<ul>
<li><a href="http://alistapart.com/articles/accessibilityseo">High Accessibility Is Effective SEO</a><br />Accessibility is great practice for websites anyway, but there is also an SEO payoff.</li>
<li><a href="http://validator.w3.org/">3C Markup Validator</a><br />Checking that your HTML and CSS is valid is a good idea whatever, but having better written websites can only help.</li>
</ul>
<p><b>Ranking factors:</b></p>
<ul>
<li><a href="http://www.seomoz.org/articles/search-ranking-factors.php">Search Engine Ranking Factors</a><br />A comprehensive list of what are believed to be the most important factors that are used in ranking sites.</li>
</ul>
<p><b>Press releases:</b></p>
<ul>
<li><a href="http://www.toprankblog.com/2005/10/lowdown-on-press-release-optimization/">Lowdown on Press Release Optimization</a><br />In the right circumstances Press Releases can be a big help in getting traffic to your site. This is a guide on writing them well.</li>
</ul>
<p>Technorati Tags: <a href="http://technorati.com/tag/seo">SEO</a>, <a href="http://technorati.com/tag/search">Search</a>, <a href="http://technorati.com/tag/google">Google</a>
</p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/top-10-links-to-get-started-with-seo/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>d.Construct Conference</title>
		<link>http://www.tomanthony.co.uk/blog/dconstruct-conference/</link>
		<comments>http://www.tomanthony.co.uk/blog/dconstruct-conference/#comments</comments>
		<pubDate>Tue, 25 Jul 2006 22:13:31 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
		
	<category>Web</category>
	<category>Conferences</category>
	<category>APIs/Mashups</category>
		<guid isPermaLink="false">http://www.tomanthony.co.uk/blog/dconstruct-conference/</guid>
		<description><![CDATA[So, I have my ticket for the d.Construct Conference.
This will be my first conference since entering the web industry (I enjoyed conferences in London, Paris, New York, LA and San Francisco whie working in the Mac software industry), and I am looking forward to meeting some of the best in the business.
The schedule looks like [...]]]></description>
			<content:encoded><![CDATA[<p>So, I have my ticket for the <a href="http://2006.dconstruct.org/">d.Construct Conference</a>.</p>
<p>This will be my first conference since entering the web industry (I enjoyed conferences in London, Paris, New York, LA and San Francisco whie working in the Mac software industry), and I am looking forward to meeting some of the best in the business.</p>
<p>The <a href="http://2006.dconstruct.org/schedule/">schedule</a> looks like it will be both fun and very informative. If you aren&#8217;t going then I suggest you take in the <a href="http://2006.dconstruct.org/podcast/">podcast</a> so you realise you are missing you and make sure to book a ticket next year.</p>
<p><a href="http://www.clagnut.com/blog/1771/">Richard Rutter</a> has some more details, if you&#8217;re interested.</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/dconstruct06" rel="tag">dconstruct06</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://www.tomanthony.co.uk/blog/dconstruct-conference/feed/</wfw:commentRSS>
		</item>
	</channel>
</rss>
