<?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-9125945520322172234</id><updated>2012-01-07T19:37:39.101-05:00</updated><category term='Usability'/><category term='Css'/><category term='Agile'/><category term='Visual Thinking'/><category term='Javascript'/><category term='Mac'/><category term='Software'/><category term='Php'/><category term='Design'/><category term='Communication'/><category term='cake'/><category term='Security'/><category term='Java'/><category term='mobility'/><category term='Groovy'/><category term='Web'/><title type='text'>Beautiful Design</title><subtitle type='html'>Industrial, user centered, interface driven, interaction, task oriented... design</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-3760554008624473944</id><published>2009-04-24T07:18:00.001-05:00</published><updated>2009-04-24T07:24:10.930-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Css'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>The humble button + a sprinkling of css</title><content type='html'>&lt;p&gt;I always figured buttons were born into this world boring, had boring childhoods and died well… boring.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_WU8UfBm3iWw/SfGt-PKcqzI/AAAAAAAAAIE/HMqb8gL4HrI/s1600-h/before%5B13%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="before" border="0" alt="before" src="http://lh3.ggpht.com/_WU8UfBm3iWw/SfGt-ZPEAkI/AAAAAAAAAII/st96UPBWr0A/before_thumb%5B9%5D.png?imgmax=800" width="78" height="24" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;See what I mean? But after reading &lt;a href="http://24ways.org/2008/shiny-happy-buttons"&gt;Shiny Happy Buttons at 24ways.org&lt;/a&gt;, my entire world view shifted:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_WU8UfBm3iWw/SfGt-SGV-0I/AAAAAAAAAIM/O6LhM5-kWz4/s1600-h/after%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="after" border="0" alt="after" src="http://lh4.ggpht.com/_WU8UfBm3iWw/SfGt-pvYu4I/AAAAAAAAAIQ/eyDkRrHDPEQ/after_thumb%5B1%5D.png?imgmax=800" width="91" height="34" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Wow!! (Firefox 3)&lt;/p&gt;  &lt;p&gt;Note: They obviously look great in Firefox but so too in Safari (Chrome seems to do something weird to them for some inexplicable reason. They’re both supposed to use Webkit though right?! Right???!!!) and IE although not identical - IE doesn’t do rounded corners:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_WU8UfBm3iWw/SfGt--eNoII/AAAAAAAAAIU/aFFqJ4lIA4s/s1600-h/after_ie%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="after_ie" border="0" alt="after_ie" src="http://lh6.ggpht.com/_WU8UfBm3iWw/SfGt-1uVfWI/AAAAAAAAAIY/hdwQuQZ_iXU/after_ie_thumb%5B1%5D.png?imgmax=800" width="126" height="37" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Still lovely in IE me thinks although the padding is somewhat exaggerated. Safari:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_WU8UfBm3iWw/SfGt_LfSRRI/AAAAAAAAAIc/IB9uOJr22kY/s1600-h/safari_after%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="safari_after" border="0" alt="safari_after" src="http://lh6.ggpht.com/_WU8UfBm3iWw/SfGt_f7n-pI/AAAAAAAAAIg/BdCWojMJmGY/safari_after_thumb%5B1%5D.png?imgmax=800" width="88" height="34" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Last, and in this case certainly least, Chrome:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_WU8UfBm3iWw/SfGt_dUYFyI/AAAAAAAAAIk/2gufUY-9LDU/s1600-h/chrome_after%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="chrome_after" border="0" alt="chrome_after" src="http://lh3.ggpht.com/_WU8UfBm3iWw/SfGt_vtTENI/AAAAAAAAAIo/hjBwnLS9_p8/chrome_after_thumb%5B1%5D.png?imgmax=800" width="91" height="38" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And here’s the Css:&lt;/p&gt;  &lt;pre&gt;.buttons button {&lt;br /&gt;    padding: 7px 10px;&lt;br /&gt;    color: #ffffff;&lt;br /&gt;    font-weight: bold;&lt;br /&gt;    text-shadow: 1px 1px 1px #000;&lt;br /&gt;    border: solid thin #882d13;&lt;br /&gt;    -webkit-border-radius: 7px;&lt;br /&gt;    -moz-border-radius: 7px;&lt;br /&gt;    border-radius: 7px;&lt;br /&gt;    -webkit-box-shadow: 2px 2px 3px #999;&lt;br /&gt;    box-shadow: 2px 2px 2px #bbb;&lt;br /&gt;    background-color: #ce401c;&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-3760554008624473944?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/3760554008624473944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=3760554008624473944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3760554008624473944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3760554008624473944'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2009/04/humble-button-sprinkling-of-css.html' title='The humble button + a sprinkling of css'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh3.ggpht.com/_WU8UfBm3iWw/SfGt-ZPEAkI/AAAAAAAAAII/st96UPBWr0A/s72-c/before_thumb%5B9%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-1551681521751235661</id><published>2009-04-18T08:21:00.001-05:00</published><updated>2009-04-18T08:21:16.188-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Lighthouse</title><content type='html'>&lt;p&gt;I’ve decided to start work on a little side project of mine very own mostly to keep the old juices of creativity properly exercised and flowing freely, and to have a place where I can play with any new and exciting webby-type technologies along the way.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lighthouseapp.com"&gt;Lighthouse&lt;/a&gt; came to mind immediately for project management (New ideas pop up faster than I can implement them… must capture them! :-)) since I’d remembered hearing good things about them from the 37signals guys. To make a long story short, Lighthouse is awesome!&lt;/p&gt;  &lt;p&gt;Getting started is easy - your first project is free so trying them out doesn’t cost you a penny. (I have other ideas I’ll eventually want to try out which is where the service starts costing money. Fine. I don’t mind paying for excellent software.) In terms of usability, the interface is a complete joy to use - the only thing that tripped me up (for all of about 2mins) was getting my milestones properly prioritized.&lt;/p&gt;  &lt;p&gt;An excellent service I’d recommend to anybody starting out. Setting up &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt;, &lt;a href="http://www.bugzilla.org/"&gt;Bugzilla&lt;/a&gt;, et. al, hosting it myself, and backing it up regularly is just something I don’t want to spend my time on.&lt;/p&gt;  &lt;p&gt;(I went with a &lt;a href="http://beanstalkapp.com/"&gt;Beanstalk&lt;/a&gt; hosted SVN repository too which happens to have at least 1 very simple, very nice integration point with Lighthouse that I’m aware of anyways, but I’ll save that topic for later.)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-1551681521751235661?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/1551681521751235661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=1551681521751235661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1551681521751235661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1551681521751235661'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2009/04/lighthouse.html' title='Lighthouse'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-3111343047750763817</id><published>2009-04-11T11:11:00.001-05:00</published><updated>2009-04-11T11:11:51.883-05:00</updated><title type='text'>Welcome to Internet Explorer 8</title><content type='html'>&lt;p&gt;Apparently Microsoft has quietly released IE8. My inner geek couldn’t resist trying it out so here goes...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_WU8UfBm3iWw/SeDBRD7ks1I/AAAAAAAAAH8/LPJY31njKkE/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_WU8UfBm3iWw/SeDBRwsbDgI/AAAAAAAAAIA/efYRJ78bSas/image_thumb%5B1%5D.png?imgmax=800" width="402" height="293" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So far so good. Roboform still seems to work. (That’s non-negotiable.) First thing I found was a neat little ‘blog this’ option under one of the menus that proceeded to fire up Windows Live Writer and immediately start work on a new post. The brand new post gets pre-filled with the title of whatever happens to be active in IE when ‘blog this’ is clicked + a link back to that page.&lt;/p&gt;  &lt;p&gt;Very cool indeed!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/canada/windows/internet-explorer/welcome.aspx"&gt;Welcome to Internet Explorer 8&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-3111343047750763817?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/3111343047750763817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=3111343047750763817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3111343047750763817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3111343047750763817'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2009/04/welcome-to-internet-explorer-8.html' title='Welcome to Internet Explorer 8'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh3.ggpht.com/_WU8UfBm3iWw/SeDBRwsbDgI/AAAAAAAAAIA/efYRJ78bSas/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-7101058393101043888</id><published>2008-12-22T13:54:00.001-05:00</published><updated>2008-12-22T13:54:42.577-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Thinking'/><category scheme='http://www.blogger.com/atom/ns#' term='Communication'/><title type='text'>Lifehacker v2...</title><content type='html'>&lt;p&gt;I didn't have the words to describe a not-quite-right feeling I couldn't shake for the new lifehack look - until reading Robin Williams's most excellent &amp;quot;The Non-Designer's Design Book&amp;quot; that is. (&lt;a href="http://www.amazon.com/Non-Designers-Design-Book-3rd-Designers/dp/0321534042/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1229970925&amp;amp;sr=8-1"&gt;Link&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_WU8UfBm3iWw/SU_ibwPeL_I/AAAAAAAAAHs/rUgSDzCubgE/s1600-h/lifehacker%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="275" alt="lifehacker" src="http://lh3.ggpht.com/_WU8UfBm3iWw/SU_icTbWMWI/AAAAAAAAAHw/F-MZX-yXQ3Y/lifehacker_thumb%5B1%5D.jpg?imgmax=800" width="406" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="6"&gt;Contrast&lt;/font&gt;&lt;/strong&gt; is what's lacking. (That's contrast of the non-wimpy variety.) The tall vertical banner on the left blends with the horizontal bar at the top, blends with the article headers to the right. The links and summaries are devilishly difficult to distinguish too. (Say that 5 times fast I dares ya!)&lt;/p&gt;  &lt;p&gt;With the right amount of contrast - of which size is but one technique, there's also colour, form, direction and weight - a reader should be able to pick up on the different elements of a layout almost immediately with little-to-no effort.&lt;/p&gt;  &lt;p&gt;Highly subjective of course. Can you tell I'm not digging the new look? :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-7101058393101043888?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/7101058393101043888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=7101058393101043888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7101058393101043888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7101058393101043888'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/12/lifehacker-v2.html' title='Lifehacker v2...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh3.ggpht.com/_WU8UfBm3iWw/SU_icTbWMWI/AAAAAAAAAHw/F-MZX-yXQ3Y/s72-c/lifehacker_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-334229985827622393</id><published>2008-10-26T08:19:00.001-05:00</published><updated>2008-10-26T08:19:08.115-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Macbooks...</title><content type='html'>I was kinda waiting on this one for awhile and was it ever worth it! Isn't she beautiful?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/christian.leskowsky/SQRtsy500eI/AAAAAAAAAGI/mFNlQS-9s48/IMG_2201.jpg?imgmax=800" alt="IMG_2201.jpg" border="0" width="360" height="270" /&gt;&lt;br /&gt;&lt;br /&gt;Small, light, excellent build quality and with a bright, vibrant screen too. I couldn't be happier. So long MS... it was great while it lasted. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-334229985827622393?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/334229985827622393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=334229985827622393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/334229985827622393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/334229985827622393'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/10/macbooks.html' title='Macbooks...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh4.ggpht.com/christian.leskowsky/SQRtsy500eI/AAAAAAAAAGI/mFNlQS-9s48/s72-c/IMG_2201.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-4586095103322608949</id><published>2008-09-05T07:21:00.005-05:00</published><updated>2008-12-21T20:23:30.928-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Php'/><category scheme='http://www.blogger.com/atom/ns#' term='cake'/><title type='text'>Model associations in Cake...</title><content type='html'>I just bumped into this little trick in a forum post on model associations...&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;class Recipe extends AppModel {&lt;br /&gt;   var $hasOne = 'User';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class User extends AppModel {&lt;br /&gt; var $hasMany = 'Recipe';&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Associations seem to allow -&amp;gt;finds like these:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;$this-&amp;gt;User-&amp;gt;Recipe-&amp;gt;find('all', array('conditions' =&amp;gt; array('cooking_time &amp;lt;' =&amp;gt; '30 mins.'));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Who knew?! This automatically does a Left Join of User on Recipe. Note to self: Find a code snippet formatter/style for Blogspot! :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-4586095103322608949?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/4586095103322608949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=4586095103322608949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4586095103322608949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4586095103322608949'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/09/model-associations-in-cake.html' title='Model associations in Cake...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-6508889261710284405</id><published>2008-08-31T17:07:00.005-05:00</published><updated>2008-12-21T20:25:55.568-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Php'/><title type='text'>PHP HereDocs</title><content type='html'>Look what I found in some random bit of open source php the other day:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;$a = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;Hello, World!&lt;br /&gt;Hi ma!&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Excellent!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-6508889261710284405?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/6508889261710284405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=6508889261710284405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6508889261710284405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6508889261710284405'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/08/php-heredocs.html' title='PHP HereDocs'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-3392941130241777002</id><published>2008-07-05T08:36:00.001-05:00</published><updated>2008-07-05T08:36:51.430-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Thinking'/><category scheme='http://www.blogger.com/atom/ns#' term='Communication'/><title type='text'>Notes: PowerPoint is not presentation</title><content type='html'>&lt;p&gt;From a presentation by Nancy Duarte.&lt;/p&gt;  &lt;p&gt;[&lt;a title="http://www.vizthink.com/blog/2008/06/18/webinar-creating-powerful-presentations-with-nancy-duarte/" href="http://www.vizthink.com/blog/2008/06/18/webinar-creating-powerful-presentations-with-nancy-duarte/"&gt;http://www.vizthink.com/blog/2008/06/18/webinar-creating-powerful-presentations-with-nancy-duarte/&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt;Telling stories in pictures &lt;/p&gt;  &lt;p&gt;Thinking visually   &lt;br /&gt;Simplicity    &lt;br /&gt;Clarity &lt;/p&gt;  &lt;p&gt;Start with open space/empty whiteboard &lt;/p&gt;  &lt;p&gt;Perfection achieved when nothing left to take away... not nothing left to add &lt;/p&gt;  &lt;p&gt;Presentations as a platform   &lt;br /&gt;&amp;#160; Mediums    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; projector    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; paper    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; web    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; devices    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; interactive    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; view    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; collab &lt;/p&gt;  &lt;p&gt;Need a visual language for your business   &lt;br /&gt;&amp;#160; specific artwork    &lt;br /&gt;&amp;#160; really resonates with your business&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-3392941130241777002?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/3392941130241777002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=3392941130241777002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3392941130241777002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3392941130241777002'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/07/notes-powerpoint-is-not-presentation.html' title='Notes: PowerPoint is not presentation'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-8831765541651543187</id><published>2008-06-27T09:03:00.001-05:00</published><updated>2008-06-27T09:03:11.904-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Zoomii.ca</title><content type='html'>&lt;p&gt;Here's a very neat take on browsing the bookshelves of an online bookstore. The interactions are surprisingly intuitive and very responsive-I actually had fun perusing the fantasy section. When was the last time I &lt;em&gt;perused&lt;/em&gt; the catalog of an online store? Let me tell you... it's never happened! I'm either searching for something specific or have been given a direct link. Here's their new releases section:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/christian.leskowsky/SGTzHeMuf2I/AAAAAAAAAFc/RmzeCgUyccE/zoomii-1%5B3%5D.jpg?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="276" alt="zoomii-1" src="http://lh4.ggpht.com/christian.leskowsky/SGTzHgJRaeI/AAAAAAAAAFg/KYtWnW7HOd8/zoomii-1_thumb%5B1%5D.jpg?imgmax=800" width="408" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Clicking on a title brings up what you'd expect... detailed product info. direct from Amazon's ginormous book database:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/christian.leskowsky/SGTzH1LAr4I/AAAAAAAAAFk/EUq9p7QYpXE/zoomii-2%5B8%5D.jpg?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="291" alt="zoomii-2" src="http://lh5.ggpht.com/christian.leskowsky/SGTzHyxJNpI/AAAAAAAAAFo/rUARRF0d_sY/zoomii-2_thumb%5B6%5D.jpg?imgmax=800" width="408" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Way to go guys!! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-8831765541651543187?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/8831765541651543187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=8831765541651543187' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/8831765541651543187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/8831765541651543187'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/06/zoomiica.html' title='Zoomii.ca'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh4.ggpht.com/christian.leskowsky/SGTzHgJRaeI/AAAAAAAAAFg/KYtWnW7HOd8/s72-c/zoomii-1_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-4327385172260255739</id><published>2008-06-17T20:18:00.001-05:00</published><updated>2008-06-17T20:18:36.637-05:00</updated><title type='text'>Internet Retailer Conference 2008</title><content type='html'>&lt;p&gt;&amp;quot;Get Elastic Ecommerce Blog&amp;quot; is quickly becoming one of my fave blogs. (&lt;a title="http://www.getelastic.com" href="http://www.getelastic.com"&gt;http://www.getelastic.com&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;They were down in Chicago last week for the Internet Retailer Conference and have posted a few of the vendor interviews they managed to squeeze in between sessions. :-)&lt;/p&gt;  &lt;p&gt;I found Berdine Wu's common-sense advice particularly enlightening. She talked about some of the things any company going online needs to get right to be successful...&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Search engine optimization/marketing&lt;/li&gt;    &lt;li&gt;User experience of your website (smooth, few clicks to buy)&lt;/li&gt;    &lt;li&gt;Clear, crisp imagery&lt;/li&gt;    &lt;li&gt;Directed email campaigns&lt;/li&gt;    &lt;li&gt;Branding coming across strongly&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Nice.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-4327385172260255739?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/4327385172260255739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=4327385172260255739' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4327385172260255739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4327385172260255739'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/06/internet-retailer-conference-2008.html' title='Internet Retailer Conference 2008'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-7707449605822391553</id><published>2008-06-15T09:24:00.001-05:00</published><updated>2008-06-15T09:24:54.475-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Notes: Google I/O State of Ajax</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;User Experience &lt;/p&gt;  &lt;p&gt;Book: Jeff Raskin: The Humane Interface &lt;/p&gt;  &lt;p&gt;2 parts:   &lt;br /&gt;&amp;#160; Visual design    &lt;br /&gt;&amp;#160; Interaction design &lt;/p&gt;  &lt;p&gt;User experience expectations have changed dramatically for the web &lt;/p&gt;  &lt;p&gt;Google Gears-&amp;gt;Gears &lt;/p&gt;  &lt;p&gt;Gears Demo 1:   &lt;br /&gt;&amp;#160; A neat demo was shown with gears being used as a background    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; processing thread    &lt;br /&gt;&amp;#160; Common pattern for doing long running tasks    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Spawn a background thread keeps the UI responsive    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Can't really do that in the browser    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Complex Javascript fights repainting... both share same thread    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gears can do this though!! &lt;/p&gt;  &lt;p&gt;Gears Demo 2:   &lt;br /&gt;&amp;#160; Form History pattern    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; like Time Machine    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Replacement for undo    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Can go back in time to different states of form    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Trying to implement undo is hard (instead of warning dialogs)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; The browser has its own undo stack    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 dueling undo stacks? -&amp;gt; Confusion &lt;/p&gt;  &lt;p&gt;Gears is really amping up responsiveness! &lt;/p&gt;  &lt;p&gt;Gears Demo 3:   &lt;br /&gt;&amp;#160; Demo-ed a growls like widget for web applications&lt;/p&gt;  &lt;p&gt;Unobtrusive Javascript:   &lt;br /&gt;&amp;#160; An application that degrades gracefully in environments where    &lt;br /&gt;&amp;#160; javascript/ajax might not be available    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Progressive enhancement    &lt;br /&gt;&amp;#160; Does your application still work?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-7707449605822391553?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/7707449605822391553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=7707449605822391553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7707449605822391553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7707449605822391553'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/06/notes-google-io-state-of-ajax.html' title='Notes: Google I/O State of Ajax'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-5539141025167786727</id><published>2008-06-15T07:59:00.001-05:00</published><updated>2008-06-15T07:59:08.665-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Firebug Rocks!!</title><content type='html'>&lt;p&gt;I was trying to figure out how the site logo at &lt;a title="http://www.macsbeer.com/index.php" href="http://www.macsbeer.com/index.php"&gt;http://www.macsbeer.com/index.php&lt;/a&gt; was done so I right clicked it and hit &amp;quot;Inpect Element&amp;quot;. (FF3+Firebug1.2.0b3)&lt;/p&gt;  &lt;p&gt;Here's what I got from firebug...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/christian.leskowsky/SFUSGqowa9I/AAAAAAAAAFU/6nrw3h-bno8/s1600-h/firebug%5B3%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="279" alt="firebug" src="http://lh3.ggpht.com/christian.leskowsky/SFUSHJyRLcI/AAAAAAAAAFY/pQZlAtad4x0/firebug_thumb%5B1%5D.jpg?imgmax=800" width="422" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In the style window on the right I quickly found the background image responsible for the nice logo but look what happened when I mouse-d over it!&lt;/p&gt;  &lt;p&gt;Fantastic.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-5539141025167786727?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/5539141025167786727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=5539141025167786727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5539141025167786727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5539141025167786727'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/06/firebug-rocks.html' title='Firebug Rocks!!'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh3.ggpht.com/christian.leskowsky/SFUSHJyRLcI/AAAAAAAAAFY/pQZlAtad4x0/s72-c/firebug_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-2728744084540120275</id><published>2008-06-07T08:23:00.001-05:00</published><updated>2008-06-07T08:23:40.638-05:00</updated><title type='text'>The Dreyfus Model of Learning (Applied to Medicine)</title><content type='html'>Each and every skill we possess falls into one of the following 5 categories of proficiency... &lt;br /&gt;&lt;br /&gt;(1) In the novice stage, the freshman medical student begins to learn the process of taking a history and memorizes the elements, chief complaint, history of the present illness, review of systems, and family and social history. &lt;br /&gt;&lt;br /&gt;(2) In the advanced beginner stage, the junior medical student begins to see aspects of common situations, such as those facing hospitalized patients (admission, rounds, discharge) that cannot be defined objectively apart from concrete situations and can only be learned through experience. Maxims emerge from that experience to guide the learner. &lt;br /&gt;&lt;br /&gt;(3) In the competent stage, the resident physician learns to plan the approach to each patient’s situation. Risks are involved, but supervisory practices are put in place to protect the patient. Because the resident has planned the care, the consequences of the plan are knowable to the resident and offer the resident an opportunity to learn. &lt;br /&gt;&lt;br /&gt;(4) In the proficient stage, the specialist physician early in practice struggles with developing routines that can streamline the approach to the patient. Managing the multiple distracting stimuli in a thoughtful way is intellectually and emotionally absorbing. &lt;br /&gt;&lt;br /&gt;(5) In the expert stage, the mid-career physician has learned to recognize patterns of discrete clues and to move quickly, using what he or she might call "intuition" to do the work. The physician is attuned to distortions in patterns or to slow down when things "don’t fit" the expected pattern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-2728744084540120275?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/2728744084540120275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=2728744084540120275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2728744084540120275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2728744084540120275'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/06/dreyfus-model-of-learning-applied-to.html' title='The Dreyfus Model of Learning (Applied to Medicine)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-3680148625955882085</id><published>2008-06-07T08:17:00.001-05:00</published><updated>2008-06-07T08:17:01.018-05:00</updated><title type='text'>On Craftsmen and Novices...</title><content type='html'>Here's an excerpt taken from 'A Pattern Language' by Christopher Alexander written more than 30 years ago. A craftsman brings to bear an intuition garnered from years of experience in his work. The novice prefers to follow rules and be told what do to. The craftsman uses abstract concepts and considers context. In the fantastic quote I've included below, Christopher describes the craftsman as being unconcerned with small mis-steps here and there - he knows he can fix them later... &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Why does the principle of gradual stiffening seem so sensible as a process of building?&lt;br /&gt;&lt;br /&gt;To begin with, such a structure allows the actual building process to be a creative act. It allows the building to be built up gradually. Members can be moved around before they are firmly in place. All those detailed design decisions which can never be worked out in advance on paper, can be made during the building process. And it allows you to see the space in three dimensions as a whole, each step of the way, as more material is added…&lt;br /&gt;&lt;br /&gt;The essence of this process is very fundamental indeed. We may understand it best by comparing the work of a fifty-year-old carpenter with the work of a novice. The experienced carpenter keeps going. He doesn’t have to keep stopping, because every action he performs, is calculated in such a way that some later action can put it right to the extent that it is imperfect now. What is critical here, is the sequence of events. The carpenter never takes a step which he cannot correct later; so he can keep working, confidently, steadily.&lt;br /&gt;&lt;br /&gt;The novice by comparison, spends a great deal of his time trying to figure out what to do. He does this essentially because he knows that an action he takes now may cause unretractable problems a little further down the line; and if he is not careful, he will find himself with a joint that requires the shortening of some crucial member – at a stage when it is too late to shorten that member. The fear of these kinds of mistakes forces him to spend hours trying to figure ahead: and it forces him to work as far as possible to exact drawings because they will guarantee that he avoids these kinds of mistakes.&lt;br /&gt;&lt;br /&gt;The difference between the novice and the master is simply that the novice has not learnt, yet, how to do things in such a way that he can afford to make small mistakes. The master knows that the sequence of his actions will always allow him to cover his mistakes a little further down the line. It is this simple but essential knowledge which gives the work of a master carpenter its wonderful, smooth, relaxed, and almost unconcerned simplicity.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-3680148625955882085?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/3680148625955882085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=3680148625955882085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3680148625955882085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3680148625955882085'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/06/on-craftsmen-and-novices.html' title='On Craftsmen and Novices...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-594450158323445025</id><published>2008-05-04T22:06:00.001-05:00</published><updated>2008-05-04T22:06:11.598-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>The BBC wants your feedback</title><content type='html'>&lt;a href="http://lh6.ggpht.com/christian.leskowsky/SB55oS6q_AI/AAAAAAAAAEQ/Bnem7PNhUAo/s1600-h/bbc_complaints%5B7%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="307" alt="bbc_complaints" src="http://lh4.ggpht.com/christian.leskowsky/SB55oy6q_BI/AAAAAAAAAEY/JXWoV8gy-n8/bbc_complaints_thumb%5B3%5D.jpg?imgmax=800" width="296" border="0" /&gt;&lt;/a&gt;   &lt;p&gt;Making it easy for disgruntled customers to leave feedback about your product - both positive and negative - is one of the best ways we have as product managers and designers to make it better.&lt;/p&gt;  &lt;p&gt;I just stumbled upon BBC's complaints website. (Shown above.) Visitors can learn about the broadcaster's complaints process, file complaints and look to past responses to see how theirs might be handled.&lt;/p&gt;  &lt;p&gt;Nice.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-594450158323445025?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/594450158323445025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=594450158323445025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/594450158323445025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/594450158323445025'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/05/bbc-wants-your-feedback.html' title='The BBC wants your feedback'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh4.ggpht.com/christian.leskowsky/SB55oy6q_BI/AAAAAAAAAEY/JXWoV8gy-n8/s72-c/bbc_complaints_thumb%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-3595251252413436610</id><published>2008-04-23T08:02:00.001-05:00</published><updated>2008-04-23T08:02:46.240-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Paging on Smugmug.com</title><content type='html'>&lt;p&gt;I love the way Smugmug does its paging of large photo albums...&lt;/p&gt;  &lt;p&gt;The first page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/christian.leskowsky/SA8zby6q-6I/AAAAAAAAADg/ML4s4i3ITXg/page_control-1%5B2%5D.jpg?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="68" alt="page_control-1" src="http://lh6.ggpht.com/christian.leskowsky/SA8zcC6q-7I/AAAAAAAAADo/gLeIkdd62yc/page_control-1_thumb.jpg?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The second page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/christian.leskowsky/SA8zcS6q-8I/AAAAAAAAADw/1XIWfROg7Gk/page_control-2%5B2%5D.jpg?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="81" alt="page_control-2" src="http://lh4.ggpht.com/christian.leskowsky/SA8zci6q-9I/AAAAAAAAAD4/bI_ES0d2tTY/page_control-2_thumb.jpg?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Look at the nice little overlay control with all 6 pages!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;and the last page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/christian.leskowsky/SA8zdC6q--I/AAAAAAAAAEA/NwraWlhZs-A/page_control-3%5B2%5D.jpg?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="70" alt="page_control-3" src="http://lh3.ggpht.com/christian.leskowsky/SA8zdS6q-_I/AAAAAAAAAEI/4v5BY-sIP8U/page_control-3_thumb.jpg?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-3595251252413436610?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/3595251252413436610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=3595251252413436610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3595251252413436610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3595251252413436610'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/04/paging-on-smugmugcom.html' title='Paging on Smugmug.com'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://lh6.ggpht.com/christian.leskowsky/SA8zcC6q-7I/AAAAAAAAADo/gLeIkdd62yc/s72-c/page_control-1_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-1897746803381147078</id><published>2008-03-26T10:28:00.001-05:00</published><updated>2008-03-26T10:34:43.782-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Parsing command line args</title><content type='html'>&lt;p&gt;I love the way it's done in Gant!!&lt;/p&gt; &lt;pre&gt;def cli = new CliBuilder ( usage : 'gant [option]* [target]*' , parser : new GnuParser ( ) )&lt;br /&gt;cli.c ( longOpt : 'usecache' , 'Whether to cache the generated class and perform modified checks on the file before re-compilation.' )&lt;br /&gt;cli.d ( longOpt : 'cachedir' , args : 1 , argName : 'cache-file' , 'The directory where to cache generated classes to.' )&lt;br /&gt;cli.f ( longOpt : 'gantfile' , args : 1 , argName : 'build-file' , 'Use the named build file instead of the default, build.gant.' )&lt;br /&gt;cli.h ( longOpt : 'help' , 'Print out this message.' )&lt;br /&gt;&lt;br /&gt;cli.l ( longOpt : 'gantlib' , args : 1 , argName : 'library' , 'A directory that contains classes to be used as extra Gant modules,' )&lt;br /&gt;cli.n ( longOpt : 'dry-run' , 'Do not actually action any tasks.' )&lt;br /&gt;cli.p ( longOpt : 'projecthelp' , 'Print out a list of the possible targets.' )&lt;br /&gt;cli.q ( longOpt : 'quiet' , 'Do not print out much when executing.' )&lt;br /&gt;cli.s ( longOpt : 'silent' , 'Print out nothing when executing.' )&lt;br /&gt;cli.v ( longOpt : 'verbose' , 'Print lots of extra information.' )&lt;br /&gt;&lt;br /&gt;cli.D ( argName : 'name&amp;gt;=&amp;lt;value' , args : 1 , 'Define &amp;lt;name&amp;gt; to have value &amp;lt;value&amp;gt;.&amp;#160; Creates a variable named &amp;lt;name&amp;gt; for use in the scripts and a property named &amp;lt;name&amp;gt; for the Ant tasks.' )&lt;br /&gt;cli.L ( longOpt : 'lib' , args : 1 , argName : 'path' , 'Add a directory to search for jars and classes.' )&lt;br /&gt;cli.P ( longOpt : 'classpath' , args : 1 , argName : 'path' , 'Specify a path to search for jars and classes.' )&lt;br /&gt;cli.T ( longOpt : 'targets' , 'Print out a list of the possible targets.' )&lt;br /&gt;cli.V ( longOpt : 'version' , 'Print the version number and exit.' )&lt;br /&gt;&lt;br /&gt;def options = cli.parse ( args )&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;parse(args) returns a map you use like so...&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;if ( options.h ) { cli.usage ( ) ; return 0 }&lt;br /&gt;if ( options.l ) { gantLib &amp;lt;&amp;lt; options.l.split ( System.properties.'path.separator' ) }&lt;br /&gt;if ( options.n ) { GantState.dryRun = true }&lt;br /&gt;def function =  ( options.p || options.T ) ? 'targetList' : 'dispatch'&lt;br /&gt;if ( options.q ) { GantState.verbosity = GantState.QUIET }&lt;br /&gt;if ( options.s ) { GantState.verbosity = GantState.SILENT }&lt;br /&gt;if ( options.v ) { GantState.verbosity = GantState.VERBOSE }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;PS. I'll try to clean this up later... pygments.org looks neat!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-1897746803381147078?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/1897746803381147078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=1897746803381147078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1897746803381147078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1897746803381147078'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/03/parsing-command-line-args.html' title='Parsing command line args'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-7233684471190137788</id><published>2008-03-25T12:13:00.001-05:00</published><updated>2008-03-25T12:13:55.095-05:00</updated><title type='text'>The Four Stages of Learning</title><content type='html'>&lt;h5&gt;Unconscious incompetence&lt;/h5&gt;  &lt;p&gt;In the first stage of learning you don't know you're no good - ignorance is bliss! Sometimes this comes from simply having preconceptions about how easy a task is and sometimes it comes from not knowing there's a better way. Dysfunctional teams and developers are often unaware of what they're doing wrong, even if it becomes obvious when scrutinized.&lt;/p&gt;  &lt;h5&gt;Conscious incompetence&lt;/h5&gt;  &lt;p&gt;The second stage of learning is the tricky one as it starts to dawn that you're not actually all that good! At this stage, teams and developers need a lot of support to prevent them wallowing in despair and to help them select and adopt new techniques.&lt;/p&gt;  &lt;h5&gt;Conscious competence&lt;/h5&gt;  &lt;p&gt;In the third stage of learning you're consciously applying the techniques you need in order to be &amp;quot;good&amp;quot;. Here teams and developers know what they should be doing but need their momentum to be maintained, often by external encouragement and review.&lt;/p&gt;  &lt;h5&gt;Unconscious competence&lt;/h5&gt;  &lt;p&gt;At the fourth stage of learning you're naturally doing things right. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-7233684471190137788?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/7233684471190137788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=7233684471190137788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7233684471190137788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7233684471190137788'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/03/four-stages-of-learning.html' title='The Four Stages of Learning'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-2392493854753191733</id><published>2008-03-24T08:51:00.001-05:00</published><updated>2008-03-24T08:51:09.299-05:00</updated><title type='text'>Interview: Nathan Shedroff</title><content type='html'>&lt;p&gt;An interview by Kate Rutter with Nathan Shedroff about blending the roles of designer and business analyst in a new program being offered at the California College of the Arts. Brilliant...&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[KR]&lt;/strong&gt;: It seems that a common attribute of similar programs is to blur the boundaries between fields, and to foster the ability to synthesize&amp;#8230;to cross-pollinate concepts and ideas across different functional areas. With this trend towards generalization, how do you avoid teaching people to be, for lack of a better phrase, Jack-or-Jane-of-all-trades but master of none?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[NS]&lt;/strong&gt;: This is a great question. There&amp;#8217;s no way we can teach students everything they need to know. We&amp;#8217;re specifically looking for passionate individuals who will take what we learn together and apply it to the passions, interests, and experience they already possess. Their learning is life-long so the best we can do is frame some of these perspectives and skills for them, give them some experience, and inspire them to continue the process. We&amp;#8217;ve prioritized, in the curriculum, the skills, knowledge, and experiences we think they will need the most, but it&amp;#8217;s just a start. Besides, there&amp;#8217;s only so much you can learn in school. At some point, you need to learn &amp;#8220;on-the-job&amp;#8221; &amp;#8212; whatever that job may be. So, we&amp;#8217;re exposing our students to a variety of skills but with unified perspectives (design-led innovation, meaningful experience, sustainability, and visionary leadership) so that their deep skills will follow these lines. They will be expert innovation leaders and will be able to apply these skills to any domain or challenge.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-2392493854753191733?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/2392493854753191733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=2392493854753191733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2392493854753191733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2392493854753191733'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/03/interview-nathan-shedroff.html' title='Interview: Nathan Shedroff'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-2130702118277542952</id><published>2008-03-23T08:35:00.001-05:00</published><updated>2008-03-23T08:35:33.580-05:00</updated><title type='text'>Bounded Irrationality or Decision Making Traps</title><content type='html'>&lt;p&gt;1. Anchoring&lt;/p&gt;  &lt;p&gt;When considering a decision, our minds are unduly influenced by the first information we find. Initial impressions and data anchor subsequent judgments.&lt;/p&gt;  &lt;p&gt;2. Confirmation&lt;/p&gt;  &lt;p&gt;Through selective search and perception, we subconsciously seek data that supports our existing point of view, and avoid contradictory evidence.&lt;/p&gt;  &lt;p&gt;3. Memorability&lt;/p&gt;  &lt;p&gt;We are overly influenced by recent or dramatic events. Repetition from one or multiple sources can also influence belief, memory, and judgment.&lt;/p&gt;  &lt;p&gt;4. Status quo&lt;/p&gt;  &lt;p&gt;Decision makers exhibit a strong bias toward conservatism, inertia and alternatives that perpetuate the status quo. We look for reasons to do nothing.&lt;/p&gt;  &lt;p&gt;5. Sunk cost&lt;/p&gt;  &lt;p&gt;Unwilling, consciously or not, to admit past mistakes, we make decisions in a way that justifies past choices.&lt;/p&gt;  &lt;p&gt;From Ambient Findability (pg. 157)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-2130702118277542952?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/2130702118277542952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=2130702118277542952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2130702118277542952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2130702118277542952'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/03/bounded-irrationality-or-decision.html' title='Bounded Irrationality or Decision Making Traps'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-5575502979183171025</id><published>2008-03-23T08:16:00.001-05:00</published><updated>2008-03-23T08:16:39.772-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>User Experience</title><content type='html'>&lt;p&gt;Peter Morville's definition of user experience is broader than most but I like the direction he takes it in... (His book Ambient Findability is fantastic btw.)&lt;/p&gt;  &lt;p&gt;1. Useful&lt;/p&gt;  &lt;p&gt;As practitioners we can't be content to paint within the lines drawn by managers. we must have the courage and creativity to ask whether our products and systems are useful, and to apply our deep knowledge of craft and medium to define innovative solutions that are more useful.&lt;/p&gt;  &lt;p&gt;2. Usable&lt;/p&gt;  &lt;p&gt;Ease of use remains vital, and yet the interface-centered methods and perspectives of human-computer interaction do not address all dimensions of web design. In short, usability is necessary but not sufficient.&lt;/p&gt;  &lt;p&gt;3. Desirable&lt;/p&gt;  &lt;p&gt;Our quest for efficiency must be tempered by an appreciation for the power and value of image, identity, brand and other elements of emotional design.&lt;/p&gt;  &lt;p&gt;4. Findable&lt;/p&gt;  &lt;p&gt;We must strive to design navigable web sites and locatable objects, so users can find what they need.&lt;/p&gt;  &lt;p&gt;5. Accesible&lt;/p&gt;  &lt;p&gt;Just as our buildings have elevators and ramps, our web sites should be accessible to people with disabilities (more than 10% of the population). today, it's good business and the ethical thing to do. Eventually, it will become the law. Standards-based design for accessibility also supports access via mobile devices.&lt;/p&gt;  &lt;p&gt;6. Credible&lt;/p&gt;  &lt;p&gt;Thanks to some ground-breaking research out of Stanford's Persuasive Technologies Lab, we're beginning to understand the design elements that influence whether users trust and believe what we tell them.&lt;/p&gt;  &lt;p&gt;7. Valuable&lt;/p&gt;  &lt;p&gt;Finally, it's not just about the user. Our sites must deliver value to our sponsors. For non-profits, the user experience must advance the mission. With for-profits, it must contribute to the bottom line and improve customer satisfaction.&lt;/p&gt;  &lt;p&gt;From Ambient Findability (pg. 109)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-5575502979183171025?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/5575502979183171025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=5575502979183171025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5575502979183171025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5575502979183171025'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/03/user-experience.html' title='User Experience'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-3943619044284429920</id><published>2008-03-01T00:25:00.001-05:00</published><updated>2008-03-01T00:25:48.482-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Communication'/><title type='text'>Information Hierarchies</title><content type='html'>&lt;p&gt;It really is amazing the amount of information most people can absorb quickly if it's organized effectively. The 2 screens linked below illustrate this...&lt;/p&gt;  &lt;p&gt;Yahoo Desktop1:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/christian.leskowsky/R8josphE0EI/AAAAAAAAACw/2Bz63Pf1aM8/before-page-hierarchy%5B3%5D?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="332" alt="before-page-hierarchy" src="http://lh5.google.com/christian.leskowsky/R8jotJhE0FI/AAAAAAAAAC4/sCBEoCfo4vo/before-page-hierarchy_thumb%5B1%5D?imgmax=800" width="347" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Yahoo Desktop2:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/christian.leskowsky/R8jotphE0GI/AAAAAAAAADA/_7Hp0khnVag/after-page-hierarchy%5B4%5D?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="292" alt="after-page-hierarchy" src="http://lh6.google.com/christian.leskowsky/R8jouZhE0HI/AAAAAAAAADI/e9Gep2vG2x0/after-page-hierarchy_thumb%5B2%5D?imgmax=800" width="355" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Differences between the first and second screens:&lt;/p&gt;  &lt;p&gt;- 4 main content groupings: the search field, sidebar, main content area and tag cloud&lt;/p&gt;  &lt;p&gt;- Data grouped to align with user goals like music, photos and documents&lt;/p&gt;  &lt;p&gt;- Icons are used effectively to break up the different groups with the main content area&lt;/p&gt;  &lt;p&gt;- Even fonts are used to group similar items with categories&lt;/p&gt;  &lt;p&gt;[Proximity, shape, size and colour are all examples of some of the visual cues we'll use to group related things together.]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-3943619044284429920?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/3943619044284429920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=3943619044284429920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3943619044284429920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3943619044284429920'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/03/information-hierarchies.html' title='Information Hierarchies'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-3872537583468459081</id><published>2008-02-24T02:48:00.001-05:00</published><updated>2008-02-24T02:57:25.525-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>H&amp;R Block's Tango</title><content type='html'>&lt;p&gt;H&amp;amp;R Block has taken their tax preparation offering in a radically new direction this year for your 2006 returns. Enter project Tango...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/christian.leskowsky/R8Eh_3LcIUI/AAAAAAAAACg/njqjWwjDLrg/tango%20tax%20prep%20software%20making-of%20story-2%5B12%5D?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="305" alt="tango tax prep software making-of story-2" src="http://lh5.google.com/christian.leskowsky/R8EhL3LcIRI/AAAAAAAAACk/GL6nqcVKVLU/tango%20tax%20prep%20software%20making-of%20story-2_thumb%5B10%5D?imgmax=800" width="400" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It runs in a browser like Firefox (shown above), but they've re-jigged the experience by getting rid of back/forward, refresh, et. al. Very slick!&lt;/p&gt;  &lt;p&gt;Check out their making of video: &amp;quot;The Journey Continues...&amp;quot;. It feels like I'm reading an interactive comic book.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/christian.leskowsky/R8EhMHLcISI/AAAAAAAAACo/D-Pm1Eg96c8/tango%20tax%20prep%20software%20making-of%20story%5B15%5D?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="291" alt="tango tax prep software making-of story" src="http://lh4.google.com/christian.leskowsky/R8EhMnLcITI/AAAAAAAAACs/nZrzntHdBus/tango%20tax%20prep%20software%20making-of%20story_thumb%5B11%5D?imgmax=800" width="400" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;[Link: &lt;a title="http://hrblock.com/tango/thejourney.html" href="http://hrblock.com/tango/thejourney.html"&gt;http://hrblock.com/tango/thejourney.html&lt;/a&gt;]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-3872537583468459081?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/3872537583468459081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=3872537583468459081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3872537583468459081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/3872537583468459081'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/02/h-block-tango.html' title='H&amp;amp;R Block&amp;#39;s Tango'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-4146502652088401186</id><published>2008-02-24T01:56:00.001-05:00</published><updated>2008-02-24T01:58:02.219-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>User Stories</title><content type='html'>&lt;p&gt;Def'n: &lt;em&gt;&amp;quot;Those that are familiar with Agile approaches to software development are also familiar with the idea of a user story being a deliverable unit of business value within the context of a system.&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;[Link: &lt;a title="http://studios.thoughtworks.com/2008/2/19/forest-for-the-trees" href="http://studios.thoughtworks.com/2008/2/19/forest-for-the-trees"&gt;http://studios.thoughtworks.com/2008/2/19/forest-for-the-trees&lt;/a&gt;]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-4146502652088401186?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/4146502652088401186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=4146502652088401186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4146502652088401186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4146502652088401186'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2008/02/user-stories.html' title='User Stories'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-1913861201560537933</id><published>2007-12-09T11:31:00.002-05:00</published><updated>2008-01-06T16:57:53.218-05:00</updated><title type='text'>Best is the Enemy of Good Enough...</title><content type='html'>&lt;p&gt;I've written about this before, but the message is worth repeating now and then so I don't forget...&lt;/p&gt;  &lt;p&gt;Sometimes I'll spend hours on something I'm trying to get perfect. &amp;quot;This block of code could be cleaner.&amp;quot; or &amp;quot;Progressing through this form doesn't feel very natural now does it?&amp;quot; It's a trap I fall into all the time. (Thankfully I'm getting a little better at catching myself on the edge.)&lt;/p&gt;  &lt;p&gt;That's not to say I shouldn't always be trying to do my best! I do however have to accept my best for what it is today, continue to learn from my experiences and improve.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-1913861201560537933?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/1913861201560537933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=1913861201560537933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1913861201560537933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1913861201560537933'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/12/best-is-enemy-of-good-enough.html' title='Best is the Enemy of Good Enough...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-6595173908387026249</id><published>2007-11-30T00:07:00.001-05:00</published><updated>2007-11-30T01:17:03.857-05:00</updated><title type='text'>Why do you use 3rd party libraries?</title><content type='html'>I asked a co-worker why he decided to roll his own javascript remoting framework rather than use something like prototype that would do it all for him. He told me he'd looked into a few, but couldn't find one that just did remoting - they all came more than generously padded with extra cruft he didn't need. I can sympathize with his point of view, but he did get me thinking about the times I've been willing to take on the additional cognitive burden frameworks like Spring, Hibernate, Struts2, etc. add to my projects. Here's what I came up:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;3rd party libraries are maintained by other people. To put another way, 3rd party libraries are not maintained by me. Which means bugs I get bug fixes for free.&lt;/li&gt;&lt;li&gt;They're usually the bits of my application that I consider plumbing ie. unrelated to the business problem I'm trying to solve. (eg. Spring, Hibernate) Why am I spending time on problems that don't add value to my project?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Each major revision of a library is more polished/refined than the last. Better abstractions, shifts towards external configuration by xml, shifts back to configuration in code by annotations/intelligent defaults are some of the ways libraries have evolved in recent past to make using them easier.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The very best are used by thousands of developers which makes them battle hardened aka. production ready. Odds are somebody somewhere has run up against bugs I would have otherwise hit in my project. Thanks Somebody!&lt;/li&gt;&lt;/ul&gt;That's all I've got for now. If I think of any more, I'll add them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-6595173908387026249?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/6595173908387026249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=6595173908387026249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6595173908387026249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6595173908387026249'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/11/why-do-you-use-3rd-party-libraries.html' title='Why do you use 3rd party libraries?'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-1841871669256110929</id><published>2007-11-10T11:11:00.001-05:00</published><updated>2007-11-10T11:53:47.094-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='mobility'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>My new Eee pc!</title><content type='html'>I have no trouble whatsoever seeing this little device becoming indispensable to me. Out of the box, it comes with more than enough software to satisfy the needs of the 80%-ile. (Internet, productivity, media management/playback and games are all well represented.) I thought the "friendly" UI Asus developed would be the first thing I turned off but there are a few things it does right that eventually sold me on it:&lt;br /&gt;&lt;br /&gt;- The applications I use the most are maximized by default and can't be made smaller - Firefox, OpenOffice, etc. Asus specifically tailored the experiences of these applications for it's new platform and done it well.&lt;br /&gt;- The little home key automatically minimizes everything instantly so you can see the dashboard. (It brings up the last application you were working in if you hit it again. Again this is instantaneous.) I use this all the time to start new applications.&lt;br /&gt;- My favourite apps couldn't be easier to find. (Web browser, word processor, presentations.)&lt;br /&gt;&lt;br /&gt;(Compare that to the advanced view: 1. Apps wouldn't maximize on their own - I found I was doing this myself all the time. 2. The home key brings up KDE's start menu. 3. Applications were harder to find buried as they are in the start menu under multiple levels of submenus I'm not familiar with coming from Windows.)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/angryfraggle/1950180100/" title="Photo Sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2094/1950180100_71f419ee3c.jpg" width="500" height="375" alt="IMG_1024" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks Asus!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-1841871669256110929?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/1841871669256110929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=1841871669256110929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1841871669256110929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1841871669256110929'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/11/my-new-eee-pc.html' title='My new Eee pc!'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://farm3.static.flickr.com/2094/1950180100_71f419ee3c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-5365969938731342903</id><published>2007-10-24T22:58:00.000-05:00</published><updated>2007-10-24T22:59:47.309-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Scott's Grails/GORM talk...</title><content type='html'>Scott Davis: davisworld.org&lt;br /&gt;&lt;br /&gt;used in grails stack&lt;br /&gt;gorm: grails object/relational mapper&lt;br /&gt;&lt;br /&gt;thin wrapper over hibernate&lt;br /&gt;&lt;br /&gt;google: grails rails performance&lt;br /&gt;&lt;br /&gt;[what is quartz?]&lt;br /&gt;&lt;br /&gt;hibernate knowledge transferrable here&lt;br /&gt;  can override default gorm behaviour&lt;br /&gt;  .hbm files&lt;br /&gt;&lt;br /&gt;can map domain classes to tables with different names&lt;br /&gt;  normally it's pogo name == table name&lt;br /&gt;&lt;br /&gt;nice dsl for gorm coming in grails 1.0-rc1 &lt;br /&gt;&lt;br /&gt;grails shell lets you connect to running application and query data&lt;br /&gt;using app domain objects&lt;br /&gt;&lt;br /&gt;select * from artist&lt;br /&gt;  * == splat&lt;br /&gt;&lt;br /&gt;See dynamic sorted list! awesome!&lt;br /&gt;Simple dynamic queries&lt;br /&gt;&lt;br /&gt;Relationships are pretty damn cool too&lt;br /&gt;  see 1-1 slide&lt;br /&gt;&lt;br /&gt;send thx!&lt;br /&gt;email: scottdavis99@yahoo.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-5365969938731342903?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/5365969938731342903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=5365969938731342903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5365969938731342903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5365969938731342903'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/10/scotts-grailsgorm-talk.html' title='Scott&apos;s Grails/GORM talk...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-5582087018881596157</id><published>2007-10-24T22:55:00.000-05:00</published><updated>2007-10-24T22:57:25.202-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Scott's Advanced Grails talk...</title><content type='html'>quote: make easy things easy, hard things possible&lt;br /&gt;&lt;br /&gt;many-many relationships not easy&lt;br /&gt;  but possible&lt;br /&gt;&lt;br /&gt;grails brings together lots of popular java libs/frameworks&lt;br /&gt;  grails uses spring mvc for views&lt;br /&gt;  user auth uses spring acegi&lt;br /&gt;&lt;br /&gt;google: many to many relationship grails&lt;br /&gt;  managed by hand in domain class&lt;br /&gt;    see BookAuthor class/slide&lt;br /&gt;  not a bad solution&lt;br /&gt;&lt;br /&gt;get on grails mailing list-&gt;codehaus project&lt;br /&gt;&lt;br /&gt;grails ships with prototype, scriptaculous, yui out of the box&lt;br /&gt;  in view:&lt;br /&gt;    &lt;g:javascript library="..."/&gt;&lt;br /&gt;      emits &amp;gt;script src=... tag into response&lt;br /&gt;&lt;br /&gt;take a look at:&lt;br /&gt;  google: cos.jar&lt;br /&gt;    manages file upload nicely&lt;br /&gt;    + others&lt;br /&gt;  project: "com.oreilly.servlet"&lt;br /&gt;&lt;br /&gt;file upload is nice&lt;br /&gt;  uses spring under the covers&lt;br /&gt;&lt;br /&gt;security through acegi&lt;br /&gt;  need to install plugin&lt;br /&gt;  gem-like: &lt;br /&gt;    grails list-plugins&lt;br /&gt;    grails install the_plugin&lt;br /&gt;  grails.org: jsecurity plugin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-5582087018881596157?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/5582087018881596157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=5582087018881596157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5582087018881596157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5582087018881596157'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/10/scotts-advanced-grails-talk.html' title='Scott&apos;s Advanced Grails talk...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-986690469218105749</id><published>2007-10-24T22:00:00.000-05:00</published><updated>2007-10-24T22:57:46.079-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>No Fluff wrapped up...</title><content type='html'>I never did get a chance to write about my experience at No Fluff last weekend in real-time, but I've decided to put up some notes from a few of my fave sessions for posterity's sake. Scott Davis's Groovy/Grails track was by far my favourite. JSF/Seam/GWT et al were interesting to be sure, but more evolutionary IMHO. Grails on the other hand (which has, admittedly, borrowed rather generously from certain other frameworks du jour) was just neat-o!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-986690469218105749?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/986690469218105749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=986690469218105749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/986690469218105749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/986690469218105749'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/10/no-fluff-wrapped-up.html' title='No Fluff wrapped up...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-7377104501072630741</id><published>2007-10-19T09:30:00.001-05:00</published><updated>2007-10-24T22:55:34.668-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>No Fluff Just Stuff - Toronto has just rolled into town...</title><content type='html'>... and I'm attending! This being my first time, I expect all the presentations will be fresh and *hopefully* exciting. I'll be sticking to the JSF, Grails and Spring 2.0 streams primarily as they seem most relevant/interesting to me, but the truth of the matter is it was really hard to choose sessions - they all look good. I'll be updating my blog throughout the day if I can - hopefully they have wifi at the hotel's conference center - otherwise expect updates in the evening.&lt;br /&gt;&lt;br /&gt;See ya there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-7377104501072630741?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/7377104501072630741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=7377104501072630741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7377104501072630741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7377104501072630741'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/10/no-fluff-just-stuff-toronto-has-just.html' title='No Fluff Just Stuff - Toronto has just rolled into town...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-8926647005437741796</id><published>2007-08-29T19:15:00.000-05:00</published><updated>2007-08-29T19:23:18.817-05:00</updated><title type='text'>Parallel Thinking</title><content type='html'>Has anyone else noticed the attention a little known language - Erlang - has been getting in recent past? It just hit me... it's an attempted shift away from more megahertz will save me, towards multiple cores will save me. Programmers everywhere are trying to find a better way to model concurrent systems. Getting shared memory systems right is just plain hard. Looks like Erlang may be my language to learn this year. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-8926647005437741796?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/8926647005437741796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=8926647005437741796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/8926647005437741796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/8926647005437741796'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/08/parallel-thinking.html' title='Parallel Thinking'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-5130340261553422419</id><published>2007-07-15T12:18:00.000-05:00</published><updated>2007-07-24T13:25:56.943-05:00</updated><title type='text'>If Data is King...</title><content type='html'>... Visualization is Queen.&lt;br /&gt;&lt;br /&gt;Companies are collecting more data than ever before. Figuring out how to store it for efficient retrieval later is indeed a difficult problem to be sure. But presenting said data in meaningful - actionable? - ways is just as tricky. (And from the perspective of business leaders, dare I say more important.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-5130340261553422419?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/5130340261553422419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=5130340261553422419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5130340261553422419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5130340261553422419'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/07/if-data-is-king.html' title='If Data is King...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-6117374729683229432</id><published>2007-06-11T10:02:00.000-05:00</published><updated>2007-06-11T09:03:48.520-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Application security the process...</title><content type='html'>A secure development process like the one in use at Microsoft takes careful planning and lots of time to achieve. My company's been moving towards something like it since I started almost 2 years ago... here's how:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We figured testing would be the least disruptive starting point for this little paradigm shift. Somebody who understands the issues du jour should be able to get you going pretty quickly. (Consider tools like Fortify's SCA and Watchfire's AppScan here.) Don't overwhelm developers with a report that's hundreds of pages long with dozens of defects - they won't read it. Focus on the most severe vulnerabilities and get them looked at first.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Secure coding guidelines&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While that's going on, you can start work on a secure coding chapter to add to your organization's coding guidelines document. The 2 main ideas to get across: input validation and output encoding, will prevent 80+% of the vulnerabilities hackers are exploiting these days. (The shorter this is the better.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Developer training&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When your guide's ready go through it with development. An hour long presentation or so should suffice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Security audits of new code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Are developers actually following the recommendations you laid out in the last 2 phases? Use regular code audits to highlight the parts of your guide that have been internalized and which bits may need further evangelizing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Security considered by designers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Security at design time is the ultimate goal. Security paid for up front is much cheaper and many times more effective than security that's bolted on at the end.&lt;br /&gt;&lt;br /&gt;But don't expect things will change overnight. It may even be worth your while to get some help while you're ramping up (consultants?), ultimately though, you want your developers writing better code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-6117374729683229432?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/6117374729683229432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=6117374729683229432' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6117374729683229432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6117374729683229432'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/06/application-security-process.html' title='Application security the process...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-6435399187749418671</id><published>2007-05-12T18:05:00.000-05:00</published><updated>2007-05-12T17:05:25.072-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Communication'/><title type='text'>Communication: Be concise...</title><content type='html'>I've found this principle applies across the board from face-to-face meetings and presentations to e-mail. People are just better at digesting information one idea at a time - the shorter the better.&lt;br /&gt;&lt;br /&gt;Some examples:&lt;br /&gt;&lt;br /&gt;Presentations shouldn't contain more than 2 or 3 main takeaways and will ideally come in at a little under an hour - give or take. Beyond that your audience will start to miss parts of your message. It really isn't worth it. If that's not possible, save some material for another presentation.&lt;br /&gt;&lt;br /&gt;Slides filled with bullet points don't help you. One idea per slide for the speaker to talk to works much better. The first time I tried this I ended up with 90 slides instead of 20 but I people definitely enjoyed the pace and format more.&lt;br /&gt;&lt;br /&gt;E-mails should focus on 1 main idea and preferably fit on my screen without scrolling. Anything else is intimidating. (I'm only using e-mail these days to give background/context for face-to-faces.)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-6435399187749418671?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/6435399187749418671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=6435399187749418671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6435399187749418671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6435399187749418671'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/communication-be-concise.html' title='Communication: Be concise...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-1690069654582448701</id><published>2007-04-26T07:24:00.000-05:00</published><updated>2007-04-27T11:22:29.375-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>On handling errors...</title><content type='html'>The 3 error types I'm dealing with all the time: bad data, resources that aren't available or invalid and surprises.&lt;br /&gt;&lt;br /&gt;Validate data coming into the application whether it be from people, web services or file system imports. Reject everything that doesn't match what you're expecting. But don't forget to tell the user what went wrong! (Where you do the validation is another story - the short answer: on the server.)&lt;br /&gt;&lt;br /&gt;Catch errors you can reasonably recover from. File not founds, access denieds, timeouts, etc. Bring the application back to a valid state, help the user correct the error and continue.&lt;br /&gt;&lt;br /&gt;Anything else has to go through a generic error handler. "An application error has occurred.  Please contact technical support and refer to error number: nnnn."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-1690069654582448701?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/1690069654582448701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=1690069654582448701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1690069654582448701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/1690069654582448701'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/on-handling-errors.html' title='On handling errors...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-5483882551282463820</id><published>2007-04-24T05:47:00.000-05:00</published><updated>2007-04-24T05:53:09.703-05:00</updated><title type='text'>My shiny new VStrom...</title><content type='html'>Finally!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/192/466678185_0f861ccd2f.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://farm1.static.flickr.com/192/466678185_0f861ccd2f.jpg" alt="" 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/9125945520322172234-5483882551282463820?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/5483882551282463820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=5483882551282463820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5483882551282463820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/5483882551282463820'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/my-shiny-new-vstrom.html' title='My shiny new VStrom...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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://farm1.static.flickr.com/192/466678185_0f861ccd2f_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125945520322172234.post-931982068144574972</id><published>2007-04-22T08:41:00.000-05:00</published><updated>2007-04-22T07:41:34.121-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>How to make a system hard to secure...</title><content type='html'>Add...&lt;br /&gt;&lt;br /&gt;1 part complexity. Thousands of classes, millions of lines of code, xml configuration files decipherable only by parsers, and all the latest technologies and buzzwords contribute here. (Don't forget to mix in a pinch of WS-* for good measure.)&lt;br /&gt;&lt;br /&gt;1 part extensibility. How many of us use the software we do because of vibrant plugin communities? (Eclipse?) Lots of plugins tells me an application is probably alive and well, and has dozens of passionate users to turn to for help when I need it. (IntelliJ/MS MVPs?)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Plugins: are those little bits of custom code you download by clicking Tools-&gt;Addons -usually written by one "Who, I Have No Idea"- that run in-process and have privileged access to the local file system, main memory and all the data contained therein.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and...&lt;br /&gt;&lt;br /&gt;1 part connectivity. Technology is more pervasive today than ever before and people are using it to keep in touch with old friends and make new ones - I'm thinking Web 2.0's poster children here: MySpace, Facebook, flickr, etc., but this criterion could be applied much more broadly (SMS?). One of my fave quotes comes from Sun Microsystems's Whitfield Diffie: (Not originally his.)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;"As the number of interactions between people goes up, their relative security goes down."&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-style: italic;"&gt;Dr. Whitfield Diffie, Chief Sun Security Guy, Crypto Wiz.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Phishing, stalking and child abduction have all flourished, sadly :-(, in these new online communities by adapting to the new medium faster than did law enforcement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-931982068144574972?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/931982068144574972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=931982068144574972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/931982068144574972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/931982068144574972'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/how-to-make-system-hard-to-secure.html' title='How to make a system hard to secure...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-2329364847134206875</id><published>2007-04-14T08:25:00.000-05:00</published><updated>2007-04-14T14:07:23.218-05:00</updated><title type='text'>Blogspot, del.icio.us, and Feedburner</title><content type='html'>I noticed a few of my fave bloggers were making daily posts of del.icio.us links and notes. &lt;span&gt;"Well that's very neat!" I say to myself. "How'd they do that?"&lt;br /&gt;&lt;br /&gt;After a little bit of poking around, here's what I've come up with...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Del.icio.us has a couple of things that'll do it if you don't mind new posts showing up in your blog full of links: &lt;span style="font-style: italic;"&gt;link rolling&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;daily blog posting&lt;/span&gt;. Great! I guess my only problem then is I don't actually want posts full of links showing up in my blog every day. Ugh. Enter Feedburner...&lt;br /&gt;&lt;br /&gt;Feedburner takes my regular Blogspot feed and wraps it up in one of their own letting them do things like track how many subscribers I've got, and count the number of click-throughs to my posts-presumably to see which ones people are reading most? But here's something else they do that's been very helpful to my little quest... feed aggregation. Did you know del.icio.us serves up a feed of links you add to your account every day? I didn't. Anywho, it looks like Feedburner will automatically grab it and drop it into my feed without touching Blogspot.&lt;br /&gt;&lt;br /&gt;Nice. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-2329364847134206875?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/2329364847134206875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=2329364847134206875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2329364847134206875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/2329364847134206875'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/blogspot-delicious-and-feedburner.html' title='Blogspot, del.icio.us, and Feedburner'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-7742175543862271107</id><published>2007-04-10T14:31:00.001-05:00</published><updated>2007-04-14T08:29:19.319-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>The Defender's Dilemma...</title><content type='html'>Bruce Schneier writes about active deterrence and retaliation in &lt;a href="http://www.schneier.com/blog/archives/2007/04/cyberattack.html"&gt;Cyber-Attack&lt;/a&gt;-a post that takes me right back to one of the first ideas I ran into getting started in security-The Defender's Dilemma. It talks about the 2 opposing forces at play in this space: attackers and defenders and says "it's a lot easier to be an attacker than a defender".&lt;br /&gt;&lt;br /&gt;Here's what it means for me...&lt;br /&gt;&lt;br /&gt;As a defender, I need to make sure my firewall lets traffic through on some ports (21, 25, 80, etc.) but not others. My app server must be locked down-this means getting rid of default apps, changing default passwords, tightening up my server.xml or http.conf, and staying on top of those daily security updates-. And wouldn't it be great if my application was built by people who've heard of things like cross-site scripting and SQL injection-sadly these are still too few and far between.&lt;br /&gt;&lt;br /&gt;As an attacker, all I need do is find one buggy service still running, an over-looked configuration setting or a single unprotected form field in a web application that might have 1000s (alright... an unprotected field that's used in an interesting way-oh in say... a SQL query).&lt;br /&gt;&lt;br /&gt;The general in Schneier's article suggests always &lt;span style="font-weight: bold;"&gt;being&lt;/span&gt; the attacker. Setting aside the moral high-ground for a moment this is the best way to tip the scales in our favour. What he's doing is moving the battlefield away from our systems and networks into somebody else's-which should make for much less collateral damage. Unfortunately that's not something we're going to be able to do is it-enter that pesky high-ground. :-(&lt;br /&gt;&lt;br /&gt;So what's left to us? Disaster recovery and response plans, rock solid backup strategies and constant vigilance. *sigh*&lt;br /&gt;&lt;br /&gt;And the topic for another entry... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-7742175543862271107?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/7742175543862271107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=7742175543862271107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7742175543862271107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/7742175543862271107'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/defenders-dilemma.html' title='The Defender&apos;s Dilemma...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-6093802974457847604</id><published>2007-04-08T14:21:00.000-05:00</published><updated>2007-04-14T08:23:06.347-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Architects...</title><content type='html'>I'm not sure architecture is where I'll end up in the next 5 years or  so but here's where I think I need to be myself before I even start thinking about filling that kind of role...&lt;br /&gt;&lt;br /&gt;An architect is somebody who:&lt;br /&gt;&lt;br /&gt;Is &lt;span style="font-weight: bold;"&gt;experienced&lt;/span&gt;. (And work in the field is pretty much the only place to get it!) S/he usually gets to decide how an application will work from the get-go at the highest level - a system-wide view. Where does it come from? A background involving several sufficiently different projects  certainly helps, but nothing beats mistakes when it comes to learning the right way to do things.&lt;br /&gt;&lt;br /&gt;Is &lt;span style="font-weight: bold;"&gt;confident&lt;/span&gt;. Confidence is something I struggle with all the time - especially when I'm wading into new territory (architectures, libraries). The good news is it's something that largely corrects itself the more decisions you have to make. I know I'm much better than when I started 5-ish years ago - a lot of that came from just slogging through, and working with really smart people.&lt;br /&gt;&lt;br /&gt;Is a &lt;span style="font-weight: bold;"&gt;mentor&lt;/span&gt;. I wouldn't want to work in a company that separates the best and brightest from the rest of us mere mortals. Books and articles are great for improving your craft, but so is a good slap on the wrist when you need it from somebody who's been there. I think an architect should do more than keep apps maintainable, testable, performant, etc. Most developers (myself very much so included) absolutely need the occasional firm but gentle nudge in the right direction!&lt;br /&gt;&lt;br /&gt;[Heavily borrowed from some of my fav bloggers out there. :-p]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-6093802974457847604?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/6093802974457847604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=6093802974457847604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6093802974457847604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/6093802974457847604'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/architects.html' title='Architects...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-8082860258227510647</id><published>2007-04-06T08:14:00.000-05:00</published><updated>2007-04-14T08:23:26.294-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>On improvement...</title><content type='html'>&lt;div class="entry"&gt;&lt;p&gt;From Extreme Programming Explained: Embrace Change…&lt;/p&gt;&lt;p&gt;&lt;em&gt;“Best is the enemy of good enough” suggests that mediocrity is preferable to waiting. This phrase misses the point of XP, which is excellence in software development through improvement. The cycle is to do the best you can today, striving for the awareness and understanding necessary to do better tomorrow. It doesn’t mean waiting for perfection in order to begin.”&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;I fall into this trap all the time. It’s paralyzing! &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-8082860258227510647?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/8082860258227510647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=8082860258227510647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/8082860258227510647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/8082860258227510647'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/from-extreme-programming-explained.html' title='On improvement...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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-9125945520322172234.post-4299074803716988517</id><published>2007-04-06T08:12:00.000-05:00</published><updated>2007-04-06T08:15:46.270-05:00</updated><title type='text'>First post...</title><content type='html'>&lt;p&gt;Hi there!&lt;/p&gt;&lt;p&gt;I've decided my first post is going to be about me.&lt;/p&gt;&lt;p&gt;My name is Christian. I was born in Toronto, Ontario, Canada and have lived here my entire life. I have a sister and mom who love me. I've been really lucky me thinks. What kind of person would I have turned out to be if I had been born in say, Africa? Asia? I'll never know. Life has been good to me and hopefully through my writing, I'll figure out how I feel about that and why.&lt;/p&gt;&lt;p&gt;Writing helps me think. Whether it's about work, life, or anything else under the sun, some of my most important aha! moments have come when I made myself slow down and reflect. I guess this is what writing does for me and why I decided to make it a bigger part of my life.&lt;/p&gt;&lt;p&gt;I haven't decided what my blog is going to be about yet. For now I think I'll write about whatever pops into my head. I know I know, blogs are supposed to be focused, coherent things about a single topic. I couldn't agree less. I'm writing about myself for friends and family. This is about my own personal journey to enlightenment. So there! :)&lt;/p&gt;&lt;p&gt;That's good enough for a first post about nothing in particular.&lt;/p&gt;&lt;p&gt;See you soon.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125945520322172234-4299074803716988517?l=christian-leskowsky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christian-leskowsky.blogspot.com/feeds/4299074803716988517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9125945520322172234&amp;postID=4299074803716988517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4299074803716988517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125945520322172234/posts/default/4299074803716988517'/><link rel='alternate' type='text/html' href='http://christian-leskowsky.blogspot.com/2007/04/first-post.html' title='First post...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/05075534189763405236</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>
