<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
  <post>
    <author>Simon Schoeters</author>
    <content>&lt;blockquote cite="http://www.sitemaps.org/"&gt;
	&lt;p&gt;Sitemaps are an easy way for webmasters to inform search engines about pages on their sites that are available for crawling. In its simplest form, a Sitemap is an XML file that lists URLs for a site along with additional metadata about each URL (when it was last updated, how often it usually changes, and how important it is, relative to other URLs in the site) so that search engines can more intelligently crawl the site.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sitemaps have a wide adoption including Google, Yahoo! and Microsoft so I thought it would be a good idea to integrate this in my website. A few posts later I was tired updating this XML file manually every time I changed something in the URL scheme so why not pass the task to Ruby on Rails and build the file automatically?&lt;/p&gt;

&lt;h3&gt;The controller&lt;/h3&gt;

&lt;p&gt;First you'll need a method to collect the data. I choose for the application controller as the Sitemap doesn't really belong anywhere else. The pages controller would be a better choice if you have one that manages all your sites URL's but that's entirely up to you.&lt;/p&gt;

&lt;samp&gt;class ApplicationController &lt; ActionController::Base&lt;br /&gt;
def sitemap&lt;br /&gt;
	@pages = Page.find(:all)&lt;br /&gt;
	render_without_layout :template =&gt; "layouts/sitemap"&lt;br /&gt;
end&lt;/samp&gt;

&lt;p&gt;The &amp;lsquo;render_without_layout&amp;rsquo; part calls the view. My view is in the views/layouts folder but again, this can be anything you want.&lt;/p&gt;

&lt;h3&gt;The view&lt;/h3&gt;

&lt;p&gt;As defined in the Sitemap method above we need a view that renders the data in an XML file. Create the Sitemap XML template in the folder you defined above (views/layouts in my case) and call it &amp;lsquo;sitemap.rxml&amp;rsquo;. Now build the structure of the Sitemap:&lt;/p&gt;

