<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-23847503</id><updated>2012-02-02T11:36:22.545+10:00</updated><category term='real world'/><category term='cheat sheet'/><category term='xml'/><category term='translink'/><category term='pse6'/><category term='java'/><category term='xproc'/><category term='photoshop'/><category term='tweetbot'/><category term='apselex'/><category term='pipeline'/><category term='adobe'/><category term='helvetica'/><category term='rcp'/><category term='ui'/><category term='commands'/><category term='pse'/><category term='iPhone'/><category term='svg'/><category term='google code'/><category term='user interface'/><category term='twitter'/><category term='go card'/><category term='queensland rail'/><category term='forms'/><category term='design'/><category term='eclipse'/><category term='qr'/><category term='iOS'/><category term='usability'/><category term='elements'/><title type='text'>evan's stuff - integration matters</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-23847503.post-1875229880966049765</id><published>2011-12-24T09:18:00.000+10:00</published><updated>2011-12-24T17:17:47.554+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tweetbot'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>TweetBot UI</title><content type='html'>After the recent changes to the official Twitter iPhone app, I've done as others have - and looked at options.&lt;br /&gt;&lt;br /&gt;At the moment, I'm trying TweetBot - self described as a Twitter app with personality.&lt;br /&gt;&lt;br /&gt;And I'm really liking it. The transitions, animations and sounds make for an enjoyable experience.&lt;br /&gt;&lt;br /&gt;But, there's a few little things which I think would improve it even further - one of which has been annoying me slightly (disproportionately to it's actual impact) - and that's the shape of the custom back button.&lt;br /&gt;&lt;br /&gt;Let me illustrate ... here's a comparison shot between TweetBot - and the standard iOS back button:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qS7to0jcrfU/TvUK6rAf_uI/AAAAAAAAAMY/quUov81HMQE/s1600/buttons.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="178" src="http://3.bp.blogspot.com/-qS7to0jcrfU/TvUK6rAf_uI/AAAAAAAAAMY/quUov81HMQE/s400/buttons.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I've highlighted the "problem" area - which shows:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the standard button has a much steeper angle, and finishes with a slight curve to the line&lt;/li&gt;&lt;li&gt;the TweetBot button is essentially a straight line (of a shallower angle) with a small curve at the end.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Like I said - not &amp;nbsp;a major issue. But every time I see it, I think how it would be nice to have it as the standard shape.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-1875229880966049765?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/1875229880966049765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=1875229880966049765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/1875229880966049765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/1875229880966049765'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2011/12/tweetbot-ui.html' title='TweetBot UI'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qS7to0jcrfU/TvUK6rAf_uI/AAAAAAAAAMY/quUov81HMQE/s72-c/buttons.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-7632965105277917540</id><published>2011-09-08T15:10:00.000+10:00</published><updated>2011-09-08T15:10:03.788+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='queensland rail'/><category scheme='http://www.blogger.com/atom/ns#' term='translink'/><category scheme='http://www.blogger.com/atom/ns#' term='qr'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='helvetica'/><title type='text'>Commuting with Helvetica</title><content type='html'>Wow, Queensland Rail have recently upgraded their corporate branding - but it's only now that they seem to be rolling out the new station identities:&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TrN5Et8NEnc/TmdIBmV2MMI/AAAAAAAAAL0/OdUuKG0DAZ8/s1600/IMG_0764.JPG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-TrN5Et8NEnc/TmdIBmV2MMI/AAAAAAAAAL0/OdUuKG0DAZ8/s320/IMG_0764.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;New Station Signage&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;And, they seem to have chosen Helvetica for the station signage as well - one of my favourite fonts.&amp;nbsp;Who would have thought we would finally get some good design in our every day commuter life?&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Strangely enough, some stations which have recently received new signs have had a similar version - but in italics! Quite bizarre. I'll update the post when I can take a picture.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-7632965105277917540?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/7632965105277917540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=7632965105277917540' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/7632965105277917540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/7632965105277917540'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2011/09/commuting-with-helvetica.html' title='Commuting with Helvetica'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-TrN5Et8NEnc/TmdIBmV2MMI/AAAAAAAAAL0/OdUuKG0DAZ8/s72-c/IMG_0764.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-8839079943622786357</id><published>2008-02-04T14:09:00.000+10:00</published><updated>2008-02-04T14:25:17.016+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google code'/><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse6'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='apselex'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>Google Code - Part 1</title><content type='html'>As I've mentioned earlier, I'm using &lt;a href="http://code.google.com/p/apselex/"&gt;Google Code&lt;/a&gt; to host the &lt;a href="http://evans-stuff.blogspot.com/2008/01/photoshop-elements-explorer-part-2.html"&gt;apselex&lt;/a&gt; project - an Adobe Photoshop Elements Explorer.&lt;br /&gt;&lt;br /&gt;It is very easy to get started, and quite easy to use.&lt;br /&gt;&lt;br /&gt;But, one thing was eluding me - how to use images in the wiki. I know - the help page has some examples, but as with all these things, the devil is in the details.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the image needs to be an external link&lt;/li&gt;&lt;li&gt;as such it needs to be hosted, and available&lt;/li&gt;&lt;li&gt;a "makes sense" approach is to store images in the wiki directory itself&lt;/li&gt;&lt;li&gt;and then simply point to the image with a link like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[http://apselex.googlecode.com/svn/wiki/ScreenshotExplorer.png]&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Simple!&lt;br /&gt;&lt;br /&gt;Naturally, using Eclipse, it was pretty straight forward to put some images in this directory. The approach I took was:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create a separate Eclipse project - mine was called ApselWiki&lt;/li&gt;&lt;li&gt;share this as a Team project (using subversion), and use the wiki as the URL&lt;br /&gt;&lt;br /&gt;https://apselex.googlecode.com/svn/wiki&lt;br /&gt;&lt;br /&gt;Note, that the wiki directory is outside the /trunk directory. That is, it's in the root of your project.&lt;/li&gt;&lt;li&gt;You can then simple paste new images into the Eclipse project - and also edit your wiki pages if you really like.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Then simply perform a "Team -&gt; Synchronize"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Easy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-8839079943622786357?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/8839079943622786357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=8839079943622786357' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/8839079943622786357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/8839079943622786357'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2008/02/google-code-part-1.html' title='Google Code - Part 1'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-862200657910027253</id><published>2008-01-29T16:17:00.000+10:00</published><updated>2008-01-29T16:46:44.267+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse6'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>Photoshop Elements - Explorer Part 2</title><content type='html'>Due to overwhelming demand (well, at least 1 person :-)), I've put up my initial code for exploring the Photoshop Elements database. For a small bit of background info, see my previous &lt;a href="http://evans-stuff.blogspot.com/2007/11/photoshop-elements-explorer.html"&gt;post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I thought I'd give google code a try for hosting - as such, the project is located &lt;a href="http://code.google.com/p/apselex/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Drop me a line in the comments if you're interested in participating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-862200657910027253?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/862200657910027253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=862200657910027253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/862200657910027253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/862200657910027253'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2008/01/photoshop-elements-explorer-part-2.html' title='Photoshop Elements - Explorer Part 2'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-5716759221890885570</id><published>2008-01-08T15:40:00.000+10:00</published><updated>2008-12-09T08:55:01.893+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='translink'/><category scheme='http://www.blogger.com/atom/ns#' term='real world'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='go card'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><title type='text'>Real World Usability</title><content type='html'>This is a post on usability - in the "real world" - which may become something of a series.&lt;br /&gt;&lt;br /&gt;The subject today is a ticket vending machine - not super exciting, but it's a a new model being rolled out in south east Queensland, so could be considered topical.&lt;br /&gt;&lt;br /&gt;First, a picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wv7sKF2Ya-Q/R4QRKw7lDLI/AAAAAAAAAGM/vHr6K6PGAkQ/s1600-h/08012008_edited-2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_wv7sKF2Ya-Q/R4QRKw7lDLI/AAAAAAAAAGM/vHr6K6PGAkQ/s320/08012008_edited-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5153262750249847986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mmmm, what ever could be a problem with this shiny new design.&lt;br /&gt;&lt;br /&gt;Well. A few things unfortunately. Let's see.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the coin slot. There's not enough room for a right handed person to insert coins, without constantly scraping them up against the side of the machine. Why?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R4QXcA7lDMI/AAAAAAAAAGU/UdUtsKip2Bc/s1600-h/08012008%28001%29_edited-1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R4QXcA7lDMI/AAAAAAAAAGU/UdUtsKip2Bc/s320/08012008%28001%29_edited-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5153269643672358082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the "ticket/change/receipt" hopper is too low. I understand that the machine needs to cater for people of all heights, including wheelchair access - but this is just too low. It requires constant stooping to fetch change and tickets.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the touch screen. I'm not sure where to start with this one, since there are so many aspects ...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the responsiveness (or lack of). there's a lag in the response - so that after you've pressed a soft button, you're not really sure if it's really pressed or not&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the angle - unless your eyes happen to be perpendicular to the screen, your screen presses will be off the mark - it seems that there is enough of a gap between the surface of the touch screen, and the actual LCD screen that this is a real problem.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;Then there's the interaction flow. The series of screens you have to wade through to get a ticket is just plain cumbersome. Some issues are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;To select a destination station, you need to go through a multi level alphabetical menu, or select from a "map". The map isn't too bad, but in combination with the "angle" problem, it's a little hard to use as well.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There are no direct keys for common stations&lt;/li&gt;&lt;br /&gt;&lt;li&gt;why not allow a one touch "daily to Central" from suburban machines?&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I realise that these concerns will not be as prevalent once the smartcard side of things is operational (since most commuters will just use them to top up the value on their cards) - but they will still be relevant for paper tickets.&lt;br /&gt;&lt;br /&gt;A little bit of research shows that these machines aren't a one off design for Translink - they're a customized version of an existing design which goes by the name of "Universal Vendor 1000". I wonder how much usability testing they did?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-5716759221890885570?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/5716759221890885570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=5716759221890885570' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/5716759221890885570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/5716759221890885570'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2008/01/real-world-usability.html' title='Real World Usability'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wv7sKF2Ya-Q/R4QRKw7lDLI/AAAAAAAAAGM/vHr6K6PGAkQ/s72-c/08012008_edited-2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-4971007945574689635</id><published>2008-01-04T14:15:00.000+10:00</published><updated>2008-12-09T08:55:02.367+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse6'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>Photoshop Elements - Migrating to Version 6</title><content type='html'>Well, I thought my migration to Adobe Photoshop Elements Version 6 was complete - and I was very happy with the way things had gone.&lt;br /&gt;&lt;br /&gt;Until, I needed to print one of my pre-migration dated images.&lt;br /&gt;&lt;br /&gt;I was greeted the following, rather unfriendly dialog, and could not print.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R320Gw7lDII/AAAAAAAAAFc/5EKSEi-xCqE/s1600-h/Screenshot+-+4_01_2008+,+2_19_39+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R320Gw7lDII/AAAAAAAAAFc/5EKSEi-xCqE/s320/Screenshot+-+4_01_2008+,+2_19_39+PM.png" alt="" id="BLOGGER_PHOTO_ID_5151471577088724098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Wtf? I was concerned to say the least.&lt;br /&gt;&lt;br /&gt;I re-traced some of my steps ...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;newly edited photos would print ok&lt;/li&gt;&lt;li&gt;new (Version 6) photos were ok&lt;/li&gt;&lt;li&gt;old (pre-version 6) photos were ok&lt;/li&gt;&lt;li&gt;old, edited photos were NOT ok&lt;/li&gt;&lt;/ul&gt;I smelled a rat with the migration process for edited images. The edited images had seemed to be imported as version sets correctly. I did a bit more checking. The following grab shows a typical (albeit) sample image:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/R321aQ7lDJI/AAAAAAAAAFk/LlB6ozvHwoI/s1600-h/Screenshot+-+4_01_2008+,+2_24_59+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/R321aQ7lDJI/AAAAAAAAAFk/LlB6ozvHwoI/s320/Screenshot+-+4_01_2008+,+2_24_59+PM.png" alt="" id="BLOGGER_PHOTO_ID_5151473011607800978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that the original image in the Version set is selected, and the Size attributes are displayed correctly in the Properties window.&lt;br /&gt;&lt;br /&gt;Now, have a look at this next one, with the newer image from the Version set selected:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R322fw7lDKI/AAAAAAAAAFs/quVUt40FhFk/s1600-h/Screenshot+-+4_01_2008+,+2_28_51+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R322fw7lDKI/AAAAAAAAAFs/quVUt40FhFk/s320/Screenshot+-+4_01_2008+,+2_28_51+PM.png" alt="" id="BLOGGER_PHOTO_ID_5151474205608709282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've highlighted the problem area - the image width and height are missing. This was pointing to all not being well with the edited image.&lt;br /&gt;&lt;br /&gt;I waded through the information on the Adobe support site &lt;a href="http://www.adobe.com/support/photoshopelements/"&gt;here&lt;/a&gt;, I couldn't find any exact match. I even resorted to the forums, which are extremely painful to use - and still no match.&lt;br /&gt;&lt;br /&gt;So, I thought - there's nothing for it but to submit a bug report. This itself was fairly painless, but disappointing:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;no reference number, or tracking information was returned.&lt;/li&gt;&lt;li&gt;no acknowledgment that a bug had even been reported (via email, for example).&lt;/li&gt;&lt;/ol&gt;However, I was determined not to be beaten by this. I went back to the support documents, and found that a number of suggested fixes finished with the recommendation to use the "Update Thumbnail" command. What the? I didn't think that this would be appropriate for me - since my thumbnails looked fine, thank you very much.&lt;br /&gt;&lt;br /&gt;Well, I thought - what could possibly go wrong ?&lt;br /&gt;&lt;br /&gt;I'm pleased to report that - it actually fixed the problem!! Woo hoo. I was a little surprised, but relieved to say the least. A few years of editing had not been lost.&lt;br /&gt;&lt;br /&gt;I was wondering why I needed to do this though - I used the supported Catalog conversion process. If PSE needed my thumbnails to be updated, I would have preferred them to be done as part of the migration process.&lt;br /&gt;&lt;br /&gt;However, this exercise did open my eyes to the strange support mechanisms provided by Adobe. When the product itself sports a gleaming new interface, it's a little sad that the support facilities are somewhat lacking - and in case of those forums, downright primitive.&lt;br /&gt;&lt;br /&gt;If any Adobe guys are around - I guess you can close my bug report too :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-4971007945574689635?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/4971007945574689635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=4971007945574689635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4971007945574689635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4971007945574689635'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2008/01/photoshop-elements-migrating-to-version.html' title='Photoshop Elements - Migrating to Version 6'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R320Gw7lDII/AAAAAAAAAFc/5EKSEi-xCqE/s72-c/Screenshot+-+4_01_2008+,+2_19_39+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-6192834328738445934</id><published>2008-01-04T12:04:00.000+10:00</published><updated>2008-01-04T12:22:50.243+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cheat sheet'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Cheat Sheet Extensibility - Part 2</title><content type='html'>Oops.&lt;br /&gt;&lt;br /&gt;I forgot to mention one of the little tricks required to make the cheat sheet actually usable - you need to be able to signal it's completion :-)&lt;br /&gt;&lt;br /&gt;There are a few things required to make this happen:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the task requires a UI control which allows the user to signal that the task is complete. I used a form hyperlink control, similar to the following:&lt;pre&gt;ImageHyperlink link = toolkit.createImageHyperlink(&lt;br /&gt;form.getBody(),&lt;br /&gt;SWT.WRAP);&lt;br /&gt;Image img = AbstractUIPlugin.imageDescriptorFromPlugin(&lt;br /&gt;Activator.PLUGIN_ID, "/icons/complete_task.gif").createImage();&lt;br /&gt;link.setImage(img);&lt;br /&gt;link.addHyperlinkListener(this);&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;a reference to the task being edited must be obtained. Fortunately, this is made available when the setInput method is called. In this method, use some code like this:&lt;/p&gt;&lt;pre&gt;public void setInput(IEditableTask _task, IMemento memento) {&lt;br /&gt;task = _task;&lt;br /&gt;}&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;attach a listener to the control&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;p&gt;when the link is activated, your listener will be fired. When this happens, the task should be set to complete. This is then just a simple method call using the task instance which has already been saved:&lt;/p&gt;&lt;pre&gt;task.complete();&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-6192834328738445934?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/6192834328738445934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=6192834328738445934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/6192834328738445934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/6192834328738445934'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2008/01/cheat-sheet-extensibility-part-2.html' title='Cheat Sheet Extensibility - Part 2'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-3805474675598656244</id><published>2008-01-02T16:06:00.000+10:00</published><updated>2008-12-09T08:55:02.706+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cheat sheet'/><category scheme='http://www.blogger.com/atom/ns#' term='forms'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Cheat Sheet Extensibility</title><content type='html'>I've been looking at the Eclipse Cheat Sheet capability recently - with a view to using it more as a workflow assistance tool, rather than a "follow these instructions" helper.&lt;br /&gt;As such, the idea of crafting specific tasks that the user can interact with seems an appealing idea.&lt;br /&gt;Here's a screen shot of a simple first attempt.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R3xBpA7lDHI/AAAAAAAAAFU/fpnYygN4DVY/s1600-h/Screenshot+-+3_01_2008+,+11_56_30+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R3xBpA7lDHI/AAAAAAAAAFU/fpnYygN4DVY/s320/Screenshot+-+3_01_2008+,+11_56_30+AM.png" alt="" id="BLOGGER_PHOTO_ID_5151064246685338738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that I've used the Eclipse Forms controls to blend in with the "flat look" layout.&lt;br /&gt;This was pretty easy to get going:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Define a task extension in your plug-in.&lt;br /&gt;&lt;pre&gt;&amp;lt;taskEditor&lt;br /&gt;class="mypdeproject.tasks.MyTaskExtension"&lt;br /&gt;icon="icons/sample.gif"&lt;br /&gt;id="MyPdeProject.taskEditor1"&amp;gt;&lt;br /&gt;&amp;lt;/taskEditor&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Define the class referenced above. It needs to implement org.eclipse.ui.internal.provisional.cheatsheets.TaskEditor&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Implement the required methods. The main one of which is the createControl method - to create the UI controls used to edit the task.&lt;br /&gt;&lt;pre&gt;public void createControl(Composite comp, &lt;br /&gt;     FormToolkit toolkit) {&lt;br /&gt;&lt;br /&gt; form = toolkit.createForm(comp);&lt;br /&gt; form.setText("Hello, Eclipse Forms");&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;Obviously, you may want to define a few more fields in there than this.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Define a complex task, and then reference our newly defined task extension.&lt;br /&gt;&lt;pre&gt;&amp;lt;task id=&amp;quot;t2&amp;quot; kind=&amp;quot;MyPdeProject.taskEditor1&amp;quot; &lt;br /&gt;  name=&amp;quot;Extended task&amp;quot; &lt;br /&gt;  skip=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;intro&amp;gt;&lt;br /&gt;   Introduction Extended&lt;br /&gt;  &amp;lt;/intro&amp;gt;&lt;br /&gt;  &amp;lt;onCompletion&amp;gt;&lt;br /&gt;   This is the Conclusion&lt;br /&gt;  &amp;lt;/onCompletion&amp;gt;&lt;br /&gt;&amp;lt;/task&amp;gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;And that's it! Simple really.&lt;br /&gt;Next, I'll take a look at how you can use task variables to communicate between your tasks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-3805474675598656244?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/3805474675598656244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=3805474675598656244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/3805474675598656244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/3805474675598656244'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2008/01/cheat-sheet-extensibility.html' title='Cheat Sheet Extensibility'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R3xBpA7lDHI/AAAAAAAAAFU/fpnYygN4DVY/s72-c/Screenshot+-+3_01_2008+,+11_56_30+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-4054123080594703236</id><published>2007-12-05T11:22:00.001+10:00</published><updated>2008-12-09T08:55:03.263+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xproc'/><category scheme='http://www.blogger.com/atom/ns#' term='pipeline'/><title type='text'>Getting started with XProc using Eclipse</title><content type='html'>This post looks at how to get started with Norm Walsh's XProc implementation - using Eclipse.&lt;br /&gt;&lt;br /&gt;XProc is an XML Pipeline Language, which is being defined by the folks at the XML Processing Model &lt;a href="http://www.w3.org/XML/Processing/"&gt;Working Group&lt;/a&gt;. Norm has an experimental implementation, hosted at &lt;a href="https://xproc.dev.java.net/"&gt;https://xproc.dev.java.net/&lt;/a&gt;. The release notes are &lt;a href="https://xproc.dev.java.net/release-notes.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Naturally enough, this is as a Netbeans project - but I thought I'd give it a try using Eclipse. It was pretty easy in the end:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Start your favourite Eclipse version - I used 3.3&lt;/li&gt;&lt;li&gt;Add in a Subversion plugin (since dev.java.net uses subversion). I've been using Subclipse lately. See &lt;a href="http://subclipse.tigris.org/"&gt;http://subclipse.tigris.org/&lt;/a&gt; for more details.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Point your SVN explorer to the repository &lt;span style="font-family:courier new;"&gt;https://xproc.dev.java.net/svn/xproc&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Check out as a new Java Project using the Wizard.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Download (some of) the required frameworks ... I found that I could get by with Saxon 6.5 and Saxon 9 to get started. Add these .jars to the build path. Also note that you should add saxon9-s9api.jar  as well as saxon9.jar.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Adjust the build path - so that these two directories are used as the java source:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;java/src&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The second is required, since a number of configuration files are referenced using a path like &lt;span style="font-family:courier new;"&gt;/etc/configuration.xml&lt;/span&gt; and as such, they need to be findable on the classpath. Eclipse will make sure that you exclude java/src from this include. Your classpath should look something like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R1YlZl-yBfI/AAAAAAAAAEo/6gYGnabu3AQ/s1600-h/Screenshot+-+5_12_2007+,+1_52_52+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R1YlZl-yBfI/AAAAAAAAAEo/6gYGnabu3AQ/s320/Screenshot+-+5_12_2007+,+1_52_52+PM.png" alt="" id="BLOGGER_PHOTO_ID_5140337146312394226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I used the xproc.Driver class to do a simple test. It was not long before I realized that things were not happy due to my running on a Windows box. I needed to change this line:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;       hash.put(port, "file://" + fn);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;to this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;       hash.put(port, "file://" + "/" + fn);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I then needed to use this sort of command line arguments:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-i source=c:\fred.xml java/samples/count.xpl&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;This just runs the count pipeline against a simple xml document.&lt;/ol&gt;Simple.&lt;br /&gt;&lt;br /&gt;Here's a screenshot of the project contents:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/R1Yj01-yBeI/AAAAAAAAAEg/XcSIRR7TF-A/s1600-h/Screenshot+-+5_12_2007+,+1_51_01+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/R1Yj01-yBeI/AAAAAAAAAEg/XcSIRR7TF-A/s320/Screenshot+-+5_12_2007+,+1_51_01+PM.png" alt="" id="BLOGGER_PHOTO_ID_5140335415440573922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note that some errors are shown (since not all required libraries are provided), and that all three of the saxon libs are required.&lt;br /&gt;&lt;br /&gt;And for good measure, here's a screen shot of a successful run:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R1YoPV-yBgI/AAAAAAAAAEw/ZCwFyU74LOI/s1600-h/Screenshot+-+5_12_2007+,+1_55_06+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R1YoPV-yBgI/AAAAAAAAAEw/ZCwFyU74LOI/s320/Screenshot+-+5_12_2007+,+1_55_06+PM.png" alt="" id="BLOGGER_PHOTO_ID_5140340268753618434" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-4054123080594703236?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/4054123080594703236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=4054123080594703236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4054123080594703236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4054123080594703236'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/12/getting-started-with-xproc-using.html' title='Getting started with XProc using Eclipse'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R1YlZl-yBfI/AAAAAAAAAEo/6gYGnabu3AQ/s72-c/Screenshot+-+5_12_2007+,+1_52_52+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-6956137821147260123</id><published>2007-11-27T14:43:00.000+10:00</published><updated>2008-12-09T08:55:04.210+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rcp'/><category scheme='http://www.blogger.com/atom/ns#' term='svg'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Declarative Eclipse Branding with SVG</title><content type='html'>Recently, I had need to add some Eclipse branding graphics to an RCP application.&lt;br /&gt;&lt;br /&gt;Rather than take the "easy" route of using an image editor, I thought I'd explore the use of SVG to produce the required images in a declarative kind of way.&lt;br /&gt;&lt;br /&gt;Using SVG for this purpose has a number of advantages ...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;they are cross platform&lt;/li&gt;&lt;li&gt;the declarative, text file nature allows the content to be generated&lt;/li&gt;&lt;li&gt;they can be created using open-source tools&lt;/li&gt;&lt;/ul&gt;The downside is that the bitmaps required for Eclipse branding must be in BMP format - not the newer PNG alternative. This is covered in detail in this Eclipse bug report - &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=21315"&gt;https://bugs.eclipse.org/bugs/show_bug.cgi?id=21315&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Fortunately, this can be overcome by converting the SVG images to a bitmap format by using a conversion program called a "rasterizer".&lt;br /&gt;&lt;br /&gt;A good example of a rasterizer is Batik - an open-source toolkit for manipulating SVG images.&lt;br /&gt;See http://xmlgraphics.apache.org/batik/tools/rasterizer.html for further details on the Batik rasterizer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Round Trip example&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's a simple example of some SVG source to get started.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;&lt;br /&gt;&amp;lt;svg&lt;br /&gt;xmlns:svg="http://www.w3.org/2000/svg"&lt;br /&gt;xmlns="http://www.w3.org/2000/svg"&lt;br /&gt;xmlns:xlink="http://www.w3.org/1999/xlink"&lt;br /&gt;width="500"&lt;br /&gt;height="330"&lt;br /&gt;id="drawing"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;defs&gt;&lt;br /&gt;&amp;lt;g id="mytext"&gt;&lt;br /&gt;&amp;lt;text&lt;br /&gt;xml:space="preserve"&lt;br /&gt;style="font-size:40px;font-weight:normal;text-align:start;line-height:100%;text-anchor:start;font-family:Bitstream Vera Sans"&lt;br /&gt;x="200" y="125"&gt;Hello&amp;lt;/text&gt;&lt;br /&gt;&amp;lt;text&lt;br /&gt;xml:space="preserve"&lt;br /&gt;style="font-size:40px;font-weight:normal;text-align:start;line-height:100%;text-anchor:start;font-family:Bitstream Vera Sans"&lt;br /&gt;x="200" y="170"&gt;World ...&amp;lt;/text&gt;&lt;br /&gt;&amp;lt;/g&gt;&lt;br /&gt;&amp;lt;/defs&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;rect style="fill:black"    width="500" height="330" x="0" y="0" /&gt;&lt;br /&gt;&amp;lt;use xlink:href="#mytext" style="fill:white" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/svg&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;This produces a result like this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R0uqVGpnYWI/AAAAAAAAADw/Kt35GsMSCl4/s1600-h/drawing5.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R0uqVGpnYWI/AAAAAAAAADw/Kt35GsMSCl4/s320/drawing5.png" alt="" id="BLOGGER_PHOTO_ID_5137387079485317474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In order to produce this image for the web, I used the Batik rasterizer. For example, the command I used was this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;C:\&gt;java -jar c:\jshare\batik-1.7\batik-rasterizer.jar drawing5.svg&lt;br /&gt;About to transcode 1 SVG file(s)&lt;br /&gt;&lt;br /&gt;Converting drawing5.svg to drawing5.png ... ... success&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Once you have a PNG format image, it's a "simple" matter of converting that to a BMP format. The simplicity involved depends on your platform:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;if you're on Windows - you can use Microsoft Paint: open the PNG and then save as BMP&lt;/li&gt;&lt;li&gt;if you're on Linux - you can use GIMP&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Refining your Image&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, that's produced a very simple image. But one of the advantages of SVG is that you can get very nice effects with a minimum of effort.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 1 - Background Gradient&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&amp;gt;&lt;br /&gt;&amp;lt;svg&lt;br /&gt;xmlns:svg="http://www.w3.org/2000/svg"&lt;br /&gt;xmlns="http://www.w3.org/2000/svg"&lt;br /&gt;xmlns:xlink="http://www.w3.org/1999/xlink"&lt;br /&gt;width="500"&lt;br /&gt;height="330"&lt;br /&gt;id="drawing"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;defs&amp;gt;&lt;br /&gt;&amp;lt;g id="mytext"&amp;gt;&lt;br /&gt;    &amp;lt;text&lt;br /&gt;  xml:space="preserve"&lt;br /&gt;  style="font-size:40px;font-weight:normal;text-align:start;line-height:100%;text-anchor:start;font-family:Bitstream Vera Sans"&lt;br /&gt;  x="200" y="125"&amp;gt;Hello&amp;lt;/text&amp;gt;&lt;br /&gt;    &amp;lt;text&lt;br /&gt;  xml:space="preserve"&lt;br /&gt;  style="font-size:40px;font-weight:normal;text-align:start;line-height:100%;text-anchor:start;font-family:Bitstream Vera Sans"&lt;br /&gt;  x="200" y="170"&amp;gt;World ...&amp;lt;/text&amp;gt;&lt;br /&gt;&amp;lt;/g&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;linearGradient id="top"&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="0%"   style="stop-color: black;"/&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="100%" style="stop-color: #484848;"/&amp;gt;&lt;br /&gt;&amp;lt;/linearGradient&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/defs&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;rect style="fill:url(#top)"    width="500" height="330" x="0" y="0" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;use xlink:href="#mytext" style="fill:white" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/svg&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;This produces a result like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R0uxnGpnYXI/AAAAAAAAAD4/DZ7p_8-5iJA/s1600-h/drawing5b.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R0uxnGpnYXI/AAAAAAAAAD4/DZ7p_8-5iJA/s320/drawing5b.png" alt="" id="BLOGGER_PHOTO_ID_5137395085304357234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nice enough, but the default direction for a gradient is from left to right.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 2 - Background Gradient - in the correct direction&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Here, we use another gradient - with a direction specifier - and embed the first.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;lt;linearGradient id="top"&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="0%"   style="stop-color: black;"/&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="100%" style="stop-color: #484848;"/&amp;gt;&lt;br /&gt;&amp;lt;/linearGradient&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;linearGradient id="topa"&lt;br /&gt;  xlink:href="#top"&lt;br /&gt;  x1="0%" y1="0%" x2="0%" y2="100%"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/defs&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;rect style="fill:url(#topa)"    width="500" height="330" x="0" y="0" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This produces a result like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R0ux52pnYYI/AAAAAAAAAEA/mOJzvl3e89k/s1600-h/drawing6.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R0ux52pnYYI/AAAAAAAAAEA/mOJzvl3e89k/s320/drawing6.png" alt="" id="BLOGGER_PHOTO_ID_5137395407426904450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 3 - Background Gradient - with a horizon effect&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This refinement adds a horizon - by splitting the image in two - at 200 px down, and using two gradients.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;lt;linearGradient id="top"&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="0%"   style="stop-color: black;"/&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="100%" style="stop-color: #484848;"/&amp;gt;&lt;br /&gt;&amp;lt;/linearGradient&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;linearGradient id="topa"&lt;br /&gt;  xlink:href="#top"&lt;br /&gt;  x1="0%" y1="0%" x2="0%" y2="100%"/&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;linearGradient id="bottom"&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="0%"   style="stop-color: #707070;"/&amp;gt;&lt;br /&gt;  &amp;lt;stop offset="100%" style="stop-color: black;"/&amp;gt;&lt;br /&gt;&amp;lt;/linearGradient&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;linearGradient id="bottoma"&lt;br /&gt;  xlink:href="#bottom"&lt;br /&gt;  x1="0%" y1="0%" x2="0%" y2="100%"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/defs&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;rect style="fill:url(#topa)"    width="500" height="200" x="0" y="0" /&amp;gt;&lt;br /&gt;&amp;lt;rect style="fill:url(#bottoma)" width="500" height="130" x="0" y="200" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This produces a result like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R0uzn2pnYaI/AAAAAAAAAEQ/Ppj5HhxutKI/s1600-h/drawing7.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R0uzn2pnYaI/AAAAAAAAAEQ/Ppj5HhxutKI/s320/drawing7.png" alt="" id="BLOGGER_PHOTO_ID_5137397297212514722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 4 - With a Graphic&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Naturally, if we are doing a nice, modern style image, we should use some modern styled clip-art to give the image a lift. Since we are using SVG, there is a whole world of choice at the &lt;a href="http://www.openclipart.org/"&gt;Open Clip Art&lt;/a&gt; project.  For my Hello World example, I've chosen a nice clean globe.&lt;br /&gt;&lt;br /&gt;In order to use a graphic, download the source to separate file. It can then be included in two different ways:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;cut and paste the source code into your SVG file&lt;/li&gt;&lt;li&gt;save it to a separate file, and reference it as below using the image tag.&lt;/li&gt;&lt;/ol&gt;Note that I have applied a scale transformation to make the image fit in.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;lt;g id="globe"&amp;gt;&lt;br /&gt; &amp;lt;image xlink:href="globe.svg"&lt;br /&gt; width="500" height="500" x="0" y="0"&lt;br /&gt; transform="scale(0.25)"/&amp;gt;&lt;br /&gt;&amp;lt;/g&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/defs&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;rect style="fill:url(#topa)"    width="500" height="200" x="0" y="0" /&amp;gt;&lt;br /&gt;&amp;lt;rect style="fill:url(#bottoma)" width="500" height="130" x="0" y="200" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;use xlink:href="#mytext" style="fill:white" /&amp;gt;&lt;br /&gt;&amp;lt;use xlink:href="#globe" x="60" y="80" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This produces a result like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/R0uzOWpnYZI/AAAAAAAAAEI/iGxSoEhg9oI/s1600-h/drawing8.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/R0uzOWpnYZI/AAAAAAAAAEI/iGxSoEhg9oI/s320/drawing8.png" alt="" id="BLOGGER_PHOTO_ID_5137396859125850514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 5 - With a Reflection&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;No self-respecting modern image would be complete without the "reflection" technique! This is amazingly simple using SVG - just apply a transform effect on the use tag.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;lt;use xlink:href="#mytext" style="fill:white" /&amp;gt;&lt;br /&gt;&amp;lt;use xlink:href="#mytext" style="fill:white;opacity:0.25"  transform="matrix(1 0 0 -1 0 400)"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;use xlink:href="#globe" x="60" y="80" /&amp;gt;&lt;br /&gt;&amp;lt;use xlink:href="#globe" style="opacity:0.25" x="60" y="80" transform="matrix(1 0 0 -1 0 400)"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This produces a result like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R0uz62pnYbI/AAAAAAAAAEY/Qaesm7k_xYo/s1600-h/drawing9.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/R0uz62pnYbI/AAAAAAAAAEY/Qaesm7k_xYo/s320/drawing9.png" alt="" id="BLOGGER_PHOTO_ID_5137397623630029234" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-6956137821147260123?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/6956137821147260123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=6956137821147260123' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/6956137821147260123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/6956137821147260123'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/11/declarative-eclipse-branding-with-svg.html' title='Declarative Eclipse Branding with SVG'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wv7sKF2Ya-Q/R0uqVGpnYWI/AAAAAAAAADw/Kt35GsMSCl4/s72-c/drawing5.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-2085693240277040415</id><published>2007-11-02T10:35:00.000+10:00</published><updated>2008-12-09T08:55:04.533+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>Photoshop Elements - Explorer</title><content type='html'>As a way of investigating the internals of the Adobe Photoshop Elements (PSE) meta tags, I thought I'd whip up a little Eclipse plug-in to do some experimentation.&lt;br /&gt;&lt;br /&gt;The primary purpose was to provide a means of exporting my metadata. I do a little editing within PSE, but my largest investment is in the metadata attached to (almost) every photo.&lt;br /&gt;&lt;br /&gt;I realize that you can (and should) backup your PSE catalog using the supplied tools, but this approach also provides a degree of independence should I ever wish to decamp to another product.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Plug-in Structure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The following diagram shows the plug-in dependency hierarchy. The diagram was produced using the brilliant &lt;a href="http://www.eclipse.org/pde/incubator/dependency-visualization/"&gt;Plug-in Dependency Visualization Tool&lt;/a&gt; from Ian Bull, also described &lt;a href="http://irbull.blogspot.com/2007/10/plug-in-dependency-visualization.html"&gt;here&lt;/a&gt; on his blog.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/RypzwxwQ3UI/AAAAAAAAADY/PK8wDk21Xmw/s1600-h/Screenshot+-+2_11_2007+,+10_33_33+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/RypzwxwQ3UI/AAAAAAAAADY/PK8wDk21Xmw/s320/Screenshot+-+2_11_2007+,+10_33_33+AM.png" alt="" id="BLOGGER_PHOTO_ID_5128038407541415234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As can be seen from the hierarchy, I make use of a number of libraries, packaged as plug-ins.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XOM - to provide XML support. See &lt;a href="http://www.xom.nu/"&gt;here&lt;/a&gt; for more details on XOM.&lt;/li&gt;&lt;li&gt;SQLite JDBC driver. See &lt;a href="http://www.zentus.com/sqlitejdbc/"&gt;here&lt;/a&gt; for more details.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I had a few choices about how I was going to deploy it - workbench, RCP or even scriptable via Eclipse Monkey ... but I thought the workbench plug-in would be the simplest thing to get started.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Workbench Integration&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Since I was aiming for the workbench, it made sense to provide some integration with the functionality you get for free! The two most obvious points are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;workbench properties&lt;/li&gt;&lt;li&gt;an image viewer&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It's very easy to integrate with the workbench Properties View. This is very well documented - in particular in this &lt;a href="http://www.eclipse.org/articles/Article-Properties-View/properties-view.html"&gt;article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have also encountered a great image viewer, courtesy of Wayne Beaton - see &lt;a href="http://wbeaton.blogspot.com/2006/02/image-view-plugin.html"&gt;here&lt;/a&gt; for more details.&lt;br /&gt;&lt;br /&gt;The great thing about making use of these functions is that they simply require an adapter to the required class to exploit the functionality.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the Properties View needs an adapter to an IPropertySource implementation&lt;/li&gt;&lt;li&gt;the Image View plug-in requires an adapter to an ImageProvider implementation.&lt;/li&gt;&lt;/ul&gt;To keep things simple, I initially coded up the getAdapter code directly into the model - but, with a teeny bit of thought - and prompting from Wayne's latest "adapters" articles &lt;a href="http://dev.eclipse.org/blogs/wayne/2007/10/23/adapters-part-deux/"&gt;here&lt;/a&gt; - it made sense to extract them into an AdapterFactory. And after doing this, it made sense to extract the whole model to it's own plug-in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Plug-in Functionality&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's pretty basic - a simple PSE Explorer View, which lists the contents of the catalog, and two menu options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;one to load an existing PSE catalog file (SQLite database)&lt;/li&gt;&lt;li&gt;one to export the loaded PSE catalog as an XML Document.&lt;/li&gt;&lt;/ul&gt;The following screen shot shows the plug-in in action - with the PSE Explorer view on the top half of the screen, and the properties and Image View on the bottom.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Ryp96xwQ3VI/AAAAAAAAADg/mtTyFwDAfQk/s1600-h/Screenshot+-+1_11_2007+,+2_54_48+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Ryp96xwQ3VI/AAAAAAAAADg/mtTyFwDAfQk/s320/Screenshot+-+1_11_2007+,+2_54_48+PM.png" alt="" id="BLOGGER_PHOTO_ID_5128049574456384850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The plug-in functionality is initiated by the two command handlers (corresponding to the menu items) - that is, import and export.&lt;br /&gt;&lt;br /&gt;The import function is facilitated by a simple DataProvider class. This provides the means of accessing the SQLite database and populating the model used by the viewer. The SQL used is similar to my &lt;a href="http://evans-stuff.blogspot.com/2007/10/exploring-pse6-database.html"&gt;earlier&lt;/a&gt; experiments.&lt;br /&gt;&lt;br /&gt;The export function merely provides an XML transformer for the populated model. The results of the export looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/RyqCwRwQ3WI/AAAAAAAAADo/C0eFcQlkB3A/s1600-h/Screenshot+-+2_11_2007+,+11_44_43+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/RyqCwRwQ3WI/AAAAAAAAADo/C0eFcQlkB3A/s320/Screenshot+-+2_11_2007+,+11_44_43+AM.png" alt="" id="BLOGGER_PHOTO_ID_5128054891625897314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is just a starting point, but it has provided a easy way for exploring the PSE metadata. With a bit more polish, I'll see if I can release some of the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-2085693240277040415?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/2085693240277040415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=2085693240277040415' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/2085693240277040415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/2085693240277040415'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/11/photoshop-elements-explorer.html' title='Photoshop Elements - Explorer'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wv7sKF2Ya-Q/RypzwxwQ3UI/AAAAAAAAADY/PK8wDk21Xmw/s72-c/Screenshot+-+2_11_2007+,+10_33_33+AM.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-4874086294652773993</id><published>2007-10-24T14:53:00.000+10:00</published><updated>2008-12-09T08:55:05.208+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><title type='text'>Photoshop Elements - User Interface</title><content type='html'>In my recent experimentation with Photoshop Elements 6 (PSE6), I was quite surprised by some of the user interface (UI) techniques employed.&lt;br /&gt;&lt;br /&gt;For example, with the "Albums" and "Keyword Tags" palettes, there is a "New" button, as shown below - the bright green cross - &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7VDC5czpI/AAAAAAAAADQ/AhV3JadKNkQ/s1600-h/Screenshot+-+24_10_2007+,+3_10_49+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7VDC5czpI/AAAAAAAAADQ/AhV3JadKNkQ/s320/Screenshot+-+24_10_2007+,+3_10_49+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124767674288361106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7Qvy5czlI/AAAAAAAAACw/JDxVvyQNweg/s1600-h/Screenshot+-+24_10_2007+,+2_49_03+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7Qvy5czlI/AAAAAAAAACw/JDxVvyQNweg/s320/Screenshot+-+24_10_2007+,+2_49_03+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124762945529368146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When you hover, the tooltip text shows as below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7RSS5czmI/AAAAAAAAAC4/n-wb5aRcrbE/s1600-h/Screenshot+-+24_10_2007+,+2_58_43+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7RSS5czmI/AAAAAAAAAC4/n-wb5aRcrbE/s320/Screenshot+-+24_10_2007+,+2_58_43+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124763538234855010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;But what if you wanted to collapse or expand the tree? There doesn't seem to be any actions available for that. Let's click the "New" button - which is a pull-down, and see what happens ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7SCC5cznI/AAAAAAAAADA/7SUPX-Grao4/s1600-h/Screenshot+-+24_10_2007+,+2_49_43+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7SCC5cznI/AAAAAAAAADA/7SUPX-Grao4/s320/Screenshot+-+24_10_2007+,+2_49_43+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124764358573608562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aaahhh. There they are. At the bottom of the "New" menu.&lt;br /&gt;&lt;br /&gt;what the?&lt;br /&gt;&lt;br /&gt;It seems that it's basically overloading that first tool bar button. I'm not sure why. For fear of cluttering up the tool bar perhaps.&lt;br /&gt;&lt;br /&gt;An alternative would be to make the buttons explicit - perhaps like the Eclipse style ones shown here (as the boxed "-" and "+"):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7TQC5czoI/AAAAAAAAADI/GjlK6vftT68/s1600-h/Screenshot+-+24_10_2007+,+2_51_37+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7TQC5czoI/AAAAAAAAADI/GjlK6vftT68/s320/Screenshot+-+24_10_2007+,+2_51_37+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124765698603404930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A little more thought needs to go into style guides for these interfaces I think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-4874086294652773993?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/4874086294652773993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=4874086294652773993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4874086294652773993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4874086294652773993'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/10/photoshop-elements-user-interface.html' title='Photoshop Elements - User Interface'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx7VDC5czpI/AAAAAAAAADQ/AhV3JadKNkQ/s72-c/Screenshot+-+24_10_2007+,+3_10_49+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-9196045122459476792</id><published>2007-10-23T10:53:00.000+10:00</published><updated>2008-12-09T08:55:07.037+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>Photoshop Elements - Smart Albums</title><content type='html'>My investigations are continuing with Adobe Photoshop Elements 6 (PSE6). And this post looks at the new feature called Smart Albums.&lt;br /&gt;&lt;br /&gt;They are based on the same concept as the Smart Playlist in iTunes. That is, they are defined searches - rather than specific, static items - so that the Album contents always stays current.&lt;br /&gt;&lt;br /&gt;It is a good feature to include, and in general seems well done. But, I've encountered a few usability issues which seem important.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1. User Interface to Modify a Smart Album&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This seems strange. The problem is that there are two different "edit" operations - the most obvious seems to be to select the Smart Album, and then the Edit toolbar icon. In this case, I've selected the album called "Smart Taxis".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1OYC5czZI/AAAAAAAAABQ/0dh4qQKOtRU/s1600-h/Screenshot+-+23_10_2007+,+11_09_14+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1OYC5czZI/AAAAAAAAABQ/0dh4qQKOtRU/s320/Screenshot+-+23_10_2007+,+11_09_14+AM.png" alt="" id="BLOGGER_PHOTO_ID_5124338126019153298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Indeed, the hover text indicates "Edit Smart Taxis Album". When you select this action, you get a dialog which only allows you to change the name! It conveniently tells you about the criteria though.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1OpC5czaI/AAAAAAAAABY/bW32iso_ZzU/s1600-h/Screenshot+-+23_10_2007+,+11_12_45+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1OpC5czaI/AAAAAAAAABY/bW32iso_ZzU/s320/Screenshot+-+23_10_2007+,+11_12_45+AM.png" alt="" id="BLOGGER_PHOTO_ID_5124338418076929442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To modify the search criteria, you instead need to follow this process:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Active the smart album, by selecting it from the Album palette&lt;/li&gt;&lt;li&gt;From the organizer, select the Options pulldown &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1O_S5czbI/AAAAAAAAABg/Nq0ixwNU-gQ/s1600-h/Screenshot+-+23_10_2007+,+11_15_27+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1O_S5czbI/AAAAAAAAABg/Nq0ixwNU-gQ/s320/Screenshot+-+23_10_2007+,+11_15_27+AM.png" alt="" id="BLOGGER_PHOTO_ID_5124338800329018802" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Then select "Modify Search Details"&lt;/li&gt;&lt;li&gt;You then, finally, see the dialog - which is entitled "Find by Details (Metadata)"&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1PNC5czcI/AAAAAAAAABo/mRAitD5Pw2U/s1600-h/Screenshot+-+23_10_2007+,+11_17_12+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1PNC5czcI/AAAAAAAAABo/mRAitD5Pw2U/s320/Screenshot+-+23_10_2007+,+11_17_12+AM.png" alt="" id="BLOGGER_PHOTO_ID_5124339036552220098" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;You then still need to make the changes you need, and if you want to change that same album, select the check box and type your original name, and press "Search" ??&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1TNi5czgI/AAAAAAAAACI/tvcXGLF-zSY/s1600-h/Screenshot+-+23_10_2007+,+11_19_38+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1TNi5czgI/AAAAAAAAACI/tvcXGLF-zSY/s320/Screenshot+-+23_10_2007+,+11_19_38+AM.png" alt="" id="BLOGGER_PHOTO_ID_5124343443188665858" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A helpful dialog then tells you that this album exists, and would you like to replace it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1PbC5czdI/AAAAAAAAABw/qlQsLnq_KUk/s1600-h/Screenshot+-+23_10_2007+,+11_21_31+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1PbC5czdI/AAAAAAAAABw/qlQsLnq_KUk/s320/Screenshot+-+23_10_2007+,+11_21_31+AM.png" alt="" id="BLOGGER_PHOTO_ID_5124339277070388690" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;OMG! In doing this post, I've just realized that it doesn't replace your album - PSE6 adds another album - with the same name.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1Qci5czfI/AAAAAAAAACA/67loy3O6Tqs/s1600-h/Screenshot+-+23_10_2007+,+11_37_11+AM.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1Qci5czfI/AAAAAAAAACA/67loy3O6Tqs/s320/Screenshot+-+23_10_2007+,+11_37_11+AM.png" alt="" id="BLOGGER_PHOTO_ID_5124340402351820274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To be slightly fair, the dialog text doesn't actually say it's going to replace that album - it says "Click OK to create a Smart Album with this name anyway". I guess it could be seen as helping to provide some form of version control. But still, it doesn't seem terribly obvious.&lt;br /&gt;&lt;br /&gt;What's going on here?&lt;br /&gt;&lt;br /&gt;It seems that there is a basic disconnect between the two halves of the screen - the Organizer on the left - with the find bar showing Search Criteria - and the Album palette on the right - which talks in Albums.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2. Smart Album search criteria&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, some of the search criteria available seems a little restrictive - that is, a bit lacking in flexibility. Some examples may help to illustrate:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Can't use "not Include" with the "Keyword Tags" search - only Include:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx16AC5czjI/AAAAAAAAACg/cIhAZFBRhlY/s1600-h/Screenshot+-+23_10_2007+,+2_27_11+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx16AC5czjI/AAAAAAAAACg/cIhAZFBRhlY/s320/Screenshot+-+23_10_2007+,+2_27_11+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124386092213915186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Can't use Smart Albums as the argument with the "Albums" search. The only albums presented in the list are standard (static) Albums.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx193C5czkI/AAAAAAAAACo/OeF9SAnqn0w/s1600-h/Screenshot+-+23_10_2007+,+2_28_03+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx193C5czkI/AAAAAAAAACo/OeF9SAnqn0w/s320/Screenshot+-+23_10_2007+,+2_28_03+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124390335641603650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This would allow for a tree structured, or nested style search. This is also something which iTunes seems to manage ok.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I'm sure there are others, but these are the ones which seem to leap out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Smart Albums is a good start - but it would nice to see them just a little bit smarter ... and easier to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-9196045122459476792?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/9196045122459476792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=9196045122459476792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/9196045122459476792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/9196045122459476792'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/10/photoshop-elements-smart-albums.html' title='Photoshop Elements - Smart Albums'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1OYC5czZI/AAAAAAAAABQ/0dh4qQKOtRU/s72-c/Screenshot+-+23_10_2007+,+11_09_14+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-7769230645222257368</id><published>2007-10-16T15:52:00.000+10:00</published><updated>2008-12-09T08:55:07.231+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>Exploring the PSE6 Database</title><content type='html'>Curiosity has got the better of me, and I needed to see a little bit more of the Photoshop Elements 6 (PSE6) database.&lt;br /&gt;&lt;br /&gt;You can use standard SQL to poke around, but for simple things I found a great tool in SQLite Expert Personal. It's a simple database exploration tool. The main screen looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/RxRS-Ptr7KI/AAAAAAAAABE/vvDafxNCrA8/s1600-h/post8a.JPG"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/RxRS-Ptr7KI/AAAAAAAAABE/vvDafxNCrA8/s320/post8a.JPG" alt="" id="BLOGGER_PHOTO_ID_5121809905550617762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Naturally, I also needed to try some SQL too. This query retrieves the Star rating (from 0 to 5) for all images:&lt;br /&gt;&lt;blockquote style="font-family: lucida grande;"&gt;select media.id as recid, media.full_filepath&lt;br /&gt;          , mdint.value as rating&lt;br /&gt;from media_table as media&lt;br /&gt; join media_to_metadata_table    as mm on media.id = mm.media_id&lt;br /&gt; join metadata_integer_table     as mdint on mm.metadata_id = mdint.id&lt;br /&gt; join metadata_description_table as mdesc on mdint.description_id = mdesc.id&lt;br /&gt;where mdesc.identifier = "xmp:Rating"&lt;br /&gt; and mime_type = "image/jpeg"&lt;br /&gt;&lt;/blockquote&gt;Another test query is to retrieve the user tags for an image:&lt;br /&gt;&lt;blockquote style="font-family: lucida grande;"&gt;select media.id as recid, tt.name&lt;br /&gt;from media_table as media&lt;br /&gt;join tag_to_media_table as t2m on media.id  = t2m.media_id&lt;br /&gt;join tag_table          as tt on t2m.tag_id = tt.id&lt;br /&gt;where media.id = 276&lt;br /&gt;and  type_name like 'user%'&lt;br /&gt;&lt;/blockquote&gt;I think that I'll put these to further use soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-7769230645222257368?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/7769230645222257368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=7769230645222257368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/7769230645222257368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/7769230645222257368'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/10/exploring-pse6-database.html' title='Exploring the PSE6 Database'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wv7sKF2Ya-Q/RxRS-Ptr7KI/AAAAAAAAABE/vvDafxNCrA8/s72-c/post8a.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-4775751402865186491</id><published>2007-10-15T15:11:00.000+10:00</published><updated>2008-12-09T08:55:07.590+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='commands'/><title type='text'>Eclipse Commands</title><content type='html'>The new command framework for Eclipse looks quite good. But I found it a little hard to get started with it.&lt;br /&gt;&lt;br /&gt;I've found some really useful info here though:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://richclientplatform.blogspot.com/2007/07/new-menu-contribution-extension.html"&gt;http://richclientplatform.blogspot.com/2007/07/new-menu-contribution-extension.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.eclipse.org/Platform_Command_Framework#Commands"&gt;http://wiki.eclipse.org/Platform_Command_Framework#Commands&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;    &lt;/ul&gt; One problem I've encountered though, is how to determine the command Id for an existing workbench function. In this case, I wanted the "&lt;span style="font-family:trebuchet ms;"&gt;Help -&amp;gt; About"  &lt;/span&gt;function to be present in my RCP app.&lt;br /&gt;&lt;br /&gt;I stumbled across a simple solution - cheat! That is, use the Cheat Sheets wizard to give a helping hand. (Thanks to &lt;a href="http://mea-bloga.blogspot.com/"&gt;Chris Aniszczyk&lt;/a&gt; for his informative &lt;a href="http://www-128.ibm.com/developerworks/opensource/library/os-eclipse-ua/"&gt;article&lt;/a&gt; on Cheat Sheets - reading it gave me the inspiration for this!)&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;     Create a new cheat sheet, by selecting &lt;span style="font-family:trebuchet ms;"&gt;File -&amp;gt; New ...&lt;/span&gt; and then selecting "Cheat Sheet".   &lt;/li&gt;   &lt;li&gt;     Just use any name, and specify a "Simple" cheat sheet.   &lt;/li&gt;   &lt;li&gt;     Once in the editor, select the "Item" - and on the right hand side of the form, you will be able to specify a command - using the gift of Browse.&lt;br /&gt;&lt;div id="ajro" style="padding: 1em 0pt; text-align: left;"&gt;      &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1dRi5czhI/AAAAAAAAACQ/9z1WbfEz_u8/s1600-h/Screenshot+-+23_10_2007+,+12_30_03+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1dRi5czhI/AAAAAAAAACQ/9z1WbfEz_u8/s320/Screenshot+-+23_10_2007+,+12_30_03+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124354507024420370" border="0" /&gt;&lt;/a&gt;    &lt;/div&gt;&lt;/li&gt;   &lt;li&gt;     Click on the Browse button, and you'll be presented with a list of common workbench commands. For example:&lt;br /&gt;&lt;div id="g:gq" style="padding: 1em 0pt; text-align: left;"&gt;       &lt;div id="swu4" style="padding: 1em 0pt; text-align: left;"&gt;        &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1dcy5cziI/AAAAAAAAACY/HlxVzAbjorc/s1600-h/Screenshot+-+23_10_2007+,+12_31_30+PM.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1dcy5cziI/AAAAAAAAACY/HlxVzAbjorc/s320/Screenshot+-+23_10_2007+,+12_31_30+PM.png" alt="" id="BLOGGER_PHOTO_ID_5124354700297948706" border="0" /&gt;&lt;/a&gt;      &lt;/div&gt;     &lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     You can then select the Command, and even press "Execute" to try it.   &lt;/li&gt; &lt;/ol&gt; I've found this a handy trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-4775751402865186491?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/4775751402865186491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=4775751402865186491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4775751402865186491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/4775751402865186491'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/10/it-seems-that-im-not-only-one-still.html' title='Eclipse Commands'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wv7sKF2Ya-Q/Rx1dRi5czhI/AAAAAAAAACQ/9z1WbfEz_u8/s72-c/Screenshot+-+23_10_2007+,+12_30_03+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-2650325565281095089</id><published>2007-10-12T13:36:00.000+10:00</published><updated>2007-10-23T14:57:18.818+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='pse'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>Photoshop Elements</title><content type='html'>Well, I finally took the plunge - and upgraded my Photoshop Elements 3.0 (and Photoshop Album) to the new Photoshop Elements 6.0 (PSE6).&lt;br /&gt;&lt;br /&gt;A few things caused the change:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the old version was starting to creak a little bit&lt;/li&gt;&lt;li&gt;lots of annoying little bits -like no alternative date format&lt;/li&gt;&lt;li&gt;the ability to use star ratings&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the shiny new interface looked cool!&lt;/li&gt;&lt;/ul&gt;The upgrade went really well. As other people have noticed - you need to then manually go and convert your old catalogs using the "Catalog Manager" (File -&gt; Catalogs ...).&lt;br /&gt;&lt;br /&gt;One disappointment is that there (still) does not seem to be an adequate interface to Flickr. What is with the whole Adobe Partner Services thing? As such, in the past I've whipped up some Java to scan my PSE catalog (stored in an Access/Jet style) database, and reconcile that against my Flickr account - using the flickrj project as the framework.&lt;br /&gt;&lt;br /&gt;One pleasant surprise is that the framework used to store the database &lt;span style="font-style: italic;"&gt;has&lt;/span&gt; been updated. It now uses something called &lt;a href="http://www.sqlite.org/index.html"&gt;SQLite&lt;/a&gt;. This looks really interesting, as it is a well featured SQL database, which stores it's entire contents in a single file. (Apparently, Lightroom also uses SQLite, but I think a different schema.)&lt;br /&gt;&lt;br /&gt;Naturally, I needed to check out the schema. Two ways spring to mind:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Native access - via the SQLite facilities&lt;/li&gt;&lt;li&gt;JDBC access.&lt;/li&gt;&lt;/ol&gt;A few little notes on each follow below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Native SQLite Access&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;download the executable from &lt;a href="http://www.sqlite.org/download.html"&gt;here&lt;/a&gt;. This gives you a zip. Simply extract the contents - a single .exe to a location of your choice.&lt;/li&gt;&lt;li&gt;locate your PSE catalog location - an easy way is to use the Help -&gt; System Info ... menu option.&lt;/li&gt;&lt;li&gt;use the command sqlite3 filename&lt;/li&gt;&lt;/ol&gt;This gives you a simple command line interface. The commands are all "." prefixed - for example, use ".help" to get started.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;JDBC &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is a JDBC interface available. I decided to try the one available &lt;a href="http://www.zentus.com/sqlitejdbc/"&gt;here&lt;/a&gt;. It was a simple matter of:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;create an Eclipse project (or IDE of choice)&lt;/li&gt;&lt;li&gt;add the jar file to the class path&lt;/li&gt;&lt;li&gt;use the sample code to start exploring&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;It does seem very straightforward. I'll post some code, etc after a bit more digging.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-2650325565281095089?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/2650325565281095089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=2650325565281095089' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/2650325565281095089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/2650325565281095089'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2007/10/photoshop-elements.html' title='Photoshop Elements'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-114716932983399036</id><published>2006-05-09T20:03:00.000+10:00</published><updated>2007-10-15T15:32:29.207+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Serving it up</title><content type='html'>Isn't it about time that we got the mainframe to actually serve up something useful - you know, in a server kind of way.&lt;br /&gt;&lt;br /&gt;Working in a support role, a common task involves checking the output of previous jobs via ISPF - and, more specifically SDSF. Well naturally, there's always a better way.&lt;br /&gt;&lt;br /&gt;For a while now (must check when), z/OS has provided an FTP interface to the JES facilities. This allows for all sorts of goodness:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;being able to list jobs&lt;/li&gt;&lt;li&gt;retrieving all output datasets for a job&lt;/li&gt;&lt;li&gt;submitting jobs.&lt;/li&gt;&lt;/ul&gt;... all from the comfort of your FTP client!&lt;br /&gt;&lt;br /&gt;What's that? You'd rather use SDSF than an FTP command line to inspect output. Of course you would. But what if you could craft a custom Java interface! Now we're talking. Say tuned for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-114716932983399036?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/114716932983399036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=114716932983399036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/114716932983399036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/114716932983399036'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2006/05/serving-it-up.html' title='Serving it up'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-114369480369506538</id><published>2006-03-30T14:54:00.000+10:00</published><updated>2006-03-30T15:10:57.786+10:00</updated><title type='text'>Monkey Matters</title><content type='html'>The Eclipse &lt;a href="http://www.eclipse.org/dash"&gt;Monkey&lt;/a&gt; scripting stuff looks cool. The ability to easily wire-up your own (&amp;amp; others) DOMs will make for handy little apps. Wayne Beaton has a great example &lt;a href="http://wbeaton.blogspot.com/2006/03/scripting-eclipse-rcp-with-javascript.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I thought I'd give it a go - but hit a small hurdle when trying to access my own DOM. The notes on the Eclipse site give the syntax:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DOM: http://update-site/plugin-id&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My problem was - I didn't have an update site: I was doing this all on a local PC.&lt;br /&gt;&lt;br /&gt;As ever, the answer was in front of my nose - or rather, in the code ... A quick check of the monkey code reveals that the metadata is simply extracted using a regular expression. In this case, it's this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DOM:\s*(\p{Graph}+)\/((\p{Alnum}|\.)+)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;meaning, anything before the slash is considered the URL, anything after is the plugin-id. And reading a little more reveals that Monkey will try and see if your plugin is loaded first - before using the update-site.&lt;br /&gt;&lt;br /&gt;It was then a simply matter of:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;exporting the plugin containing my DOM.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;then installing my plugin in my workspace (copy to plugin directory)&lt;/li&gt;&lt;li&gt;and then running the script!&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I finally had access to my DOM !! plus, learnt a little of the Monkey internals on the way :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-114369480369506538?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/114369480369506538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=114369480369506538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/114369480369506538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/114369480369506538'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2006/03/monkey-matters.html' title='Monkey Matters'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23847503.post-114204974776013762</id><published>2006-03-11T14:01:00.000+10:00</published><updated>2006-03-11T14:02:27.766+10:00</updated><title type='text'>My First Post</title><content type='html'>Ok, I guess that everyone does one of these ...&lt;br /&gt;&lt;br /&gt;fingers crossed X.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23847503-114204974776013762?l=evans-stuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://evans-stuff.blogspot.com/feeds/114204974776013762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23847503&amp;postID=114204974776013762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/114204974776013762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23847503/posts/default/114204974776013762'/><link rel='alternate' type='text/html' href='http://evans-stuff.blogspot.com/2006/03/my-first-post.html' title='My First Post'/><author><name>Evan</name><uri>http://www.blogger.com/profile/07600238233315828371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
