<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
  <post>
    <author>Simon Schoeters</author>
    <content>&lt;p&gt;If you try to make the best out of a website you it's easy to loose track of the stuff you checked and the ones you missed. This list should help me not to forget the small optimizations next time. This list is by no means exhaustive and not every point is needed in every situation but it's a start. It is customized for my own web development projects but it could be a start point for your own checkpoint list as well. Note, this is a checklist, not a tutorial on how to write websites and it assumes you have some basic understanding about accessible webdesign (make sure your site still works with JavaScript turned off, split your HTML structure from the layout, etc).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write correct semantic HTML

   &lt;ul&gt;
   &lt;li&gt;Use a strict doctype&lt;/li&gt;
   &lt;li&gt;Define your document language&lt;/li&gt;
   &lt;li&gt;Define your content type for the XML and once more in the head&lt;/li&gt;
   &lt;li&gt;Use microformats where possible: hCard, hReview, XFN, etc.&lt;/li&gt;
   &lt;li&gt;Validate your finished page (or have reason why it does not)&lt;/li&gt;
   &lt;li&gt;Correct HTML elements for the right content, did you know the &amp;lt;samp&amp;gt; element?&lt;/li&gt;
   &lt;/ul&gt;
   &lt;/li&gt;
&lt;/ul&gt;

&lt;samp&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" /&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;/samp&gt;

&lt;ul&gt;
&lt;li&gt;Decent CSS

   &lt;ul&gt;
   &lt;li&gt;No browser dependent hacks (if possible)&lt;/li&gt;
   &lt;li&gt;Never use JavaScript to load styles&lt;/li&gt;
   &lt;li&gt;Use only external stylesheets so it can be cached (no more then 8kB)&lt;/li&gt;
   &lt;li&gt;Write general CSS, be aware for &amp;lsquo;&lt;a href="http://joshuaink2006.johnoxton.co.uk/blog/330/avoiding-classitis" title="Avoiding classitis by John Oxton" class="ext"&gt;classitis&lt;/a&gt;&amp;rsquo;&lt;/li&gt;
   &lt;li&gt;Different colors for visited links (a:visited)&lt;/li&gt;
   &lt;/ul&gt;

&lt;/li&gt;
&lt;li&gt;Check your sites browser compatibility

   &lt;ul&gt;
   &lt;li&gt;Internet Explorer&lt;/li&gt;
   &lt;li&gt;Firefox&lt;/li&gt;
   &lt;li&gt;Opera&lt;/li&gt;
   &lt;li&gt;Safari&lt;/li&gt;
   &lt;li&gt;Lynx&lt;/li&gt;
   &lt;li&gt;Mobile devices&lt;/li&gt;
   &lt;/ul&gt;

&lt;/li&gt;
&lt;li&gt;Accessibility

   &lt;ul&gt;
   &lt;li&gt;Still readable for people with color blindness?&lt;/li&gt;
   &lt;li&gt;Enough contrast between text and background?&lt;/li&gt;
   &lt;li&gt;Test with larger font sizes&lt;/li&gt;
   &lt;li&gt;Add a 'last updated' date&lt;/li&gt;
   &lt;/ul&gt;

&lt;/li&gt;
&lt;li&gt;SEO or Search Engine Optimization

   &lt;ul&gt;
   &lt;li&gt;Google Sitemap&lt;/li&gt;
   &lt;li&gt;robots.txt&lt;/li&gt;
   &lt;li&gt;Google Analytics&lt;/li&gt;
   &lt;li&gt;Use rel="nofolow" for links in the comments&lt;/li&gt;
   &lt;li&gt;Technorati&lt;/li&gt;
   &lt;li&gt;Add the description and keywords meta tags&lt;/li&gt;
   &lt;li&gt;Add &lt;abbr title="Dublin Core"&gt;DC&lt;/abbr&gt; meta tags (optional)&lt;/li&gt;
   &lt;/ul&gt;

&lt;/li&gt;
&lt;li&gt;Performance

   &lt;ul&gt;
   &lt;li&gt;As HTTP requests&lt;/li&gt;
   &lt;li&gt;Check image file sizes&lt;/li&gt;
   &lt;li&gt;Optimize include files (get rid of white spaces in CSS or JavaScript files)&lt;/li&gt;
   &lt;li&gt;GZIP all your output&lt;/li&gt;
   &lt;li&gt;Use the expire cache in Apache&lt;/li&gt;
   &lt;li&gt;Move JavaScripts to the bottom of the page where possible&lt;/li&gt;
   &lt;/ul&gt;

&lt;/li&gt;
&lt;li&gt;Content&lt;/li&gt;
&lt;li&gt;License, check the CC licenses&lt;/li&gt;
&lt;li&gt;Nice extra's

   &lt;ul&gt;
   &lt;li&gt;XML&lt;/li&gt;
   &lt;li&gt;JSON&lt;/li&gt;
   &lt;li&gt;OpenSearch&lt;/li&gt;
   &lt;/ul&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Missing something? Write a short comment so I can add it to the list.&lt;/p&gt;

&lt;h3&gt;Tools&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.paciellogroup.com/resources/contrast-analyser.html" title="Contrast Analyser" class="ext"&gt;Software tool for checking foreground &amp;amp; background colour combinations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.vischeck.com/vischeck/" title="Vischeck" class="ext"&gt;How does your website look like to someone who is color blind?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://michelf.com/projects/sim-daltonism/" title="Sim Daltonism" class="ext"&gt;Sim Daltonism, a color blindness simulator for Mac OS X&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.graybit.com/" title="GrayBit" class="ext"&gt;Convert a full-color web page into a grayscale rendition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.yahoo.com/yslow/" title="Really useful extension for Firebug to check a site&amp;#39;s performance" class="ext"&gt;Yahoo! YSlow extension to check a site's performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.websiteoptimization.com/services/analyze/" title="Web Page Analyzer" class="ext"&gt;Website Performance Tool and Web Page Speed Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Read more&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.456bereastreet.com/archive/200709/10_colour_contrast_checking_tools_to_improve_the_accessibility_of_your_design/" title="Color contrast checking tools to improvet the accessibility of your design" class="ext"&gt;Color contrast checking tools to improve the accessibility of your design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.456bereastreet.com/archive/200603/evaluating_website_accessibility_part_3_digging_deeper/" title="Evaluating website accessibility part 3, Digging Deeper" class="ext"&gt;Evaluating website accessibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
    <created-at type="datetime">2007-09-27T00:11:18+02:00</created-at>
    <id type="integer">3</id>
    <location-id type="integer">1</location-id>
    <permalink>webdesign-checklist</permalink>
    <title>Webdesign checklist</title>
    <updated-at type="datetime">2008-10-10T17:41:39+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;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>