&lt;samp&gt;xml.instruct!&lt;br /&gt;
xml.urlset('xmlns'=&gt;'http://www.sitemaps.org/schemas/sitemap/0.9',&lt;br /&gt;
'xmlns:xsi'=&gt;'http://www.w3.org/2001/XMLSchema-instance',&lt;br /&gt;
'xsi:schemaLocation'=&gt;'http://www.sitemaps.org/schemas/sitemap/0.9&lt;br /&gt;
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd') {&lt;br /&gt;
	for page in @pages&lt;br /&gt;
		xml.url {&lt;br /&gt;
			xml.loc("http://" + request.env["HTTP_HOST"] + "/" + page.permalink + "/")&lt;br /&gt;
			xml.lastmod(page.updated_at.strftime('%Y-%m-%d'))&lt;br /&gt;
			xml.changefreq("weekly")&lt;br /&gt;
			xml.priority("0.7")&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
}&lt;/samp&gt;

&lt;p&gt;This &lt;a href="http://en.wikipedia.org/wiki/Code_snippets" title="Code snippets definition on Wikipedia" class="ext"&gt;snippet&lt;/a&gt; assumes your page object has a permalink and an updated_at parameter, change these if yours looks different.&lt;/p&gt;

&lt;p&gt;There are a few things you need to know about Sitemaps: &amp;lsquo;loc&amp;rsquo; is the only required element so you can drop the &amp;lsquo;lastmod&amp;rsquo;, &amp;lsquo;changefreq&amp;rsquo; and &amp;lsquo;priority&amp;rsquo; elements if you don't have any useful data for these parameters. More in detail:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;loc&lt;/strong&gt; - required: the full URL to the page, include your domain as well.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;lastmod&lt;/strong&gt; - optional: last modification date for that page in the &lt;a href="http://www.w3.org/TR/NOTE-datetime" title="W3C Datetime format specification" class="ext"&gt;W3C Datetime&lt;/a&gt; format, probably something like YYYY-MM-DD.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;changefreq&lt;/strong&gt; - optional: how frequently the page is likely to change. Valid values are: always, hourly, daily, weekly, monthly, yearly or never.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;priority&lt;/strong&gt; - optional: the priority of this URL relative to other URLs in your site. Valid values range from 0.0 to 1.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the official &lt;a href="http://www.sitemaps.org/protocol.php" title="sitemaps.org protocol description" class="ext"&gt;Sitemap protocol definition&lt;/a&gt; site for a full description.&lt;/p&gt;

&lt;h3&gt;The route&lt;/h3&gt;

&lt;p&gt;You have a automatically generated Sitemap but no way to get there. Tell Rails to call your Sitemap in the routes.rb file by adding the following mapping (change the controller if you choose a different one above):&lt;/p&gt;

&lt;samp&gt;map.connect 'sitemap.xml', :controller =&gt; 'application', :action =&gt; 'sitemap'&lt;/samp&gt;

&lt;p&gt;Request your new Sitemap with http://www.example.com/sitemap.xml. You may need to restart your Rails server to enable the new route.&lt;/p&gt;

&lt;h3&gt;The robots.txt&lt;/h3&gt;

&lt;p&gt;Almost done. The Sitemap should be working by now but how does a crawler (like the &lt;a href="http://en.wikipedia.org/wiki/Googlebot" class="ext" title="Googlebot's page on Wikipedia"&gt;Googlebot&lt;/a&gt;) where to look for you Sitemap? That's where the robots.txt file is for. Every crawler should request the robots.txt file first to see what it may or may not index so this is the ideal place to advertise our Sitemap. Add the following line to the robots.txt file in you public directory and make sure to use the full URL to your Sitemap (including the domain):&lt;/p&gt;

&lt;samp&gt;Sitemap: http://www.example.com/sitemap.xml&lt;/samp&gt;

&lt;p&gt;That's it for today! The next time a crawler visits you site it will find the Sitemap and index it.&lt;/p&gt;

&lt;h3&gt;Resources&lt;/h3&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.sitemaps.org/" title="sitemaps.org" class="ext"&gt;Official Sitemap definition&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.d-jones.com/2007/4/5/google-sitemaps-in-ruby-on-rails" title="Great article I used to get started" class="ext"&gt;Google Sitemaps in Ruby on Rails&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="/sitemap.xml" title="My Sitemap as an example"&gt;My site's Sitemap&lt;/a&gt; as an example&lt;/li&gt;
&lt;/ul&gt;</content>
    <created-at type="datetime">2007-10-07T14:17:14+02:00</created-at>
    <id type="integer">8</id>
    <location-id type="integer">1</location-id>
    <permalink>sitemaps</permalink>
    <title>Sitemaps in Ruby on Rails</title>
    <updated-at type="datetime">2007-12-12T12:42:31+01:00</updated-at>
  </post>
  <post>
    <author>Simon Schoeters</author>
    <content>&lt;p&gt;Have a look at my social graph in the sidebar on the &lt;a href="/about" title="About Suffix"&gt;about&lt;/a&gt; page. It shows a bunch of links to websites elsewhere on the web that are loosely related to me (e.g. my LinkedIn profile or Flickr photos) or my &amp;ldquo;friends&amp;rdquo;. These links are automatically collected based on &lt;a href="http://gmpg.org/xfn/" title="XHTML Friends Network" class="ext"&gt;XFN&lt;/a&gt; and &lt;a href="http://www.foaf-project.org/" title="Friend of a Friend (FOAF) project" class="ext"&gt;FOAF&lt;/a&gt; data with the Google Social Graph &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt;.&lt;/p&gt;

&lt;h3&gt;What?&lt;/h3&gt;

&lt;p&gt;A &lt;a href="http://en.wikipedia.org/wiki/Social_graph" title="Social graph on Wikipedia" class="ext"&gt;social graph&lt;/a&gt; consists of who an individual is connected to based on the type of connections. In the internet world people use XFN and FOAF to describe their connections with other peoples websites. These websites can be other websites of myself (such as my Flickr photo page) or a website of a friend of mine.&lt;/p&gt;

&lt;samp&gt;&amp;lt;a href="http://fousa.be" &lt;strong&gt;rel="friend met"&lt;/strong&gt;&amp;gt;Jelle&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;a href="http://flickr.com/photos/schoeters" &lt;strong&gt;rel="me"&lt;/strong&gt;&amp;gt;My photos&amp;lt;/a&amp;gt;&lt;/samp&gt;

&lt;p&gt;The previous 2 XFN examples describe my connections with &lt;span class="vcard"&gt;&lt;a class="url fn n" href="http://www.fousa.be"&gt;&lt;span class="given-name"&gt;Jelle&lt;/span&gt;&lt;span class="family-name hidden"&gt; Vandebeeck&lt;/span&gt;
&lt;/a&gt;&lt;/span&gt;'s website, a friend of mine, and my Flickr photo page. Now, I'm not the only one using this, thousands of links (blogs, LinkedIn profiles, Twitter profiles, etc.) have been marked up in this way. Wouldn't it be nice when we could visualize all these online connections?&lt;/p&gt;

&lt;p&gt;Google recently released their &lt;a href="http://code.google.com/apis/socialgraph/" title="Google Social Graph API" class="ext"&gt;Social Graph API&lt;/a&gt; which crawls the Google index for all XFN and FOAF enabled links based on a list of URL's. This returns a &lt;abbr title="JavaScript Object Notation"&gt;JSON&lt;/abbr&gt; response with all these links and the connection types associated with it. As the API is using the Google index you have access to a huge amount of data in a very fast way. On the  downside the correctness of the data depends on the freshness of the Google index. Today my Twitter profile link still shows up in the results even though I removed my account a few months ago and the links in my previous blog post aren't found yet.&lt;/p&gt;

&lt;h3&gt;Ruby on Rails implementation&lt;/h3&gt;

&lt;p&gt;Let's have a look at the Ruby on Rails code to build our own social graph. First you'll need the JSON gem to parse the response from Google (the may be different in Rails 2.x, I didn't check).&lt;/p&gt;

&lt;samp&gt;gem install json&lt;/samp&gt;

&lt;p&gt;Great, now lets ask Google for our social graph. I built an array with all the pages on this blog but for the sake of the example I will use a static array with some sample links.&lt;/p&gt;

&lt;samp&gt;require 'open-uri'&lt;br /&gt;
require 'json'&lt;br /&gt;
&lt;br /&gt;
links = ['http://www.example.com/','http://www.example.com/example']&lt;br /&gt;
url = "http://socialgraph.apis.google.com/lookup?q=" + links.join(',') + "&amp;amp;fme=0&amp;amp;edi=1&amp;amp;edo=0"&lt;br /&gt;
resp = Net::HTTP.get_response(URI.parse(url))&lt;br /&gt;
result = JSON.parse(resp.body)&lt;br /&gt;
&lt;br /&gt;
graph = Array.new&lt;br /&gt;
for node in result['nodes']&lt;br /&gt;
	for sub_node in node[1]['nodes_referenced_by']&lt;br /&gt;
		graph &amp;lt;&amp;lt; [ sub_node[0], sub_node[1]['types'] ]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
graph.uniq!&lt;/samp&gt;

&lt;p&gt;At the end we remove the duplicate URL's and there you have it, an array with all you XFN and FOAF friends linking to the given URL's. You can play around with the 3 parameters at the end of the Google URL:&lt;/p&gt;

&lt;table summary="List of possible URL parameters and their values"&gt;
&lt;tr&gt;
	&lt;th&gt;fme&lt;/th&gt;&lt;td&gt;true, false, 1 or 0&lt;/td&gt;&lt;td&gt;Follow the &amp;lsquo;me&amp;rsquo; links found on the given URL's.&lt;td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;th&gt;edi&lt;/th&gt;&lt;td&gt;true, false, 1 or 0&lt;/td&gt;&lt;td&gt;Return a list with pages linking &lt;strong&gt;to&lt;/strong&gt; the given URL's.&lt;td&gt;
&lt;tr&gt;
	&lt;th&gt;edo&lt;/th&gt;&lt;td&gt;true, false, 1 or 0&lt;/td&gt;&lt;td&gt;Return a list with pages linked &lt;strong&gt;from&lt;/strong&gt; the given URL's.&lt;td&gt;
&lt;/tr&gt;
&lt;/table&gt;


&lt;h3&gt;Resources&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google's Social Graph &lt;a href="http://code.google.com/apis/socialgraph/docs/api.html" title="Social Graph API Documentation" class="ext"&gt;API documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The very simple &lt;a href="http://braincast.nl/samples/jsoneditor/" title="JavaScript JSON Editor" class="ext"&gt;JavaScript JSON editor&lt;/a&gt; is an easy way to visualize the JSON tree.&lt;/li&gt;
&lt;/ul&gt;</content>
    <created-at type="datetime">2008-03-03T00:07:00+01:00</created-at>
    <id type="integer">21</id>
    <location-id type="integer">1</location-id>
    <permalink>google-social-graph</permalink>
    <title>Google Social Graph in RoR</title>
    <updated-at type="datetime">2008-05-20T10:45:44+02:00</updated-at>
  </post>
  <post>
    <author>Simon Schoeters</author>
    <content>&lt;p&gt;It's all about the map in this sites header today. The header background shows a dynamically generated map of the coordinates shown in the right top corner, or my last recorded place. I can select my current location (latitude and longitude) and the header background map is updated accordingly. So how exactly does this work?!&lt;/p&gt;

&lt;h3&gt;No Google or Yahoo! maps?&lt;/h3&gt;

&lt;p&gt;I integrated Yahoo! Maps first. The Yahoo! Maps look nice, the API is easy to use and well documented but the problem is that you are only allowed to play with these maps within limits placed on you by the API's terms and conditions. Below are some extracts from the &lt;a href="http://info.yahoo.com/legal/us/yahoo/maps/mapsapi/mapsapi-2141.html" title="Yahoo! Terms Center" class="ext"&gt;Yahoo! Maps API Terms of Use&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;You understand and agree that you must retain the attribution text and links contained within all Yahoo! Maps and Yahoo! Map images without alteration.&lt;/li&gt;
	&lt;li&gt;Your will not store or allow end users to store map imagery, map data or geocoded location information from the Yahoo! Maps APIs for any future use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would break these terms as I convert the original image to a grayscale version and store the map on the server for performance reasons so the Yahoo! Maps are out of the question. Google or Yahoo! Maps are great for out of the box functionalities but if you want more freedom you will probably have to look elsewhere (or pay for licenses if possible).&lt;/p&gt;

&lt;h3&gt;OpenStreetMap&lt;/h3&gt;

&lt;p&gt;Luckily for us there are other solutions out there. Let's take a look at &lt;a href="http://www.openstreetmap.org/" class="ext"&gt;OpenStreetMap&lt;/a&gt; for example. OpenStreetMap is a &amp;lsquo;wiki style&amp;rsquo; editable map, made by people like you and me. The content is available under the Creative Commons Attribution-ShareAlike 2.0 license which means anyone can use (and remix) the data as long as you share it with a similar license.&lt;/p&gt;

&lt;p&gt;This &amp;lsquo;Wikipedia-like&amp;rsquo; approach has some drawbacks as well: the map is incomplete and the data is not 100% reliable. On the other side you can correct or complete the map where needed. This may or may not be important for your project but I only needed a nice background image for this website so a general overview of the area is more than sufficient.&lt;/p&gt;

&lt;p&gt;OpenStreetMap has a RESTfull way to build a map image with a given latitude, longitude, zoom level and image size. Here is how (or see an example for &lt;a href="http://tah.openstreetmap.org/MapOf?lat=50.8668&amp;long=4.69714&amp;z=12&amp;w=200&amp;h=200" title="OpenStreetMap map of my home town" class="ext"&gt;my city&lt;/a&gt;):&lt;/p&gt;

&lt;samp&gt;http://tah.openstreetmap.org/MapOf?lat=&amp;lt;lat&amp;gt;&amp;amp;long=&amp;lt;long&amp;gt;&amp;amp;z=&amp;lt;zoom&amp;gt;&amp;amp;w=&amp;lt;width&amp;gt;&amp;amp;h=&amp;lt;height&amp;gt;&amp;amp;skip_attr=1&lt;/samp&gt;

&lt;p&gt;The &lt;code&gt;skip_attr&lt;/code&gt; defines if you want to include an &lt;abbr title="OpenStreetMap"&gt;OSM&lt;/abbr&gt; attirbution image in your map or not.&lt;/p&gt;

&lt;h3&gt;Start coding&lt;/h3&gt;

&lt;p&gt;The process flow:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;The current location is updated on the website,&lt;/li&gt;
	&lt;li&gt;a map of this new location is downloaded from a map server,&lt;/li&gt;
	&lt;li&gt;the downloaded map image is converted to grayscale and&lt;/li&gt;
	&lt;li&gt;the generated image is saved to disk.&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="center"&gt;&lt;img src="/images/map_flow.gif" alt="Map flow" /&gt;&lt;/p&gt;

&lt;p&gt;We'll use &lt;a href="http://rmagick.rubyforge.org/" title="Graphics Processing for Ruby and Ruby on Rails" class="ext"&gt;RMagick&lt;/a&gt; and Ruby on Rails to convert the downloaded image to something else so make sure you have this installed first.&lt;/p&gt;

&lt;samp&gt;# Writes an image with a map of the location, the zoom ranges from 4 to 17&lt;br /&gt;
def map(latitude, longitude, width = 500, height = 500, zoom = 7)&lt;br /&gt;
   require 'RMagick'&lt;br /&gt;
   require 'open-uri'&lt;br /&gt;
   map_request_url = "http://tah.openstreetmap.org/MapOf?lat=#{latitude}&amp;amp;long=#{longitude}&amp;amp;z=#{zoom}&amp;amp;w=#{width}&amp;amp;h=#{height}"&lt;br /&gt;
   uri = URI.parse(map_request_url)&lt;br /&gt;
   map = Magick::ImageList.new&lt;br /&gt;
   map.from_blob(uri.read)&lt;br /&gt;
   map = map.quantize(256, Magick::GRAYColorspace)&lt;br /&gt;
   map.write(RAILS_ROOT + '/public/images/map.png')&lt;br /&gt;
end&lt;/samp&gt;

&lt;p&gt;That's it, this method downloads and converts the image and saves it in your images folder so from now on you can use this image in your website:&lt;/p&gt;

&lt;samp&gt;&amp;lt;img src="/images/map.png" alt="Map" /&amp;gt;&lt;/samp&gt;

&lt;h3&gt;More resources&lt;/h3&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/takecontrolofyourmaps" title="Take Control of Your Maps" class="ext"&gt;Take Control of Your Maps&lt;/a&gt; explains how to build you own map stack.&lt;/li&gt;
&lt;/ul&gt;</content>
    <created-at type="datetime">2008-04-15T18:14:57+02:00</created-at>
    <id type="integer">24</id>
    <location-id type="integer">1</location-id>
    <permalink>generated-maps</permalink>
    <title>Generated maps with Ruby on Rails</title>
    <updated-at type="datetime">2008-09-19T01:45:44+02:00</updated-at>
  </post>
  <post>
    <author>Simon Schoeters</author>
    <content>&lt;p&gt;I keep the latitude and longitude for each of these blog post (as you can see in the right hand column). My blog's &lt;abbr title="Really Simple Syndication"&gt;RSS&lt;/abbr&gt; feed is generated from my posts table. Until now it was a plain simple RSS feed but why not combine the 2 and enhance my RSS feed with the coordinates? They are there anyway and GeoRSS is widely adopted these days.&lt;/p&gt;

&lt;h3&gt;What is GeoRSS?&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://georss.org" title="Geographically Encoded Objects for RSS feeds" class="ext"&gt;GeoRSS&lt;/a&gt; is a way to encode location information in RSS feeds. This can be as simple as adding one small &lt;abbr title="Extensible Markup Language"&gt;XML&lt;/abbr&gt; element to your existing feed. GeoRSS feeds are designed to be consumed by geographic software such as map generators and by doing so your feed can be used in new and different ways: pinpointing on a may, finding other posts close to this one, etc.&lt;/p&gt;

&lt;h3&gt;What we need&lt;/h3&gt;

&lt;p&gt;Generating the actual RSS feed is not in the scope of this article, we'll only add location awareness to our existing feed. Please head over to &lt;span class="vcard"&gt;&lt;span class="fn"&gt;Larry Myers&lt;/span&gt;&lt;/span&gt;' &lt;a href="http://www.myersds.com/notebook/2006/05/11/how_to_generate_rss_feeds_with_rails" title="How To Generate RSS Feeds with Rails" class="ext"&gt;How To Generate RSS Feeds with Rails&lt;/a&gt; article if you don't generate your feed yet.&lt;/p&gt;

&lt;p&gt;We'll need to add one small XML element to each item in our feed with the latitude and longitude for the post:&lt;/p&gt;

&lt;samp&gt;&amp;lt;georss:point&amp;gt;50.8668 4.69714&amp;lt;/georss:point&amp;gt;&lt;/samp&gt;

&lt;p&gt;In Ruby on Rails this looks like the following (where latitude and longitude are 2 fields in our posts table). The syntax looks a little strange as we need a way to add the &amp;lsquo;georss:point&amp;rsquo; element and Ruby doesn't like the colon in there (it indicates a &lt;a href="http://corelib.rubyonrails.org/classes/Symbol.html" title="Symbol class definition" class="ext"&gt;symbol&lt;/a&gt;).&lt;/p&gt;

&lt;samp&gt;xml.georss :point do&lt;br /&gt;
xml.text! post.latitude.to_s  + ' ' + post.longitude.to_s&lt;br /&gt;
end&lt;/samp&gt;

&lt;p&gt;Great, now we only need to add the GeoRSS namespace at the top of our feed to tell the feed parsers what we mean.&lt;/p&gt;

&lt;samp&gt;xml.rss (:version =&gt; "2.0", "xmlns:georss" =&gt; "http://www.georss.org/georss")&lt;/samp&gt;

&lt;h3&gt;My location aware RSS feed&lt;/h3&gt;

&lt;p&gt;The full view template should now resembles something like this:&lt;/p&gt;

&lt;samp&gt;xml.instruct! :xml, :version=&gt;"2.0"&lt;br /&gt;
xml.rss (:version =&gt; "2.0", &lt;strong&gt;"xmlns:georss" =&gt; "http://www.georss.org/georss"&lt;/strong&gt;) {&lt;br /&gt;
xml.channel {&lt;br /&gt;
xml.title("My GeoRSS feed")&lt;br /&gt;
xml.link("http://www.example.com")&lt;br /&gt;
xml.description("My posts enhanced with location info")&lt;br /&gt;
xml.language('en-us')&lt;br /&gt;
for post in @posts&lt;br /&gt;
xml.item do&lt;br /&gt;
xml.title(post.title)&lt;br /&gt;
xml.description(post.content)&lt;br /&gt;
xml.author("none@none.be (#{post.author})")&lt;br /&gt;
xml.pubDate(post.created_at.strftime("%a, %d %b %Y %H:%M:%S %z"))&lt;br /&gt;
xml.link( post_permalink_url(post.permalink) )&lt;br /&gt;
xml.guid( post_permalink_url(post.permalink) )&lt;br /&gt;
&lt;strong&gt;xml.georss :point do&lt;br /&gt;
xml.text! post.latitude.to_s  + ' ' + post.longitude.to_s&lt;br /&gt;
end&lt;/strong&gt;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
}&lt;/samp&gt;

&lt;p&gt;That's it. Not too exciting at first but try your RSS feed URL in Google Maps and see how easy it is to pinpoint each location on a map (here is &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=http:%2F%2Fwww.suffix.be%2Ffeeds%2Fblog.xml&amp;amp;safe=on&amp;ie=UTF8" title="My GeoRSS feed in Google Maps" class="ext"&gt;mine&lt;/a&gt;).&lt;/p&gt;</content>
    <created-at type="datetime">2008-05-23T17:00:46+02:00</created-at>
    <id type="integer">25</id>
    <location-id type="integer">3</location-id>
    <permalink>georss-with-ruby-on-rails</permalink>
    <title>GeoRSS with Ruby on Rails</title>
    <updated-at type="datetime">2008-05-23T18:25:04+02:00</updated-at>
  </post>
  <post>
    <author>Simon Schoeters</author>
    <content>&lt;p&gt;Today we launched a new website: &lt;a href="http://www.milkcarton.be/" title="Mac OS X applications and frameworks by milkcarton" class="ext" rel="me"&gt;milkcarton.be&lt;/a&gt;. Last year we started developing a small Cocoa application but got stuck and never got to something &amp;lsquo;release worthy&amp;rsquo;, the half finished program was waiting there to be forgotten. A few months ago we decided to pick up where we left of and fix the design mistakes we made last year. We started from scratch and here we are, releasing our first private beta today!&lt;/p&gt;

&lt;h3&gt;Lustro&lt;/h3&gt;

&lt;p&gt;What is this mysterious app? It listens to the name &lt;strong&gt;Lustro&lt;/strong&gt; and is a small Address Book exporter for Mac OS X Leopard. It exports all your contacts to &lt;abbr title="Comma-separated values"&gt;CSV&lt;/abbr&gt;, tab-delimited or hCard files or overwrites your Google Contacts with the ones on your Mac (so that you have access to all your Address Book contacts in GMail). If this sounds like something you could use you can &lt;a href="http://www.milkcarton.be/contact" title="Contact milkcarton" class="ext" rel="me"&gt;drop us a note&lt;/a&gt; as we are still looking for beta testers. Lustro is free and open source so there is no excuse to chicken out on this one.&lt;/p&gt;

&lt;h3&gt;milkcarton&lt;/h3&gt;

&lt;p&gt;We didn't really have a decent home for Lustro so we decided to create a new website to host these little applications, frameworks or other bits of code we designed and will design. That's &lt;a href="http://www.milkcarton.be/" title="Mac OS X applications and frameworks by milkcarton" class="ext" rel="me"&gt;milkcarton.be&lt;/a&gt;: hop over there to and have a look around.&lt;/p&gt;

</content>
    <created-at type="datetime">2008-06-20T18:15:57+02:00</created-at>
    <id type="integer">29</id>
    <location-id type="integer">1</location-id>
    <permalink>launching-milkcarton-lustro</permalink>
    <title>Launching milkcarton with Lustro</title>
    <updated-at type="datetime">2008-06-20T18:15:57+02:00</updated-at>
  </post>
  <post>
    <author>Simon Schoeters</author>
    <content>&lt;p&gt;Only 3 days ago we launched the first version of &lt;a href="http://www.milkcarton.be/apps/lustro" title="Lustro, export your Address Book contacts" class="ext"&gt;Lustro&lt;/a&gt;. It took us a week between the beta testing and the final release and we fixed and enhanced quite a few things. Lustro is our little Mac OS X Leopard app to export your Address Book contacts to &lt;abbr title="Comma-separated values"&gt;CSV&lt;/abbr&gt;, tab delimited, hCards and Google Contacts.&lt;/p&gt;

&lt;h3&gt;Google Contacts export&lt;/h3&gt;

&lt;p&gt;A few months back making an application that exports your Address Book contacts to GMail sounded like a useful idea. Little the we know that Apple was working on the same thing. A few weeks before we released the beta version Apple came out with their built-in Address Book to Google Contacts export with the release of &lt;a href="http://support.apple.com/kb/HT1141" class="ext" title="About the Mac OS X 10.5.3 Update"&gt;Mac OS X 10.5.3&lt;/a&gt;. We are not good enough to beat Apple... not yet.&lt;/p&gt;

&lt;p&gt;We decided to keep the Google export in Lustro for the following reason (copied from the Lustro Help):&lt;/p&gt;

&lt;blockquote&gt;&amp;ldquo;Address Book also synchronizes with MobileMe, Exchange, Yahoo! and Google if you enable this in the preferences. Lustro still includes the Google Contacts export as the Address Book syncing only works if you have connected an iPhone or iPod Touch before and the syncing mechanism is not perfect at the time of writing (e.g. company cards show an empty name in the GMail contacts list).&amp;rdquo;&lt;/blockquote&gt;

&lt;p&gt;So there are a few smaller reasons why you would still use Lustro today, maybe we can add the photo export in the next release as Apple skipped that one as well.&lt;/p&gt;

&lt;h3&gt;hCard exports&lt;/h3&gt;

&lt;p&gt;The other mayor feature are the &lt;a href="http://microformats.org/wiki/hcard" title="hCard - Microformats wiki" class="ext"&gt;hCard&lt;/a&gt; exports. We couldn't find any hCard exporters for Apple so why not include it? We got some indirect feedback from &lt;span class="vcard"&gt;&lt;a href="http://flickr.com/photos/factoryjoe/2625201023/" class="fn ext"&gt;Chris Messina&lt;/a&gt;, &lt;span class="vcard"&gt;&lt;a href="http://flickr.com/photos/factoryjoe/2625201023/comment72157605921180862/" class="fn ext"&gt;Brian Suda&lt;/a&gt;&lt;/span&gt;, &lt;span class="vcard"&gt;&lt;a href="http://flickr.com/photos/factoryjoe/2625201023/comment72157605908401795/" class="fn ext"&gt;Tantek &amp;Ccedil;elik&lt;/a&gt;&lt;/span&gt;, &lt;span class="vcard"&gt;&lt;a href="http://microformatique.com/?p=263" class="fn ext"&gt;John Allsopp&lt;/a&gt;&lt;/span&gt; and &lt;span class="vcard"&gt;&lt;a href="http://ma.gnolia.com/people/adactio/bookmarks/scucuwumuch" class="fn ext"&gt;Jeremy Keith&lt;/a&gt;, whow, I'm impressed! In the end I think we released Lustro a little too late for the GMail export thing, the buzz was over and lots of GMail exporters started to pop-up but the hCard export made up for that one.&lt;/p&gt;

&lt;p&gt;&lt;span class="vcard"&gt;&lt;a href="http://flickr.com/photos/factoryjoe/2625201023/comment72157605921180862/" class="fn ext"&gt;Brian Suda&lt;/a&gt;&lt;/span&gt;'s idea for a distributed hCard export sounds great. I don't think it fits in Lustro as it's the opposite way but I can see an Address Book plugin that &amp;lsquo;subscribes&amp;rsquo; on hCard enabled webpages.&lt;/p&gt;</content>
    <created-at type="datetime">2008-07-03T20:02:40+02:00</created-at>
    <id type="integer">30</id>
    <location-id type="integer">1</location-id>
    <permalink>lustro-out-now</permalink>
    <title>Lustro on the streets</title>
    <updated-at type="datetime">2009-02-21T22:09:25+01:00</updated-at>
  </post>
</posts>
