<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Jaysen Marais</title>
	<atom:link href="http://jaysenmarais.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://jaysenmarais.com/blog</link>
	<description>Making it happen, bit by bit</description>
	<pubDate>Sat, 06 Feb 2010 04:07:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Synchronize bookmarks with Delicious &amp; Firefox</title>
		<link>http://jaysenmarais.com/blog/20090502/delicious/</link>
		<comments>http://jaysenmarais.com/blog/20090502/delicious/#comments</comments>
		<pubDate>Sat, 02 May 2009 22:35:40 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[web development]]></category>

		<category><![CDATA[bookmarks]]></category>

		<category><![CDATA[browser]]></category>

		<category><![CDATA[delicious]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[synchronizing]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/?p=223</guid>
		<description><![CDATA[The web is awesome, but managing URLs is a pain. That pain is magnified if you use multiple machines and made worse if you use multiple operating systems (not to mention home vs. work, desktop vs. phone etc). There are roughly a million ways to handle this problem. Here&#8217;s mine.

Step 1. Move bookmarks to delicious.com
About [...]]]></description>
			<content:encoded><![CDATA[<p>The web is awesome, but managing URLs is a pain. That pain is magnified if you use multiple machines and made worse if you use multiple operating systems (not to mention home vs. work, desktop vs. phone etc). There are roughly a million ways to handle this problem. Here&#8217;s mine.</p>
<p><center><img src="/blog_media/200905/cloud_diagram.png" width="450" height="270" alt="synchronizing bookamrks between multiple computers and OSes using delicious" /></center></p>
<h4>Step 1. Move bookmarks to delicious.com</h4>
<p>About 2 years ago I moved all my bookmarks to <a href="http://www.delicious.com">delicious.com</a>, a &#8217;social bookmarking&#8217; service which stores your bookmarks and enables you to access, share and organize (via tagging) these bookmarks over the web. Over time it&#8217;s become second nature to save anything interesting I find to my delicious account.</p>
<p><center><img src="/blog_media/200905/delicious_screen.png" width="486" height="184" alt="delicious.com screenshot" /></center></p>
<h4>Step 2. Install delicious.com browser extension</h4>
<p>Whilst delicious (and its ilk) can be used via the web interface, things really get interesting when you install the relevant browser extensions. These give you an experience much like regular browser-based bookmarking, but with synchronization and superior bookmark search.</p>
<ul>
<li>Official <a href="https://addons.mozilla.org/en-US/firefox/addon/3615">Delicious Bookmarks</a> extension for firefox</a> (any OS). Best.</li>
<li>Official <a href="http://delicious.com/help/quicktour/ie">Delicious Bookmarks</a> Add-on for Internet Explorer (windows)</li>
<li>Unofficial <a href="http://delicioussafari.com/">DeliciousSafari</a> plugin for Safari (mac)</li>
<li>Unofficial <a href="http://delicioussafari.com/bookmarks.php">Bookmarks</a> app for iPhone</li>
</ul>
<h4>Step 3. Specify &#8220;everyday&#8221; bookmarks</h4>
<p><img src="/blog_media/200905/manage_favourite_tags.png" width="180" height="108" alt="specifying favourite tags" style="float:right;margin-left:15px;margin-bottom:5px;" />We all have bookmarks we use everyday. Delicious allows me to group mine together by applying a common tag (I use the tag &#8220;me&#8221;). I then tell the <a href="https://addons.mozilla.org/en-US/firefox/addon/3615">Delicious Bookmarks</a> extension for firefox that the &#8220;me&#8221; tag denotes my favourites and viola! All my everyday bookmarks appear in Firefox&#8217;s toolbar. Better still, any additions or edits I make to this list of favourite bookmarks are propagated across all my browsers and computers.</p>
<h4>Step 4. Bring on the favicons!</h4>
<p>Although the Delicious extension for Firefox is great, it pays too much head to Firefox conventions for my liking. Specifically it doesn&#8217;t display <a href="http://en.wikipedia.org/wiki/Favicon">favicons</a> on mac (firefox doesn&#8217;t do toolbar favicons on mac by default) and doesn&#8217;t offer the ability to hide toolbar labels (which take up space). Luckily Firefox is highly customizable so I&#8217;ve managed to put together a simple Firefox extension which overrides these design decisions (and fix an intermittent &#8220;huge favicon&#8221; issue on mac Firefox). Behold: my <a href="http://jaysenmarais.com/blog/bits/delicious-bookmarks-toolbar/">Delicious Bookmarks Toolbar extension</a>.</p>
<p><center><a href="http://jaysenmarais.com/blog/bits/delicious-bookmarks-toolbar/"><img src="/blog_media/200905/extension_preview.png" width="481" height="279" alt="the 'Delicious Bookmarks Toolbar' extension replaces the Delicious Bookmark labels with favicons (mac &amp; pc)" style="border:none;" /></a></center></p>
<p>By the way, if you thought this blog post was written simply as an excuse to link to that simple extension, you&#8217;d be right.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20090502/delicious/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spherical panoramas: photographs without edges</title>
		<link>http://jaysenmarais.com/blog/20090410/spherical-panoramas/</link>
		<comments>http://jaysenmarais.com/blog/20090410/spherical-panoramas/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 19:52:00 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[panorama]]></category>

		<category><![CDATA[photography]]></category>

		<category><![CDATA[pangeaVR]]></category>

		<category><![CDATA[photoshop]]></category>

		<category><![CDATA[ptgui]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/?p=134</guid>
		<description><![CDATA[Most lay-people see photography as the cut-and-dried act of capturing the world &#8220;as it is&#8221;. Ironically, the simple and necessary action of framing a photograph instantly renders the result subjective (&#8217;un-photogenic&#8217; subjects are typically pushed out-of-frame). This creative choice built into the camera&#8217;s design is part of the appeal of photography. However, we occasionally encounter [...]]]></description>
			<content:encoded><![CDATA[<p>Most lay-people see photography as the cut-and-dried act of capturing the world &#8220;as it is&#8221;. Ironically, the simple and necessary action of framing a photograph instantly renders the result subjective (&#8217;un-photogenic&#8217; subjects are typically pushed out-of-frame). This creative choice built into the camera&#8217;s design is part of the appeal of photography. However, we occasionally encounter entirely photogenic scenes that we wish to convey in their entirety. Luckily, there is a type of photograph that has no edges at all; the <a href="/blog/panoramas/">spherical panorama</a>.</p>
<p><object CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="500" height="280" CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"><param name="src" value="/panoramas/posters/poster_01_sand_blow_summit.mov"><param name="href" value="http://panoramas.jaysenmarais.com.s3.amazonaws.com/01_1800_500_sand_blow_summit.mov"><param name="autoplay" value="true"><param name="controller" value="false"><param name="target" value="myself"><param name="pluginspage" value="http://www.apple.com/quicktime/download/"><param name="type" value="video/quicktime"><embed src="/panoramas/posters/poster_01_sand_blow_summit.mov" width="500" height="280" autoplay="true" controller="false" href="http://panoramas.jaysenmarais.com.s3.amazonaws.com/01_1800_500_sand_blow_summit.mov" pluginspage="http://www.apple.com/quicktime/" target="myself"></embed></object><center><a href="/blog/panoramas/#moreton_sand_blow_summit" style="margin-right:5px;">Moreton island sand-blow (summit)</a><span style="background:url(/blog_media/time.png) left center no-repeat; padding-left: 21px; margin-right: 5px;">29th <abbr title="December">Dec</abbr> 08</span> <a href="http://maps.google.com/maps?t=h&amp;hl=en&amp;ie=UTF8&amp;ll=-27.193047,153.419059&amp;spn=0.005611,0.008765&amp;z=17" title="view in google maps" style="background:url(/blog_media/200904/google_maps_16x16.gif) left center no-repeat;padding-left:21px;margin-right:5px;">map</a> <a href="http://panoramas.jaysenmarais.com.s3.amazonaws.com/01_6500_sand_blow_summit.mov" rel="nofollow" style="background: url(/blog_media/quicktime_16x16.gif) left center no-repeat; padding-left: 21px;">HD (2.6<abbr title="mega-bytes">MB</abbr>)</a> </center>
<p>This spherical panorama captures the complete scene; from the zenith (above my head) to the complete horizon to the the nadir (under my feet). No photographic paraphernalia (camera, tripod, photographer) distracts the viewer from the scene. What kind of magical camera does this? Well, with the right know-how, software and technique any camera will do. This is because spherical panoramas are simply an amalgamation of many regular photographs. Here&#8217;s the kit I used to make my example panorama.</p>
<p><center><img src="/blog_media/200904/rig.jpg" width="500" height="222" alt="tripod, nodal ninja panoramic head and Canon 5D mark II" /><br/><em>Tripod fitted with a <a href="http://store.nodalninja.com/category_s/31.htm">Nodal Ninja 5</a> panoramic tripod head supporting  a <a href="http://www.dpreview.com/reviews/canoneos5dmarkii/">Canon 5D mark II</a> with <a href="http://www.usa.canon.com/consumer/controller?act=ModelInfoAct&amp;fcategoryid=148&amp;modelid=7487">Canon 16 - 35mm f2.8L</a> lens</em></center>
<p>To get started we need a sequence of regular photographs which cover the entire scene. Typically this involves taking several &#8216;rows&#8217; of images, each containing a constant number of images (columns). The number of rows and columns required depends on the lens used but nevertheless the angle between rows should be consistent, as should that between each column (made easy by using a <a href="http://en.wikipedia.org/wiki/Panoramic_tripod_head">panoramic tripod head</a>, e.g. <a href="http://store.nodalninja.com/category_s/31.htm">Nodal Ninja 5</a>). In addition, a zenith shot (directly up) and two (complimentary) &#8216;nadir&#8217; shots (directly down) are required. Here&#8217;s the sequence of images I used to produce my sample panorama.</p>
<p><center><img src="/blog_media/200904/array_zenith.jpg" width="82" height="125" alt="zenith row" /><em style="display:block;">zenith</em><img src="/blog_media/200904/array_sky.jpg" width="500" height="125" alt="sky row" /><em style="display:block;">sky row</em><img src="/blog_media/200904/array_horizon.jpg" width="500" height="125" alt="zenith row" /><em style="display:block;">horizon row</em><img src="/blog_media/200904/array_ground.jpg" width="500" height="125" alt="zenith row" /><em style="display:block;">ground row</em><img src="/blog_media/200904/array_nadir.jpg" width="166" height="125" alt="zenith row" /><em style="display:block;">nadir (taking two at opposites enables later removal of feet &amp; shadows)</em></center>
<p>The rest of the spherical panorama creation process is all in software. I plan to cover the details in a future screen-cast, but for now here&#8217;s a quick overview:</p>
<ol>
<li><img src="/blog_media/200904/dpp_logo_75.jpg" alt="Canon Digitial Photo Professional (needs a better logo)" width="75" height="79" align="right" style="margin-left:10px;" />Ensure &#8216;consistent colour&#8217; across shots by correcting white-balance discrepancies (tip: remember to lock white-balance, exposure, shutter-speed, focal length and focus while shooting). Also correct any <a href="http://en.wikipedia.org/wiki/Vignetting">vignetting</a> (dark edges) and <a href="http://en.wikipedia.org/wiki/Chromatic_aberration">chromatic aberration</a> (coloured fringing on detail). For these tasks I use Canon&#8217;s bundled <a href="http://www.canon.co.uk/for_home/product_finder/cameras/digital_slr/eos30d/software/index.asp">DPP</a> software (if <a href="http://www.adobe.com/products/photoshoplightroom/">Lightroom</a>&#8217;s vignetting correction tools were better, I&#8217;d use it instead).</li>
<li><img src="/blog_media/200904/ptgui_logo_75.jpg" alt="PTGui" width="75" height="98" align="right" style="margin-left:10px;" />Import the corrected images into a stitching tool (after trying a few apps I finally ponied up for a copy of <a href="http://www.ptgui.com/">PTGui</a>). By creating control-point pairs (i.e. locating similar features in different photographs) I give PTGui the necessary information to correctly align, warp, composite and blend the all images (except for the zenith and nadir) into a single &#8217;stitched&#8217; equirectilinear result.</li>
<li>In photoshop I work a little magic to combine the two original nadir shots (which both contain my legs and feet) into a single feet-free nadir image</li>
<li>Using PTGui again I produce another equirectilinear image, this time containing only the warped ground (from the composited nadir) and sky (from the zenith shot)</li>
<li><img src="/blog_media/200904/photoshop_logo_75.jpg" alt="Photoshop logo" width="75" height="73" align="right" style="margin-left:10px;" />Back in photoshop I combine both equirectilinear images into a single image (&#8217;patching&#8217;) and apply any necessary retouching (e.g. making horizons dead-level and apply colour-corrections) to produce the <em>pièce de résistance</em>: the final (70+ megapixel) image.</li>
</ol>
<p><center><img src="/blog_media/200904/nadir_patching.jpg" width="500" height="387" alt="patching the warped nadir and zenith onto the stitched panorama in photoshop" /><br/><em>patching the warped nadir and zenith onto the stitched panorama in photoshop</em></center>
<p>At first glance this appears to be a regular photo, but in fact it covers 360&deg; horizontally and 180&deg; vertically (i.e. the entire scene). So how does it justify the &#8217;spherical&#8217; and &#8216;edge-less&#8217; tags? Well, the most effective way to present such an image is to wrap the rectangular image around an imaginary sphere and give the viewer control of a virtual camera placed at the orb&#8217;s centre. Rotating the camera simulates &#8216;looking&#8217; in the original scene. There are no limits on where the camera may look and no visible edges or seams.</p>
<p><center><img src="/blog_media/200904/wrap-sequence.jpg" width="500" height="80" alt="the distortion in the equirectilinear image disappears when the image is wrapped around a sphere" /><br/><em>the distortion in the equirectilinear image disappears when the image is wrapped around a sphere (inside which the viewer&#8217;s virtual &#8216;camera&#8217; rotates)</em></center>
<p>Spherical panoramas really take on a new dimension when combined with software like the <a href="http://jaysenmarais.com/blog/20080825/immersive-photographs-on-the-iphone-with-pangeavr/">PangeaVR iPhone app</a> I&#8217;ve mentioned before. Wherever I am I can show friends exactly what my favourite places are like by handing them the phone and saying &#8220;drag the image with your finger&#8221;. No other explanation, instruction or intervention is required for me to show friends overseas what the beach I learned to surf at is &#8220;really like&#8221;. Of course, the panoramas can also be viewed in a web browser. Below are links to a few panoramas I&#8217;ve created in the past few months from images taken on my Christmas holiday back home.</p>
<table cellspacing="0" cellpadding="0" border="0">
<tr>
<td style="padding-right:10px;padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#moreton_sand_blow_summit"><img src="/blog_media/200904/panorama_poster_01.jpg" width="160" height="90" alt="view 'moreton island sand blow (summit)' panorama" border="0" /></a></td>
<td style="padding-right:10px;padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#moreton_sand_blow_saddle"><img src="/blog_media/200904/panorama_poster_02.jpg" width="160" height="90" alt="view 'moreton island sand blow (saddle)' panorama" border="0" /></a></td>
<td style="padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#moreton_sand_blow_north"><img src="/blog_media/200904/panorama_poster_03.jpg" width="160" height="90" alt="view 'Moreton island sand blow (crest, north)' panorama" border="0" /></a></td>
</tr>
<tr>
<td style="padding-right:10px;padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#moreton_sand_blow_middle"><img src="/blog_media/200904/panorama_poster_04.jpg" width="160" height="90" alt="view 'Moreton island sand blow (crest, middle)' panorama" border="0" /></a></td>
<td style="padding-right:10px;padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#moreton_sand_blow_south"><img src="/blog_media/200904/panorama_poster_05.jpg" width="160" height="90" alt="view 'Moreton island sand blow (crest, south)" border="0" /></a></td>
<td style="padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#moreton_beach_dune"><img src="/blog_media/200904/panorama_poster_06.jpg" width="160" height="90" alt="view 'Moreton island eastern beach (dune)' panorama" border="0" /></a></td>
</tr>
<tr>
<td style="padding-right:10px;padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#moreton_beach_shore"><img src="/blog_media/200904/panorama_poster_07.jpg" width="160" height="90" alt="view 'Moreton island eastern beach (shore)' panorama" border="0" /></a></td>
<td style="padding-right:10px;padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#palm_beach_avenue_beach_1"><img src="/blog_media/200904/panorama_poster_08.jpg" width="160" height="90" alt="view 'Palm beach avenue beach (1)' panorama" border="0" /></a></td>
<td style="padding-bottom:10px;"><a href="http://jaysenmarais.com/blog/panoramas/#palm_beach_avenue_beach_2"><img src="/blog_media/200904/panorama_poster_09.jpg" width="160" height="90" alt="view 'Palm beach avenue beach (2)' panorama" border="0" /></a></td>
</tr>
</table>
<p>Hopefully I&#8217;ll have more to add to my <a href="http://jaysenmarais.com/blog/panoramas/">panoramas page</a> soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20090410/spherical-panoramas/feed/</wfw:commentRss>
<enclosure url="http://panoramas.jaysenmarais.com.s3.amazonaws.com/01_6500_sand_blow_summit.mov" length="2720186" type="video/quick" />
<enclosure url="http://panoramas.jaysenmarais.com.s3.amazonaws.com/01_1800_500_sand_blow_summit.mov" length="326740" type="video/quick" />
		</item>
		<item>
		<title>Ragged CSS: makes life easier</title>
		<link>http://jaysenmarais.com/blog/20090126/ragged-css-makes-life-easier/</link>
		<comments>http://jaysenmarais.com/blog/20090126/ragged-css-makes-life-easier/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 19:55:44 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[web development]]></category>

		<category><![CDATA[code formatting]]></category>

		<category><![CDATA[css]]></category>

		<category><![CDATA[semantic html]]></category>

		<category><![CDATA[tips]]></category>

		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/?p=95</guid>
		<description><![CDATA[The web community is generally coming (or has come) to accept that &#8217;semantic&#8217; class naming conventions (&#8217;old school&#8217; elements with classes describing content not appearance) are preferable to the 'boldGreyLink' type conventions popular around the millennium.	


Millenium era HTML &#38; CSS
&#8216;Semantic&#8217; era HTML &#38; CSS



&#60;html&#62;
&#60;head&#62;
&#60;title&#62;'Millenium' era&#60;/title&#62;
&#60;style type="text/css"&#62;
div.redSubHead {
  color: red;
}
p.greyText {
  color: #666;
}
td.columnHeaderCell {
 [...]]]></description>
			<content:encoded><![CDATA[<p>The web community is generally coming (or has come) to accept that &#8217;semantic&#8217; class naming conventions (&#8217;old school&#8217; elements with classes describing content not appearance) are preferable to the <code>'boldGreyLink'</code> type conventions popular around the millennium.	</p>
<table cellpadding="0" cellspacing="10" border="0">
<tr>
<th style="padding:5px;">Millenium era HTML &amp; CSS</th>
<th style="padding:5px;">&#8216;Semantic&#8217; era HTML &amp; CSS</th>
</tr>
<tr>
<td style="position:relative; width:50%;padding:5px;" valign="top">
<pre style="border:solid 1px #eee;padding:10px; background:#f8f8f8;line-height:1.2em;">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;'Millenium' era&lt;/title&gt;
&lt;style type="text/css"&gt;
<span style="color:#c00;">div.redSubHead</span> {
  color: red;
}
<span style="color:#c00;">p.greyText</span> {
  color: #666;
}
<span style="color:#c00;">td.columnHeaderCell</span> {
  font-weight: bold;
}
<span style="color:#c00;">td.oddRowCell</span> {
  background: #eee;
}
<span style="color:#c00;">td.evenRowCell</span> {
  background: #ddd;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

  <span style="color:#c00;">&lt;div class="redSub"&gt;</span>sub 1&lt;<span style="color:#c00;">/div&gt;</span>
  <span style="color:#c00;">&lt;p class="greyText"&gt;</span>blah&lt;<span style="color:#c00;">/p&gt;</span>
  &lt;table&gt;

    &lt;tr&gt;
      <span style="color:#c00;">&lt;td class="colHeader"&gt;</span>A<span style="color:#c00;">&lt;/td&gt;</span>
      <span style="color:#c00;">&lt;td class="colHeader"&gt;</span>B<span style="color:#c00;">&lt;/td&gt;</span>
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td <span style="color:#c00;">class="oddRow"</span>&gt;1&lt;/td&gt;
      &lt;td <span style="color:#c00;">class="oddRow"</span>&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td <span style="color:#c00;">class="evenRow"</span>&gt;3&lt;/td&gt;
      &lt;td <span style="color:#c00;">class="evenRow"</span>&gt;4&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
</td>
<td valign="top" style="width:50%;padding:5px;">
<pre style="border:solid 1px #eee;padding:10px; background:#f8f8f8;line-height:1.2em;">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;'Semantic' era&lt;/title&gt;
&lt;style type="text/css"&gt;
<span style="color:#0a0;">.section h2</span> {
  color: red;
}
<span style="color:#0a0;">.section p</span> {
  color: #666;
}
<span style="color:#0a0;">.section thead th</span> {
  font-weight: bold;
}
<span style="color:#0a0;">.section td</span> {
  background: #ddd;
}
<span style="color:#0a0;">.section tr.odd td</span>  {
  background: #eee;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  <span style="color:#0a0;">&lt;div class="section"&gt;</span>
    <span style="color:#0a0;">&lt;h2&gt;</span>sub 1&lt;<span style="color:#0a0;">/h2&gt;</span>
    <span style="color:#0a0;">&lt;p&gt;</span>blah&lt;<span style="color:#0a0;">/p&gt;</span>
    &lt;table&gt;
      <span style="color:#0c0;">&lt;thead&gt;</span>
        &lt;tr&gt;
          <span style="color:#0a0;">&lt;th&gt;</span>A<span style="color:#0a0;">&lt;/th&gt;</span>
          <span style="color:#0a0;">&lt;th&gt;</span>B<span style="color:#0a0;">&lt;/th&gt;</span>
        &lt;/tr&gt;
      <span style="color:#0a0;">&lt;/thead&gt;</span>
      &lt;tr <span style="color:#0a0;">class="odd"</span>&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;3&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  <span style="color:#0a0;">&lt;/div&gt;</span>
&lt;/body&gt;
&lt;/html&gt;</pre>
</td>
</tr>
<tr>
<td valign="top" style="padding:5px;">
<ol style="color:#900;">
<li>document structure inferred</li>
<li>classes describe appearance (volatile)</li>
<li>direct class application bloats html</li>
<li>changing style properties causes headaches (change all instance names or they&#8217;ll be out of sync with appearance).
			</ol>
</td>
<td valign="top" style="padding:5px;">
<ol style="color:#090;">
<li>document structure inherent</li>
<li>classes describe content (stable)</li>
<li>&#8216;container&#8217; classes give context to descendants</li>
<li>appearance (volatile) is abstracted from structure (stable). Redesign is anticipated &amp; therefore easier</li>
</ol>
</td>
</tr>
</table>
<p>One pillar of the &#8217;semantic&#8217; technique is the sparing application of <code>class</code> attributes, primarily to container elements. Elements are &#8216;caught&#8217; using CSS <a href="http://www.w3.org/TR/CSS2/selector.html#descendant-selectors">&#8216;descendant&#8217; selectors</a> (multi-part) which target hierarchies rather than using simple <a href="http://www.w3.org/TR/CSS2/selector.html#class-html">class selectors</a> which require a directly applied <code>class</code> attribute. Using descendant selectors respects the hierarchical nature of the <abbr title="Document Object Model">DOM</abbr> but makes writing bulk CSS quite tricky. Why? Mainly because CSS stylesheets (and style blocks) are fundamentally rule <b>lists</b>, but the DOM elements which our descendent selectors target are obviously <b>trees</b>. How do we bridge the gap between these fundamentally different structures?</p>
<h4>Enter &#8216;ragged&#8217; CSS</h4>
<p>In 2006 I (then a contracting developer) found myself filling the shoes of a fantastic design contractor whose contract was up but sadly not extended (project managers eternally underfund and misunderstand UI). I was the new &#8216;CSS guy&#8217; for a project with scores of developers, hundreds of pages and crippling compatibility/accessibility requirements. I wasn&#8217;t really qualified for the task, but my predecessor gave me a CSS tip that got me through: &#8220;don&#8217;t sweat the properties, focus on rule hierarchies&#8221;.</p>
<p>This rule-centric approach is most clearly evident in the CSS formatting style I picked up on that project and used ever since; a style I call &#8216;<b>Ragged CSS</b>&#8216;.</p>
<table cellpadding="0" cellspacing="10" border="0">
<tr>
<th style="padding:5px;">&#8216;tall&#8217; CSS</th>
<th style="padding:5px;">&#8216;ragged&#8217; CSS</th>
</tr>
<tr>
<td valign="top" style="padding:5px;">
<pre style="border:solid 1px #eee;padding:10px; background:#f8f8f8;line-height:1.2em;">
.section h2 {
  color: red;
}
.section p {
  color: #666;
}
.section thead th {
  font-weight: bold;
}
.section td {
  background: #ddd;
}
.section tr.odd td  {
  background: #eee;
}</pre>
</td>
<td valign="top" style="padding:5px;">
<pre style="border:solid 1px #eee;padding:10px; background:#f8f8f8;line-height:1.2em;">
.section { }
  .section h2 { color: red; }
  .section p { color: #666; }
  .section table { }
    .section thead th { font-weight: bold; }
    .section td { background: #ddd; }
      .section tr.odd td { background: #eee; }</pre>
</td>
</tr>
</table>
<p>It differs from the common &#8216;tall&#8217; CSS formatting style in only a few (primarily cosmetic) ways:</p>
<ol>
<li><b style="display:block;">One line per rule, one rule per line</b>There may be hundreds of rules, but each will only have a handful of properties.
	</li>
<li>
		<b style="display:block;">Indent CSS rules to represent target element hierarchy</b>A block of markup (e.g. a calendar) will typically involve several rules (perhaps dozens). Indenting rules more clearly indicates how their properties will cascade.</p>
<li>
		<b style="display:block;">Make rules for &#8216;landmark&#8217; elements (empty rules if necessary)</b>Adding an empty rule for element&#8217;s whose classes are used in subsequent selectors makes indentation hierarchy far clearer (improves readability).
	</li>
<li>
		<b style="display:block;">&#8216;namespace&#8217; your rules to avoid conflict</b>Class names may be repeated on large projects unintentionally. Target &#8216;abc&#8217; class elements inside &#8216;xyz&#8217; class elements using a &#8216;.xyz .abc&#8217; selector rather than a global &#8216;.abc&#8217; selector to avoid tainting someone else&#8217;s unrelated &#8216;abc&#8217; class.
	</li>
<li>
		<b style="display:block;">Avoid element prefixes sparingly in your selectors</b>Don&#8217;t use a <code>'span.content'</code> selector where a plain <code>'.content'</code> selector will do. Dogmatic prefixing (i.e. increasing <a href="http://www.smashingmagazine.com/2007/07/27/css-specificity-things-you-should-know/">specificity</a> unnecessarily) makes your rules unnecessarily vulnerable to otherwise inconsequential markup changes (changing the <code>span</code> to a <code>div</code> for instance).
	</li>
</ol>
<p>I&#8217;ve been using this formatting style for a few years now and it&#8217;s made complex CSS development a snap (browser quirks aside). If you&#8217;re writing &#8216;tall&#8217; CSS (or using a tool which generates it), give ragged CSS a go on your next project. Your future self (and/or your successor) will thank you for it!</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20090126/ragged-css-makes-life-easier/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Scrolling beyond the black stump in Google Earth</title>
		<link>http://jaysenmarais.com/blog/20081115/scrolling-beyond-the-black-stump-in-google-earth/</link>
		<comments>http://jaysenmarais.com/blog/20081115/scrolling-beyond-the-black-stump-in-google-earth/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 21:30:39 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[Mapping]]></category>

		<category><![CDATA[Australia]]></category>

		<category><![CDATA[Google Earth]]></category>

		<category><![CDATA[Google Maps]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[maps]]></category>

		<category><![CDATA[outback]]></category>

		<category><![CDATA[Satellite photos]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/?p=42</guid>
		<description><![CDATA[Recently an American friend of mine was asking about the basics of Australia&#8217;s geography over lunch. When I couldn&#8217;t make my points clearly using condiments and cutlery I turned to  the Google Earth iPhone app (also worth a look is Earthscape). I find myself reaching for the iPhone mid-conversation quite frequently these days. Though [...]]]></description>
			<content:encoded><![CDATA[<p>Recently an American friend of mine was asking about the basics of Australia&#8217;s geography over lunch. When I couldn&#8217;t make my points clearly using condiments and cutlery I turned to  the <a href="http://www.google.com/mobile/apple/earth.html">Google Earth iPhone app</a> (also worth a look is <a href="http://www.earthscape.com/iphone/index.html">Earthscape</a>). I find myself reaching for the iPhone mid-conversation quite frequently these days. Though awkward (or rude) in a 2 person chat, I find judicious interrogation of the <a href="http://en.wikipedia.org/wiki/Series_of_tubes">inter-tubes</a> dramatically elevates casual debates, planning sessions and meandering conversations between 3+ people (which this was).</p>
<p><center><a href="http://www.google.com/mobile/apple/earth.html"><img src="http://www.jaysenmarais.com/blog_media/200811/iPhone_google_search_australia.jpg" alt="Australia in Google Earth iPhone app" width="450" height="243" style="border:none;"></a><br/>Australia in <a href="http://www.google.com/mobile/apple/earth.html">Google Earth iPhone app</a></center>
<p>Anyway, the conversation inevitably turned to questions about &#8216;the outback&#8217;, the facet of Australian life which seems to intrigue other nationalities most. Questions typically follow the &#8220;Did you live in the outback?&#8221; &#8220;Have you been there?&#8221; &#8220;What is it?&#8221; &#8220;Pet kangaroo?&#8221; line (No, not sure, umm, dog person). My difficulty in answering &#8216;outback&#8217; related questions is that, like most Aussies I know (other <a href="http://en.wikipedia.org/wiki/South_East_Queensland">South-East Queensland</a> types), I have <a href="http://en.wikipedia.org/wiki/Outback#Terminology">no firm definition of &#8216;the outback&#8217;</a> to go on. I&#8217;ve camped in some arid and desolate spots (by European and American standards) in Australia (technically not &#8216;outback&#8217; due to their proximity to the coast), but I&#8217;ve never been close to or &#8216;beyond the <a href="http://en.wikipedia.org/wiki/Black_stump">black stump</a>&#8216;, let alone into the &#8216;<a href="http://en.wikipedia.org/wiki/Never_Never_(Australian_outback)">Never Never</a>&#8216;.</p>
<p>Living in a <a href="http://en.wikipedia.org/wiki/England#Climate">a disconcertingly rainy country</a> has made me think about the Australia&#8217;s arid interior more and more. To keep my hands busy during a skype chat this morning, I fired up the <a href="http://earth.google.com/">Google Earth desktop client</a> to check out Google&#8217;s satellite imagery resolution for the Australian interior. Not bad as it turns out, particularly in areas in the many stripes of <a href="http://www.gearthblog.com/blog/archives/2007/06/huge_imagery_update.html">60cm DigitalGlobe imagery</a> (red-tinged for some reason). Even in areas covered by the lower resolution <a href="http://www.cnes.fr/web/CNES-en/1415-spot.php">CNES Spot satellite</a> images, the novelty of being able to make out individual trees soon gives way to wonder at the strange patterns visible from space.</p>
<p><center><br />
<table cellpadding="0" cellspacing="5" border="0" style="border-collapse:separate;border-spacing:5px;">
<tr>
<td valign="top"><a href="http://www.jaysenmarais.com/blog_media/200811/google_earth_lake_carnegie_large.jpg"><img src="http://www.jaysenmarais.com/blog_media/200811/google_earth_lake_carnegie.jpg" alt="Lake Carnegie in Google Earth (larger version)" width="225" height="126" style="border:solid 1px #000;" /></a>
<div style="text-align:center;width:225px;"><a href="http://maps.google.com/maps?ll=-26.306967,123.0351&#038;z=13&#038;t=h&#038;hl=en">26&deg;18&#8242;16.99&#8243; S, 123&deg;02&#8242;09.02&#8243; E</a><br/><a href="http://en.wikipedia.org/wiki/Lake_Carnegie_(Western_Australia)">Lake Carnegie</a>, an &#8216;ephemeral lake&#8217; in <abbr title="Western Australia">WA</abbr> (image scale: 10km across)</div>
</td>
<td valign="top"><a href="http://www.jaysenmarais.com/blog_media/200811/google_earth_nullarbor_large.jpg"><img src="http://www.jaysenmarais.com/blog_media/200811/google_earth_nullarbor.jpg" alt="Nullarbor plain in Google Earth (larger version)" width="225" height="126" style="border:solid 1px #000;" /></a>
<div style="text-align:center;width:225px;"><a href="http://maps.google.com/maps?ll=-29.911867,127.01788&#038;z=9&#038;t=h&#038;hl=en">29&deg;55&#8242;33.45&#8243; S, 127&deg;01&#8242;55.77&#8243; E</a><br/>The endless <a href="http://en.wikipedia.org/wiki/Nullarbor_Plain">Nullarbor plain</a> of <abbr title="South Australia">SA</abbr>/<abbr title="Western Australia">WA</abbr> (image scale: 112km across)</div>
</td>
</tr>
<tr>
<td valign="top"><a href="http://www.jaysenmarais.com/blog_media/200811/google_earth_simpson_desert_large.jpg"><img src="http://www.jaysenmarais.com/blog_media/200811/google_earth_fire_scars.jpg" alt="Fire scars (Simpson Desert, NT) in Google Earth (larger version)" width="225" height="126" style="border:solid 1px #000;" /></a>
<div style="text-align:center;width:225px;"><a href="http://maps.google.com/maps?ll=-24.009231,136.9887&#038;z=11&#038;t=h&#038;hl=en">24&deg;00&#8242;47.77&#8243; S, 137&deg;00&#8242;42.19&#8243; E</a><br/>Fire-ravaged <a href="http://en.wikipedia.org/wiki/Simpson_desert">Simpson desert</a>, <abbr title="Northern Territory">NT</abbr> (image scale: 38km across)</div>
</td>
<td valign="top"><a href="http://www.jaysenmarais.com/blog_media/200811/google_earth_lake_mackay_large.jpg"><img src="http://www.jaysenmarais.com/blog_media/200811/google_earth_lake_mackay.jpg" alt="Lake Mackay in Google Earth" width="225" height="126" style="border:solid 1px #000;" /></a>
<div style="text-align:center;width:225px;"><a href="http://maps.google.com/maps?ll=-22.381692,128.85415&#038;z=9&#038;t=h&#038;hl=en">22&deg;21&#8242;04.26&#8243; S, 128&deg;58&#8242;56.72&#8243; E</a><br/>Massive <a href="http://en.wikipedia.org/wiki/Lake_Mackay">Lake Mackay</a>, <a href="http://en.wikipedia.org/wiki/Great_Sandy_Desert">Great Sandy Desert</a>, <abbr title="Western Australia">WA</abbr>/<abbr title="Northern Territory">NT</abbr> (image scale: 111km across, rotated)</div>
</td>
</tr>
</table>
<p></center>
<p>Wind, water, sand, salt, erosion and fire have all shaped the interior with scant evidence of human existence. In particular, note that the Nullarbor shot above covers an area roughly 112km x 63km with no buildings, rivers, lakes or hills. Now that&#8217;s desolation!</p>
<p>Whilst assembling the above screen-grabs I noticed that <a href="http://maps.google.com/">Google Maps</a> seems to use a different database of satellite imagery than Google Earth at zoom levels below 13. This leads to a slightly odd disconnect when viewing <a href="http://maps.google.com.au/?ie=UTF8&#038;t=h&#038;ll=-25.347129,131.033764&#038;spn=0.090444,0.245991&#038;z=12">Uluru in google maps at zoom level 12</a> and then zooming once to view <a href="http://maps.google.com.au/?ie=UTF8&#038;t=h&#038;ll=-25.347129,131.033764&#038;spn=0.090444,0.245991&#038;z=13">Uluru at zoom level 13</a>.</p>
<p><center></p>
<table cellpadding="0" cellspacing="5" border="0" style="border-collapse:separate;border-spacing:5px;">
<tr>
<td valign="top"><a href="http://maps.google.com.au/?ie=UTF8&#038;t=h&#038;ll=-25.347129,131.033764&#038;spn=0.090444,0.245991&#038;z=12"><img src="http://www.jaysenmarais.com/blog_media/200811/uluru_googlemaps_zoom12.jpg" alt="Uluru seen in Google Maps at zoom level 12" width="150" height="100" style="border:solid 1px #000;" /></a>
<div style="text-align:center;width:150px;"><a href="http://maps.google.com.au/?ie=UTF8&#038;t=h&#038;ll=-25.347129,131.033764&#038;spn=0.090444,0.245991&#038;z=12">Uluru in Google maps (zoom level 12)</a></div>
</td>
<td valign="top"><a href="http://maps.google.com.au/?ie=UTF8&#038;t=h&#038;ll=-25.347129,131.033764&#038;spn=0.090444,0.245991&#038;z=13"><img src="http://www.jaysenmarais.com/blog_media/200811/uluru_googlemaps_zoom13.jpg" alt="Uluru seen in Google Maps at zoom level 13" width="150" height="100" style="border:solid 1px #000;" /></a>
<div style="text-align:center;width:150px;"><a href="http://maps.google.com.au/?ie=UTF8&#038;t=h&#038;ll=-25.347129,131.033764&#038;spn=0.090444,0.245991&#038;z=13">Uluru in Google maps (zoom level 13)</a></div>
</td>
<td valign="top"><a href="http://www.flickr.com/photos/58769188@N00/280326461/"><img src="http://www.jaysenmarais.com/blog_media/200811/uluru_aerial_flickr_rplzzz.jpg" alt="amatuer aerial photo of uluru (credit rplzzz, flickr)" width="150" height="100" style="border:solid 1px #000;" /></a>
<div style="text-align:center;width:150px;">Photo of Uluru (credit <a href="http://www.flickr.com/photos/58769188@N00/280326461/">rplzzz</a>, flickr)</div>
</td>
</tr>
</table>
<p></center>
<p>True to form, the <a href="http://wordpress.org/">wordpress team</a> had managed to release several point releases since my last post, making this the 3rd post in a row preceded by a <a href="http://codex.wordpress.org/Upgrading_WordPress_Extended">wordpress upgrade</a>. My goal is to have the next post up before <a href="http://codex.wordpress.org/Version_2.7">WordPress 2.7</a> hits. I&#8217;m doomed.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20081115/scrolling-beyond-the-black-stump-in-google-earth/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Out with the old, in with the new (drive)</title>
		<link>http://jaysenmarais.com/blog/20080925/out-with-the-old-in-with-the-new-drive/</link>
		<comments>http://jaysenmarais.com/blog/20080925/out-with-the-old-in-with-the-new-drive/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 21:14:09 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[hard-drive]]></category>

		<category><![CDATA[HDD]]></category>

		<category><![CDATA[Leopard]]></category>

		<category><![CDATA[macbook]]></category>

		<category><![CDATA[tiger]]></category>

		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/?p=41</guid>
		<description><![CDATA[After my fourth month of constant hard-drive space scavenging (in both OS X and boot-camped Vista) I finally bit the bullet and initiated the oft-delayed drive upgrade. It also seemed like the least irritating time to do the similarly deferred Tiger-to-Leopard upgrade too (hitherto postponed due to space  and enthusiasm scarcity).
At this point you [...]]]></description>
			<content:encoded><![CDATA[<p>After my fourth month of constant hard-drive space scavenging (in both OS X and boot-camped Vista) I finally bit the bullet and initiated the oft-delayed drive upgrade. It also seemed like the least irritating time to do the similarly deferred <a href="http://en.wikipedia.org/wiki/Mac_OS_X_v10.4">Tiger</a>-to-<a href="http://en.wikipedia.org/wiki/Mac_OS_X_v10.5">Leopard</a> upgrade too (hitherto postponed due to space  and enthusiasm scarcity).</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200809/macbook_upgrade.jpg" width="450" height="338" alt="macbook pro hard drive upgrade" style="disply:block;" /><span style="display:block;font-style:italic;">At this point you really hope the rest of the upgrade guide is up to scratch</span></center></p>
<p>Everything went pretty smoothly (except for a last minute scramble to find a size 00 philips screwdriver). ExtremeTech&#8217;s <a href="http://www.extremetech.com/article2/0,1697,2119528,00.asp">Upgrade your macbook pro&#8217;s hard-drive</a> came in very handy, with only a few deviations necessary to effect the switcheroo.</p>
<p>Here&#8217;s a quick list of the necessary bits and pieces I ended up using:</p>
<ul>
<li>Macbook Pro (<a href="http://guides.macrumors.com/MacBook_Pro#Rev._C">Rev C</a>, circa Jan &#8216;07)</li>
<li>The <a href="http://www.extremetech.com/article2/0,1697,2119528,00.asp">upgrade guide</a> loaded on the iPhone</li>
<li>A new 2.5&#8243; SATA drive (<a href="http://www.amazon.co.uk/Western-Digital-Scorpio-Serial-5400rpm/dp/B000VNCEPA">Western Digital 250Gb scorpio</a>)</li>
<li>a <a href="http://www.amazon.co.uk/2-5-Sata-eSata-External-Enclosure/dp/B000S89NQG/ref=pd_sim_ce_24">basic 2.5&#8243; USB enclosure</a> to enable ad-hoc pillaging of the old drive</li>
<li>Tiger DVD</li>
<li>Vista DVD</li>
<li><a href="http://en.wikipedia.org/wiki/Torx">Torx</a> T-6 screw-driver</li>
<li>size 00 and size 0 <a href="http://en.wikipedia.org/wiki/Henry_F._Phillips">phillips screwdrivers</a></li>
<li>2 x <a href="http://www.amazon.co.uk/Western-Digital-Passport-Essential-250GB/dp/B0012IOHVM/ref=dp_cp_ob_ce_title_0/026-5055864-3620456">WD passport 250Gb passport drives</a> (one with Mac &amp; PC app installers, the other for <a href="http://www.apple.com/macosx/features/timemachine.html">Time Machine</a>)</li>
</ul>
<p>Having the guide on the iPhone proved very handy, and luckily I had a size 0 phillips screwdriver to hand (the recommended size 00 didn&#8217;t seem right for the job). Now I&#8217;m cruising along nicely with fresh Tiger/Vista installs and throwing RAW files around without a care (hard-drive rationing is like solitary confinement, it warps the mind).</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20080925/out-with-the-old-in-with-the-new-drive/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Immersive photographs on the iPhone with PangeaVR</title>
		<link>http://jaysenmarais.com/blog/20080825/immersive-photographs-on-the-iphone-with-pangeavr/</link>
		<comments>http://jaysenmarais.com/blog/20080825/immersive-photographs-on-the-iphone-with-pangeavr/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 13:10:12 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[photography]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[pangeaVR]]></category>

		<category><![CDATA[panorama]]></category>

		<category><![CDATA[remember the milk]]></category>

		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/?p=39</guid>
		<description><![CDATA[It was all I could do to stay true to my anti-iPhone stance so long as my 3G demands remained unmet, so when apple finally relented and released the iPhone 3G I too was forced to concede (it would have been unreasonable of me not too!). 
Most curious onlookers are sold after a whistle-stop tour [...]]]></description>
			<content:encoded><![CDATA[<p>It was all I could do to stay true to my anti-iPhone stance so long as my 3G demands remained unmet, so when apple finally relented and released the <a href="http://www.apple.com/iphone/">iPhone 3G</a> I too was forced to concede (it would have been unreasonable of me not too!). </p>
<p>Most curious onlookers are sold after a whistle-stop tour of <a href="http://www.apple.com/iphone/features/sms.html">SMS</a>, <a href="http://www.apple.com/iphone/features/safari.html">Web</a> and <a href="http://www.apple.com/iphone/features/maps.html">Google Maps</a>. However some stubborn folks haughtily demand what makes &#8216;it so special anyway?&#8217;, so I do my solemn best to give them the personalised excuse they need to justify their inevitable purchase. <a href="http://iconfactory.com/twitterrific_touch/screenshots.html">Twitterific</a> seems to be the killer app for folks on twitter (twits?) and the <a href="http://www.commoncraft.com/Twitter">common craft intro to twitter</a> video quickly converts the non-twits. Productivity obsessives (guilty) have trouble restraining themselves when they see <a href="http://www.rememberthemilk.com/services/iphone/">remember the milk</a> and <a href="http://www.reqall.com/about/reqall_iphone_native">reqall</a>. Some nuts are tougher to crack.</p>
<p>The final trick I have up my sleeve (besides games, but that&#8217;s cheap) is <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284877515&#038;mt=8">PangeaVR</a> (app-store link).</p>
<p><center><img src="http://jaysenmarais.com/blog_media/200808/pangea_boat_house.jpg" width="450" height="243" alt="PangeaVR iPhone ap displaying 'boat house' panorama from panedia.com" /><br/>PangeaVR iPhone app displaying &#8216;<a href="http://maps.panedia.com/vr.php?pano=1577&#038;z=15&#038;mt=m">boat house</a>&#8216; panorama from <a href="http://panedia.com/">panedia.com</a></center></p>
<p>It&#8217;s not the most snappily-named app, nor the most seductively dressed but it&#8217;s the app that&#8217;s come closest to eliciting an audible &#8216;wow&#8217; from me. In short PangeaVR allows you to view immersive photographs by rubbing your finger on the touch-screen. Drag left to look left, up is up etc. Spin around, zoom in, stare at a foreign sky. See the world not as the photographer frames it, but as they saw it (there&#8217;s a big difference). Revisit the places of your youth. Take a peek at that fantasy vacation spot. Show your friends the home town you never shut up about.</p>
<p><img src="http://jaysenmarais.com/blog_media/200808/pangea_panedia_tall.jpg" width="150" height="278" alt="example list of panoramas within a PangeaVR portfolio" style="float:right; margin-left: 10px; margin-bottom: 5px;" /> PangeaVR is (amazingly) free, though I <a href="http://idents.tv/blog/2008/04/09/what-do-you-reckon-i-know-i-dont-care/">reckon</a> that with a less imposing UI metaphor (PangeaVR&#8217;s current UI is based around an intimidatingly long list of &#8216;portfolios&#8217;) and a <a href="http://www.macrumors.com/iphone/2008/08/20/the-1-paid-app-koi-pond/">Koi Pond</a>-like price tag, PangeaVR could be a major money spinner for Pangea software (should they choose to go that route). The coolest part about PangeaVR as it stands though is that <a href="http://www.pangeasoft.net/pano/pangeavr/portfolios.html">publishing your own panoramas through the system</a> is also free and (theoretically) within reach of anyone with a digital camera (preferably with a <a href="http://wiki.panotools.org/Hardware#Lenses">wide lens</a> and a <a href="http://wiki.panotools.org/Heads">bracket head</a>), a PC and time! <a href="http://www.pangeasoft.net/">Brian Greenstone and the Pangea software guys</a> responsible for this app/system deserve major kudos for their open-handed approach.</p>
<p>Now I should point out that this isn&#8217;t the first time I&#8217;ve encountered panoramic photography, so my praise isn&#8217;t just that of the VR ingénue. I&#8217;ve toiled to <a href="http://jaysenmarais.com/blog/20080402/making-linear-panoramas-that-dont-suck/">stitch my own panoramas</a> in the past only to have users unable to load the Quicktime/flash/java plug-in necessary to view them or confused that they must &#8216;click &#038; drag&#8217; the photo (to which they are unaccustomed) to &#8216;pan&#8217; the image (some very unhelpful lingo). In the end I gave up and started outputting stitched images as <a href="http://www.flickr.com/photos/jaysenmarais/2392738256/">static JPEGs</a>. What makes PangeaVR worth mentioning is that it harnesses people&#8217;s natural tendency to touch screens (<a href="http://www.codinghorror.com/blog/archives/001115.html">even when they really shouldn&#8217;t</a>) and the ability of even the most timid <a href="http://en.wikipedia.org/wiki/Digital_native">digital immigrant</a> to comprehend the &#8216;move the picture with your finger&#8217; concept. </p>
<p>My next move is to devise a workflow for producing my own spherical panoramas without splashing out on any <a href="http://www.panomundo.com/panos/howto/hardware.html">specialist equipment</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20080825/immersive-photographs-on-the-iphone-with-pangeavr/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Photos &#8212; trip to Salzburg &amp; Munich</title>
		<link>http://jaysenmarais.com/blog/20080407/photos-trip-to-salzburg-munich/</link>
		<comments>http://jaysenmarais.com/blog/20080407/photos-trip-to-salzburg-munich/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 15:14:13 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[photography]]></category>

		<category><![CDATA[Flickr]]></category>

		<category><![CDATA[Lightroom]]></category>

		<category><![CDATA[munich]]></category>

		<category><![CDATA[PictureSync]]></category>

		<category><![CDATA[salzburg]]></category>

		<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/20080407/photos-trip-to-salzburg-munich/</guid>
		<description><![CDATA[
Just a quick post (to offset my last ridiculously long post on stitching panoramas with Hugin). I&#8217;ve finally posted the photos from my recent trip to Salzburg &#38; Munich. It took a few weeks (spare-time) to cull (from ~400 to 85), caption, tag, geocode, post-process and upload the images.
I&#8217;m still using the workflow described in [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/jaysenmarais/sets/72157604400931881/detail/"><img src="http://farm3.static.flickr.com/2097/2391769351_84b647a8a5_t.jpg" alt="flickr set: Salzburg and Munich" align="right" style="margin-left: 10px;margin-bottom: 5px;border:0px;" /></a>
<p>Just a quick post (to offset my last ridiculously long <a href="http://jaysenmarais.com/blog/20080402/making-linear-panoramas-that-dont-suck/">post on stitching panoramas with Hugin</a>). I&#8217;ve finally posted the <a href="http://www.flickr.com/photos/jaysenmarais/sets/72157604400931881/detail/">photos from my recent trip to Salzburg &amp; Munich</a>. It took a few weeks (spare-time) to cull (from ~400 to 85), caption, tag, geocode, post-process and upload the images.</p>
<p>I&#8217;m still using the workflow described in <a href="http://jaysenmarais.com/blog/20080106/photography-08-ditching-iphoto/">Photography ‘08 (ditching iphoto)</a> with a few minor modifications:</p>
<ul>
<li>Re-reading the metadata into <a href="http://www.adobe.com/products/photoshoplightroom/">Lightroom</a> after geocoding in <a href="http://picturesync.net/">PictureSync</a>. Otherwise Lightroom is unaware of the geotags and may subsequently overwrite them.</li>
<li>I&#8217;ve also started exporting temp images from Lightroom (which have the &#8216;develop&#8217; settings applied) as PictureSync seems unable to accurately apply the crops/tone adjustments defined in Lightroom. The temp images are uploaded and deleted.</li>
</ul>
<p>Enjoy the <a href="<a href="http://www.flickr.com/photos/jaysenmarais/sets/72157604400931881/detail/">pics</a>. Also check out <a href="http://www.kodakgallery.at/Slideshow.jsp?Uc=1b7f9rwrt.1prx87n4p&#038;Uy=-xi8uas">Robert&#8217;s pictures of the hike</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20080407/photos-trip-to-salzburg-munich/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Making nodal panoramas that don&#8217;t suck</title>
		<link>http://jaysenmarais.com/blog/20080402/making-linear-panoramas-that-dont-suck/</link>
		<comments>http://jaysenmarais.com/blog/20080402/making-linear-panoramas-that-dont-suck/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 22:57:00 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[photography]]></category>

		<category><![CDATA[autopano-sift]]></category>

		<category><![CDATA[blending]]></category>

		<category><![CDATA[composite image]]></category>

		<category><![CDATA[how-to]]></category>

		<category><![CDATA[hugin]]></category>

		<category><![CDATA[panorama]]></category>

		<category><![CDATA[panotools]]></category>

		<category><![CDATA[photoshop]]></category>

		<category><![CDATA[ptstitcher]]></category>

		<category><![CDATA[stitching]]></category>

		<category><![CDATA[tutorial]]></category>

		<category><![CDATA[walkthrough]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/20080402/making-linear-panoramas-that-dont-suck/</guid>
		<description><![CDATA[Update: 6th Feb 2010, changed &#8216;linear&#8217; in title to &#8216;nodal&#8217; due to comment feedback]]></description>
			<content:encoded><![CDATA[<p><b>Update: 6th Feb 2010, changed &#8216;linear&#8217; in title to &#8216;nodal&#8217; due to comment feedback</b</p>
<p>Most modern digital cameras (even phones) have a &#8216;panorama photo&#8217; mode, allowing you to take multiple photos which are then magically combined into a single large photograph. Sounds great, but there&#8217;s a problem. These composite images (whether produced in-camera or using &#8216;automatic stitching&#8217; programs) look OK at first glance, but are typically full of smudges, ghosts, morphing people and objects sprouting from thin air.</p>
<p><center><img src="http://jaysenmarais.com/blog_media/200803/hugin_10.jpg" alt="Issues with automatic panorama stitching software" /></center></p>
<p>So where exactly is is all going wrong? In theory, the basic steps required to create convincing composite images (including panoramas) are:</p>
<ol>
<li><b>Align the images</b> &mdash; Ordering and placing images by examining their overlaps.</li>
<li><b>Correct for <a href="http://en.wikipedia.org/wiki/Angle_of_view">angle of view</a></b> &mdash; Think &#8216;fisheye&#8217;, but subtler.</li>
<li><b>Remap images to compensate for varying distance</b> &mdash; Closer subjects &#8216;move&#8217; more between shots than distant ones. This is fixed by identifying common &#8216;control points&#8217; then remapping the images so they overlap perfectly.</li>
<li><b>Blend images to hide image seams</b> &mdash; Obscuring (typically softening) the boundaries between images to create the illusion of a single image.</li>
</ol>
<p>Photostitching software typically gets steps 1 and 2 spot on, but can&#8217;t hold a candle to humans when it comes to pattern recognition (the secret sauce behind steps 3 and 4). If we want good composite images we have to hijack the identification of control points and eventually produce a layered photoshop file so we can blend manually (to perfection).</p>
<h4>Pitfalls during shooting</h4>
<p>First we need to keep an eye out for things that often go pear-shaped during the shoot.</p>
<ul>
<li><b>Creeping Horizon</b> &mdash; Caused by gradually rotating the camera up/down between shots (when doing a horizontal pano).</li>
<li><b>Wavy horizons</b> &mdash; If the camera&#8217;s not perfectly level, the horizon will see-saw up &amp; down.</li>
<li><b>Moving foreground subjects</b> &mdash; People/cars/trees/etc moving between shots.</li>
<li><b>Moving photographer</b> &mdash; Wind, terrain and rampaging wild-life may interrupt your plans.</li>
<li><b>Rubbish/damaged lenses</b> &mdash; Cheap cameras have cheap lenses whose variations become glaringly obvious during stitching.</li>
<li><b>Varying &#8216;brightness&#8217;</b> &mdash; Not locking exposure results in adjacent shots with lighter or darker skies.</li>
<li><b>Varying &#8216;colour&#8217;</b> &mdash; Not locking white-balance (when multiple light sources present) can result in dramatically different colour between shots.</li>
<li><b>Changing light</b> &mdash; If clouds arrive halfway through shooting your panorama, give up or start again.</li>
</ul>
<h4>Tips for shooting</h4>
<ul>
<li>Use a <strong>tripod</strong></li>
<li><strong>Level your tripod</strong> (camera&#8217;s rotation axis should typically be perpendicular to the horizon).</li>
<li>Be <strong>aware of moving objects near</strong> the camera (remember to check 360&deg;). Fast moving objects are generally OK. It&#8217;s the slow moving object that cause headaches later on.</li>
<li>Take <strong>more shots</strong> than the camera recommends (only if using manual stitching). Using 2/3 overlap will give you a spare photoshop layer during blending.</li>
<li><strong>Be quick</strong>. Light and subjects will change during your shoot. Plan your panorama, do a dry run, then fly like the wind (but don&#8217;t forget the other tips).</li>
<li><strong>Lock any camera settings</strong> you can, leave the rest alone. Some cameras lock exposure and white balance in &#8216;panorama&#8217; mode (check the manual), but it&#8217;s up to you to keep focal length (zoom), aperture, focus and ISO constant.</li>
</ul>
<h4>Playing with pixels &mdash; stitching an &#8216;unstitchable&#8217; panorama</h4>
<p>All the apps mentioned in this section are available for Windows and OS X (linux too, though using gimp instead of photoshop). Also it&#8217;s worth pointing out that even though this post is about horizontal panoramas, these techniques can be be used to create any composite image (<a href="http://hugin.sourceforge.net/tech/imgs/venice_corr_enblend.jpg">blended tiled images</a>, <a href="http://hugin.sourceforge.net/tech/imgs/venice_noncorr.jpg">unblended tiled images</a>, spherical panoramas, <a href="http://www.tawbaware.com/maxlyons/gigapixel.htm">gigapixel images</a> etc).</p>
<ol>
<li>
<p><b>Shoot the images &amp; collect on PC</b> &mdash; I&#8217;m going to use images taken atop <a href="http://en.wikipedia.org/wiki/Gaisberg">Gaisberg mountain</a> near Salzburg, Austria. The images were shot on my <a href="http://www.dpreview.com/reviews/CanonG7/">Canon Powershot G7</a> in it&#8217;s <a href="http://www.canon.co.jp/imaging/mode/camera/stitch-e.html">Stitch Assist</a> mode (exposure &amp; white balance locked). To make things interesting I&#8217;ve chosen a set of images with a few of the common issues you may come across (no tripod, inconsistent position).
</p>
</li>
<li>
<p><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_logo.gif" alt="hugin logo" align="right" style="margin-left: 10px;" /><b>Download and extract <a href="http://hugin.sourceforge.net/">Hugin</a></b> &mdash; Hugin is an ambitious open source (donation-ware) panorama creation GUI (cross-platform, written in c# under <a href="http://www.mono-project.com/Main_Page">mono</a>). It&#8217;s still beta so you may find the UI a little cryptic and glitchy, but you can&#8217;t complain given the price-tag (free).</p>
</li>
<li>
<p><b>Download and install <a href="http://user.cs.tu-berlin.de/~nowozin/autopano-sift/">autopano-sift</a> (optional)</b> &mdash; Autopano-sift is a helper program for Hugin which identifies control points in your sub-panorama images using some <a href="http://en.wikipedia.org/wiki/Scale-invariant_feature_transform">pretty hefty maths</a>. We will use autopano-sift to kick-start the control point detection process, but you can bypass autopano-sift and create all control points manually if you wish.</p>
</li>
<li>
<p><b>Open Hugin and load images</b> &mdash; When Hugin loads click the &#8216;load images&#8217; button and locate the images which make up your panorama (some camera naming schemes make this difficult so it&#8217;s best to collect them in a folder beforehand). Hugin may ask you to specify your cameras stated focal length (usually silk-screened around the lens itself) and 35mm equivalent (try <a href="http://www.dpreview.com">dpreview</a> or the manual).</p>
<p><center><img src="http://jaysenmarais.com/blog_media/200803/hugin_1.gif" alt="Hugin startup screen" /></center></p>
<p>Once Hugin has loaded your images, autopano-sift will appear (on first-run, Hugin may ask you to locate the autopano.exe).</p>
</li>
<li>
<p><b>Use autopano-sift to identify control points (optional)</b> &mdash; The autopano-sift UI has a few tweak-able parameters for the adventurous but for now just click &#8216;compute&#8217;.</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_2.gif" alt="autopano-sift UI" /></center></p>
<p>Autopano-sift&#8217;s &#8216;PTO generation&#8217; process will kick off. This process may take a few minutes (depending on the size &amp; number of your images). Once completed, click &#8216;OK&#8217; and close autopano-sift.</p>
</li>
<li>
<p><b>The rough draft</b> &mdash; Hugin will use the control points generated by autopano-sift to align and distort your images. It will present its results in the &#8216;preview&#8217; window.</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_3.gif" alt="initial panorama results" /></center></p>
<p>As you can see, there are some misaligments. These are to be expected (especially with dodgy source images like the ones I&#8217;m using) but unlike the automatic stitching software which would just blend over these cracks, we have the power to fix them.</p>
</li>
<li>
<p><b>Get to know the &#8216;control points&#8217; tab</b> &mdash; Close the preview window and navigate to the &#8216;control points&#8217; tab.</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_4.gif" alt="hugin control points tab" /></center></p>
<p>The &#8216;control points&#8217; tab enables you to review, edit, delete and add control points to improve the stitching &amp; blending processes. Additionally, it gives a unique perspective on exactly why automated control point detection is so underwhelming. Main points:</p>
<ol>
<li>Existing control-points on both images (automatically generated by autopano-sift).</li>
<li>We&#8217;re only really interested in the area of overlap. Ideally there would be control points evenly distributed througout this entire overlap region.</li>
<li>The list of control points (automatic and manual).</li>
</ol>
</li>
<li>
<p><b>Manually tweaking control points</b> &mdash; The &#8216;control points&#8217; tab in the current build of Hugin (0.7 beta 4) has some frustrating UI glitches, but the following workarounds helped me:</p>
<ul>
<li>When <strong>editing existing control points</strong>, set the zoom factor to &#8216;200%&#8217;  (be sure to click them dead centre or Hugin will try to create a new control point, frustrating).</li>
<li>When <strong>adding new control points</strong>, set the zoom factor to &#8216;fit to window&#8217; then click on both images in turn, position the control points, click the &#8216;fine-tune&#8217; button and then the &#8216;add&#8217; button. repeat.</li>
</ul>
<p>Add a few control points for each troublesome image pair (evenly throughout the overlap area) then go to the &#8216;optimize&#8217; tab, choose &#8216;everything&#8217; and click the &#8216;optimize&#8217; button. Once the optimization process is complete, check the preview (ctrl-p on windows, cmd-P on mac) to see whether it&#8217;s made an improvement to the panorama. If there are still major breaks, tweak the control points as necessary.</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_5.gif" alt="improved stitch" /></center></p>
<p>Here you can see the panorama preview is less &#8216;wavy&#8217;. Don&#8217;t worry too much about the rotation, we&#8217;ll fix this in photoshop.</p>
</li>
<li>
<p><b>Get <a href="http://www.all-in-one.ee/~dersch/">PTStitcher</a></b> &mdash; Although Hugin comes with a stitching engine (nona), we&#8217;ll use PTStitcher as it has better blending plus .psd output. Download the <a href="http://www.all-in-one.ee/~dersch/">PanoTools zip</a> and extract it. Copy the pano12.dll from the extracted folder into your Hugin folder. Copy the PTStitcher.exe app (from the Helpers folder in the extracted PanoTools folder) to the Hugin folder.</p>
</li>
<li>
<p><b>Creating a stitched (layered) psd file</b> &mdash; In Hugin, go to the &#8216;Stitcher&#8217; tab, change the &#8217;stitch the images&#8217; option to &#8216;into a layered photoshop file&#8217; and click &#8217;stitch now&#8217; (beware the psd file may be several hundred megabytes, hope you&#8217;ve got the RAM). Hugin may ask you to locate PTStitcher. If so point it to the copy you put in the Hugin folder.</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_6.gif" alt="Hugin stitcher options" /></center>
</li>
<li>
<p><b>Final blending &amp; cropping in photoshop</b> &mdash; Upon opening the psd file in photoshop you&#8217;ll notice that the blend lines are pretty conspicuous. However, as each shot is a separate (masked) layer you can tweak each blend independently by editing the mask.</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_7.gif" alt="blend issues" /></center></p>
<p>At this point you also have the opportunity to mask in/out moving foreground subjects and make other creative edits (i.e. duplicate people). If you took my advice and shot with 2/3 overlap you&#8217;ll have a spare layer to run wild with too. A few blending tips:</p>
<ul>
<li>Use broad diameter &#8217;soft&#8217; brushes to feather the masks in areas of sky.</li>
<li>Avoid straight lines in your masks (especially horizontal &amp; vertical lines). Human eyes will spot those straight away.</li>
<li>In areas of high detail use small diameter &#8216;harder&#8217; edged brushes (this avoid ghosting in the final image).</li>
<li>Hard edged subjects in the foreground make great (hard) mask boundaries</li>
</ul>
<p>After tweaking each of the seams the whole panorama becomes pretty convincing. This is the most rewarding part of the process, and you run the risk of wasting a lot of time ;). In this example I decided to merge foreground characters from two different shots, but I left some easter eggs in there for anyone who&#8217;s really looking.</p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_8.gif" alt="resolved blend issues" /></center>
</li>
<li>
<p><b>The final cut</b> &mdash; To get rid of the &#8216;rising horizon&#8217; problem in this image set (a constant issue when shooting panoramas sans tripod) I&#8217;ve selectively cloned and distorted the middle foreground grass and left sky. The final image captures all the things I remember from that instant in one single image (the ultimate <a href="http://www.thefreedictionary.com/aide-memoire">aide mémoire</a>).</p>
<p><center><a href="http://www.flickr.com/photos/jaysenmarais/2392738256/sizes/l/"><img src="http://www.jaysenmarais.com/blog_media/200803/hugin_9.jpg" alt="final image" /></a></center>
</li>
</ol>
<p>The length of this post might make the process of manually assembling composite/panoramic images appear complex, but trust me, the second time&#8217;s a snap. Oh, and you&#8217;ll be the only kid on your street who&#8217;s panoramas don&#8217;t suck.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20080402/making-linear-panoramas-that-dont-suck/feed/</wfw:commentRss>
		</item>
		<item>
		<title>dpreview.com lens review widget sallies forth</title>
		<link>http://jaysenmarais.com/blog/20080130/dpreview_lens_review_widget/</link>
		<comments>http://jaysenmarais.com/blog/20080130/dpreview_lens_review_widget/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 18:27:39 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[dpreview]]></category>

		<category><![CDATA[photography]]></category>

		<category><![CDATA[flash]]></category>

		<category><![CDATA[lens]]></category>

		<category><![CDATA[lens review]]></category>

		<category><![CDATA[user interface]]></category>

		<category><![CDATA[visualisation]]></category>

		<category><![CDATA[visualization]]></category>

		<category><![CDATA[web design]]></category>

		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/20080130/dpreview_lens_review_widget/</guid>
		<description><![CDATA[Today&#8217;s a big day at dpreview.com as it sees the launch of the first dpreview.com lens reviews. I&#8217;m excited as it also sees the launch of my latest and greatest project, the humbly-titled lens review widget (or see it embedded in a lens review).

The lens review widget is a flash component embedded into our lens [...]]]></description>
			<content:encoded><![CDATA[<p>Today&#8217;s a big day at <a href="http://www.dpreview.com">dpreview.com</a> as it sees the launch of the first <a href="http://www.dpreviews.com/lensreviews/">dpreview.com lens reviews</a>. I&#8217;m excited as it also sees the launch of my latest and greatest project, the humbly-titled <a href="http://www.dpreview.com/lensreviews/widget/Fullscreen.ashx">lens review widget</a> (or see it <a href="http://www.dpreview.com/lensreviews/canon_17-85_4-5p6_is_usm_c16/page3.asp">embedded in a lens review</a>).</p>
<p><a href="http://www.dpreview.com/lensreviews/widget/Fullscreen.ashx"><img src="http://www.jaysenmarais.com/blog_media/200801/widget_screenshot_sharpness_nographs.jpg" alt="Screen shot of the lens review widget in sharpness mode" style="border:none;" /></a></p>
<p>The lens review widget is a flash component embedded into our lens reviews responsible for presenting the results of our studio tests. The challenge of the project is that the lens review studio test output is intricate, multi-dimensional and in acute danger of misinterpretation.  </p>
<p>The widget&#8217;s goal is to provide users with a constructive mental model of this dataset and an intuitive/responsive/encouraging interface with which to navigate it. </p>
<p>The broad data categories initially displayed are:</p>
<ul>
<li><img src="http://www.jaysenmarais.com/blog_media/200801/widget_sharpness.jpg" alt="sharpness demonstration" align="right" style="text-align:center;" /><b>Sharpness</b> is the top of the list for most lens geeks. Not all lenses are created equal, especially considering the difference in the &#8217;sharpness&#8217; of the image they produce. A single lens can vary greatly between different focal length/aperture combinations and even varies (non-linearly) from centre to corner within a single shot!</li>
<li><img src="http://www.jaysenmarais.com/blog_media/200801/widget_ca.jpg" alt="chromatic aberration demonstration" align="right" /><b><a href="http://en.wikipedia.org/wiki/Chromatic_aberration">Chromatic aberration</a></b> is the colour &#8216;fringing&#8217; you see around light-on-dark or dark-on-light objects in your photographs. Generally purple or green (but occasionally blue/yellow) this effect varies with focal length/aperture and distance from centre.</li>
<li><img src="http://www.jaysenmarais.com/blog_media/200801/widget_distortion.jpg" alt="distortion demonstration" align="right" /><b>Distortion</b> is what causes real world straight lines to appear curved in your photographs. Zoom lenses in particular are prone to distorting &#8216;inwards&#8217; (pincushion) at one extreme and &#8216;outwards&#8217; (barrel) at the other. Distortion varies by focal length.</li>
<li><img src="http://www.jaysenmarais.com/blog_media/200801/widget_falloff.jpg" alt="falloff demonstration" align="right" /><b>Falloff</b> is the phenomenon whereby the corners of the frame appear &#8216;darker&#8217; than the centre (i.e. the light &#8216;falls off&#8217; from centre to edge). Though often used as an intentional effect, falloff is generally avoided if possible and varies with focal length, aperture and obviously, distance from centre.</li>
</ul>
<p>In practice these 4 effects are all present (to some extent) in every shot you take, so representing their individual effects is more complicated than simply displaying the raw images (which we also do). </p>
<h4>Designing the user interface</h4>
<p>With so much data to navigate and several dimensions to deal with (angle from centre, distance from centre, focal length and aperture) the process of designing a useful and intuitive UI was difficult. Eventually a standard hierarchy emerged:</p>
<ol>
<li><b>Lens review</b>. It may seem the obvious choice, but I&#8217;ve included it on this list as (if allowed in configuration) the user is able to change the review data being viewed within the widget.</li>
<li><b>Visualization</b>. Sharpness &#038; Chromatic Aberration, Distortion or Fall-off.</li>
<li><b><a href="http://en.wikipedia.org/wiki/Focal_length">Focal Length</a></b>. Or &#8216;zoom&#8217; to non-photographers, is generally marked on lenses in arbitrary integer values (generally 4 - 7 per lens).</li>
<li><b><a href="http://en.wikipedia.org/wiki/Aperture">Aperture</a></b>. The variable size of the &#8216;hole&#8217; which regulates the amount of light entering the camera body. Stated in <a href="http://en.wikipedia.org/wiki/F-number">f numbers</a>, an approximately logarithmic semi-standardized decimal value. The aperture values available for a lens depend on the focal length chosen.</li>
<li><b>Comparison lens review</b>. Users reading reviews are constantly making comparative decisions, so the widget allows users to compare two lens reviews (or two data-points within the same review) cheek-by-jowl, hopefully improving comprehension. Of course, this requires user interface chrome to allow the user to choose.</li>
</ol>
<p><img src="http://www.jaysenmarais.com/blog_media/200801/widget_lenspicker.jpg" alt="picker picker control" align="right" />There was much internal debate (which still rages) about this UI element which allows users to change/compare reviews, but the eventual decision was to filter reviews by system, lens and finally camera body. <em>Note: Our lens tests are performed on a camera body (instead of an optical test bench) which has relevance upon the results.</em></p>
<h4>The &#8217;slider&#8217;</h4>
<p>The real challenge from a UI perspective was creating a UI element which allowed users to change focal length / aperture in an intuitive way, was brand-neutral and could cope with the intricacies of the focal length /aperture systems and their inter-relationship. After initially experimenting with <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/controls/Slider.html#includeExamplesSummary">flash&#8217;s slider component</a>, I decided to abandon it and start from scratch (before you shout <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">Not Invented Here</a>, be aware that flash&#8217;s slider is a major usability dud). </p>
<p><center><img src="http://www.jaysenmarais.com/blog_media/200801/widget_grabslider.gif" alt="GrabSlider demo animation" /></center></p>
<h4>Trim</h4>
<p>Some neat little features that I pushed into the widget (usually late at night):</p>
<ul>
<li><strong>Full screen mode</strong>: At any time a user can click the full screen button at the bottom of the widget to view in a new window/tab (selected reviews, visualization, focal length &amp; aperture are retained).</li>
<li><strong>Permalinking</strong>: At any point, users can obtain a permalink to the current state of the widget to bookmark and/or link to (again the selected reviews, visualization, focal length &amp; aperture are retained).</li>
<li><strong>Keyboard controls</strong>: A bit of a power-user feature requested by the guys in the office, the keyboard arrow keys can be used to control focal length and aperture. If multiple reviews are visible, they will all receive the inputs, allowing users to change the visualizations in unison (not currently possible via the sliders).</li>
</ul>
<p>Though a few minor issues persist, I&#8217;m very happy with the current implementation. I feel it strikes the right balance between aesthetics, usability, accuracy, brand-neutrality and &#8216;fun&#8217;. </p>
<p>Time (and the forums) will ultimately tell.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20080130/dpreview_lens_review_widget/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Photography &#8216;08 (ditching iphoto)</title>
		<link>http://jaysenmarais.com/blog/20080106/photography-08-ditching-iphoto/</link>
		<comments>http://jaysenmarais.com/blog/20080106/photography-08-ditching-iphoto/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 18:14:12 +0000</pubDate>
		<dc:creator>Jaysen</dc:creator>
		
		<category><![CDATA[photography]]></category>

		<category><![CDATA[Flickr]]></category>

		<category><![CDATA[geotagging]]></category>

		<category><![CDATA[iPhoto]]></category>

		<category><![CDATA[Lightroom]]></category>

		<category><![CDATA[metadata]]></category>

		<category><![CDATA[PictureSync]]></category>

		<guid isPermaLink="false">http://jaysenmarais.com/blog/20080106/photography-08-ditching-iphoto/</guid>
		<description><![CDATA[Until recently my digital photography &#8216;workflow&#8217; (such as it was) has been comically under-thought:

Take photo, download images (using canon software) to mac and wipe CF card.
Import images into iPhoto 6 then:

Battle against iPhoto&#8217;s terrible data-entry interface (helped slightly by Ken Ferry&#8217;s great Keyword assistant for iPhoto).
Complain bitterly when I realized that iPhoto does not write [...]]]></description>
			<content:encoded><![CDATA[<p>Until recently my digital photography &#8216;workflow&#8217; (such as it was) has been comically under-thought:</p>
<ol>
<li>Take photo, download images (using canon software) to mac and wipe CF card.</li>
<li>Import images into iPhoto 6 then:
<ul>
<li>Battle against iPhoto&#8217;s terrible data-entry interface (helped slightly by Ken Ferry&#8217;s great <a href="http://homepage.mac.com/kenferry/software.html">Keyword assistant for iPhoto</a>).</li>
<li>Complain bitterly when I realized that iPhoto does not write <a href="http://en.wikipedia.org/wiki/Exif">EXIF</a>/<a href="http://en.wikipedia.org/wiki/Extensible_Metadata_Platform">XMP</a>, instead it keeps metadata in own proprietary database.</li>
<li>Lament iPhoto&#8217;s ignorance of <a href="http://en.wikipedia.org/wiki/Geotagging">Geo-tagging</a> (storing latitude and longitude in photos to allow them to be represented on maps).</li>
</ul>
</li>
<li>Avoid backing up iPhoto library (not so straight-forward) whilst panicking that i&#8217;d lose my photos to a disc failure.</li>
<li>Ignore requests to email photos due to effort required (we all do it!) or resize and email if feeling keen (rare).</li>
<li>Occassionally upload tiny subset to facebook (and receive angry-mails from non-facebookers who can&#8217;t see the images).</li>
</ol>
<p><strong>The New way</strong></p>
<ul>
<li>Signed up for <a href="http://flickr.com/upgrade/">flickr pro</a> account. $25/year for unlimited storage/bandwidth etc.</li>
<li>Downloaded <a href="http://www.adobe.com/uk/products/photoshoplightroom/">Lightroom</a> (metadata editor, neat tone curve editor).</li>
<li>Downloaded <a href="http://picturesync.net/">PictureSync</a>. It turns iPhoto data into EXIF/IPTC/XMP/Spotlight tags, pulls lat/long from google earth (optional) and uploads (full-size) photos flickr. Also plays nice with lightroom. Great rules engine (for fixing metadata).</li>
<p><a href="http://picturesync.net/"><img src="http://www.jaysenmarais.com/blog_media/200801/picturesync_screen.jpg" alt="picturesync integrates with google earth, uploads to flickr and has a nifty rules engine" style="display:block;border:none;" /></a></p>
<li>Added <a href="http://www.facebook.com/apps/application.php?id=2352557895">My Flickr app</a> to my facebook profile, canned default photo app.</li>
</ul>
<p><strong>The new status quo</strong></p>
<ol>
<li>Images metadata now embedded in images (where it ought to be) instead of in an app&#8217;s database.</li>
<li>Photos backed up (hurrah) in the cloud (even better) at full resolution/quality with powerful privacy control.</li>
<li>Can view/search/share entire photo library over web (including all metadata).</li>
<li>Friends/family can download images (configurable) in a variety of sizes without any additional effort on my part.</li>
<p><a href="http://www.flickr.com/photos/jaysenmarais/"><img src="http://www.jaysenmarais.com/blog_media/200801/flickr_download_example.jpg" style="display:block;border:none;" alt="flickr image downloads can be enabled (per-image) and are available in a variety of sizes"></a></p>
<li>Ready-made RSS (and GeoRSS) feeds of my images thanks to flickr (friends and family can <a href="http://api.flickr.com/services/feeds/photos_public.gne?id=39779962@N00&#038;lang=en-us&#038;format=atom">subscribe</a>).</li>
<li>My Geo-tagged photos can be viewed on <a href="http://www.flickr.com/photos/jaysenmarais/map/">ready-made map UI</a>. Cool!</li>
<li>Significantly more web 2.0 street-cred (easy on the 2.0 cynicism people!)</li>
</ol>
<p>So next time someone asks me to send them a copy of a photo, there&#8217;s now a more-than-slim chance I may actually do so.</p>
<p>Next on my list is getting my G7 and my <a href="http://jaysenmarais.com/blog/20071217/going-off-the-reservation-with-new-garmin-gps/">new GPS</a> working together to automatically geocode my images.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaysenmarais.com/blog/20080106/photography-08-ditching-iphoto/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
