<?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-8148933216702728291</id><updated>2012-02-02T05:04:34.322-08:00</updated><category term='Introduction.'/><title type='text'>def dayCoder(self):</title><subtitle type='html'>some stuff about not being a particularly good programmer, about languages, about testing, about Apple, about tech, and anything else I fancy adding.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>93</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-5690730868167224165</id><published>2012-02-02T03:31:00.000-08:00</published><updated>2012-02-02T05:04:34.335-08:00</updated><title type='text'>Single Story, Television and Violet Blue</title><content type='html'>Last night, due to very bad WiFi in my hotel, I watched a few TED videos I'd downloaded in case the WiFi in my hotel room was very bad. One was just superb. It was 'The Danger of a Single Story' from Chimamanda Adichie. I'd never heard of her before, but just ordered a couple of her books on the strength of how much I enjoyed this:&lt;br /&gt;&lt;br /&gt;&lt;object width="526" height="374"&gt;&lt;br /&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;br /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;br /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;br /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;br /&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;br /&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talk/stream/2009G/Blank/ChimamandaAdichie_2009G-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/ChimamandaAdichie-2009G.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=652&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=chimamanda_adichie_the_danger_of_a_single_story;year=2009;theme=words_about_words;theme=master_storytellers;theme=women_reshaping_the_world;theme=the_creative_spark;event=TEDGlobal+2009;tag=Africa;tag=book;tag=culture;tag=storytelling;tag=third+world;tag=writing;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;br /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="526" height="374" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2009G/Blank/ChimamandaAdichie_2009G-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/ChimamandaAdichie-2009G.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=652&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=chimamanda_adichie_the_danger_of_a_single_story;year=2009;theme=words_about_words;theme=master_storytellers;theme=women_reshaping_the_world;theme=the_creative_spark;event=TEDGlobal+2009;tag=Africa;tag=book;tag=culture;tag=storytelling;tag=third+world;tag=writing;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;It made me think of The Wire.  Just as Chimamanda was stuck telling single stories in her early writing, the majority of TV is stuck telling single stories.  The majority of characters in TV are superficial. One dimensional. They have a single story … good policeman … bent copper… drug dealer … guy in red shirt in away team to the planet surface.&lt;br /&gt;&lt;br /&gt;Characters become multi-dimensional when we know more than one of their stories.  I've always thought this is why The Wire is so good.  Most the characters have more than one story.  It's not possible to do this for all of them, of course. Some minor characters are never fleshed out.  Some characters have to wait for several seasons to pass before getting more of their stories told. After this happened a couple of times, I stopped judging characters on their single-story - being patient for the reveal of a second, third … nth story.&lt;br /&gt;&lt;br /&gt;I haven't always extended that patience in the real world, but it's something I shall endeavour to do, having thought about it in this way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm going to have to consider whether this is also why I like &lt;a href="http://www.bbc.co.uk/programmes/b017h7m1"&gt;The Killing &lt;/a&gt;and &lt;a href="http://www.bbc.co.uk/programmes/b019ch5q"&gt;Borgen&lt;/a&gt;.  I think it's why Skins and Misfits are so good - they present single-story stereotypes intially, but dedicate whole episodes to fleshing out each of the main characters by giving them additional stories.&lt;br /&gt;&lt;br /&gt;This assumption of a single story is what's bitten Violet Blue in captioning &lt;a href="http://www.zdnet.com/photos/macworld-2012-conference-at-a-crossroads/6342029?seq=19&amp;tag=content;siu-container"&gt;"The Saddest Booth Babe In The World" &lt;/a&gt;).  I'm not going to judge her too harshly. She'd just responding to a single story in he way most of us often do. She's not doing herself any favours, however,  by not reconsidering, not apologising, not  learning, not growing. &lt;br /&gt;&lt;br /&gt;A person at conference booth can be a young attractive women, with breasts in a tight t-shirt, representing herself and her work and her nerdery. A young attractive woman, with breasts in a tight t-shirt is not necessarily hired marketing eye-candy. She may for bored and tired and disillusioned. She may be struggling to overcome shyness or social awkwardness (I am imagining myself in a similar situation). She may be sitting there thinking "Fuck! I wish I'd hired a booth-babe. I suck at this!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5690730868167224165?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5690730868167224165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2012/02/single-story-television-and-violet-blue.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5690730868167224165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5690730868167224165'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2012/02/single-story-television-and-violet-blue.html' title='Single Story, Television and Violet Blue'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-637565675362261610</id><published>2011-12-13T02:07:00.000-08:00</published><updated>2011-12-13T02:09:03.926-08:00</updated><title type='text'></title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/9317452-rivers-of-london" style="float: left; padding-right: 20px"&gt;&lt;img alt="Rivers of London (Peter Grant, #1)" border="0" src="http://ecx.images-amazon.com/images/I/61U8IoHM7EL._SX106_.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/9317452-rivers-of-london"&gt;Rivers of London&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/363130.Ben_Aaronovitch"&gt;Ben Aaronovitch&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/246415999"&gt;3 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Picked this up at the airport last week. It's an odd mix. Like a Mark Billingham rewritten by Robert Rankin.  It also reminds me of Neil Gaiman's Neverwhere.&lt;br/&gt;&lt;br/&gt;The main sticking point is that there's a lack of balance between historical background and complexity of plot. It feels like 100 pages of plot and 250 pages of historical/geographical filler.&lt;br/&gt;&lt;br/&gt;It's closer to Rankin or Pratchett than Gaiman.  So if you like that kind of thing, you'll probably like this. &lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/4811173-daycoder"&gt;View all my reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-637565675362261610?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/637565675362261610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/12/rivers-of-london-by-ben-aaronovitch-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/637565675362261610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/637565675362261610'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/12/rivers-of-london-by-ben-aaronovitch-my.html' title=''/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1400385230295948465</id><published>2011-09-13T13:35:00.000-07:00</published><updated>2011-09-13T13:48:50.231-07:00</updated><title type='text'>Trying out ifttt</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-zSTkzwaWuE4/Tm_A9NnaV0I/AAAAAAAAAFM/KZT5gk92vx8/s1600/ifttt%2B_%2BTasks-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 116px;" src="http://4.bp.blogspot.com/-zSTkzwaWuE4/Tm_A9NnaV0I/AAAAAAAAAFM/KZT5gk92vx8/s320/ifttt%2B_%2BTasks-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5651948215232780098" /&gt;&lt;/a&gt;&lt;br /&gt;Really interesting and nicely designed new service called ifttt. It lets you link web stuff.  I'm giving it a whirl right here by linking my blog, such as it is, to Twitter.  I partly chose this because I don't update the blog often, and so it shouldn't annoy people too much. I'd also probably tweet about most blog posts anyway.&lt;br /&gt;&lt;br /&gt;I haven't read T&amp;Cs yet. I'm mostly positive about this, but I can see how it could potentially be abused.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1400385230295948465?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1400385230295948465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/09/trying-out-ifttt.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1400385230295948465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1400385230295948465'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/09/trying-out-ifttt.html' title='Trying out ifttt'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-zSTkzwaWuE4/Tm_A9NnaV0I/AAAAAAAAAFM/KZT5gk92vx8/s72-c/ifttt%2B_%2BTasks-1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-4605209502307931072</id><published>2011-05-15T09:52:00.000-07:00</published><updated>2011-05-15T16:00:10.593-07:00</updated><title type='text'>Cube Destroyed</title><content type='html'>We acquired  a new bed to replace the one in my son's room, which was a temporary stop-gap gratefully received from Freecycle.  I have instructions to put the new one in my daughter's room, and move the one in my daughter's room into my son's room.  I'm not quite sure why. I just do as I'm told.&lt;br /&gt;&lt;br /&gt;I got a bit pissed off because there were a number of my small geek screwdrivers on the floor, no in their box, and a couple of them were broken. There was also a greasy plate under the bed.&lt;br /&gt;&lt;br /&gt;That was nothing though, compared to what I found when I lifted the mattress.  No, not a jazz mag, they have teh internetz for that these days, what I found was my Apple Cube, which should've been in its box in my bedroom, ready for eBayinig, or put to some other use.&lt;br /&gt;&lt;br /&gt;It was old and had a couple of faults: USB and modem on the motherboard were broken.  Ethernet was OK though, and USB via ADC worked.  So it was a functioning, but old.&lt;br /&gt;&lt;br /&gt;What I found was basically everything stripped to the smallest possible component. This is what's left of it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-KYFiz-zdzPY/TdBaoqO4vxI/AAAAAAAAAEc/tJoDrW5t3Ko/s1600/IMG_0728.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://1.bp.blogspot.com/-KYFiz-zdzPY/TdBaoqO4vxI/AAAAAAAAAEc/tJoDrW5t3Ko/s320/IMG_0728.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5607081190654263058" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4605209502307931072?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4605209502307931072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/05/cube-destroyed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4605209502307931072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4605209502307931072'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/05/cube-destroyed.html' title='Cube Destroyed'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-KYFiz-zdzPY/TdBaoqO4vxI/AAAAAAAAAEc/tJoDrW5t3Ko/s72-c/IMG_0728.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-1499169782496733791</id><published>2011-05-14T10:59:00.000-07:00</published><updated>2011-05-15T09:52:23.197-07:00</updated><title type='text'>nightCoder</title><content type='html'>I'm currently working in Switzerland, commuting weekly, flying out on Monday morning and back on Friday afternoon.  Last weekend, my colleague Charles and I elected to stay for the weekend.  It meant an additional day of work by not losing Friday afternoon and Monday morning travelling.&lt;br /&gt;We took Saturday off to explore Milan a little, worked on Sunday morning at the client's office, and then had an afternoon on the terrace with cheese, ham, bread an beer for lunch.  We had a problem sharing the ADSL, but I wanted to do a little more work on a test tool, so Charles surfed, and I worked.&lt;br /&gt;&lt;div&gt;We took a break to use the hotel pools for an hour or so. I had the chilly outdoor pool to myself. Charles had the heated indoor pool to himself.  Then we drove into through Lugano, out around and back through Paradiso and back to the lake.  We ate at a chain restaurant, The Spaghetti Store. It's not as nice as the restaurants in the surrounding villages, but it's right by the lake, and it was a warm clear night.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When we got back to the hotel, there were beers left if the fridge, so we repaired once more to the terrace. We tried open unencrypted sharing of the ADSL via WiFi, which worked. Charles surfed and I surfed a little but mostly continued to work on the test tool.  I had neglected to plug in my power supply, but finished what I wanted to to do with 10% battery left. Charles was still surfing, but was reliant on my Wifi.  I decided not to plug into the power, it was an opportunity to run the battery completely flat. I caught up with a few RSS feeds and gave Charles a countdown on the power situation.  I think it finally died at 1:30am.&lt;br /&gt;&lt;br /&gt;So here I am, coding, at night, not in a cubicle (or equivalent).  It was pretty sweet:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh6.googleusercontent.com/_RqM-t4zWExk/TcfhNXyxKgI/AAAAAAAABA8/1oWp5GCFvz0/s800/DSC00572.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://lh6.googleusercontent.com/_RqM-t4zWExk/TcfhNXyxKgI/AAAAAAAABA8/1oWp5GCFvz0/s800/DSC00572.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 800px; height: 532px;" src="https://lh6.googleusercontent.com/_RqM-t4zWExk/TcfhNXyxKgI/AAAAAAAABA8/1oWp5GCFvz0/s800/DSC00572.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And yes. It was Python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1499169782496733791?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1499169782496733791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/05/nightcoder.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1499169782496733791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1499169782496733791'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/05/nightcoder.html' title='nightCoder'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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='https://lh6.googleusercontent.com/_RqM-t4zWExk/TcfhNXyxKgI/AAAAAAAABA8/1oWp5GCFvz0/s72-c/DSC00572.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-1598495982045203757</id><published>2011-03-09T12:13:00.000-08:00</published><updated>2011-03-11T19:38:26.894-08:00</updated><title type='text'>Offensive.</title><content type='html'>I've just been reading a Grauniad article: &lt;a href="http://www.guardian.co.uk/commentisfree/2011/mar/08/jeffrey-epstein-prince-andrew-chris-bryan"&gt;Not quite a paedophile' – John Humphrys' strange correction&lt;/a&gt; in which Tanya Gold has written:&lt;blockquote&gt;Mainstream porn actresses – I will not call a woman who is a paid-for receptacle for semen a "star".&lt;/blockquote&gt;Yes. Really. In a written piece about poor choice of words on live radio, one woman calls another woman a spunk bucket.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'd love to hear Anna Span or Belle de Jour's opinion on this.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1598495982045203757?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1598495982045203757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/03/offensive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1598495982045203757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1598495982045203757'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/03/offensive.html' title='Offensive.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6598958259928789790</id><published>2011-01-30T05:15:00.000-08:00</published><updated>2011-01-30T05:43:02.152-08:00</updated><title type='text'>Python FTW: Clearing an FTP folder.</title><content type='html'>I'm doing some testing that involves kicking off a lot of concurrent processes.  Some of these write files to an FTP server.  I don't need those files once I've checked that they exist, but FTP doesn't allow deletion of multiple files (AFAIK). The first time we cleared the server, we took a directory listing and wrote an FTP script from that.  It worked well enough, but we'd need to write that script each time.&lt;br /&gt;&lt;br /&gt;So a little play with Python gave me this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from ftplib import FTP&lt;br /&gt;&lt;br /&gt;def clearFTPDirectory(address,&lt;br /&gt;                    username,&lt;br /&gt;                    directory):&lt;br /&gt;&lt;br /&gt;  server=FTP(address)&lt;br /&gt;  server.login(username)&lt;br /&gt;  server.cwd(directory)&lt;br /&gt;&lt;br /&gt;  directory=[]&lt;br /&gt;  server.dir(directory.append)&lt;br /&gt;&lt;br /&gt;  # list comprehension, baby!&lt;br /&gt;  filenames=[entry.split(':')[-1][3:] for entry in directory]&lt;br /&gt;&lt;br /&gt;  for filename in filenames:&lt;br /&gt;      try:&lt;br /&gt;          server.delete(filename)&lt;br /&gt;          print 'Deleted:%s'%filename&lt;br /&gt;      except:&lt;br /&gt;          print ('failed to delete "%s"'%filename)&lt;br /&gt;&lt;br /&gt;  server.quit()&lt;/pre&gt;…it should save a fair few cumulative hours, but more importantly, it'll save a fair few hours of tedium.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The bit that tripped me up for a little while was  &lt;span class="Apple-style-span"   style="  white-space: pre; font-family:monospace;font-size:13px;"&gt;server.dir(directory.append)&lt;/span&gt; which takes the append function as a parameter. Makes perfect sense now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: if you use this, you may need to check the format of the strings returned by dir(), and adjust the line that extracts the filename.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6598958259928789790?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6598958259928789790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/01/python-ftw-clearing-ftp-folder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6598958259928789790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6598958259928789790'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/01/python-ftw-clearing-ftp-folder.html' title='Python FTW: Clearing an FTP folder.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-7100602757806813411</id><published>2011-01-30T05:04:00.000-08:00</published><updated>2011-01-30T05:14:53.617-08:00</updated><title type='text'>Briefly Sexist Dad</title><content type='html'>I caught myself being an old-fashioned gender-stereotype father this morning.  I have a chest of drawers to put together for my daughter's bedroom. Last night I thought that I'd see if my son would like to help put it together.  Then this morning I realised that was a bit daft. There's no reason why my daughter shouldn't help put it together. It's for her room after all.&lt;br /&gt;&lt;br /&gt;So I asked her.&lt;br /&gt;&lt;br /&gt;"Nah", she said, and turned back to watching some crap on the Disney channel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7100602757806813411?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7100602757806813411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/01/briefly-sexist-dad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7100602757806813411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7100602757806813411'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/01/briefly-sexist-dad.html' title='Briefly Sexist Dad'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-284101218922640007</id><published>2011-01-02T03:40:00.000-08:00</published><updated>2011-01-02T03:59:48.540-08:00</updated><title type='text'>When i became a skeptic</title><content type='html'>I've sometimes wondered whether I've ever had faith. Ever believed in God.  I don't think I ever have. I don't have any memory of faith. I went to a church pre-school, to Sunday school, to state schools that did the obligatory Christian service each morning at assembly.  But I don't think I ever believed it.&lt;br /&gt;&lt;br /&gt;I do recall though, the first time I thought faith was bollocks. It was in an R.E. lesson with Mrs Stone, aka Ol' Ma' Brick. She explained faith in terms of the chairs the class was sitting on. That we had unquestioning faith in each chair's ability to support us.   I couldn't articulate why I thought this was bollocks at the time, but bollocks it most certainly was. I'd have been 11 or 12, I think.&lt;br /&gt;&lt;br /&gt;We don't have blind faith in chairs. We have years of experience of chairs and knowledge of the physical world to inform us that the chair will support our weight.  Sometimes a chair will break.  A old and brittle plastic garden chair might lose a leg.  A wooden glued chair may have joint that's worked loose and come apart.&lt;br /&gt;&lt;br /&gt;Sometimes we might see a new design of chair that seems impossibly flimsy, perhaps made of wire, that becomes stronger &lt;span style="font-style:italic;"&gt;when&lt;/span&gt; we sit on it.  Or that appears not to have a full complement of legs.  When we sit on these, we don't do so with blind faith, we do so tentatively, half expecting it to collapse, preparing for it to break, and being pleasantly surprised when it doesn't.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-284101218922640007?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/284101218922640007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/01/when-i-became-skeptic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/284101218922640007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/284101218922640007'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/01/when-i-became-skeptic.html' title='When i became a skeptic'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6221424160033061231</id><published>2011-01-01T04:54:00.000-08:00</published><updated>2011-01-01T08:56:44.303-08:00</updated><title type='text'>Another iPad Epiphany</title><content type='html'>My wife bought a traditional compendium of games for the family for Christmas. A nice wooden box with Chess, Draughts (Checkers), Backgammon, Othello (Reversi), etc. The pieces for the games are hidden inside the box, the lid is reversible with different game boards painted on each side.&lt;br /&gt;&lt;br /&gt;It's like  a primitive, manual iPad.&lt;br /&gt;&lt;br /&gt;Looked at another way, the iPad is like a compendium of apps, but the box under the board is like a TARDIS, and you can't lose the pieces in or under the sofa.&lt;br /&gt;&lt;br /&gt;I'm going to start saving for iPad II.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6221424160033061231?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6221424160033061231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2011/01/another-ipad-epiphany.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6221424160033061231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6221424160033061231'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2011/01/another-ipad-epiphany.html' title='Another iPad Epiphany'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-139526652843285288</id><published>2010-12-30T16:57:00.000-08:00</published><updated>2010-12-30T18:13:06.650-08:00</updated><title type='text'>Elton John</title><content type='html'>The first I heard of Elton John having a child was when I read that the BBC had sought the opinion of the despicable Stephen Green on the news. Stephen Green is, in my unqualified opinion, delusional bordering on insane.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not (just) because I'm an atheist and he's religious.   Some of my best acquaintances are religious.  It's because he's a hateful biblical literalist, a Leviticus believing religious nutjob.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My opinion on gay sex, gay marriage, gay adoption, gay surrogacy, gay parents and gay elderly parents is that it's not really any of my business. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's worth remembering, before judging these new parents, that children are born to terrible parents, to elderly fathers, to cuckolded husbands, into loveless marriages etc, all the time. No licence is required, no exam needs to be passed.  The same applies here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The objections are simply about homophobia, about man-on-man action, not about parenting. Usually, when sex is discussed, I'd say it's OK as long as it's consensual. The ambivalent and those supporting Elton don't see it as being about sex though, and so it's not about consent. Children do not give consent to their parents. Children do not choose their parents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not a fan, incidentally. If anything will make me turn the radio off, it's Elton bloody John.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-139526652843285288?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/139526652843285288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/12/elton-john.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/139526652843285288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/139526652843285288'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/12/elton-john.html' title='Elton John'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3816010685273383124</id><published>2010-12-30T16:37:00.001-08:00</published><updated>2010-12-30T16:52:08.397-08:00</updated><title type='text'>Budgeting</title><content type='html'>I've been looking at my bank statements for the last 6 months to try to figure out where all the money's gone.  I seem to spend a lot, but I don't actually buy much. Or at least I don't have much to show for it, except an expanding waistline.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My plan for 2011 is to have a budget.  Unavoidable things will still go out as direct debits, petrol will go on the debit card.  Food and drink will come out of a weekly cash allowance, and when it's gone, it's gone. If I want something, I'm going to save for it.  I hope to find that by the time I've saved enough to make the purchase, I'll no longer really want it.  I also hope that by using real cash, I'll become more aware of what I'm spending.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3816010685273383124?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3816010685273383124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/12/budgeting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3816010685273383124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3816010685273383124'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/12/budgeting.html' title='Budgeting'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3494405925100856298</id><published>2010-12-28T03:22:00.000-08:00</published><updated>2011-04-29T13:06:44.788-07:00</updated><title type='text'>Level scores on Angry Birds</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Game Centre doesn't give scores or ranking per level. This makes it difficult to target levels that are potentially going to yield more points. Below are my scores. I'm particularly interested in any scores you have that beat mine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Angry Birds…&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Poached Eggs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1 -  1   34240&lt;/div&gt;&lt;div&gt;1 -  2   61200&lt;/div&gt;&lt;div&gt;1 -  3   42820&lt;/div&gt;&lt;div&gt;1 -  4   31120&lt;/div&gt;&lt;div&gt;1 -  5   64930&lt;/div&gt;&lt;div&gt;1 -  6   36570&lt;/div&gt;&lt;div&gt;1 -  7   45610&lt;/div&gt;&lt;div&gt;1 -  8   56410&lt;/div&gt;&lt;div&gt;1 -  9   55440&lt;/div&gt;&lt;div&gt;1 - 10   68560&lt;/div&gt;&lt;div&gt;1 - 11   59960&lt;/div&gt;&lt;div&gt;1 - 12   53560&lt;/div&gt;&lt;div&gt;1 - 13   53010&lt;/div&gt;&lt;div&gt;1 - 14   78180&lt;/div&gt;&lt;div&gt;1 - 15   52590&lt;/div&gt;&lt;div&gt;1 - 16   65760 [66300]&lt;/div&gt;&lt;div&gt;1 - 17   56620&lt;/div&gt;&lt;div&gt;1 - 18   50400 [56080]&lt;/div&gt;&lt;div&gt;1 - 19   39130&lt;/div&gt;&lt;div&gt;1 - 20   60590&lt;/div&gt;&lt;div&gt;1 - 21   83440&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2 -  1   68350&lt;/div&gt;&lt;div&gt;2 -  2   73710&lt;/div&gt;&lt;div&gt;2 -  3  117740&lt;/div&gt;&lt;div&gt;2 -  4   56480&lt;/div&gt;&lt;div&gt;2 -  5   92550&lt;/div&gt;&lt;div&gt;2 -  6   74130&lt;/div&gt;&lt;div&gt;2 -  7   55300&lt;/div&gt;&lt;div&gt;2 -  8   55390&lt;/div&gt;&lt;div&gt;2 -  9   29420&lt;/div&gt;&lt;div&gt;2 - 10   43840&lt;/div&gt;&lt;div&gt;2 - 11   95430&lt;/div&gt;&lt;div&gt;2 - 12   63920&lt;/div&gt;&lt;div&gt;2 - 13   89760&lt;/div&gt;&lt;div&gt;2 - 14   52310 [56050]&lt;/div&gt;&lt;div&gt;2 - 15   67510&lt;/div&gt;&lt;div&gt;2 - 16   68490 [73150]&lt;/div&gt;&lt;div&gt;2 - 17   43690&lt;/div&gt;&lt;div&gt;2 - 18   64450 [70730]&lt;/div&gt;&lt;div&gt;2 - 19   54780&lt;/div&gt;&lt;div&gt;2 - 20   56490&lt;/div&gt;&lt;div&gt;2 - 21   82640&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3 -  1   64560 [65420]&lt;/div&gt;&lt;div&gt;3 -  2   54920&lt;/div&gt;&lt;div&gt;3 -  3   76550&lt;/div&gt;&lt;div&gt;3 -  4   39650&lt;/div&gt;&lt;div&gt;3 -  5  105590&lt;/div&gt;&lt;div&gt;3 -  6   63030&lt;/div&gt;&lt;div&gt;3 -  7   56620&lt;/div&gt;&lt;div&gt;3 -  8   82290&lt;/div&gt;&lt;div&gt;3 -  9   66740&lt;/div&gt;&lt;div&gt;3 - 10   55090&lt;/div&gt;&lt;div&gt;3 - 11   50940 [56550]&lt;/div&gt;&lt;div&gt;3 - 12   50010&lt;/div&gt;&lt;div&gt;3 - 13   48680&lt;/div&gt;&lt;div&gt;3 - 14   52100 [55260]&lt;/div&gt;&lt;div&gt;3 - 15   63530&lt;/div&gt;&lt;div&gt;3 - 16   75460 [76490]&lt;/div&gt;&lt;div&gt;3 - 17   74160&lt;/div&gt;&lt;div&gt;3 - 18   91200&lt;/div&gt;&lt;div&gt;3 - 19   68260 [69500]&lt;/div&gt;&lt;div&gt;3 - 20  121630&lt;/div&gt;&lt;div&gt;3 - 21  130400&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Mighty Hoax&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4 -  1   67130&lt;/div&gt;&lt;div&gt;4 -  2   58250&lt;/div&gt;&lt;div&gt;4 -  3   62540&lt;/div&gt;&lt;div&gt;4 -  4   63880&lt;/div&gt;&lt;div&gt;4 -  5   93380&lt;/div&gt;&lt;div&gt;4 -  6   60040&lt;/div&gt;&lt;div&gt;4 -  7   71120&lt;/div&gt;&lt;div&gt;4 -  8   52880&lt;/div&gt;&lt;div&gt;4 -  9   42370 [46920]&lt;/div&gt;&lt;div&gt;4 - 10   46990 [54510]&lt;/div&gt;&lt;div&gt;4 - 11   95890&lt;/div&gt;&lt;div&gt;4 - 12   99200&lt;/div&gt;&lt;div&gt;4 - 13   77360&lt;/div&gt;&lt;div&gt;4 - 14   87000&lt;/div&gt;&lt;div&gt;4 - 15   88260&lt;/div&gt;&lt;div&gt;4 - 16   83180&lt;/div&gt;&lt;div&gt;4 - 17   30460&lt;/div&gt;&lt;div&gt;4 - 18   89400&lt;/div&gt;&lt;div&gt;4 - 19   52110&lt;/div&gt;&lt;div&gt;4 - 20  108660&lt;/div&gt;&lt;div&gt;4 - 21   90800 [94100]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5 -  1   58810&lt;/div&gt;&lt;div&gt;5 -  2   52900&lt;/div&gt;&lt;div&gt;5 -  3   89430&lt;/div&gt;&lt;div&gt;5 -  4   72990&lt;/div&gt;&lt;div&gt;5 -  5   84560&lt;/div&gt;&lt;div&gt;5 -  6   93830&lt;/div&gt;&lt;div&gt;5 -  7   87250&lt;/div&gt;&lt;div&gt;5 -  8   83650&lt;/div&gt;&lt;div&gt;5 -  9   72830 [79120]&lt;/div&gt;&lt;div&gt;5 - 10   52340&lt;/div&gt;&lt;div&gt;5 - 11   69260&lt;/div&gt;&lt;div&gt;5 - 12   73520&lt;/div&gt;&lt;div&gt;5 - 13   62190&lt;/div&gt;&lt;div&gt;5 - 14   58400&lt;/div&gt;&lt;div&gt;5 - 15   60790 [ 64950]&lt;/div&gt;&lt;div&gt;5 - 16  116840 [117770]&lt;/div&gt;&lt;div&gt;5 - 17  103620 &lt;/div&gt;&lt;div&gt;5 - 18  112190 [116910]&lt;/div&gt;&lt;div&gt;5 - 19  115250&lt;/div&gt;&lt;div&gt;5 - 20  103620 [104780]&lt;/div&gt;&lt;div&gt;5 - 21  175600&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Danger Above&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6 -  1   69180&lt;/div&gt;&lt;div&gt;6 -  2   87140&lt;/div&gt;&lt;div&gt;6 -  3   76220&lt;/div&gt;&lt;div&gt;6 -  4   93430&lt;/div&gt;&lt;div&gt;6 -  5   70170&lt;/div&gt;&lt;div&gt;6 -  6   79000&lt;/div&gt;&lt;div&gt;6 -  7  125970 [124830]&lt;/div&gt;&lt;div&gt;6 -  8  101150&lt;/div&gt;&lt;div&gt;6 -  9  109640 (Don't think this will yield much more)&lt;/div&gt;&lt;div&gt;6 - 10  103590 [103820]&lt;/div&gt;&lt;div&gt;6 - 11  105670&lt;/div&gt;&lt;div&gt;6 - 12  111720&lt;/div&gt;&lt;div&gt;6 - 13   88930 [93520]&lt;/div&gt;&lt;div&gt;6 - 14   95850&lt;/div&gt;&lt;div&gt;6 - 15  139720&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7 -  1  131030&lt;/div&gt;&lt;div&gt;7 -  2  143230&lt;/div&gt;&lt;div&gt;7 -  3   68410&lt;/div&gt;&lt;div&gt;7 -  4   86680 [86740]&lt;/div&gt;&lt;div&gt;7 -  5   83190  84840&lt;/div&gt;&lt;div&gt;7 -  6   80140&lt;/div&gt;&lt;div&gt;7 -  7  103750 [104070]&lt;/div&gt;&lt;div&gt;7 -  8   90290 [96080]&lt;/div&gt;&lt;div&gt;7 -  9  136720&lt;/div&gt;&lt;div&gt;7 - 10  107110 [115680]&lt;/div&gt;&lt;div&gt;7 - 11  113320&lt;/div&gt;&lt;div&gt;7 - 12   90110 [91290]&lt;/div&gt;&lt;div&gt;7 - 13   67270&lt;/div&gt;&lt;div&gt;7 - 14   65460 [69750]&lt;/div&gt;&lt;div&gt;7 - 15  158350 158650&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;8 -  1  107430&lt;/div&gt;&lt;div&gt;8 -  2   71330 [73020]&lt;/div&gt;&lt;div&gt;8 -  3  128600 [135380]&lt;/div&gt;&lt;div&gt;8 -  4  117670&lt;/div&gt;&lt;div&gt;8 -  5   97400&lt;/div&gt;&lt;div&gt;8 -  6  115610&lt;/div&gt;&lt;div&gt;8 -  7  167140&lt;/div&gt;&lt;div&gt;8 -  8  113640 [125310]&lt;/div&gt;&lt;div&gt;8 -  9  143550 [143560]&lt;/div&gt;&lt;div&gt;8 - 10  124500&lt;/div&gt;&lt;div&gt;8 - 11  108260 [110810]&lt;/div&gt;&lt;div&gt;8 - 12  106900 115020&lt;/div&gt;&lt;div&gt;8 - 13  152690 [153610]&lt;/div&gt;&lt;div&gt;8 - 14   90410&lt;/div&gt;&lt;div&gt;8 - 15  150290 [152750]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4.The Big Setup&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;9 -  1   24150&lt;/div&gt;&lt;div&gt;9 -  2   38830&lt;/div&gt;&lt;div&gt;9 -  3   44660&lt;/div&gt;&lt;div&gt;9 -  4   55890 [58440]&lt;/div&gt;&lt;div&gt;9 -  5   40090&lt;/div&gt;&lt;div&gt;9 -  6   53330&lt;/div&gt;&lt;div&gt;9 -  7   82830&lt;/div&gt;&lt;div&gt;9 -  8   58320 [61950]&lt;/div&gt;&lt;div&gt;9 -  9   47240&lt;/div&gt;&lt;div&gt;9 - 10   80970&lt;/div&gt;&lt;div&gt;9 - 11   57610 [58380]&lt;/div&gt;&lt;div&gt;9 - 12   66980 [71530]&lt;/div&gt;&lt;div&gt;9 - 13   78050 [83880]&lt;/div&gt;&lt;div&gt;9 - 14   71150 [73650]&lt;/div&gt;&lt;div&gt;9 - 15   86210 [88980]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;10 -  1  71370&lt;/div&gt;&lt;div&gt;10 -  2  96290 [96960]&lt;/div&gt;&lt;div&gt;10 -  3  77060 [80880]&lt;/div&gt;&lt;div&gt;10 -  4 101850&lt;/div&gt;&lt;div&gt;10 -  5  93870&lt;/div&gt;&lt;div&gt;10 -  6 112100&lt;/div&gt;&lt;div&gt;10 -  7  89290  [97300]&lt;/div&gt;&lt;div&gt;10 -  8  75770&lt;/div&gt;&lt;div&gt;10 -  9  67620&lt;/div&gt;&lt;div&gt;10 - 10  73530&lt;/div&gt;&lt;div&gt;10 - 11 135470&lt;/div&gt;&lt;div&gt;10 - 12  85460&lt;/div&gt;&lt;div&gt;10 - 13  80270  [82020]&lt;/div&gt;&lt;div&gt;10 - 14 107700&lt;/div&gt;&lt;div&gt;10 - 15 105880 [109140]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;11 -  1 117850 [121610]&lt;/div&gt;&lt;div&gt;11 -  2 112110 [115190]&lt;/div&gt;&lt;div&gt;11 -  3 131750 [153290]&lt;/div&gt;&lt;div&gt;11 -  4  89130 [95150]&lt;/div&gt;&lt;div&gt;11 -  5 125980 [137640]&lt;/div&gt;&lt;div&gt;11 -  6 100680 [104850]&lt;/div&gt;&lt;div&gt;11 -  7 124440&lt;/div&gt;&lt;div&gt;11 -  8 126010 [130760]&lt;/div&gt;&lt;div&gt;11 -  9 106430 [108810]&lt;/div&gt;&lt;div&gt;11 - 10  77020 [82090]&lt;/div&gt;&lt;div&gt;11 - 11  92120 [95520]&lt;/div&gt;&lt;div&gt;11 - 12  84390 [87010]&lt;/div&gt;&lt;div&gt;11 - 13 100000 [113450]&lt;/div&gt;&lt;div&gt;11 - 14  91400 [95860]&lt;/div&gt;&lt;div&gt;11 - 15  95690 [101340]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5.Ham 'Em High&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;12 -  1  76200&lt;/div&gt;&lt;div&gt;12 -  2  83020 [83740]&lt;/div&gt;&lt;div&gt;12 -  3  60280&lt;/div&gt;&lt;div&gt;12 -  4  83780 [88590]&lt;/div&gt;&lt;div&gt;12 -  5  79980&lt;/div&gt;&lt;div&gt;12 -  6  62150 [62170]&lt;/div&gt;&lt;div&gt;12 -  7  70140 [71240]&lt;/div&gt;&lt;div&gt;12 -  8  60260&lt;/div&gt;&lt;div&gt;12 -  9 101640&lt;/div&gt;&lt;div&gt;12 - 10  85520 [96250]&lt;/div&gt;&lt;div&gt;12 - 11  75650 [79370]&lt;/div&gt;&lt;div&gt;12 - 12  78350 [80880]&lt;/div&gt;&lt;div&gt;12 - 13  77370&lt;/div&gt;&lt;div&gt;12 - 14  91680&lt;/div&gt;&lt;div&gt;12 - 15 150510&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;13 -  1  79340&lt;/div&gt;&lt;div&gt;13 -  2  82470&lt;/div&gt;&lt;div&gt;13 -  3  78610&lt;/div&gt;&lt;div&gt;13 -  4  93700&lt;/div&gt;&lt;div&gt;13 -  5 100480&lt;/div&gt;&lt;div&gt;13 -  6  97160&lt;/div&gt;&lt;div&gt;13 -  7 147700&lt;/div&gt;&lt;div&gt;13 -  8  60280&lt;/div&gt;&lt;div&gt;13 -  9  78630&lt;/div&gt;&lt;div&gt;13 - 10  65240&lt;/div&gt;&lt;div&gt;13 - 11  88460&lt;/div&gt;&lt;div&gt;13 - 12  90670&lt;/div&gt;&lt;div&gt;13 - 13  54300&lt;/div&gt;&lt;div&gt;13 - 14  82650&lt;/div&gt;&lt;div&gt;13 - 15 129810&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;14 -  1 120950&lt;/div&gt;&lt;div&gt;14 -  2 110460&lt;/div&gt;&lt;div&gt;14 -  3  63670&lt;/div&gt;&lt;div&gt;14 -  4 122830&lt;/div&gt;&lt;div&gt;14 -  5  68450&lt;/div&gt;&lt;div&gt;14 -  6 104710&lt;/div&gt;&lt;div&gt;14 -  7  58080&lt;/div&gt;&lt;div&gt;14 -  8  70670&lt;/div&gt;&lt;div&gt;14 -  9 102260&lt;/div&gt;&lt;div&gt;14 - 10 108310&lt;/div&gt;&lt;div&gt;14 - 11  94580&lt;/div&gt;&lt;div&gt;14 - 12 104520&lt;/div&gt;&lt;div&gt;14 - 13  87240&lt;/div&gt;&lt;div&gt;14 - 14  81990&lt;/div&gt;&lt;div&gt;14 - 15 129920&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;f  -  1 114070&lt;/div&gt;&lt;div&gt;f  -  2  67940&lt;/div&gt;&lt;div&gt;f  -  3 92000&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Angry Birds Seasons…&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Easter Eggs&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1 -   1 -  79640&lt;/div&gt;&lt;div&gt;1 -   2 - 121940&lt;/div&gt;&lt;div&gt;1 -   3 - 116990&lt;/div&gt;&lt;div&gt;1 -   4 - 121610&lt;/div&gt;&lt;div&gt;1 -   5 - 127710&lt;/div&gt;&lt;div&gt;1 -   6 -  90400&lt;/div&gt;&lt;div&gt;1 -   7 -  95190&lt;/div&gt;&lt;div&gt;1 -   8 -  96570&lt;/div&gt;&lt;div&gt;1 -   9 -  98600&lt;/div&gt;&lt;div&gt;1 -  10 - 100280&lt;/div&gt;&lt;div&gt;1 -  11 - 130110&lt;/div&gt;&lt;div&gt;1 -  12 -  94780&lt;/div&gt;&lt;div&gt;1 -  13 -  92640&lt;/div&gt;&lt;div&gt;1 -  14 - 109350&lt;/div&gt;&lt;div&gt;1 -  15 - 120770&lt;/div&gt;&lt;div&gt;1 -  16 - 106820&lt;/div&gt;&lt;div&gt;1 -  17 - 106120&lt;/div&gt;&lt;div&gt;1 -  18 - 121000&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hogs and Kisses&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1 -  1 -  56830&lt;/div&gt;&lt;div&gt;1 -  2 - 118640&lt;/div&gt;&lt;div&gt;1 -  3 -  60230&lt;/div&gt;&lt;div&gt;1 -  4 - 168680&lt;/div&gt;&lt;div&gt;1 -  5 - 102940&lt;/div&gt;&lt;div&gt;1 -  6 -  67270&lt;/div&gt;&lt;div&gt;1 -  7 -  95650&lt;/div&gt;&lt;div&gt;1 -  8 -  65200&lt;/div&gt;&lt;div&gt;1 -  9 -  56150&lt;/div&gt;&lt;div&gt;1 - 10 -  58370&lt;/div&gt;&lt;div&gt;1 - 11 -  70400&lt;/div&gt;&lt;div&gt;1 - 12 -  66120&lt;/div&gt;&lt;div&gt;1 - 13 - 102070&lt;/div&gt;&lt;div&gt;1 - 14 - 110130&lt;/div&gt;&lt;div&gt;1 - 15 - 151560&lt;/div&gt;&lt;div&gt;1 - 16 - 113470&lt;/div&gt;&lt;div&gt;1 - 17 -  94940&lt;/div&gt;&lt;div&gt;1 - 18 -  78850&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Season's Greedings&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1 -  1   71140&lt;/div&gt;&lt;div&gt;1 -  2   82190&lt;/div&gt;&lt;div&gt;1 -  3   60730&lt;/div&gt;&lt;div&gt;1 -  4   95700&lt;/div&gt;&lt;div&gt;1 -  5  116820&lt;/div&gt;&lt;div&gt;1 -  6   63960&lt;/div&gt;&lt;div&gt;1 -  7   73570&lt;/div&gt;&lt;div&gt;1 -  8   91330&lt;/div&gt;&lt;div&gt;1 -  9  102050&lt;/div&gt;&lt;div&gt;1 - 10   60370&lt;/div&gt;&lt;div&gt;1 - 11   70480&lt;/div&gt;&lt;div&gt;1 - 12   85280&lt;/div&gt;&lt;div&gt;1 - 13  122200&lt;/div&gt;&lt;div&gt;1 - 14  102830&lt;/div&gt;&lt;div&gt;1 - 15   58880&lt;/div&gt;&lt;div&gt;1 - 16  100060&lt;/div&gt;&lt;div&gt;1 - 17   64230&lt;/div&gt;&lt;div&gt;1 - 18  113210&lt;/div&gt;&lt;div&gt;1 - 19   48820&lt;/div&gt;&lt;div&gt;1 - 20   50430&lt;/div&gt;&lt;div&gt;1 - 21   73900&lt;/div&gt;&lt;div&gt;1 - 22  100480&lt;/div&gt;&lt;div&gt;1 - 23   77360&lt;/div&gt;&lt;div&gt;1 - 24   59000&lt;/div&gt;&lt;div&gt;1 - 25  158630&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Trick or Treat&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1 -  1   48400&lt;/div&gt;&lt;div&gt;1 -  2   79150&lt;/div&gt;&lt;div&gt;1 -  3   75410&lt;/div&gt;&lt;div&gt;1 -  4   66090&lt;/div&gt;&lt;div&gt;1 -  5   71940&lt;/div&gt;&lt;div&gt;1 -  6   69530&lt;/div&gt;&lt;div&gt;1 -  7   84250&lt;/div&gt;&lt;div&gt;1 -  8  110310&lt;/div&gt;&lt;div&gt;1 -  9  102070&lt;/div&gt;&lt;div&gt;1 - 10  102090&lt;/div&gt;&lt;div&gt;1 - 11  110600&lt;/div&gt;&lt;div&gt;1 - 12   75350&lt;/div&gt;&lt;div&gt;1 - 13  103850&lt;/div&gt;&lt;div&gt;1 - 14   88710&lt;/div&gt;&lt;div&gt;1 - 15   85010&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2 -  1  101650&lt;/div&gt;&lt;div&gt;2 -  2   98910&lt;/div&gt;&lt;div&gt;2 -  3   88090&lt;/div&gt;&lt;div&gt;2 -  4   93520&lt;/div&gt;&lt;div&gt;2 -  5  105290&lt;/div&gt;&lt;div&gt;2 -  6   91550&lt;/div&gt;&lt;div&gt;2 -  7  106390&lt;/div&gt;&lt;div&gt;2 -  8   91600&lt;/div&gt;&lt;div&gt;2 -  9   54120&lt;/div&gt;&lt;div&gt;2 - 10   83339&lt;/div&gt;&lt;div&gt;2 - 11  103270&lt;/div&gt;&lt;div&gt;2 - 12  101820&lt;/div&gt;&lt;div&gt;2 - 13   75250&lt;/div&gt;&lt;div&gt;2 - 14  100970&lt;/div&gt;&lt;div&gt;2 - 15  107520&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3 -  1  120980&lt;/div&gt;&lt;div&gt;3 -  2   92040&lt;/div&gt;&lt;div&gt;3 -  3  110200&lt;/div&gt;&lt;div&gt;3 -  4   48840&lt;/div&gt;&lt;div&gt;3 -  5   73630&lt;/div&gt;&lt;div&gt;3 -  6  112110&lt;/div&gt;&lt;div&gt;3 -  7   96550&lt;/div&gt;&lt;div&gt;3 -  8  101080&lt;/div&gt;&lt;div&gt;3 -  9   77040&lt;/div&gt;&lt;div&gt;3 - 10  118620&lt;/div&gt;&lt;div&gt;3 - 11  112170&lt;/div&gt;&lt;div&gt;3 - 12   79940&lt;/div&gt;&lt;div&gt;3 - 13  113850&lt;/div&gt;&lt;div&gt;3 - 14  102620&lt;/div&gt;&lt;div&gt;3 - 15  102490&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Angry Birds Rio…&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Smuggler's Den&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1 -  1   63060 &lt;/div&gt;&lt;div&gt;1 -  2   48100&lt;/div&gt;&lt;div&gt;1 -  3   59320&lt;/div&gt;&lt;div&gt;1 -  4   60730&lt;/div&gt;&lt;div&gt;1 -  5   59360&lt;/div&gt;&lt;div&gt;1 -  6   74100&lt;/div&gt;&lt;div&gt;1 -  7   59240&lt;/div&gt;&lt;div&gt;1 -  8  121680&lt;/div&gt;&lt;div&gt;1 -  9   78690&lt;/div&gt;&lt;div&gt;1 - 10   84150&lt;/div&gt;&lt;div&gt;1 - 11   89430&lt;/div&gt;&lt;div&gt;1 - 12   85890&lt;/div&gt;&lt;div&gt;1 - 13   94500&lt;/div&gt;&lt;div&gt;1 - 14   84690&lt;/div&gt;&lt;div&gt;1 - 15   71410&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2 -  1   96490&lt;/div&gt;&lt;div&gt;2 -  2   84290&lt;/div&gt;&lt;div&gt;2 -  3   95900&lt;/div&gt;&lt;div&gt;2 -  4   72980&lt;/div&gt;&lt;div&gt;2 -  5   52400&lt;/div&gt;&lt;div&gt;2 -  6   96920&lt;/div&gt;&lt;div&gt;2 -  7   63500&lt;/div&gt;&lt;div&gt;2 -  8  117340&lt;/div&gt;&lt;div&gt;2 -  9   84060&lt;/div&gt;&lt;div&gt;2 - 10   79780&lt;/div&gt;&lt;div&gt;2 - 11   61700&lt;/div&gt;&lt;div&gt;2 - 12   65440&lt;/div&gt;&lt;div&gt;2 - 13  108420&lt;/div&gt;&lt;div&gt;2 - 14   65880&lt;/div&gt;&lt;div&gt;2 - 15   92460&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jungle Escape&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3 -  1   84420&lt;/div&gt;&lt;div&gt;3 -  2   76160&lt;/div&gt;&lt;div&gt;3 -  3   52150&lt;/div&gt;&lt;div&gt;3 -  4  106150&lt;/div&gt;&lt;div&gt;3 -  5   90960&lt;/div&gt;&lt;div&gt;3 -  6   70320&lt;/div&gt;&lt;div&gt;3 -  7   93350&lt;/div&gt;&lt;div&gt;3 -  8  147110&lt;/div&gt;&lt;div&gt;3 -  9  105480&lt;/div&gt;&lt;div&gt;3 - 10   94390&lt;/div&gt;&lt;div&gt;3 - 11   57040&lt;/div&gt;&lt;div&gt;3 - 12   98950&lt;/div&gt;&lt;div&gt;3 - 13  105100&lt;/div&gt;&lt;div&gt;3 - 14   84390&lt;/div&gt;&lt;div&gt;3 - 15  118020&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4 -  1  63850&lt;/div&gt;&lt;div&gt;4 -  2  98760&lt;/div&gt;&lt;div&gt;4 -  3  68910&lt;/div&gt;&lt;div&gt;4 -  4  108210&lt;/div&gt;&lt;div&gt;4 -  5  75870&lt;/div&gt;&lt;div&gt;4 -  6  79910&lt;/div&gt;&lt;div&gt;4 -  7  94160&lt;/div&gt;&lt;div&gt;4 -  8  121320&lt;/div&gt;&lt;div&gt;4 -  9  56630&lt;/div&gt;&lt;div&gt;4 - 10  78340&lt;/div&gt;&lt;div&gt;4 - 11  88500&lt;/div&gt;&lt;div&gt;4 - 12  73040&lt;/div&gt;&lt;div&gt;4 - 13  63220&lt;/div&gt;&lt;div&gt;4 - 14  97740&lt;/div&gt;&lt;div&gt;4 - 15  72420&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: Updated with new high scores.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The scores in square brackets are the highest known scores from other people.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My son is appalled by this. "Oh My God!", he said, "You're an Angry Birds nerd!"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;20110429: Updated with Ham 'Em High,  Rio and Easter Seasons scores.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3494405925100856298?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3494405925100856298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/12/level-scores-on-angry-birds.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3494405925100856298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3494405925100856298'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/12/level-scores-on-angry-birds.html' title='Level scores on Angry Birds'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-8283839819706351433</id><published>2010-12-19T13:31:00.000-08:00</published><updated>2010-12-19T13:57:43.465-08:00</updated><title type='text'>A problem with headphones.</title><content type='html'>I'm pleased to read &lt;a href="http://www.marco.org/2377548060"&gt;this&lt;/a&gt; from Marco Arment. I've had the same problem with all in-ear-with-grommets headphones that I've tried.  I'm pleased simply because I've never heard anyone else echo my complaint.&lt;br /&gt;&lt;br /&gt; I hadn't considered that other designs that also make a seal would have the same problem. It's something I'll consider when I buy replacements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8283839819706351433?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8283839819706351433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/12/problem-with-headphones.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8283839819706351433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8283839819706351433'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/12/problem-with-headphones.html' title='A problem with headphones.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5321148705144929637</id><published>2010-11-28T11:07:00.000-08:00</published><updated>2010-12-02T00:36:53.316-08:00</updated><title type='text'>Link Bomb</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=pwnefUaKCbc"&gt;Janelle Monae - Tightrope&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=e8Xox174PXA"&gt;Mr Deity and the Woman&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=U0--sA5Ah74"&gt;Lucky Louie - Ass&lt;/a&gt; (Audio NSFW)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=VABSoHYQr6k"&gt;Louis CK learns about the Catholic Church&lt;/a&gt; (Audio NSFW)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=V0W7Jbc_Vhw"&gt;Tim Minchin - Storm&lt;/a&gt; (Audio NSFW)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=fHRDfut2Vx0" title="And the fact remains if you protect a single kiddie fucker,then Pope, or Prince or plumber you're a fucking motherfucker."&gt;Tim Minchin  - Pope Song&lt;/a&gt; (NSFW. May offend you if you're Catholic)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=owGykVbfgUE&amp;feature=related"&gt;Old Spice | The Man Your Man Could Smell Like&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=zkd5dJIVjgM"&gt;Sesame Street: Smell Like A Monster&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.thewesternnostril.co.za/"&gt;&lt;br /&gt;The Western Nostril&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rolcats.com/"&gt;Яolcats&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devour.com"&gt;http://devour.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=J6sEdodZEg0"&gt;The Trachtenburg Family Slideshow Players - Mountain Trip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/chzgray#p/a/u/0/amd6FyAVVDI"&gt;Charlie and the Swiss Chocolate Factory&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xkcd.com/705/"&gt;XKCD Sys Admin&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5321148705144929637?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5321148705144929637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/11/link-bomb.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5321148705144929637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5321148705144929637'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/11/link-bomb.html' title='Link Bomb'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-2145580333452078816</id><published>2010-11-27T03:19:00.000-08:00</published><updated>2010-11-27T04:53:45.172-08:00</updated><title type='text'>Writing UTF-8 files from Python</title><content type='html'>As always, there may be better ways to do this (using XML libraries, for example),  but it took far too long to figure this out, given that there's so little to do to fix the problem.  I found a lot of the examples found on Google didn't answer this specifically, but just added to the confusion.&lt;br /&gt;&lt;br /&gt;The problem:&lt;br /&gt;&lt;blockquote&gt;a = 'âêîôŷ'&lt;br /&gt;print a&lt;/blockquote&gt;&lt;br /&gt;gives this error:&lt;br /&gt;&lt;blockquote&gt;UnicodeDecodeError: 'ascii', '\xc3\xa2\xc3\xaa\xc3\xae\xc3\xb4\xc5\xb7', 0, 1, 'ordinal not in range(128)'&lt;/blockquote&gt;&lt;br /&gt;The proper way to define a unicode string is this:&lt;br /&gt;&lt;blockquote&gt;a = u'âêîôŷ'&lt;br /&gt;print a&lt;/blockquote&gt;&lt;br /&gt;which yields:&lt;br /&gt;&lt;blockquote&gt;âêîôŷ'&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;In my search, though, there was lots of talk of how to convert strings to UTF-8, and this is *not* what you do if you want to write to a UTF-8 file.  If you convert to UTF-8 before writing, you'll probably get errors becasue it'll contain values &gt;=127.&lt;br /&gt;This is how you do it...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ascii='abcdef'&lt;br /&gt;uni = u'â˘¸ðêƒ'&lt;br /&gt;file=codecs.open('utf-8.xml', mode='w', encoding='utf-8')&lt;br /&gt;file.write(ascii)&lt;br /&gt;file.write(uni)&lt;br /&gt;file.close()&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The only difference here is that you must use 'u' when defining literals, and you need to used codecs.open, with the encoding specified, when opening the file.&lt;br /&gt;&lt;br /&gt;If, when you read the file, it appears to have 2 strange characters rather than the one unicode character you expect, the file is probably OK, it's the viewer that isn't reading UTF-8 properly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-2145580333452078816?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/2145580333452078816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/11/writing-utf-8-files-from-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2145580333452078816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2145580333452078816'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/11/writing-utf-8-files-from-python.html' title='Writing UTF-8 files from Python'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3128324419054107590</id><published>2010-11-26T09:44:00.000-08:00</published><updated>2010-12-30T04:16:34.181-08:00</updated><title type='text'>More fun with Python</title><content type='html'>I'd recently written a little Python app to create a load of test data.  The test data is XML, and should be UTF-8.  I'd not really considered this properly, and for my original purposes, it's irrelevant.  For a bit of fun/experimentation/learning, I put a tk front end on it, and email ed the project team to let them know, just in case it was useful.&lt;br /&gt;&lt;br /&gt;Coincidentally, the vendor of the external product that would be producing these XML files in the real world was going to be late by several months, meaning that the XML files would need to be hand-crafted, the test data generator turned into a deliverable, and I briefly turned from tester into nightCoder.&lt;br /&gt;&lt;br /&gt;There were a number of feature requests. My testing colleague started testing and raising defects against my code.  Testing revealed areas in which i could be improved. I added a log file, properties files, some exception handling and error reporting dialogs.  I had a real developer moment when it was deployed, went wrong and said (with a tester's smile on my face), "well that doesn't happen on &lt;span style="font-style:italic;"&gt;my&lt;/span&gt; machine!".&lt;br /&gt;&lt;br /&gt;While trying to figure out that problem, using a Swiss keyboard, typing garbage into some mandatory field, committing yielded another error as a result of non ASCII characters. As the client is Swiss, and these fields will probably included non ASCII, a fix was definitely required.  Had this been just a learning exercise, I may not have been too worried, As I was now delivering this software, I had no option other than to figure it out.  This highlights my main problem with self-teaching: I really struggle to find projects, and often abandon them in an unfinished state because nobody is relying on the solution.&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3128324419054107590?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3128324419054107590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/11/more-fun-with-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3128324419054107590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3128324419054107590'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/11/more-fun-with-python.html' title='More fun with Python'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6653002524936353840</id><published>2010-10-18T03:20:00.000-07:00</published><updated>2010-10-18T05:40:04.400-07:00</updated><title type='text'>The Henry Spink Foundation</title><content type='html'>I'd never heard of The Henry Spink Foundation, but &lt;a href="http://twitter.com/JohnLDixon"&gt;John L Dixon&lt;/a&gt; retweeted this from &lt;a href="http://twitter.com/zeno001"&gt;Alan Henness&lt;/a&gt;, and now I have:&lt;br /&gt;&lt;blockquote&gt;NOOOOOOOOO!!!!!! NOT FELICITY KENDALL!!!! &lt;a href="http://bit.ly/9X9rJW"&gt;http://bit.ly/9X9rJW&lt;/a&gt; #dreamsshattered&lt;/blockquote&gt;&lt;br /&gt;I set off to find out a little more. I read a little. I came across a list of therapies*. I ticked off Homeopathy, Chiropractic, and one of my favourites, Craniosacral Osteopathy from a mental list of quackery.  I haven't and don't intend to read all of it. There may be some good and useful information about some good and useful therapies in amongst the bullshit.  The trouble is that I already know from just five minutes perusing, that I can't trust it.&lt;br /&gt;&lt;br /&gt;I picked something I'd never heard of from the &lt;a href="http://www.henryspink.org/search.aspx"&gt;list&lt;/a&gt; that they call the 'information centre'.  I chose &lt;a href="http://www.henryspink.org/the_tomatis_method.htm"&gt;The Tomatis Method&lt;/a&gt;.  In the second paragraph. I read: &lt;br /&gt;&lt;blockquote&gt;According to Dr Tomatis this happens when muscles are not working properly and through auditory stimulation it is possible to retrain the muscles of the inner ear so that it can function without distortion.&lt;/blockquote&gt;&lt;br /&gt;Hang on, I thought. &lt;i&gt;Muscles of the inner ear ?&lt;/I&gt;  My anatomical knowledge comes from what I've picked up from watching Your Life In Their Hands, going to Body Worlds, playing Bones Lite, being slightly in love with &lt;a href="http://www.alice-roberts.co.uk/"&gt;Dr Alice Roberts&lt;/a&gt; and doing a 60 point level 2 Technology of Music unit with the Open University.&lt;br /&gt;&lt;br /&gt;The OU course had a bit about the ear, but I didn't recall anything about muscles of the inner ear.  It seemed a bit unlikely.  I can wiggle my pinnae a bit, so I know we have vestigial muscles associated with the outer ear.  I know we can attenuate our hearing by manipulating the ossicles, which sounds as though muscles are involved. Muscles in the cochlear seem a  bit unlikely though.&lt;br /&gt;&lt;br /&gt;So I googled. I found this kind of thing : &lt;a href="http://www.mc.vanderbilt.edu/histology/labmanual2002/labsection2/Ear03.htm"&gt;EAR&lt;/a&gt;.  Intra-inner-ear-musculature was conspicuous by its absence.&lt;br /&gt;&lt;br /&gt;Next step, look up The Tomatis Method.  The &lt;a href="http://www.tomatis.com/index.php?page=methode&amp;lang=2&amp;menu=on"&gt;Official site&lt;/a&gt; says something different:&lt;br /&gt;&lt;blockquote&gt;…listening will be disturbed when there is a dysfunction of the two muscles located in the middle ear whose role is to enable the precise and harmonious integration of acoustic information into the inner ear, and from there to the brain…&lt;/blockquote&gt;&lt;br /&gt;I don't want to go into the Tomatis Method in any detail.  The rest of the information given by The Henry Spink Foundation suggests that it's nonsense.  The point I'm trying to make is that if someone like me, a half-arsed lay anatomist with really quite rudimentary knowledge can spot a mistake like this in about 5 minutes, proper smart qualified people should be able to rip it to shreds.  More worrying though is that gullible, desperate, less inquisitive people might buy into this kind of nonsense and line the pockets of these charlatans.&lt;br /&gt;&lt;br /&gt;[Note: if there's actual evidence of the efficacy of the Tomatis Method, that would pass the scrutiny of a proper professional, like Ben Goldacre, say, I'll happily write another post singing its praises]&lt;br /&gt;&lt;br /&gt;[* John has since called the &lt;a href="http://www.henryspink.org/info.aspx"&gt; list&lt;/a&gt;&lt;i&gt;a real "Woo's Woo" of AltMed treatments"&lt;/i&gt;. Genius!]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6653002524936353840?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6653002524936353840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/10/henry-spink-foundation.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6653002524936353840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6653002524936353840'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/10/henry-spink-foundation.html' title='The Henry Spink Foundation'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-6319175582902794712</id><published>2010-10-02T10:41:00.000-07:00</published><updated>2010-10-02T11:43:57.471-07:00</updated><title type='text'>Wireless Audio done right.</title><content type='html'>With an open mind, I introduced the &lt;a href="http://daycoder.blogspot.com/2010/09/disappointing-bargain.html"&gt; Sony wireless speakers&lt;/a&gt; to my wife. I explained that they were a complete bargain, and that if we didn't want them, I could probably re-sell them to someone at work. She was quite keen to get some music back into the living room.  Our DVD player, which was used to play CDs, has migrated to another room, and music on a MacBook's speakers is obviously compromised.&lt;br /&gt;&lt;br /&gt;After a quick demo, while she was out of the house earlier, I started to set them up properly.  As I was setting them up, I discovered that our Airport Express, which I'd bought to augment a dead spot right where my wife sits on the couch, was now very close to our AV cupboard.  My son had moved it a little while back.&lt;br /&gt;&lt;br /&gt;Rather than plug in the Sony kit, I figured I might be able to hook up the Airport Express.  We've a bit of an unconventional setup.  Virgin V+ and Sky boxes hooked up to an old Phillips video sender, which is routed to &lt;a href="http://www.acoustic-energy.co.uk/Default.aspx?pagename=Aego-M-loudspeaker"&gt;Aego-M 2.1 speakers&lt;/a&gt; (fantastic) and an NEC projector (feeling its age now), which projects straight onto the living room wall, giving us a 70" picture.  If the video sender is transmitting, it kills WiFi, so it's just used to switch sources. it has 4 in and 1 out, so here were 2 spare inputs.&lt;br /&gt;&lt;br /&gt;A quick nose through my boxes of cables and connectors yielded a SCART to Phono converter (the kind you get with a PS2 or a Wii) and a 3.5mm jack to Phono cable. Perfect. I hooked it up, fired up iTunes on my MacBook Pro, the &lt;a href="http://itunes.apple.com/gb/app/remote/id284417350?mt=8"&gt;Remote App&lt;/a&gt; on my iPod Touch, paired them, and had audio out of the Aegos straight away.&lt;br /&gt;&lt;br /&gt;I did briefly have a problem with Remote losing the ability to connect to iTunes. The settings were correct. The interwebs suggested a firewall problem.  My firewall settings were fine, but something was screwing up with it. I switched the firewall off, reconnected, and turned the firewall on again, and it's been fine ever since.&lt;br /&gt;&lt;br /&gt;The Remote app is brilliant. Fantastic. It can switch between multiple libraries, and it can re-route audio to either the Mac's speakers or the Airport connected speakers (or both).  It's also far faster than I'd expect.  I have a fairly large library (12,000+ songs), and it takes seconds to connect, seearch etc. It's as though the library is on the iPod.&lt;br /&gt;&lt;br /&gt;This is how it's meant to be.  The Sony system goes back on Monday.  Turns out an 83% discount doesn't matter if the product is fundamentally flawed. Docking an iPod touch or an iPhone takes it out of your hand, and that's just wrong.&lt;br /&gt;&lt;br /&gt;People accuse me of fanboyism, but it's only partly true. Apple generally make stuff that's better than everyone else, but often it's just because it sucks less than everyone else rather than being phenomenally good.  iTunes + Airport Express + Remote is an example of phenomenally good.&lt;br /&gt; but they absolutely nailed this.&lt;br /&gt;&lt;br /&gt;With &lt;a href="http://www.apple.com/uk/itunes/airplay/"&gt;Airplay&lt;/a&gt; coming to third party devices, this is only going to get better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6319175582902794712?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6319175582902794712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/10/wireless-audio-done-right.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6319175582902794712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6319175582902794712'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/10/wireless-audio-done-right.html' title='Wireless Audio done right.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4777212518087178501</id><published>2010-09-30T10:07:00.000-07:00</published><updated>2010-09-30T10:34:01.078-07:00</updated><title type='text'>A disappointing bargain</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_spoBTy3882Y/TKTEu5zceEI/AAAAAAAAACY/a87HGsGAXRw/s1600/69300.jpeg"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 193px;" src="http://2.bp.blogspot.com/_spoBTy3882Y/TKTEu5zceEI/AAAAAAAAACY/a87HGsGAXRw/s400/69300.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5522755353132693570" /&gt;&lt;/a&gt;&lt;br /&gt;Yesterday I bought a Sony &lt;a href='http://www.sony.co.uk/product/mfi-ipod-speaker-docks/air-sa20pk'&gt;AIR-SA20PK&lt;/a&gt; Multi-Room Wireless speaker system. I got it back to my mid-week digs, unboxed it, and gave it a quick trial.  Maybe 10 minutes. It has such significant flaws that I'm currently considering the purchase a mistake.&lt;br /&gt;&lt;br /&gt;When you buy a £300 gadget for £50, and it &lt;i&gt;still&lt;/i&gt; disappoints, it's no surprise to discover that it's discontinued product.&lt;br /&gt;&lt;br /&gt;Brief explanation of the system. There are three boxes. Two are remote speakers, the other is a base unit, which is a combined iPod Dock, FM Radio and Digital Audio Transmitter. Each speaker can play they audio of the iPod or radio independently. The base unit can also be connected to an amplifier or TV with phono connectors for L/R audio and composite video. Think of it as Sonos Lite. &lt;br /&gt;&lt;br /&gt;Before I explain what's wrong with it, reasons to be cheerful:&lt;br /&gt;&lt;br /&gt;I'd been looking for a simple iPod Dock that would connect to my amp and would charge the iPod from the mains. The Apple Universal Dock is £39. It needs USB power, so is dead to me, but it gives me a reference price.  The Dock/Transmitter part of the Sony Air system plugs into the mains (with a ludicrously big tethered wall wart) and has phono connectors for some iPod-to-amp goodness.&lt;br /&gt;&lt;br /&gt;I probably wouldn't have paid £50 just for something that only did this, but nevertheless, it solves my problem.&lt;br /&gt;&lt;br /&gt;In a quick test, in one room, with one receiver about 3 foot from the dock and the other about 20ft from the dock, everything paired quickly and sounded good.  Not enough base said fellow lodger, but he's young and likes terrible music consisting mainly of bass and appalling lyrics. It sounded reasonably well rounded considering the size of the units. They're about the size of a kitchen radio, but twice as deep.&lt;br /&gt;&lt;br /&gt;And now the bad…&lt;br /&gt;&lt;br /&gt;I need to confirm this, but I've read that the FM radio audio cannot be routed to the L/R phono output of the base unit. There's no switch, those outputs are hard-wired for the iPod.&lt;br /&gt;&lt;br /&gt;I've tested briefly with an iPhone. It doesn't work. My hypothesis is that the base unit's wireless signal and the 3G of an iPhone interfere with each other, or perhaps getting approval for connectivity with an iPhone is harder and more expensive than for a mere iPod.&lt;br /&gt;&lt;br /&gt;I've also read that the new retina display iPods aren't compatible for some reason, but have yet to confirm.&lt;br /&gt;&lt;br /&gt;Setting up was really easy, but actually putting the iPod into the dock and picking up the Sony remote was an "Oh Noes!" moment. It just immediately felt all wrong. "What have I done?", I thought, as a superb visual interface was replaced with a play/pause/prev/next interface. The fact that the iPod needs to be in the dock while it's in use is a bit of a disaster. While charging overnight is fair enough, (REMINDER:Check that the iPod charges while the base unit is in standby mode), but not using the iPod's interface for navigation is simply an epic fail.&lt;br /&gt;&lt;br /&gt;I've yet to test the range or whether WiFi suffers while the base unit is on. Experience with an analogue video sender was that it totally screwed with our WiFi, no matter what channels were in use.  The Sony may turn out to be fine in this respect, but the proper solution is to use Wifi or Bluetooth. Proprietary wireless is really just asking for trouble.&lt;br /&gt;&lt;br /&gt;There are no auxiliary inputs on the base unit. This is madness. It means that no audio, other than from a &lt;i&gt;supported&lt;/i&gt; iPod, can be used with the system. If the 4th generation iPod Touch incompatibility is true, it means that this system became obsolete inside about 2 years. Break/Lose your iPod and your multi-room audio just broke forever.&lt;br /&gt;&lt;br /&gt;There are no auxiliary inputs on the remote speakers.  This is also madness. There should be a line in on both of the remote speakers so that any other source can be used with them. If the transmitter breaks, the remote speakers die with it.&lt;br /&gt;&lt;br /&gt;Note: A colleague has pointed out that other S-Air transmitters are available, even if this one is discontinued.  He also suggested that the reason for not having an aux inputs is that it obviates the need for A/D converters, making the units cheaper to produce.&lt;br /&gt;&lt;br /&gt;It's really doesn't feel like a £300 product.  Amp plus speakers plus Apple Remote on the iPod plus iTunes plus Airport Express. That's a better solution.  I'd still need that dock though, and all of that would be a lot more than £50.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4777212518087178501?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4777212518087178501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/09/disappointing-bargain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4777212518087178501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4777212518087178501'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/09/disappointing-bargain.html' title='A disappointing bargain'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_spoBTy3882Y/TKTEu5zceEI/AAAAAAAAACY/a87HGsGAXRw/s72-c/69300.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-4178060624538334254</id><published>2010-09-17T03:29:00.000-07:00</published><updated>2010-09-17T03:46:35.701-07:00</updated><title type='text'>Obama's religion</title><content type='html'>I can't remember what I was discussing with a friend of mine last night, but it led me to say "Obama probably isn't a Christian".&lt;br /&gt;&lt;br /&gt;My friend looked at me as though I was mad. As though I'd said something deeply offensive.&lt;br /&gt;&lt;br /&gt;"What do you mean ?", he demanded.&lt;br /&gt;&lt;br /&gt;I looked puzzled at his reaction, and replied, "Well, he's an intelligent man. He's more likely to be a closet atheist. He'd be unelectable if he didn't do the whole Christian thing"&lt;br /&gt;&lt;br /&gt;He relaxed.&lt;br /&gt;&lt;br /&gt;"Oh. Thank fuck for that! For a moment I thought you'd gone mad and that you thought he was a Muslim!"&lt;br /&gt;&lt;br /&gt;Oh how we laughed. For quite a long time.&lt;br /&gt;&lt;br /&gt;Interestingly, I read &lt;a href="http://scienceblogs.com/pharyngula/2010/09/obama_is_not_an_atheist.php?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+scienceblogs%2Fpharyngula+%28Pharyngula%29"&gt;this&lt;/a&gt; today.  I may have to revise my opinion, but my experience suggests that most Christians are either non-practising believers, or practising-non-believers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4178060624538334254?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4178060624538334254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/09/obamas-religion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4178060624538334254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4178060624538334254'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/09/obamas-religion.html' title='Obama&apos;s religion'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1250254279135409917</id><published>2010-09-13T09:53:00.000-07:00</published><updated>2010-09-13T10:05:13.291-07:00</updated><title type='text'>'Bland Recognition'</title><content type='html'>I hereby lay claim to the term 'Bland Recognition', first used on &lt;a href="http://twitter.com/daycoder/status/24302471885"&gt;Twitter&lt;/a&gt;, in relation to the erosion of variety and creativity in advertising, architecture, society, products.&lt;br /&gt;&lt;br /&gt;It's what you feel when you find yourself in &lt;a href="http://www.independent.co.uk/news/uk/this-britain/clone-attack-the-two-sides-of-high-street-uk-493296.html"&gt;clone town&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1250254279135409917?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1250254279135409917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/09/bland-recognition.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1250254279135409917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1250254279135409917'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/09/bland-recognition.html' title='&apos;Bland Recognition&apos;'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4727054540840974190</id><published>2010-09-13T07:18:00.001-07:00</published><updated>2010-09-13T07:36:46.882-07:00</updated><title type='text'>The iPod Nano (the crap one)</title><content type='html'>I've not tried one, but initial impressions aren't good. It looks ugly. A touch interface feels inappropriate with such a small screen.&lt;br /&gt;&lt;br /&gt;All of the 'but for a little bit more, you can get an iPod Touch' harping, though, just reminds me of when the iPod mini was introduced, and people all said it was stupid to save a few quid when a full sized iPod has way more storage.&lt;br /&gt;&lt;br /&gt;I think if this nano fails, it won't have anything to do with price/features, it'll be because it's a bit ugly, and difficult to use.&lt;br /&gt;&lt;br /&gt;The new iPod nano is a fifth of the weight of the new iPod Touch. (≃20g vs ≃100g)&lt;br /&gt;&lt;br /&gt;The new iPod Touch is almost five times the volume of the new iPod Nano. (2.8 cubic inches versus 0.6 cubic inches)&lt;br /&gt;&lt;br /&gt;I guess the iPod Nano is the gym iPod. It's small and light and has a clip. As such it's certainly more niche. I'd expect far fewer sales of iPod Nanos versus iPod Touch, but that doesn't mean it's failed, it just indicates how the market has segmented.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4727054540840974190?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4727054540840974190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/09/ipod-nano-crap-one.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4727054540840974190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4727054540840974190'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/09/ipod-nano-crap-one.html' title='The iPod Nano (the crap one)'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5297260108854997675</id><published>2010-09-13T07:05:00.000-07:00</published><updated>2010-09-13T08:18:41.361-07:00</updated><title type='text'>Hywel's Law</title><content type='html'>&lt;blockquote&gt;The grammatical correctness of an email request for tech support is inversely proportional to the stupidity of the question therein.&lt;/blockquote&gt;&lt;br /&gt;That is all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5297260108854997675?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5297260108854997675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/09/hywels-law.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5297260108854997675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5297260108854997675'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/09/hywels-law.html' title='Hywel&apos;s Law'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-7758395791539457549</id><published>2010-09-10T02:08:00.000-07:00</published><updated>2010-09-10T03:08:14.733-07:00</updated><title type='text'>Tefal Quick Cup</title><content type='html'>A year or two ago, our kettle broke. We got a Tefal Quick Cup to replace it. Just the right amount of water is heated as it passes through an element, meaning you only heat the water you need. It also dispenses cool filtered water. What's not to like ?&lt;br /&gt;&lt;br /&gt;What's not to like:&lt;br /&gt;&lt;br /&gt;1. The 'cool' water is room temperature, which is hardly cool on a hot day. If you want cool filtered water, get a water filter jug and keep it in the fridge. If you want cool water, get it from the tap.&lt;br /&gt;&lt;br /&gt;2. 'Cool' water remains in the pipe/element until the next time you use it.  This means that you get a small amount of cold water in your cup. The workaround is to start the hot water for a second, stop it, empty the tepid water into the sink and then start making a drink. If you forget to do this it makes instant black coffee even more disgusting than it normally is, and white coffee undrinkable. Tea is a disaster. Coffee in a cafetière is just about OK, except ours doesn't fit under the Quick Cup's spout easily.&lt;br /&gt;&lt;br /&gt;3. Tea is a disaster. Boiling water plus teabag in a mug may be against the law, but it's how most people make tea these days. While it's not as nice as making it in a warmed pot with a little patience, it'll make a fairly decent cuppa. WARNING! DO NOT MAKE TEA WITH A TEFAL QUICK CUP! No. Seriously. Don't do it. It'll be like American tea, where you get cup of warm water and a teabag on the side.&lt;br /&gt;&lt;br /&gt;4. You'll need a kettle anyway. Being impatient, we ended up buying a cheap kettle anyway, for boiling water to make pasta etc. Turns out it's good for tea as well.&lt;br /&gt;&lt;br /&gt;5. It feels more inconvenient. If you're making one cup or two, it's probably better. Making four or six or eight makes you feel like a galley slave. Worse though, is that it engenders an entitlement to instant gratification. Whereas with a kettle, it's automatic to fill it to a desired level as you put it on, with the TQC, it's automatic just to hit the button.  Fine if the reservoir is full, but SO UNFAIR if, mid cup, it starts spitting out steam and coughing.&lt;br /&gt;&lt;br /&gt;6. It dispenses a set amount of water. This is mostly a convenience. Press once, get a mug full of water.  Not all of our mugs are the same capacity, so some get dangerously full and others pique the pessimist in me and seem half empty.&lt;br /&gt;&lt;br /&gt;7. It dispenses a set amount of water, but with no intelligence, and it encourages a lack of attention from the user. Press the button a second time, and it stops. Press it again and it'll yield a whole mug's worth again. Usually not a problem, but if the reservoir runs dry, and you're forced ALL THE WAY across the kitchen to fill it up, when you poke that button, you get a full cup's worth. If you're not paying attention, that could be half a cup's worth of dilute coffee all over the work surface.&lt;br /&gt;&lt;br /&gt;8. It dispenses a set amount of water. See 4 and 5. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In summary, this is what it's good at:&lt;br /&gt;&lt;br /&gt;1. Instant black coffee, as long as you remember to purge the spout.&lt;br /&gt;&lt;br /&gt;This is what it's bad at:&lt;br /&gt;&lt;br /&gt;2. Everything else.&lt;br /&gt;&lt;br /&gt;Buy a kettle instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7758395791539457549?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7758395791539457549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/09/tefal-quick-cup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7758395791539457549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7758395791539457549'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/09/tefal-quick-cup.html' title='Tefal Quick Cup'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-2304764995765809704</id><published>2010-08-30T09:35:00.000-07:00</published><updated>2010-08-30T10:02:07.459-07:00</updated><title type='text'>Postcode Search Usability Fail</title><content type='html'>[RANT]&lt;br /&gt;When searching online for goods in stock in nearby stores, I get really wound up by having to put in a full postcode.  This is normally mildly annoying, in that I know my own full postcode, but there are some places for which I only know a partial postcode.&lt;br /&gt;&lt;br /&gt;Example: I live in Kent, but work in Hampshire. The local Argos doesn't have stock of the printer ink I need, but it is listed, and is available for home delivery. PC World, Comet, Curries, Tescos, etc, no longer stock the ink.&lt;br /&gt;&lt;br /&gt;I attempt to search the Basingstoke store. I enter "RG21", which I know is the town centre. It's rejected because it's not a full postcode, even though an area postcode should be sufficiently accurate in this instance. Grrrr!&lt;br /&gt;[/RANT]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-2304764995765809704?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/2304764995765809704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/08/postcode-search-usability-fail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2304764995765809704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2304764995765809704'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/08/postcode-search-usability-fail.html' title='Postcode Search Usability Fail'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5823463857455100844</id><published>2010-08-20T10:52:00.000-07:00</published><updated>2010-08-20T11:48:21.121-07:00</updated><title type='text'>Functional Testing Tools.</title><content type='html'>This week, I've spent a fair amount of time reading about functional test tools.  Both for automated testing, and for manual testing, for two different projects.&lt;br /&gt;&lt;br /&gt;I don't know what it is about tools for testers, but they feel terribly prescriptive and constraining.  We tried Seapine's TCM tool a couple of years ago. The idea was to replace our slightly flaky Excel based scripts.  It was chosen because we use Seapine's defect management tool, Test Track Pro, and it made for an integrated solution.&lt;br /&gt;&lt;br /&gt;Test Track Pro is fine.  I don't think we get much out of it that couldn't be achieved with Bugzilla or a hundred other defect management tools.  It's not perfect, it's not simple enough for my tastes, but it's reliable and does what it needs to do.&lt;br /&gt;&lt;br /&gt;What happened was that I spent a couple of months writing macros to convert our Excel scripts into a form that Seapine could handle, and using their SOAP/WSDL API to write a Java utility to inject the scripts as new test cases.  I also spent some time writing another utility to generate a project status summary using the fundamental metric we measure against, which is number of test steps.  It's not a particularly good metric, with tens of thousands of steps, we have a good feeling for how long scripts take to execute.&lt;br /&gt;&lt;br /&gt;We also tend to write very long scripts, some with many hundreds of steps.  It's probably bad practice, but it works for us, and historically, with no TCM, it was easier to manage a few long scripts rather than many short ones.  I've written some fairly extensive VBA macros to make the scripts manageable.  It used to be a manual task to clear results prior to a new test run, for example, but that's now one click away.  Other macros allow steps to be included or excluded from a test run quickly based on context (e.g. enable different steps for hardware keyboard and touchscreen, or disable steps for deprecated devices).  These macros were written, fundamentally, to save us time. They're written by the testers for the testers.&lt;br /&gt;&lt;br /&gt;Trying to use a COTS TCM solution after being used to this kind of freedom was a nightmare.  A few of the testers never even got started. I was quite enthusiastic, but other than a trial project, to prove the feasibility, it never got adopted.&lt;br /&gt;&lt;br /&gt;Developers don't put up with these kinds of tools, and neither should testers.  I think a lot of the test tools are designed by process nutjobs.  Managers writing requirements for they way they think things should work and implemented blindly by developers, but the users, the real world testers, don't get enough say.  It's a shame.&lt;br /&gt;&lt;br /&gt;On the automated test side, things look a little better.  I think it's because there's more developer influence. A lot of developers will want to use the tools themselves and their ideas get incorporated.  In terms of web testing, there's plenty to choose from.  Selenium and Watir seem to be top.  Selenium's IDE for recording scripts is nice and simple, and the ability to convert these to Java or Ruby or Perl of Python means reusable modular tests are nice and easy to write.  The problem I have is that I need to test Java. Specifically in-browser applets. Selenium can apparently do that through FEST, but on reading the instructions, I really can't be arsed, I'm not convinced that I'd actually get it to work at all.&lt;br /&gt;&lt;br /&gt;The two front runners in this contest are HP's Quick Test Pro and Froglogic's Squish.  Squish would let me use Python, which is a massive win, it's Eclipse based and the object lookup appears to be astonishingly good (from the demos).  Froglogic have loads of information available on their website, including the user guide, so I can really find out about how it works.  HP's on the other hand seems impenetrable. Quick Test Pro really is the industry standard, it'll look great on the CV, but it'll mean a VB-like language, which is a real shame. Head says QTP. Heart says Squish.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5823463857455100844?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5823463857455100844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/08/functional-testing-tools.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5823463857455100844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5823463857455100844'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/08/functional-testing-tools.html' title='Functional Testing Tools.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3458344892778219998</id><published>2010-07-30T09:20:00.000-07:00</published><updated>2010-07-30T10:09:29.155-07:00</updated><title type='text'>Inception (no proper spoilers)</title><content type='html'>When I say no spoilers, if you read on, you may read something that makes the film less enjoyable, but there are no plot giveaways.&lt;br /&gt;&lt;br /&gt;I don't get to the cinema often these days. I'd not heard of Inception until last week, when it was decided that I should take my twelve year old son to the cinema.  He wanted to see it, it looked above average and so we went.&lt;br /&gt;&lt;br /&gt;I think it was the first film we've seen together at the cinema that wasn't a kids film. We enjoyed it, we talked about it on the drive home. I thought the end of the final scene, just before the credits, was great.It made for a nice few hours of quality father-son time.&lt;br /&gt;&lt;br /&gt;Two things distracted me.  A phone rang.  I was drawn out of the film, back to the theatre, frowning in the direction of the offending sound.  But it was in the film, not in the audience.  I've no idea how film-makers are going to deal with that problem.&lt;br /&gt;&lt;br /&gt;The second distraction was &lt;a href="http://www.imdb.com/name/nm0182839/"&gt;Marion Cotillard&lt;/a&gt;, who plays DiCaprio's wife. She's simply ridiculously, compellingly, extraordinarily beautiful in this film. Whenever she was on screen, I simply forgot about the film.&lt;br /&gt;&lt;br /&gt;So, decent enough film. Gets the brain working a bit, but it's not difficult to follow if you take Kermode's advice and don't go to the loo.  My son loved it. It looked stunning.&lt;br /&gt;&lt;br /&gt;This week, I've had the luxury of being able to read some of the criticism of it.  I could argue that they should get off their high horses and enjoy it for what it is, but they all seem to have a point: There's way, way too much exposition. I can't see how they'd strip out all of it, but it's a film that explains itself far too well and leaves the viewer with (almost) no questions.&lt;br /&gt;&lt;br /&gt;I've not thought about the film this week beyond just one niggling technical question (to which I &lt;span style="font-style:italic;"&gt;think&lt;/span&gt; I know the answer).  If it had been made without explaining itself as it went along, I'd have been begging friends to see it so that we could talk it through and try to figure it out, argue theories.&lt;br /&gt;&lt;br /&gt;It's not going to stand the test of time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3458344892778219998?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3458344892778219998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/07/inception-no-proper-spoilers.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3458344892778219998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3458344892778219998'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/07/inception-no-proper-spoilers.html' title='Inception (no proper spoilers)'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-7376324367719043172</id><published>2010-07-16T02:54:00.000-07:00</published><updated>2010-08-30T03:52:25.581-07:00</updated><title type='text'>Please say what I'm thinking.</title><content type='html'>Was just reading Matt Gallagher's &lt;a href="http://cocoawithlove.com/2010/07/is-virtual-machine-for-cocoa.html"&gt;Is a virtual machine for Cocoa programming inevitable?&lt;/a&gt; on &lt;a href="http://cocoawithlove.com/"&gt;Cocoa With Love&lt;/a&gt;.  I subscribe, but often don't read a lot of the posts. They're too technical for my current ability and level of interest.  I want to be more interested, but I just don't have the time/inclination at the moment.  I'll be reading every word of this one because I kind of hate C.&lt;br /&gt;&lt;br /&gt;I read the introduction wanting Matt to say what I was thinking, which is essentially that C pointers suck.  There are other things I dislike about the language, the curly braces and the misuse of '=' for assignment and '==' for equality, for example, but much of this is cosmetic. The pointers are a deeper issue, although there is a element of cosmetic unpleasantness about them too.&lt;br /&gt;&lt;br /&gt;What was I thinking ?  Well, in Matt's words (Yay!) : &lt;blockquote&gt;More relevant in the long term is the one feature that Objective-C can't remove or fix: complaints about C itself, in particular C pointers.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Even though this isn't the point Matt is making, I'm reminded of Robert B. K. Dewar's &lt;a href="http://www.adacore.com/home/ada_answers/lectures/#"&gt;lectures on Ada&lt;/a&gt;.  I've embedded part 3 below (will remove if requested to do so)…&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-2bfe5fa698914c37" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v22.nonxt8.googlevideo.com/videoplayback?id%3D2bfe5fa698914c37%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331087081%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D83C0767244FE1387C9AB5E887319553E8E6E7681.812124715C803FE72384EFCADFFD73DF755EA5A7%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D2bfe5fa698914c37%26offsetms%3D5000%26itag%3Dw160%26sigh%3DyRoWlHD-Uk8x2kYvJm1tHvznYtU&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v22.nonxt8.googlevideo.com/videoplayback?id%3D2bfe5fa698914c37%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331087081%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D83C0767244FE1387C9AB5E887319553E8E6E7681.812124715C803FE72384EFCADFFD73DF755EA5A7%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D2bfe5fa698914c37%26offsetms%3D5000%26itag%3Dw160%26sigh%3DyRoWlHD-Uk8x2kYvJm1tHvznYtU&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;The key thing to take from this is the rigour of the Ada compiler compared to C, the cost of finding defect at compile time versus runtime and the amount of time spent in debugging in Ada compared to C.  I'm not saying Ada should be used instead (it shouldn't), but C in particular lets things through to runtime that are going to be a bugger to find and resolve.  The nature of Cocoa, object based and dynamic is a much better fit to Python. If a virtual machine is proposed, a language &lt;span style="font-style:italic;"&gt;like&lt;/span&gt; Python would be much more suitable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7376324367719043172?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7376324367719043172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/07/please-say-what-im-thinking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7376324367719043172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7376324367719043172'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/07/please-say-what-im-thinking.html' title='Please say what I&apos;m thinking.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8965455738957488150</id><published>2010-07-10T05:14:00.001-07:00</published><updated>2010-08-30T04:06:33.678-07:00</updated><title type='text'>Certifications</title><content type='html'>I attended a course recently, took and passed an exam to qualify as an ISTQB Advanced Technical Test Analyst (ATTA) . It's probably the last certification course I'll ever do.  I have ISEB's Foundation Certification, which basically confirms I'm not brain-dead, I have ISEB's Intermediate Certification, in which I learned nothing except how to pass the exam.  ATTA is an improvement, but the certification demonstrates  more about my understanding of the expectations of a the examination board than my testing abilities.&lt;br /&gt;&lt;br /&gt;The reasons for doing these courses are to enhance the CV. I'm no longer convinced that they do this.  Foundation is fine, but the others are pretty much worthless. In a fight between experience and certification, experience wins.&lt;br /&gt;&lt;br /&gt;I'm just starting a new project at work. It's completely outside my comfort zone. It appears to be process intensive. There are high expectations. The lazy, comfortable part of me is dreading this. Having talked to the test manager, I suspect the pain will be worth it.  It's genuinely going to be a 'valuable learning experience'. I mean that most sincerely, folks.  I think I'll learn more about testing in the next few months than I have in three certifications and 4 years as a full time tester.&lt;br /&gt;&lt;br /&gt;There may be a trip to Switzerland in it next year too, which will be nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8965455738957488150?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8965455738957488150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/07/certifications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8965455738957488150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8965455738957488150'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/07/certifications.html' title='Certifications'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6309100463908551824</id><published>2010-07-10T02:53:00.000-07:00</published><updated>2010-07-10T05:29:20.820-07:00</updated><title type='text'>Setting Up for Productive Procrastination</title><content type='html'>There's only so much time, and much of it is wasted.  I'm going to try to waste less of it by means of this cunning plan:&lt;br /&gt;&lt;br /&gt;I'm unsubscribing from some RSS feeds and subscribing to some others.&lt;br /&gt;&lt;br /&gt;I threw out the MacDailyNews feed a while ago, and it felt quite liberating. Today I've gone further. MacWorld, MacUser, TUAW, AppleMatters etc, in fact, the whole folder called 'Apple News' has been chucked.&lt;br /&gt;&lt;br /&gt;I'm thinking of chucking 'Tech News' too (The Register, Wired, Ars Technica), but haven't plucked up the courage yet.&lt;br /&gt;&lt;br /&gt;The feeds I'm subscribing to are all blogs. They're blogs by professionals software testers. It's what I do, but I don't think much about it, I don't read much about it, and I'm not really getting any better at it.  I want to.  Pretty much all the books I've read on testing cover the same old stuff and are, frankly, uninspiring.&lt;br /&gt;&lt;br /&gt;So I'm looking to real people for inspiration instead. Wish me luck.&lt;br /&gt;&lt;br /&gt;I'm starting with Adam Goucher's &lt;a href="http://adam.goucher.ca/?feed=rss2"&gt;Quality through Innovation&lt;/a&gt; and Eric Jacobson's &lt;a href="http://www.testthisblog.com/"&gt;Test This Blog&lt;/a&gt;. I'm going to use them to learn from and I'm going to use them as experienced content filters.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6309100463908551824?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6309100463908551824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/07/setting-up-for-productive.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6309100463908551824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6309100463908551824'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/07/setting-up-for-productive.html' title='Setting Up for Productive Procrastination'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-7801679271449287173</id><published>2010-06-21T05:58:00.000-07:00</published><updated>2010-06-21T06:25:16.680-07:00</updated><title type='text'>Cognitive dissonance holds no fears for him.</title><content type='html'>Charles Arthur calls Paul Thurrott an idiot &lt;a href="http://twitter.com/charlesarthur/status/16689566169"&gt;very politely&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7801679271449287173?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7801679271449287173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/06/cognitive-dissonance-holds-no-fears-for.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7801679271449287173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7801679271449287173'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/06/cognitive-dissonance-holds-no-fears-for.html' title='Cognitive dissonance holds no fears for him.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-8482244225615666819</id><published>2010-06-17T09:29:00.000-07:00</published><updated>2010-06-17T10:54:37.418-07:00</updated><title type='text'>Blog Comments</title><content type='html'>I'm not a tech blogger. I'm a Software Tester and I occasionally post, occasionally about tech, because it's good indulgent creative fun and, as pretty much nobody reads this, it's not going to hurt anyone.&lt;br /&gt;&lt;br /&gt;This post was going to be a comment on &lt;a href="http://www.technovia.co.uk/2010/06/john-gruber-joe-wilcox-and-why-comments-are-anti-web.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+Technovia+%28Technovia%29"&gt;Ian Betteridge's blog entry&lt;/a&gt; on the whole should-Gruber-allow-comments-on-&lt;a href="http://daringfireball.net/"&gt;Daring Fireball&lt;/a&gt; thing.&lt;br /&gt;&lt;br /&gt;As Ian wants to &lt;span style="font-style:italic;"&gt;encourage everyone who really wants to comment on what I write to get their own blog fired up, and write. You never know, you might enjoy it&lt;/span&gt;, that's what I'm doing.&lt;br /&gt;&lt;br /&gt;It's not, though, the first time I've written here as a response to another blog.  I do use comments on sites, but not really very much these days.  It seems like a waste of time and effort.  There's an awful lot of stupid out there and I'm trying not to participate.&lt;br /&gt;&lt;br /&gt;I'd tend to use Twitter to contact &lt;a href="https://twitter.com/ianbetteridge"&gt;@ianbetteridge&lt;/a&gt;, who I kind of know, via Twitter, and I'd use email to contact comments@daringfireball.net. &lt;a href="https://twitter.com/gruber"&gt;@gruber&lt;/a&gt; doesn't know who the fuck I am, and as emailing is more effort, I'm only likely to do so if I have something to say that I think he'd want to hear. I honestly don't want to waste his time.&lt;br /&gt;&lt;br /&gt;I'd probably email John if I thought he'd got something factually wrong. He'd want to correct it, (&lt;a href="http://daringfireball.net/2005/01/misc_updates"&gt;which he does&lt;/a&gt;). I might also drop him en email if I thought he'd missed something (say he was writing about drawing graphs, but seemed not to know about &lt;a href="http://www.omnigroup.com/products/omnigraphsketcher/"&gt;omnigraphsketcher&lt;/a&gt;, and I thought that was a great tool he should know about).&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://daycoder.blogspot.com/2009/02/oscars.html"&gt;first post on this blog linking to an external source&lt;/a&gt; linked to &lt;a href="http://daringfireball.net/2009/02/best_picture"&gt;Daring Fireball&lt;/a&gt;.  That's no coincidence.  Had there been comments, I'd have left one alongside dozens of others that would be ignored and forgotten.&lt;br /&gt;&lt;br /&gt;So thanks, John and Ian for indirectly and directly getting me to post stuff here that at least I'll be able to read again sometime.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8482244225615666819?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8482244225615666819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/06/blog-comments.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8482244225615666819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8482244225615666819'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/06/blog-comments.html' title='Blog Comments'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4153852614900842861</id><published>2010-06-09T02:40:00.000-07:00</published><updated>2010-06-09T03:21:01.962-07:00</updated><title type='text'>Ten reasons why you should still avoid Android</title><content type='html'>1. The back of the case is still plastic, so it's going to get scratched to buggery and the battery cover will keep falling off.&lt;br /&gt;&lt;br /&gt;2. Hardware designed to meet a features checklist with no regard to usability.&lt;br /&gt;&lt;br /&gt;3. The camera will have a tiny sensor with a huge megapixel count, which will yield awful noisy images.&lt;br /&gt;&lt;br /&gt;4. You can't upgrade the OS to the latest version because the carrier doesn't let you. You have to buy a whole new phone and get locked in to another lengthy contract, probably getting a lower 'unlimited' data cap in the process.&lt;br /&gt;&lt;br /&gt;5. New Android devices will be out practically every week, rendering your Android device out of date, forcing you to sell it at a loss in order to upgrade to the latest and greatest and get locked in to another lengthy contract, probably getting a lower 'unlimited' data cap in the process.&lt;br /&gt;&lt;br /&gt;6. Locked in to Google for map data, which means directions will probably tell you to walk across a busy road and probably die. Add the cost of good health insurance to that mobile contract.&lt;br /&gt;&lt;br /&gt;7. Voice-to-text that you'll have to correct manually, which will take more time, so you won't bother after a while. Even if it does work, which it won't, which I can say with complete certainty, even though I've never used it on a phone, you won't use it becasue it'll make you look like a dick in public*&lt;br /&gt;&lt;br /&gt;8. Doesn't have a gyroscope, so gaming is impossible.  It'll still be impossible when a gyroscope is introduced, because it didn't have one to start with, and no games will support it. Ever.&lt;br /&gt;&lt;br /&gt;9. Due to uncontrolled multi-tasking, your battery will only last for 30 minutes, and you'll have to use a clunky task manager to take control, but the battery will be dead by the time you notice anyway.&lt;br /&gt;&lt;br /&gt;10. See the web grind to a halt with all that Flash crap.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Yes. That was mostly bullshit. Want Android ? Get an Android device. Want an iPhone ? Get an iPhone. Happy with your crappy PAYG 4 year old mobile and can't justify the contracts on any smartphone ? Stick with that phone. Honestly, it's fine.&lt;br /&gt;&lt;br /&gt;* If you use a BT headset, you don't seem to mind looking like a dick in public, so this may not apply to you, except it will, because voice recognition doesn't work.  I know this for certain because I bought some in 2000, for a desktop, and it was shit. It didn't work then, and itll never work. That's crazy Star Trek tech. Science *Fiction*.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4153852614900842861?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4153852614900842861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/06/ten-reasons-why-you-should-still-avoid.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4153852614900842861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4153852614900842861'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/06/ten-reasons-why-you-should-still-avoid.html' title='Ten reasons why you should still avoid Android'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-1935639056336094566</id><published>2010-06-07T09:07:00.001-07:00</published><updated>2010-06-07T09:54:09.030-07:00</updated><title type='text'>Why I think Apple products are light on features…</title><content type='html'>Something occurred to me the other week regarding the paucity of box-ticking features on Apple products. I'd forgotten about that thought until reading a &lt;a href="http://www.adambanks.com/wordpress/matt-warman-telegraph-iphone-inaccuracies/2541/#comment-18469"&gt;comment&lt;/a&gt; on Adam Banks' blog (&lt;a href="http://www.adambanks.com/wordpress/matt-warman-telegraph-iphone-inaccuracies/2541/"&gt;Ten reasons to doubt the Telegraph’s linkbait&lt;/a&gt;).  1st draft of this entry was about 1,000 words. I've trimmed it a little:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Apple doesn't add any feature that introduces more problems that it solves.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1935639056336094566?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1935639056336094566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/06/why-i-think-apple-products-are-light-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1935639056336094566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1935639056336094566'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/06/why-i-think-apple-products-are-light-on.html' title='Why I think Apple products are light on features…'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-7521687832963857368</id><published>2010-05-11T01:52:00.000-07:00</published><updated>2010-05-11T05:04:03.474-07:00</updated><title type='text'>#twitterjoketrial</title><content type='html'>The &lt;a href="http://www.channel4.com/news/articles/science_technology/man+fined+for+twitter+airport+aposbomb+threatapos/3643287"&gt;#twitterjoketrial&lt;/a&gt; reminded me a little of a story Mrs Daycoder told me recently.  It's a case of procedures gone mad and common sense thrown out of the window.&lt;br /&gt;&lt;br /&gt;Mrs Daycoder is a primary school teacher. She's trained in first aid.  The school has an incident book, in which, according to procedures, &lt;span style="font-style:italic;"&gt;all&lt;/span&gt; accidents and injuries must be recorded.  The staff mostly have a reasonable amount of common sense, so below a certain threshold, very minor accidents and injuries simply aren't recorded.  Once they make it into the book, then staff have no choice but to follow procedures to the letter.&lt;br /&gt;&lt;br /&gt;One of the teaching assistants (TA) doesn't have quite as much common sense. She's a stickler for the rules.  A child came in from the playground with a splinter in his finger. The TA immediately wrote it into the incident book, and procedures then had to be followed.  The procedures forbid any medical treatment by staff, the child's legal guardian must be called in to deal with the incident, and this is what happened.  The school secretary had to explain and apologise to the dumbfounded mother of this child that the staff weren't allowed to remove the splinter from her son's finger, and requested that she come to the school to deal with the incident.  After convincing the mum that it wasn't a joke, she reluctantly came in.  Had any of the other staff dealt with the issue at the start, they'd have done so without fuss and without the incident being logged.&lt;br /&gt;&lt;br /&gt;The #twitterjoketrail is the same thing.  At each stage, it came to the attention of someone who wouldn't or couldn't defy procedure for some reason. Perhaps through a legitimate fear of taking responsibility, a lack of common sense or pig-headedness.&lt;br /&gt;&lt;br /&gt;That someone should have a criminal record, and have had his chosen career halted because of this should appall all of us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7521687832963857368?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7521687832963857368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/05/twitterjoketrial.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7521687832963857368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7521687832963857368'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/05/twitterjoketrial.html' title='#twitterjoketrial'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-5729549172586299365</id><published>2010-04-08T04:04:00.000-07:00</published><updated>2010-04-08T05:17:54.445-07:00</updated><title type='text'>We Don't Need No Stinkin' Task Manager</title><content type='html'>I was in the pub last night.  Sadly this doesn't happen enough these days, but there was a free meal in the offing, it wasn't £5.99 "chicken ding!", and it got me out of Fat Fighters this week. The conversation inevitably landed, at one point, on the iPad, and then meandered to the iPhone, then iPhone OS 4.0, and multitasking.&lt;br /&gt;&lt;br /&gt;I pointed out that we don't know anything yet.  All we know is that we have a date where 4.0 will be announced. That's announced, not released. New features, perhaps APIs and perhaps a new version of Xcode, but the OS itself will be released later.&lt;br /&gt;&lt;br /&gt;What my colleagues actually want from multi-tasking, it seems, is not very much. Generally one additional thing, like Spotify/Pandora, or GPS tracking while running/cycling.&lt;br /&gt;&lt;br /&gt;There was, thankfully, an acknowledgement that other devices that had no restraints on multi tasking were, frankly, shit, would grind to a halt, and  require task managers to get things moving again.&lt;br /&gt;&lt;br /&gt;This morning, I read &lt;a href="http://smithsocksimon.tumblr.com/post/505285149/no-multitasking-in-iphone-4-0"&gt;no-multitasking-in-iphone-4-0&lt;/a&gt;, which sums things up quite nicely. This response &lt;a href="http://twitter.com/grrrth/status/11813686984"&gt;"There may be some new audio API to allow Spotify in b/g, etc."&lt;/a&gt; makes a lot of sense. That would probably address 90% of complaints.&lt;br /&gt;&lt;br /&gt;I was thinking that permitting a single background app would be OK, not just music.  Suitable apps would have a low use background mode that would not exceed, say 5% of system resources, or however much the Music app currently uses when playing music in the background. Apps would qualify for background apps status during the approval process.&lt;br /&gt;&lt;br /&gt;As useful as this might be, there needs to be a simply UI for managing this. The good news is that we already have it: start a task (like play some music), and quit the app. The app switches to background mode, and the foreground app quits, returning the user to the home screen. While the background app is running, a double-click opens a control to stop/pause/switch etc.&lt;br /&gt;&lt;br /&gt;The bad news is that this isn't quite enough. I could have my GPS-tracking and Spotify running at the same time, but what happens when I quit the second qualified-to-run-as-a-background-app app ? How do I indicate to the user what just happened ? The options seem to be:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;1st background app continues to run, 2nd app just quits, user receives no indication.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;1st background app quits, 2st app switches to background mode,user receives no indication.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;User gets a popup asking which one to run in the background&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Finger-in-the-air, that probably covers 99% of case. Bump the limit to 2 running background apps, and this whole UI is broken. The extra 1% simply isn't worth the UI pain. We don't need no stinkin' task manager&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5729549172586299365?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5729549172586299365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/04/iphone-ipod-os-40-multi-tasking.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5729549172586299365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5729549172586299365'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/04/iphone-ipod-os-40-multi-tasking.html' title='We Don&apos;t Need No Stinkin&apos; Task Manager'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-8134862346226776771</id><published>2010-03-28T09:50:00.000-07:00</published><updated>2010-03-28T15:35:19.545-07:00</updated><title type='text'>iPad has the Attention of Consumers</title><content type='html'>I was in the supermarket this afternoon. I went in to buy milk, bread, ham and pasta. I came out with milk, bread, ham, pasta, a small pork pie and copy of Mac Format magazine.&lt;br /&gt;&lt;br /&gt;Mac Format, which I haven't bought for years, lured me with its actual-size iPad cover.  I had a brief conversation with the young woman at the checkout…&lt;br /&gt;&lt;br /&gt;YWATC: "Ooh! Are you going to get one ?"&lt;br /&gt;ME: "I think so, as long as I can afford it"&lt;br /&gt;YWATC: "How much are they ?"&lt;br /&gt;ME: "They're probably going to be about £400"&lt;br /&gt;YWATC:"Oh, That's not too bad"&lt;br /&gt;&lt;br /&gt;A few weeks ago, my sister-in-law was talking about the iPad. Her techspertise, as far as I know,  extends to buying stuff from eBay, using facebook and sending NSFW emails.&lt;br /&gt;&lt;br /&gt;Ordinary people really want this thing. And before they've even seen one, too.  They &lt;span style="font-style:italic;"&gt;get&lt;/span&gt; simple in way that the average spec-blinded tech pundit never will.&lt;br /&gt;&lt;br /&gt;The less said about the pork pie, the better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8134862346226776771?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8134862346226776771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/03/ipad-has-attention-of-consumers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8134862346226776771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8134862346226776771'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/03/ipad-has-attention-of-consumers.html' title='iPad has the Attention of Consumers'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-2768972318329650336</id><published>2010-03-11T10:08:00.000-08:00</published><updated>2010-08-30T04:11:04.702-07:00</updated><title type='text'>Persistence Is Futile</title><content type='html'>The rubber thing holding my car exhaust in place has perished to the point that it's no longer holding my exhaust in place.  I don't remember the last time I had to replace an exhaust, but it could be as long ago as 1993, back when I drove a 1978 vintage 1275GT Mini called Fudge.  Things have changed since them.&lt;br /&gt;&lt;br /&gt;I fired up google, looking for "tyre and exhaust" centres nearby.  I found plenty of places selling tyres, but virtually none selling exhausts.  I was puzzled. I wondered what had changed to make the replacement exhaust a thing of the past.  My hypothesis is that as car manufacturers were obliged by law to add expensive catalytic converters to their cars, the exhaust ceased to be a regular maintenance part, and needed to last as long as the car.  The costs appeared so high a few years ago, that a perfectly serviceable banger would be uneconomical to repair if the cat was knackered.  Prices have dropped, but the quality of exhausts hasn't.&lt;br /&gt;&lt;br /&gt;No doubt this caused a number of businesses to downsize, go bust to diversify. Instead of exhausts, they'll push servicing, they'll have become MoT centres etc.  I don't recall a particular outcry against car manufacturers or environmental legislators lamenting the passing of these businesses.&lt;br /&gt;&lt;br /&gt;When new technology emerges, be it durable car exhaust or broadband internet, it'll kill some business models. Businesses based on dead models will also perish. Businesses that make new models to exploit the technology have a pretty good chance, whether they're start-ups or not.&lt;br /&gt;&lt;br /&gt;Media businesses seem to want the status quo to persist.  It seems to me that media businesses are just middle men. The least imaginative, the least creative, the least entitled to the status quo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-2768972318329650336?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/2768972318329650336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/03/persistence-is-futile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2768972318329650336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2768972318329650336'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/03/persistence-is-futile.html' title='Persistence Is Futile'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-7575782059808493048</id><published>2010-03-10T02:14:00.000-08:00</published><updated>2010-03-10T03:13:08.266-08:00</updated><title type='text'>Hadley Freeman: Grrrrrr!</title><content type='html'>I've just been reading this Grauniad article: &lt;a href="http://www.guardian.co.uk/commentisfree/2010/mar/10/facebook-groups-internet-hadley-freeman"&gt;Facebook groups are the new lynch mob&lt;/a&gt;, by Hadley Freeman.  I was skimming through most of it. It didn't tell me anything new. People have deeply disturbing, nasty, dangerous opinions and prejudices and they're not afraid to tell you about them in comment threads on the web. Fine. Yawn. Yet another &lt;span style="font-style:italic;"&gt;social media is bad&lt;/span&gt; article to annoy the &lt;a href="https://twitter.com/Glinner"&gt;Linehans&lt;/a&gt; and &lt;a href="https://twitter.com/charltonbrooker"&gt;Brookers&lt;/a&gt; and &lt;a href="https://twitter.com/caitlinmoran"&gt;Morans&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But then I read this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;The much-publicised Save 6 Music Facebook group was obviously well-intended, but perhaps if half the people who joined it had ever listened to the station before the threat of its closure there wouldn't have been the need for the group in the first place&lt;/span&gt;.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It's lazy.  It's disappointing. It's an appalling use of hyperbole.  Most of all it's wrong. I write as a 6 Music listener who &lt;span style="font-style:italic;"&gt;had &lt;/span&gt;not joined the &lt;a href="http://www.facebook.com/group.php?gid=278123313911"&gt;Save BBC 6Music&lt;/a&gt; group.&lt;br /&gt;&lt;br /&gt;The only other campaigning facebook group I seem to have joined is &lt;a href="http://www.facebook.com/group.php?gid=33457048634"&gt;For Simon Singh and Free Speech - Against the BCA Libel Claim&lt;/a&gt;. That one's more important even than a radio station, so please consider joining, if you agree that is.&lt;br /&gt;&lt;br /&gt;Back to the hyperbole.  The implication is that &lt;a href="http://www.facebook.com/group.php?gid=278123313911"&gt;Save BBC 6Music&lt;/a&gt; has considerably more members than there are actual 6 music listeners. At the time of writing, the facebook group membership was 154,893.  The 6 Music audience for February 2010 was 695,000.&lt;br /&gt;&lt;br /&gt;Let's take the ratio Hadley suggests : 'half'. That's 77,447 (rounding up) people who don't listen to 6Music, but who think it's a good use of the licence fee.  That would increase the 6Music audience to 772,447, or, if you like, a hike of a shade over 11%.&lt;br /&gt;&lt;br /&gt;Sorry to say, Hadley, but bumping the listener count by half the facebook support, would make fuck all difference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7575782059808493048?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7575782059808493048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/03/hadley-freeman-grrrrrr.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7575782059808493048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7575782059808493048'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/03/hadley-freeman-grrrrrr.html' title='Hadley Freeman: Grrrrrr!'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-1092493149325690021</id><published>2010-03-09T06:08:00.000-08:00</published><updated>2010-03-09T08:07:07.139-08:00</updated><title type='text'>Advertising that I don't mind</title><content type='html'>Ads are annoying, but they don't have to be.  Take Tweetie, for example.  I use the free, ad sponsored version.  I may get the paid, ad-free version, but that would be because I want to send some money Loren Brichter's way for a job well done. (Find Tweetie here:&lt;a href="http://www.atebits.com/"&gt;http://www.atebits.com/&lt;/a&gt;). It would not be because the ads annoy me.&lt;br /&gt;&lt;br /&gt;This is what ads look like in Tweetie:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://img.skitch.com/20100309-k4g3g34swd1k96n1mwqeafa657.jpg" alt="Tweetie" /&gt;&lt;/div&gt;&lt;br /&gt;They're not very frequent.  They're usually well designed. Some are even pretty.  They're not intrusive. They sit in a little well so they don't sneakily look like tweets. They just slip between the tweets, and I can scroll past them just as I'd scan and scroll past some tweets I don't think I'm interested in today - e.g. I'm in the mood for some Amanda Palmer, sometimes not, so I just skip past those tweets next to her pic without reading.&lt;br /&gt;&lt;br /&gt;I have clicked on the ones in Tweetie. I may even have bought stuff that was advertised there. So I'd be concerned about the paid, ad-free Tweetie, because …gulp… I like the ads, and I think I'd miss 'em.  They seem well targeted to me as a long-term Mac user.&lt;br /&gt;&lt;br /&gt;Other ads I don't mind much at the moment are those in streaming TV, on &lt;a href="http://www.channel4.com/programmes/4od"&gt;4OD&lt;/a&gt;, for example.  I appreciate that they're a small price to pay for the content I'm getting.  If the ads start to take over the content, then it'll be a different story. Right now there are fewer ads in streaming catch-up TV than in broadcast TV, which is nice.  Easy to get, legal, with some ads beats torrenting.  TV networks are looking more and more like middlemen. I look forward to shows that exist online in this way without having to be bought by a network and broadcast, that become popular by word of mouth and where episodes are released simultaneously across the globe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1092493149325690021?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1092493149325690021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/03/advertising-that-i-dont-mind.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1092493149325690021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1092493149325690021'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/03/advertising-that-i-dont-mind.html' title='Advertising that I don&apos;t mind'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1491369039089993058</id><published>2010-03-09T02:30:00.000-08:00</published><updated>2010-03-09T04:24:27.442-08:00</updated><title type='text'>Bosses buy bad UX</title><content type='html'>User Experience matters to users.  In Enterprise, users usually have no say in the software they use.  Those decisions are made by bosses, bean counters or 'IT'.  UX may not even be on their checklist.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Most bosses won't be using the software. Not even email in many cases. They have a secretary/PA for that.  This is not a criticism. It's an observation. It's just the nature of their jobs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Accountants should look at the bigger picture, the TCO, but they'll have a hard time seeing beyond tangible, measurable costs.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In organisations where IT call the shots, I don't think they have the best interests of the user at heart.  Or rather the UI that they use is the admin end. How easy it is to configure and maintain users on the system. End user UX may not be of great concern.  If it's really bad, they'll get swamped with support calls, but most likely, they'll get no calls from disgruntled users who can work software that they hate and bitch about it to their colleagues.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can think of only one case where universal hatred of a product caused change in a large organisation.  Said organisation moved from an ancient but functional email system, Teamworks, to Lotus Notes.  Initially most people were quite excited to get a modern client. There were some initial problems. There was some initial dislike. This is normal. People don't like change. They'll grumble. They'll pine for the old, unless you give them a chance to try the old again: then they'll run from it screaming.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's not normal is for universal long term hatred of a new product.  It took about two or three years of mass user complaint, but eventually, thankfully, it was dropped in favour of Outlook.  The product became known as 'FLN' ("F*cking Lotus Notes").  The only person I've ever heard defend FLN worked at basement level IT, made his own Roman clothing for re-enactments and knew his way around a twelve-sided die.  He also derided users for not being able to use the unusable FLN. (He's a really nice bloke, but he's more &lt;a href="http://www.channel4.com/programmes/the-it-crowd/articles/moss"&gt;Moss&lt;/a&gt; than &lt;a href="http://www.channel4.com/programmes/the-it-crowd/articles/roy"&gt;Roy&lt;/a&gt;. )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Outlook is far from perfect, of course, but the UX improvement, compared to FLN, was astonishing.   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; I've worked on products that have appalling UX. Old fashioned, like some Windows 3.1 app.  I worked for one company for a short time that took pride in its applications looking shit.  They drew attention to it in the brochure.  They didn't call it 'shit' directly, they called it something like 'focused on utility, not on eye candy'. Anyone trying to make it look better to work better would probably get a formal warning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The terrible thing ? They were right. Looking shit was a genuine  advantage for them.  Some kind of negative reinforcement.  The message was '&lt;i&gt;Hah! Look at the eye candy in [rival product]. We didn't waste time on that nonsense, we made our product&lt;b&gt; &lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;work&lt;/b&gt;&lt;/i&gt;'.  This marketing was successful because the people buying the product were amenable to the message, and they were not the ones who would have to use it day in, day out for hours and hours.&lt;br /&gt;&lt;br /&gt;When function and form are treated as mutually exclusive, it's often the user that suffers, not the bloke signing the cheques.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1491369039089993058?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1491369039089993058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/03/bosses-buy-bad-ux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1491369039089993058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1491369039089993058'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/03/bosses-buy-bad-ux.html' title='Bosses buy bad UX'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4595553506300455861</id><published>2010-02-19T03:20:00.000-08:00</published><updated>2010-02-19T07:40:24.456-08:00</updated><title type='text'>The iPad isn't enough simple*</title><content type='html'>The iPad will be a revolution in computing. It'll be your Nan's computer. It'll be the exercise book and textbook and exam paper in classrooms.  It's the future of computing, blah, bah, etc, as others have said.&lt;br /&gt;&lt;br /&gt;I already use my iPod touch for 90% of my leisure computing needs.  I'd still need a laptop, but that could change, particularly if I admit to myself that no, I'm not actually ever going to get around to doing any proper development.  I may never need a &lt;span style="font-style:italic;"&gt;new&lt;/span&gt; laptop. For my father, who got his first laptop last year at age 69, an iPad would not only be perfectly adequate, it'd be simpler. It would be better.  I'd considered getting a little Linux netbook for him, but decided supporting a MacBook would be a lot easier on both of us.&lt;br /&gt;&lt;br /&gt;The iPad isn't a standalone device.  It still needs iTunes running on a Mac or a PC.  This is a considerable expense and complication. Like a HiFi, where the sound is only as good as the weakest component, so the iPad will only be as simple as the most complex component.  People/n00bs may not be scared of the iPad, but they'll continue to be scared of their computers.&lt;br /&gt;&lt;br /&gt;If you've ever seen the episode of Gavin &amp;amp; Stacey in which Bryn explains the web to Gavin, I'm like Bryn, but the patronising assumptions of the ignorance of my father's Gavin are correct.  That's how I have to explain computing tasks to my father, an intelligent, curious man.  Remote support, on even the simplest of tasks can be frustrating.  I can't say 'just drag it to the preview icon on the dock', I have to email him step-by-step instructions, with clearly labelled screen grabs (thank you www.skitch.com, for making this easy).&lt;br /&gt;&lt;br /&gt;The iPad comes close to fixing this, but the iTunes on a complex computer problem remains. It needs to be made simpler, and ideally cheaper too.  Simpler is in everybody's interest. Cheaper is too, even for Apple.  As Pogue said a few years ago : "Simple sells".  I'd have had a hard time getting my father to accept buying a Mac mini &lt;span style="font-style:italic;"&gt;and&lt;/span&gt; an iPad rather than just a MacBook.  The MacBook was already twice the cost of the windows laptops he'd seen advertised.  A standalone iPad, or an iPad + iTunes magic box that was as cheap as a MacBook would have been another story.&lt;br /&gt;&lt;br /&gt;There's room here for Apple to make a bunch more money by reducing mandatory complexity.&lt;br /&gt;&lt;br /&gt;Time Capsule runs an embedded version of OS-X (AFAIK). I think Apple can take iTunes off the computer, make it client-server and have the server run on a Time Capsule.   A Time Capsule is technically a computer, but it's abstracted.  Nobody&lt;span style="font-style:italic;"&gt; thinks &lt;/span&gt;of Time Capsule as a computer. Adding an iTunes Server to it won't change that.  Apple TV boxes could use this server too.  Hell, Apple TV boxes could &lt;span style="font-style:italic;"&gt;be&lt;/span&gt; the server.&lt;br /&gt;&lt;br /&gt;Backup and sync via WiFi would be nice. It would be a new thing for iPhones/iPods/iPads, but Time Machine does wireless syncing from Mac to Time Capsule and Apple TV syncs wirelessly to iTunes too, so it's certainly possible.  I don't think wireless backup/sync is necessary right now, just that a hypothetical Time Capsule/Apple TV + iTunes server, with iPads no longer requiring Macs or PCs, will seem clunky without it.&lt;br /&gt;&lt;br /&gt;Perhaps I'm thinking too small here. Accustomed to keeping data local.  Perhaps Apple's facility in North Carolina is gearing up to be a massive cloud store for our entire media libraries.  Who needs more than 16GB on an iPad when all your media is in the cloud ?&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;* 'Simple' is a noun here. Apologies if that is irritating.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4595553506300455861?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4595553506300455861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/02/ipad-isnt-enough-simple.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4595553506300455861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4595553506300455861'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/02/ipad-isnt-enough-simple.html' title='The iPad isn&apos;t enough simple*'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3538478366172525610</id><published>2010-01-28T10:31:00.000-08:00</published><updated>2010-08-30T04:11:28.601-07:00</updated><title type='text'>The iPad</title><content type='html'>Well, everyone else is talking about it, I may as well add to the noise.&lt;br /&gt;&lt;br /&gt;Q: Do I need one ?&lt;br /&gt;A: No.&lt;br /&gt;&lt;br /&gt;Q: Do I want one ?&lt;br /&gt;A: I'm not sure.&lt;br /&gt;&lt;br /&gt;Q: Would I use one ?&lt;br /&gt;A: Yes.&lt;br /&gt;&lt;br /&gt;Q: Will I get one ?&lt;br /&gt;A: Probably.&lt;br /&gt;&lt;br /&gt;A lot of people are puzzled by the iPad. They don't know what it's for. Although it sits in between an iPod/iPhone and a laptop, it also invades the iPod/laptop space.  It's portable, more convenient than a laptop, but not pocketable.  I see it living on the coffee table.  The iWork apps aside, it's really a device for consuming rather than creating.  I'm sure we'll see creative apps in time, but it'll be best for the kind that&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3538478366172525610?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3538478366172525610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2010/01/ipad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3538478366172525610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3538478366172525610'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2010/01/ipad.html' title='The iPad'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5624808697860100678</id><published>2009-11-25T03:20:00.000-08:00</published><updated>2009-11-25T03:33:05.853-08:00</updated><title type='text'>Disconnection doesn't necessarily mean Broken Web App</title><content type='html'>I was wrong about something yesterday…&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.quirksmode.org/blog/archives/2009/11/native_iphone_a.html"&gt;Peter-Paul Koch&lt;/a&gt; unambiguously sets this straight&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style:italic;"&gt;Let’s debunk one argument. It is perfectly possible to write an offline Web app for Safari iPhone. The browser supports appcache and local storage for storing the application and its data, respectively.&lt;br /&gt;&lt;br /&gt;Both Web apps and native apps can work offline. Thus this argument has no value.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;I still think web apps suck. They suck on a desktop. Running them on a phone, with a fraction of the clock speed, a fraction of the cores, a fraction of the RAM, and they're going to suck an order of magnitude more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5624808697860100678?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5624808697860100678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/11/disconnection-doesnt-necessarily-mean.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5624808697860100678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5624808697860100678'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/11/disconnection-doesnt-necessarily-mean.html' title='Disconnection doesn&apos;t necessarily mean Broken Web App'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-3596254402775634162</id><published>2009-11-24T03:12:00.000-08:00</published><updated>2009-11-24T06:11:03.236-08:00</updated><title type='text'>iPod Touch, iPhone, Native vs Web Apps and pinch of ChromeOS</title><content type='html'>I'm prompted to write this by John Gruber's &lt;a href="http://daringfireball.net/2009/11/iphone_web_apps_alternative"&gt;iPhone Web Apps Alternative&lt;/a&gt; post.&lt;br /&gt;&lt;br /&gt;I pretty much agree with Gruber on this, but he neglects to consider the iPod Touch.  Most apps, unless they use the camera, compass or GPS, are iPod Touch apps too.  Apple screwed up by not having a common name for the two devices (No, I can't think of a good one), and I don't think they expected or planned for the iPod Touch to be such a success.&lt;br /&gt;&lt;br /&gt;Many apps require connectivity to work &lt;span style="font-style:italic;"&gt;because the data is in the cloud&lt;/span&gt;.  Most of the apps that rely on data in the cloud could be written as web apps. They would probably be slow and suck, and suck more life of the 3G network, but they'd do the job.  It's the difference between www.twitter.com and Tweetie or Twitterific.  Twitter sucks in  a desktop browser.  It sucks really badly in the mobile optimised version on the iPod/iPhone. (Thinks: "iApp" as a common name?)&lt;br /&gt;&lt;br /&gt;An app that &lt;span style="font-style:italic;"&gt;doesn't need data from the cloud &lt;/span&gt; should be written as a native app. It'd be faster, not suck as much, and not require any wifi/3G bandwidth at all.  Most importantly, it would work on an iPod Touch where there was no accessible Wi-Fi. (And on an iPhone where there was no 3G or edge).&lt;br /&gt;&lt;br /&gt;An app that lives in the cloud and uses data from the cloud is sometimes necessary, such as a webmail client.  These still suck compared to native clients, but needs must when the devil vomits into your kettle.&lt;br /&gt;&lt;br /&gt;I have no problem not using Mail, Twitter, Safari, NNW, Facebook, linked etc when I'm on a bus or a train. To not be able to play Bpop or boxed-in or Bones or Reversi because of no connectivity makes no sense whatsoever.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Apps and data in the cloud break when connectivity breaks.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's why ChromeOS makes little sense to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3596254402775634162?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3596254402775634162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/11/people-forget-that-iphone-apps-are-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3596254402775634162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3596254402775634162'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/11/people-forget-that-iphone-apps-are-for.html' title='iPod Touch, iPhone, Native vs Web Apps and pinch of ChromeOS'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4006663448775222871</id><published>2009-10-30T09:50:00.000-07:00</published><updated>2009-10-30T10:42:09.692-07:00</updated><title type='text'>Defying Gravity Series 1 Episode 2 'Natural Selection'</title><content type='html'>I'm really rather enjoying this series so far.  I'm kind of waiting for it to jump the shark, which it seems in danger of doing quite early on if they're not careful.  That'd be a shame. There are unscientific/supernatural things in the series, and that's fine, it's TV, they're necessary and entertaining devices.  If it doesn't &lt;span style="font-style:italic;"&gt;need&lt;/span&gt; to be wrong though, it really needs to be right.&lt;br /&gt;&lt;br /&gt;In episode 2, ('Natural Selection'), an experiment is performed by one of the astronauts that she describes as 'natural selection'. Anyone with a passing knowledge of evolution knows immediately that it's bullshit TV science rearing its ugly head yet again.  &lt;br /&gt;&lt;br /&gt;An external actor, selecting randomly is about as far from natural selection as you can get.  The survivors won't be the fittest / most appropriate, they'll simply be lucky.&lt;br /&gt;&lt;br /&gt;Two things required for evolution are (random) mutation and natural selection.  What the stupid experiment in Defying Gravity does is 'Random Selection'.&lt;br /&gt;&lt;br /&gt;Darwin's finches are the result of evolution by natural selection.  The ones that remain are best suited to their environment.&lt;br /&gt;&lt;br /&gt;The pigeons he studied are the result of selective breeding.  That is taking two birds with particular characteristics and letting them get it on (repeat to freak).  Same with domestic dogs.  Their suitability is not governed by nature, but by man. This unatural selection yields significant changes quickly.&lt;br /&gt;&lt;br /&gt;I have a &lt;span style="font-style:italic;"&gt;very&lt;/span&gt; basic understanding of this stuff, gleaned from TV and getting halfway through The Blind Watchmaker 10 years ago.  If I was writing a scene with this stuff in,  I'd run it by a biologist.  I'd check.  I'd really not want to look this foolish on TV.  And that's just me. One person.  Nobody. Not one single person noticed when this was being written and rehearsed and recorded, that it was bullshit ? What astounds me about this Defying Gravity nonsense is this carelessness.&lt;br /&gt;&lt;br /&gt;If you work on this show and told your boss that this scene was bullshit, show them this blog.  Tell them I said they were idiots and they should listen to you next time. People notice this shit.   Mmmkay ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4006663448775222871?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4006663448775222871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/10/defying-gravity-series-1-episode-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4006663448775222871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4006663448775222871'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/10/defying-gravity-series-1-episode-2.html' title='Defying Gravity Series 1 Episode 2 &apos;Natural Selection&apos;'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8995077093466497018</id><published>2009-08-15T03:14:00.000-07:00</published><updated>2010-08-30T04:12:28.962-07:00</updated><title type='text'>Filmmakers and musicians having a “credit score”</title><content type='html'>&lt;blockquote&gt;I often think about writers and filmmakers and musicians having a “credit score” with my bureau. The currency is the amount of faith I have that a certain project will be great or even good. Some creators rate so low that if the currency were actual money, I won’t loan them $50 if they left behind a $100 bill as collateral. Whereas the Coen Brothers could tell me “Our next movie is going to be a static, 90-minute shot of a bowl of Cheerios getting soggier and soggier over time” and I’d still mark Opening Day on my calendar.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So says Andy Ihnatko. &lt;br /&gt;&lt;br /&gt;He's right. This is how I feel about Tarantino. I can't imagine him ever making a bad movie. I sometimes worry that I'm blindly accepting of anything that he does, but really, is that such a bad thing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8995077093466497018?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8995077093466497018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/08/filmmakers-and-musicians-having-credit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8995077093466497018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8995077093466497018'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/08/filmmakers-and-musicians-having-credit.html' title='Filmmakers and musicians having a “credit score”'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1471574334739755207</id><published>2009-06-24T02:53:00.000-07:00</published><updated>2010-08-30T04:11:48.326-07:00</updated><title type='text'>Fax machines : Oh how I hate thee.</title><content type='html'>Fax machines and washing machines. The both confuse me.  Are both designed to be operated by a female brain, perhaps ?&lt;br /&gt;&lt;br /&gt;Reminder to self: to use the fax machine at work successfully,  feed the paper face down and upside down.  Put the paper in before dialling the number, or it won't work. It'll pretend to go through the motions, but it'll fail.  The fax machine's printer will not begin to warm up until the faxing is complete, despite needing to print whether the operation was a success or not.&lt;br /&gt;&lt;br /&gt;Washing machine : I haven't quite figured it out yet. Anyway: fabric conditioner is for wimps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1471574334739755207?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1471574334739755207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/06/fax-machines-oh-how-i-hate-thee.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1471574334739755207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1471574334739755207'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/06/fax-machines-oh-how-i-hate-thee.html' title='Fax machines : Oh how I hate thee.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-7550499254414398599</id><published>2009-06-19T03:27:00.000-07:00</published><updated>2009-06-19T06:10:00.129-07:00</updated><title type='text'>from x import *</title><content type='html'>Damn.  I instinctively knew this was was bad, but it was in the examples I was given before I got stuck in, and before things got complicated, and stupidly without looking to find out if there was a better way.&lt;br /&gt;&lt;br /&gt;I have &lt;code&gt;from x import *&lt;/code&gt; and &lt;code&gt;from x import name1, name2&lt;/code&gt; all through my code.&lt;br /&gt;&lt;br /&gt;It hasn't actually bitten me yet, but I know that I need to change this.  Everywhere.&lt;br /&gt;&lt;br /&gt;In some languages, there would be no better way.  This kind of import is the way things work, and if there's an ambiguity, it's a compile time issue, where things need to be made explicit/qualified when names are used, or it simply won't work.&lt;br /&gt;&lt;br /&gt;There's a similar thing in Ada, where &lt;code&gt;with x;&lt;/code&gt; is essentially the same as &lt;code&gt;import x&lt;/code&gt;, but everything must be qualified.  There's a &lt;code&gt;use x;&lt;/code&gt; statement that exposes everything in x.  It's not dangerous, like Python's &lt;code&gt;*&lt;/code&gt;, but it does make it a bastard to find things.  The first rule of Ada was "Never use &lt;code&gt;use&lt;/code&gt;".&lt;br /&gt;&lt;br /&gt;Note to self: next time I try a new language and something looks like a &lt;code&gt;use&lt;/code&gt;, figure out how to not use that 'feature'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7550499254414398599?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7550499254414398599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/06/from-x-import.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7550499254414398599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7550499254414398599'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/06/from-x-import.html' title='from x import *'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6960262971885906719</id><published>2009-06-17T02:27:00.000-07:00</published><updated>2009-06-19T03:27:42.574-07:00</updated><title type='text'>Code Like a Pythonista: Idiomatic Python</title><content type='html'>&lt;a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html"&gt;Code Like a Pythonista: Idiomatic Python&lt;/a&gt; by David Goodger.&lt;br /&gt;&lt;br /&gt;It's a must read.  I was surprised at how much I already knew, but it's a great reference, and it has lots of good links at the bottom too.&lt;br /&gt;&lt;br /&gt;I wish I'd read this a few months ago, when I started dabbling in Python.  I didn't realise how deep I'd get.  I though just up to the ankles, but I'm maybe up to my knees by now.&lt;br /&gt;&lt;br /&gt;Things I've done right :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Used 4 spaces for indents.  I always have, in all languages that allowed it. (Though possibly not in examples on this blog, for reasons of laziness)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tried to stick to 80 chars. This is just a habit from my days (and nights) on a VT220.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;StudlyCaps for classes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Avoided single line compound statements.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Practicality beats Purity.  Always believed this. Some people try to write optimised code. I try to write readable code, and if it needs to be optimised, refactor later, and litter the code with comments explaining why.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Things I'm naturally graduating toward:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I love whitespace.  I use tons of it.  Always have. It really helps readability.  So I may have as many as 10 blank lines between functions.  Gradually, this has been reducing.  While I'm using Python, the excess whitespace has become annoying.  I'm not quite at the 1 line between functions, 2 between classes guideline, but I think I'll naturally get there soon.&lt;br /&gt;Used None for many default parameters, initialising new objects inside functions. (I didn't really know why, but now I do, and I can fix it where I've got it wrong at the moment)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Things I've done wrong:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Used camelCase where I should be using joined_lower.  I prefer camelCase, but if joined_lower is more Pythonic, I'm willing to yield this.  Not sure if I'll change all the code that I already have though.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not used spaces after , and : in lists and dicts&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not used docstrings much (My excuse is that I'm in a mixed Java/Jython environment, and I don't know how to make the docstrings useful).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I have some unnecessary "== True" or "== None" gubbins. The linked doc has a &lt;a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#id29"&gt;table&lt;/a&gt; explaining how the Truth Values work.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6960262971885906719?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6960262971885906719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/06/code-like-pythonista-idiomatic-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6960262971885906719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6960262971885906719'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/06/code-like-pythonista-idiomatic-python.html' title='Code Like a Pythonista: Idiomatic Python'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3669843818267155514</id><published>2009-06-17T02:05:00.001-07:00</published><updated>2009-06-17T02:27:15.509-07:00</updated><title type='text'>Lovely MISO font from omkrets</title><content type='html'>Don't know much 'bout typography, I quite like Papyrus, for example, which is probably wrong, but I do despise Comic Sans, so my eyes must work a bit…&lt;br /&gt;&lt;br /&gt;There's a lovely looking free font available from &lt;a href="http://www.omkrets.se/typografi/"&gt;omkrets&lt;/a&gt; called Miso:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_spoBTy3882Y/Sji2UDcDv1I/AAAAAAAAACI/7nAEKoBsRKg/s1600-h/miso_promotion1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 112px;" src="http://2.bp.blogspot.com/_spoBTy3882Y/Sji2UDcDv1I/AAAAAAAAACI/7nAEKoBsRKg/s400/miso_promotion1.jpg" border="0" alt="Picture of MISO font"id="BLOGGER_PHOTO_ID_5348225013139095378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are different weights, but they're equally spaced, so you can have normal and bold fit into the same space.   The technical terms from the &lt;a href="http://www.omkrets.se/typografi/miso-v02.pdf"&gt;PDF&lt;/a&gt; descibing the font are 'Equal stroke height, varying baseline' and 'equal glyph width'. Maybe lots of fonts do this, but it looked like genius to me.&lt;br /&gt;&lt;br /&gt;I think I'd like a monospaced version for coding with, but there are probably very good reasons why this won't work.  Are there any good sans serif monospaced types ? Would the 'i's would look all wrong ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3669843818267155514?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3669843818267155514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/06/lovely-miso-font-from-omkrets.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3669843818267155514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3669843818267155514'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/06/lovely-miso-font-from-omkrets.html' title='Lovely MISO font from omkrets'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_spoBTy3882Y/Sji2UDcDv1I/AAAAAAAAACI/7nAEKoBsRKg/s72-c/miso_promotion1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-5203972318685786853</id><published>2009-06-16T02:52:00.001-07:00</published><updated>2009-06-16T04:35:37.340-07:00</updated><title type='text'>New MacBook Pros and the missing ExpressCard slot</title><content type='html'>I'm in full agreement with &lt;a href="http://www.macvideo.tv/blogs/index.cfm?entryid=117349&amp;blogid=101658"&gt;Matt Davis&lt;/a&gt;, that replacing the ExpressCard slot on the MacBook Pros with an SD card slot makes little sense.&lt;br /&gt;&lt;br /&gt;Some people love that they now have an SD card slot.  I get that.  I still think it sucks.&lt;br /&gt;&lt;br /&gt;The pros need connectivity, and while the unibody enclosures and battery life are superb, the compromise has been connectivity.&lt;br /&gt;&lt;br /&gt;Audio people use firewire drives and firewire audio devices.  At the same time.  They use express card to connect to &lt;a href="http://www.bswusa.com/proditem.asp?item=SYMPHONYMOBILE"&gt;pro equipment&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Video people use firewire drives and firewire audio devices at the same time too.  They use the expresscard slot for reading and writing SxS at high speed, and also for &lt;a href="http://www.aja.com/products/io/io-express.php"&gt;specialist pro equipment&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If people really wanted an SD card reader, they could've just bought one for the expresscard slot.&lt;br /&gt;&lt;br /&gt;The real test, though, is if people switch to Windows, or go for the 17", which still has expresscard.  Is it really the hardware that matters, or is it software.  If it's hardware, they'll switch.  I'm not switching any time soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5203972318685786853?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5203972318685786853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/06/new-macbook-pros-and-missing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5203972318685786853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5203972318685786853'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/06/new-macbook-pros-and-missing.html' title='New MacBook Pros and the missing ExpressCard slot'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3403027979951223830</id><published>2009-06-09T11:37:00.000-07:00</published><updated>2009-06-10T02:25:02.757-07:00</updated><title type='text'>Python: Finding out if a class is a subclass of a class</title><content type='html'>I needed to find out whether a class was a subclass of another.  Googling, I found a &lt;a href="http://mail.python.org/pipermail/python-dev/2005-January/050907.html"&gt;message&lt;/a&gt; by Armin Rigo on the Python-Dev mailing list with this line :&lt;br /&gt;&lt;pre&gt;    for basecls in type(obj).__mro__:&lt;/pre&gt;&lt;br /&gt;A quick look squizz at __mro__, enough to see that it represents 'method resolution order'.  (I'll look in more details at some point, but that phrase was enough for now).  A bit of a distillation at the Python command line, and I end up with this simple test/condition:&lt;br /&gt;&lt;pre&gt;    &amp;lt;ParentClass&amp;gt; in &amp;lt;ChildClass&amp;gt;.__mro__&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3403027979951223830?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3403027979951223830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/06/python-finding-out-if-class-is-subclass.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3403027979951223830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3403027979951223830'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/06/python-finding-out-if-class-is-subclass.html' title='Python: Finding out if a class is a subclass of a class'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-784807097427470593</id><published>2009-06-01T06:48:00.000-07:00</published><updated>2009-06-01T08:33:51.111-07:00</updated><title type='text'>Determine current stack depth</title><content type='html'>If anyone knows of a better way to do this, do let me know...&lt;br /&gt;&lt;br /&gt;The test harness I'm writing produces a lot of logging information.  It's necessary to record what test are doing, where they fail etc, so that we can investigate and not just produce yet more useless metrics.   One of the things I found myself doing was adding indentation so that the test cases, sub tests and test steps etc were shown with increasing indentation.  As with source code, it makes the scope of the test results easier to follow.&lt;br /&gt;&lt;br /&gt;The more I was adding this by hand, the more I though that maybe there was a better way to do things.  I'm probably going to so something a little more intelligent, but for now I've gone with indenting my logs according to the call depth of the function that writes the log string.&lt;br /&gt;&lt;br /&gt;At a fairly high level, there is a routine to print to the console and to a log file.  References to this cascade through the code, so that this one function is the one that actually gets called when logging :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;def printAndLog(self, logText):&lt;br /&gt;    print logText&lt;br /&gt;    self.log(logText)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;All I need to do is determine the stack depth:&lt;br /&gt;&lt;pre&gt;def callDepth():&lt;br /&gt;  depth = 0&lt;br /&gt;  while True:&lt;br /&gt;    try:&lt;br /&gt;      sys._getframe(depth)&lt;br /&gt;      depth +=1&lt;br /&gt;    except:&lt;br /&gt;      return depth - 1&lt;/pre&gt;&lt;br /&gt;and use it to add indentation...&lt;br /&gt;&lt;pre&gt;def printAndLog(self, logText):&lt;br /&gt;  logText = '  ' * self.callDepth() + logText&lt;br /&gt;  print logText&lt;br /&gt;  self.log(logText)&lt;/pre&gt;&lt;br /&gt;Not sure that it's entirely legit to be calling _getframe, but it's working at the moment, and I'm not doing anything with the returned frames anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-784807097427470593?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/784807097427470593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/06/determine-current-stack-depth.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/784807097427470593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/784807097427470593'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/06/determine-current-stack-depth.html' title='Determine current stack depth'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8093162804085307460</id><published>2009-05-29T10:38:00.000-07:00</published><updated>2009-05-29T11:38:17.912-07:00</updated><title type='text'>Exploiting Python's logical evaluation order for conditional evaluation in list comprehensions</title><content type='html'>My head is hurting slightly over this one. First I'll show the experimentation (edited!)&lt;br /&gt;&lt;pre&gt;&gt;&gt;&gt; if 'arse':5&lt;br /&gt;... &lt;br /&gt;5&lt;br /&gt;&gt;&gt;&gt; if '':5&lt;br /&gt;... &lt;br /&gt;&gt;&gt;&gt; &lt;br /&gt;&gt;&gt;&gt; if 'arse'==True:5&lt;br /&gt;... &lt;br /&gt;&gt;&gt;&gt; 'arse' and 'arse'&lt;br /&gt;'arse'&lt;br /&gt;&gt;&gt;&gt; 'arse' and 'flange'&lt;br /&gt;'flange'&lt;br /&gt;&gt;&gt;&gt; 'arse'==True&lt;br /&gt;False&lt;br /&gt;&gt;&gt;&gt; a = [1,2,3,4,5]&lt;br /&gt;&gt;&gt;&gt; b = [4,4,4,4,5]&lt;br /&gt;&gt;&gt;&gt; c = [x==y for x,y in zip(a,b)]&lt;br /&gt;&gt;&gt;&gt; c&lt;br /&gt;[False, False, False, True, True]&lt;br /&gt;&gt;&gt;&gt; a = [(x&amp;lt;y and x+1 or y) for x,y in zip(a,b)]&lt;br /&gt;&gt;&gt;&gt; a&lt;br /&gt;[2, 3, 4, 4, 5]&lt;br /&gt;&gt;&gt;&gt; a = [(x&amp;lt;y and x+1 or y) for x,y in zip(a,b)]&lt;br /&gt;&gt;&gt;&gt; a&lt;br /&gt;[3, 4, 4, 4, 5]&lt;br /&gt;&gt;&gt;&gt; a = [(x&amp;lt;y and x+1 or y) for x,y in zip(a,b)]&lt;br /&gt;&gt;&gt;&gt; a&lt;br /&gt;[4, 4, 4, 4, 5]&lt;br /&gt;&gt;&gt;&gt; a = [(x&amp;lt;y and x+1 or y) for x,y in zip(a,b)]&lt;br /&gt;&gt;&gt;&gt; a&lt;br /&gt;[4, 4, 4, 4, 5]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I then spent a little time reading about logical operator and precedence in my Python Pocket Reference, because this was messing with my head.  In x and y, if x is false, y is not evaluated.  If x is true in some form, then y gets evaluated.  If y happens to be a string, then the evaluation of y is returned, which is a string.&lt;br /&gt;&lt;br /&gt;What we have then is a sort of trick if:else: statement.  By writing…&lt;br /&gt;&lt;pre&gt;condition and x or y&lt;/pre&gt;&lt;br /&gt;…we're achieving the same as…&lt;br /&gt;&lt;pre&gt;if condition:&lt;br /&gt;    x&lt;br /&gt;else:&lt;br /&gt;    y&lt;/pre&gt;&lt;br /&gt;This is remarkably handy stuff.  Especially (as shown above) when used in a list comprehension.  I'm not sure that it's particularly readable, but it's certainly more concise than the code I had previoulsy.  More importantly, it works too (the previous code did not).  The result is this (names changed to protect the innocent), which increments the values in a list, but only up to the corresponding limits specified in another list:&lt;br /&gt;&lt;pre&gt;counters = [counter&amp;lt;boundary.upper and counter+1 or counter for counter,boundary in zip(counters,boundaries)]&lt;/pre&gt;&lt;br /&gt;The code I had in place prior looked something like this:&lt;br /&gt;&lt;pre&gt;newList=[]&lt;br /&gt;for counter,limit in zip(counters, limits):&lt;br /&gt;    if counter &lt; limit.upperLimit:&lt;br /&gt;        newList.append[counter+1]&lt;br /&gt;    else:&lt;br /&gt;        newList.append[counter]&lt;br /&gt;counters=newList&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/8148933216702728291-8093162804085307460?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8093162804085307460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/exploiting-pythons-logical-evaluation.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8093162804085307460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8093162804085307460'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/exploiting-pythons-logical-evaluation.html' title='Exploiting Python&apos;s logical evaluation order for conditional evaluation in list comprehensions'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-4992506858570971030</id><published>2009-05-29T03:03:00.000-07:00</published><updated>2009-05-29T03:15:29.237-07:00</updated><title type='text'>Python: str * int … WTF!? … Thinks … Ah!</title><content type='html'>I was reading Guido's &lt;a href="http://python-history.blogspot.com/2009/03/problem-with-integer-division.html"&gt;History of Python&lt;/a&gt; blog this morning.  In it he mentions this : &lt;blockquote&gt;Passing an invalid argument, for example a string, is generally caught quickly because few operations accept mixed string/numeric operands (the exception being multiplication)&lt;/blockquote&gt;&lt;br /&gt;WTF!?&lt;br /&gt;Rushes over to Terminal...&lt;br /&gt;&lt;pre&gt;&gt;&gt;&gt; 'string' *2&lt;br /&gt;'stringstring'&lt;/pre&gt;&lt;br /&gt;Why the hell would _anyone_ want to do that ?&lt;br /&gt;&lt;br /&gt;…Thinks…&lt;br /&gt;&lt;br /&gt;…Realise that I have some code that can be simplified with this…&lt;br /&gt;&lt;pre&gt;indent=''&lt;br /&gt;for space in range(level):&lt;br /&gt;   indent += ' '&lt;/pre&gt;&lt;br /&gt;…quick check for zero case…&lt;br /&gt;&lt;pre&gt;&gt;&gt;&gt; 'string' *0&lt;br /&gt;''&lt;/pre&gt;&lt;br /&gt;…changes code…&lt;br /&gt;&lt;pre&gt;indent = ' ' * level&lt;/pre&gt;&lt;br /&gt;Python lesson 1 learned for the day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4992506858570971030?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4992506858570971030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-str-int-wtf-thinks-ah.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4992506858570971030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4992506858570971030'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-str-int-wtf-thinks-ah.html' title='Python: str * int … WTF!? … Thinks … Ah!'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8675101282481663418</id><published>2009-05-28T09:06:00.000-07:00</published><updated>2009-05-28T09:21:29.205-07:00</updated><title type='text'>Wolfram|Alpha. I guess this explains the 'Alpha' part</title><content type='html'>Today I wanted to convert something, and thought maybe it was the sort of thing &lt;a href="http://www.wolframalpha.com/"&gt;Wolfram|Alpha&lt;/a&gt; would be good at, and a better starting point than Google. Converting from European shoe sized to UK shoe sizes, to see if &lt;a href="http://www.vibramfivefingers.com/"&gt;some shoes I like the look of&lt;/a&gt; (but will probably not buy if I'm honest), are made in my size. &lt;br /&gt;&lt;br /&gt;If you type a query about shoe sizes in, it probably won't know what to do with it, but it will have a link to shoe sizes and some example queries. &lt;br /&gt;&lt;br /&gt;One of the examples happens to be  "U.K. men's size 11 shoe in Japanese size".  I clicked this and then changed it to  "European men's size 47 shoe in U.K. size".  It borked (&lt;i&gt;Wolfram|Alpha isn't sure what to do with your input&lt;/i&gt;).  Changing it to "U.K. men's size 11 shoe in European size" also made it bork. &lt;br /&gt;&lt;br /&gt;I guess this explains the  'alpha' part of the name. &lt;br /&gt;&lt;br /&gt;BTW, I &lt;i&gt;really&lt;/i&gt; want to like Wolfram|Alpha, but their natural language parser just doesn't work well enough yet to allow people to get at the data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8675101282481663418?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8675101282481663418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/wolframalpha-i-guess-this-explains.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8675101282481663418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8675101282481663418'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/wolframalpha-i-guess-this-explains.html' title='Wolfram|Alpha. I guess this explains the &apos;Alpha&apos; part'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6330980003738095410</id><published>2009-05-27T10:39:00.000-07:00</published><updated>2009-05-27T10:59:45.130-07:00</updated><title type='text'>Blogger, spaces, &amp;nbsp; and &lt;pre&gt;</title><content type='html'>OK, So I've been posting bits of code of late, and Blogger buggers up the spacing. It removed leading spaces and trims multiple spaces to single spaces.  This is probably good for the average blog post, but really, really bad for indent dependent Python.&lt;br /&gt;&lt;br /&gt;I finally got around to Googling the problem.  I'll repeat it here, just in case this helps someone else.&lt;br /&gt;&lt;br /&gt;This is how I was doing it until today:&lt;br /&gt;&lt;br /&gt;&amp;lt;code&amp;gt;&lt;br /&gt;def double(x):&lt;br /&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return x*2&lt;br /&gt;&amp;lt;/code&amp;gt;&lt;br /&gt;&lt;br /&gt;But now I know about &amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt; and I can write this instead:&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt&lt;br /&gt;def double(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return x*2&lt;br /&gt;&amp;lt;/pre&amp;gt;&amp;lt;&lt;br /&gt;To show this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def double(x):&lt;br /&gt;    return x*2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Much better !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6330980003738095410?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6330980003738095410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/blogger-spaces-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6330980003738095410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6330980003738095410'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/blogger-spaces-and.html' title='Blogger, spaces, &amp;amp;nbsp; and &amp;lt;pre&amp;gt;'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1809724663852570858</id><published>2009-05-27T10:22:00.000-07:00</published><updated>2009-05-27T10:39:41.729-07:00</updated><title type='text'>Python : Using **arg and setattr to create instance variables at runtime</title><content type='html'>I found that I need the generic/extendable **args, but I also needed those args easily visible to a method in a subclass.   Initially I just passed the **args dctionary into a named parameter, but that seemed messy when I actually came to use it.  Plus I need this usable by (even) less able programmers.&lt;br /&gt;&lt;br /&gt;Here's in essence what I've done:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&gt;&gt;&gt; class A(object):&lt;br /&gt;...   def __init__(self, **args):&lt;br /&gt;...     for key,value in args.iteritems():&lt;br /&gt;...       setattr(self,key,value)&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; a=A(first = 1, second = 2, name="Monty")&lt;br /&gt;&gt;&gt;&gt; a.first&lt;br /&gt;1&lt;br /&gt;&gt;&gt;&gt; a.second&lt;br /&gt;2&lt;br /&gt;&gt;&gt;&gt; a.name&lt;br /&gt;'Monty'&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;There's a little more to it.  I have checks against the existing names in case I overwrite something, for example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1809724663852570858?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1809724663852570858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-using-arg-and-setattr-to-create.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1809724663852570858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1809724663852570858'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-using-arg-and-setattr-to-create.html' title='Python : Using **arg and setattr to create instance variables at runtime'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8728438013918122672</id><published>2009-05-26T04:39:00.000-07:00</published><updated>2009-05-27T02:23:24.239-07:00</updated><title type='text'>Python : Instantiate nested classes in a superclass, not the direct containing class</title><content type='html'>I'm using classes for parts of the test harness that I'm writing for some functional testing.  I'm writing I want the tests themselves to be fairly clean, fairly free of boilerplate etc, because some of the people writing the test have not done much or any coding before.&lt;br /&gt;&lt;br /&gt;I have a TestCase class and I have a TestStep class.   When a new test step is written, TestStep is subclassed and included in a subclass of TestCase.&lt;br /&gt;&lt;br /&gt;One of the things I wanted to avoid doing was having to get the test writer to instantiate the TestSteps.  I don't think this is possible in many languages, but Python lets me do it with its ludicrous ability to introspect and add stuff to objects at runtime.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class NewTestCase(TestCase):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class NewTestStep(TestStep):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def body(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...test step code goes here...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def body(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stepNewTestStep() #call instance of NewTestStep&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Note that there's no &lt;code&gt;stepNewTestStep = NewTestStep()&lt;/code&gt; anywhere, and I can add as many TestSteps as I like to the class.  &lt;code&gt;stepNewTestStep&lt;/code&gt; is not hard coded into the TestCase.&lt;br /&gt;&lt;br /&gt;I'd considered naming the NewTestStep objectsas newTestStep rathe than stepNewTestStep, but I was already getting duplicate names in the tests that I'd written, so decided to add the explicit 'step' prefix.&lt;br /&gt;&lt;br /&gt;To a Python newbie like me, this is a bit WTF!?, but stick with me.  As ever, real Pythoneers, feel free to tell me of better, more Pythonic ways to do this. Here's how it was done…&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import types&lt;br /&gt;class TestCase(object):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for name in dir(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attribute = self.__getattribute__(name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if type(attribute) = types.TypeType:  # ignore any non classes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for base in attribute.__bases__:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if 'TestStep' in base.__name__: # only interested in TestStep classes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setattr(self, 'step%s' % attribute.__name__, attribute())&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In plain English, get the names of all the things in TestCase/NewTestCase. For each, make reference to the object of that name (__getattribute__), see if it derived from TestStep and then create a new instance of it (setattr), called 'step[ClassName]' as part of TestCase/NewTestCase.&lt;br /&gt;&lt;br /&gt;Note that NewTestCase inherits the __init__ of TestCase, so dir(self) returns the names of everything in NewTestCase.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8728438013918122672?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8728438013918122672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-instantiate-nested-classes-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8728438013918122672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8728438013918122672'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-instantiate-nested-classes-in.html' title='Python : Instantiate nested classes in a superclass, not the direct containing class'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1359750833201974949</id><published>2009-05-22T02:39:00.000-07:00</published><updated>2009-05-22T02:59:40.212-07:00</updated><title type='text'>Python : Iterating Multiple Lists</title><content type='html'>I did this a few times...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for index in range(len(aList)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingWith(aList[index], blist[index])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingElseWith(cList[index])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Or even...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for a in aList:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingWith(a, blist[aList.index(a)])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingElseWith(cList[aList.index(a)])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And at some point, it felt wrong.  It felt, I have come to understand, unPythonic.&lt;br /&gt;Google was my friend, although I didn't really look or read enough, and I ended up with something like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;a=0&lt;br /&gt;b=1&lt;br /&gt;c=2&lt;br /&gt;for abc in zip(a,b,c):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingWith(abc[a], abc[b])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingElseWith(abc[c])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And I was happy.  But putting it in a few more places, it also felt like unPython.  So I decided to take a better look (actually just a better more explicit simple search for exactly what I wanted), and found the Pythonic way...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for a,b,c in zip(aList,bList,cList):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingWith(a.b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomethingElseWith(c)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Refactoring to use this idiom has been wonderful. Lines of code disappearing &lt;b&gt;and&lt;/b&gt; the code becoming more readable too.  Marvellous !&lt;br /&gt;&lt;br /&gt;(I think I found my answer at &lt;a href="http://www.testingreflections.com/taxonomy_menu/2/107/121/120"&gt;testing reflections&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1359750833201974949?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1359750833201974949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-iterating-multiple-lists.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1359750833201974949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1359750833201974949'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-iterating-multiple-lists.html' title='Python : Iterating Multiple Lists'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-7142754021448211471</id><published>2009-05-22T02:16:00.000-07:00</published><updated>2009-05-22T02:39:01.327-07:00</updated><title type='text'>Pythonic</title><content type='html'>I'm not a very Pythonic Python programmer yet, but it's getting better.  The web has oodles of useful hints and tips.  I'm adding stuff here that I find useful as much for me as anyone else.&lt;br /&gt;&lt;br /&gt;I don't think yesterday was the first time I came across the term 'Pythonic', but it's the first tie it really registered.  It's a nice landmark on my journey.&lt;br /&gt;&lt;br /&gt;'Pythonic' just means doing things in Python the way a real Python programmer does them, rather than doing it Python in the way that it's normally achieved in another language. I've mentioned before that I'm a couple of degrees of separation from being a real Python programmer.  I'm from an Ada background, and came to Python via Java.&lt;br /&gt;&lt;br /&gt;Ada is a superb language.  It's like a polar opposite of Python, and that's fine. I wouldn't use Python for safety critical, and I wouldn't use Ada to write automated functional tests.  Right tools for the job and all that.&lt;br /&gt;&lt;br /&gt;Edit: worth a read : &lt;a href="http://faassen.n--tree.net/blog/view/weblog/2005/08/06/0"&gt;What is Pythonic ?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7142754021448211471?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7142754021448211471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/pyhtonic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7142754021448211471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7142754021448211471'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/pyhtonic.html' title='Pythonic'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4689044862708116146</id><published>2009-05-18T17:50:00.000-07:00</published><updated>2009-05-18T18:03:04.903-07:00</updated><title type='text'>Example of an exception class in Python</title><content type='html'>If I'm going to suggest that you define your own exceptions, I really ought to give an example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class PlayerError(Exception):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass&lt;br /&gt;&lt;br /&gt;class PlayerIsNotPlayingInExpectedDirectionError(PlayerError):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self, direction):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp;"""direction parameter should be 'forwards' or 'in reverse'"""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp;if 'rev' in direction : direction = 'in reverse'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp;self.direction = direction&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __str__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "Player was not playing %s as expected." % self.direction&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4689044862708116146?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4689044862708116146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/example-of-exception-class-in-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4689044862708116146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4689044862708116146'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/example-of-exception-class-in-python.html' title='Example of an exception class in Python'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3606717901228185631</id><published>2009-05-18T17:33:00.000-07:00</published><updated>2009-05-18T17:45:23.395-07:00</updated><title type='text'>Define and raise exceptions liberally.</title><content type='html'>It does the job, but this doesn't really feel like it's enough:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if not playerIsPlayingForwards():&lt;br /&gt;&amp;nbsp;&amp;nbsp&amp;nbsp;&amp;nbsp&amp;nbsp;&amp;nbsp;raise "Player is not playing forwards'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I'm using this structure instead, liberally raising my own verbose exceptions :&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert playerIsPlayingForwards():&lt;br /&gt;&amp;nbsp;&amp;nbsp;except AssertionError:&lt;br /&gt;&amp;nbsp;&amp;nbsp&amp;nbsp;&amp;nbsp&amp;nbsp;&amp;nbsp;raise PlayerIsNotPlayingInExpectedDirectionError('Forwards')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;It takes a bit more time, but it's worth it. You get it back in debug time saved.  You also get a nice warm fuzzy feeling when one of your explicit exceptions gets raised, highlighting a very specific problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3606717901228185631?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3606717901228185631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/define-and-raise-exceptions-liberally.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3606717901228185631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3606717901228185631'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/define-and-raise-exceptions-liberally.html' title='Define and raise exceptions liberally.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1181330445327535399</id><published>2009-05-18T17:02:00.000-07:00</published><updated>2009-05-18T17:27:33.145-07:00</updated><title type='text'>Finding the name of the current function in Python. nameOfThisFunction()</title><content type='html'>As part of my testing, I need to create logs that give me some traceability for when things go wrong, evidence of testing whatever the result.  Kind of like permanent debug text.  I'll look at differences between log files of the same tests run on previous and new versions.  It's ad-hoc testing when it's first written and it's regression testing thereafter.&lt;br /&gt;&lt;br /&gt;One of the ways to show trace is simply to show which methods/functions are being called.  Being lazy, I simply want to cut and paste something, I don't want to also have to change it.  I would prefer to use the actual function name rather than hard coding into a string for printing / logging.  The name might change in the future.  I might forget to alter the name after pasting it.&lt;br /&gt;&lt;br /&gt;This is what I don't want:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def testStepA(param):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writeToLogFile('Reached function 'testStepA')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;br /&gt;def testStepB(param):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writeToLogFile('Reached function 'testStepB')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I want something like this instead:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def testStepA(param):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writeToLogFile('Reached function '%s', nameOfThisFunction())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;br /&gt;def testStepB(param):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writeToLogFile('Reached function '%s', nameOfThisFunction())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Fortunately, inspect gives me the information I'm after:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import inspect&lt;br /&gt;&lt;br /&gt;def nameOfThisFunction (offset=0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return inspect.stack()[1 + offset][3]&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1181330445327535399?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1181330445327535399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/finding-name-of-current-function-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1181330445327535399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1181330445327535399'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/finding-name-of-current-function-in.html' title='Finding the name of the current function in Python. nameOfThisFunction()'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8987338527987518737</id><published>2009-05-18T01:01:00.000-07:00</published><updated>2009-05-18T01:17:26.351-07:00</updated><title type='text'>Handling exceptions and printing a useful trace in Python</title><content type='html'>In writing a test harness for functional automated testing,  I'm expecting things to fail.  In writing some of the tests, I'm trying to get things to fail, poking around the boundaries etc.   WhenI have a test suite that takes 50 hours to run, that I kick off on a Friday night,  what I don't want is for it to stop running five minutes after I leave the office.&lt;br /&gt;&lt;br /&gt;I want it to carry on with the rest of the tests, but I also want some information about these failures.  What exceptions were raised and where they were raised.  This is how I'm doing it:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import sys&lt;br /&gt;import traceback&lt;br /&gt;…&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myTestCase.executeTestSteps()&lt;br /&gt;except: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# handle and log exceptions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exctype, value, trace = sys.exc_info()[:3]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extracted_tb = traceback.extract_tb(trace)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printAndLog("**********************');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printAndLog(str(exctype) + ':' + str(value))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for tb_line in extracted_tb:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printAndLog(str(tb_line[0]) + 'line ' + str(tb_line[1]) + ' in ' + str(tb_line[2]) + ' (' + str(tb_line[3]) + ')')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printAndLog("**********************');&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;del trace&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;( Where myTestCase is the thing I want to run and printAndLog (you'll have to roll your own) sends to the console and to a log file)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8987338527987518737?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8987338527987518737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/handling-exceptions-and-printing-useful.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8987338527987518737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8987338527987518737'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/handling-exceptions-and-printing-useful.html' title='Handling exceptions and printing a useful trace in Python'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5562348383512215906</id><published>2009-05-18T00:36:00.000-07:00</published><updated>2009-05-18T16:59:41.724-07:00</updated><title type='text'>Profit per head. Tech stock</title><content type='html'>The &lt;a href="http://royal.pingdom.com/2009/05/14/congratulations-google-staff-210k-in-profit-per-head-in-2008/"&gt;$210K profit per head at Google&lt;/a&gt; figures are interesting (as &lt;a href="http://daringfireball.net/"&gt;John Gruber&lt;/a&gt; points out).&lt;br /&gt;&lt;br /&gt;Apple's not known for talking small profits and Microsoft pride take pride &lt;a href="http://www.youtube.com/watch?v=EIS6G-HvnkU"&gt;associating themselves with cheap&lt;/a&gt; so what's going on here ?&lt;br /&gt;&lt;br /&gt;I have a few initial thoughts…&lt;br /&gt;&lt;br /&gt;1 - Microsoft doesn't have stores.  Although the Apple stores must bring in lot of revenue, they're also a massive overhead.&lt;br /&gt;&lt;br /&gt;2 - Apple isn't in enterprise, and this is where Microsoft gets its profit.  Money for old rope with Office and Exchange and Windows volume licenses.&lt;br /&gt;&lt;br /&gt;3 - The data is based on 'employees', but that's not the same as staff.  It probably excludes contract staff.  Those companies using lots of contractors might be showing artificially high numbers using this measurement.  I've no idea whether Microsoft, Google or Apple uses a lot of contact staff (I suspect not), but I bet a few of the companies listed do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5562348383512215906?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5562348383512215906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/profit-per-head-tech-stock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5562348383512215906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5562348383512215906'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/profit-per-head-tech-stock.html' title='Profit per head. Tech stock'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4101200668513973178</id><published>2009-05-17T02:17:00.000-07:00</published><updated>2009-05-17T02:53:29.257-07:00</updated><title type='text'>Python: count of parameters in a function</title><content type='html'>I recently had a problem with a that class had several ways to populate one of its instance variables.  An instance method was called in each case, either with a parameter, (using the method provided by the class), or without a parameter, (in the case of the same method overridden in a subclass). I've since realised that there was a simpler/better way to achieve this, but no matter, Python allowed me to figure out which one to call by being able to count the parameters in the method, and then call&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import inspect&lt;br /&gt;&lt;br /&gt;def parametersInMethod(method):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return len(inspect.getargspec(method)[0])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Allowed me to do this...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if parametersInMethod(self.populateInstanceVariable) == 0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.populateInstanceVariable()&lt;br /&gt;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.populateInstanceVariable(withValue)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This give a little insight into 'inspect' and also shows how methods being objects allow them to be passed as parameters into functions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4101200668513973178?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4101200668513973178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-count-of-parameters-in-function.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4101200668513973178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4101200668513973178'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/python-count-of-parameters-in-function.html' title='Python: count of parameters in a function'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5143381729835513125</id><published>2009-05-09T07:02:00.000-07:00</published><updated>2009-05-09T09:24:46.973-07:00</updated><title type='text'>More on Python and a bit on Objective C</title><content type='html'>I can't quite put my finger on it, possibly because I've not used ObjC in anger yet, but it seems to have a similar ethos to Python.  I'm probably going to ignore ObjC for a while longer, but I may dabble with PyObjC instead.   Learn some Cocoa through the increasingly familiar Python, then apply that knowledge to an ObjC project.&lt;br /&gt;&lt;br /&gt;What I love about Python so far is that just trying things seems to usually just work.  It's a language that does what you want it to.    It's a little dangerous, because so much is checked and can be manipulated at runtime.  It's the least nanny-ish language I've come across, trusting the programmer to do the right thing and allowing the programmer to break convention when it is appropriate.  It's counter-intuitive, perhaps, but the responsibility given to the programmer seems to lead to responsible programming.  Treat me like an adult and I will behave like an adult kind of thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5143381729835513125?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5143381729835513125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/05/more-on-python-and-bit-on-objective-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5143381729835513125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5143381729835513125'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/05/more-on-python-and-bit-on-objective-c.html' title='More on Python and a bit on Objective C'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1180463123202862094</id><published>2009-04-15T04:46:00.002-07:00</published><updated>2009-04-15T09:01:23.900-07:00</updated><title type='text'>Why "The dumbest 'Macs are better than PCs' post, ever" wasn't dumb at all.</title><content type='html'>Ian Betteridge, former Mac User (UK) editor and recent switcher &lt;span style="font-style:italic;"&gt;from&lt;/span&gt; Macintosh (for perfectly good and valid reasons), usually gets it right, but gets it wrong in his &lt;a href="http://www.technovia.co.uk/2009/04/the-dumbest-macs-are-better-than-pcs-post-ever.html"&gt;The dumbest “Macs are better than PCs” post, ever&lt;/a&gt; post.&lt;br /&gt;&lt;br /&gt;The post to which he refers says this :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;“Apple never, ever expresses battery life based on the number of cells that make it up. The ThinkPad I have at work is available with a 4, 6, and 9-cell option. And I have no idea what any of it means or why I should care. Apple just tells me how long I can work without a power source, which is what I actually care about.&lt;br /&gt;&lt;br /&gt;The PC-makers just don’t get it.”&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Ian thinks this is absurd, and given an example where it is &lt;a href="http://www1.euro.dell.com/content/topics/topic.aspx/global/products/adamo/topics/en/emea/adamo-onyx?c=uk&amp;cs=ukdhs1&amp;l=en&amp;s=dhs&amp;redirect=1"&gt;demonstrably false&lt;/a&gt;.  That's all well and good, but it doesn't really refute the original post.  Indeed, it is &lt;a href="http://www1.euro.dell.com/content/products/productdetails.aspx/laptop-inspiron-1545?c=uk&amp;cs=ukdhs1&amp;l=en&amp;s=dhs&amp;~ck=mn"&gt;demonstrably true&lt;/a&gt; for another model by the same company.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;4-cell 2.0AHr Battery&lt;br /&gt;6-cell 2.2AHr Battery&lt;br /&gt;9-cell 2.2AHr Battery&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Seriously, WTF does that mean to any normal person ? &lt;br /&gt;&lt;br /&gt;So far from being a dumb post, it highlights perfectly the kind of thing that most PC makers don't get most of the time.  If they did, they would quote a time for each battery.  No doubt the batteries are common to many models, but it wouldn't take too much effort to calculate the typical battery life (by dragging amp hours for the battery from a database table and power draw of the laptop from another table).   This kind of attention to detail is exactly what Apple get most of the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1180463123202862094?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1180463123202862094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/04/ian-betteridge-gets-it-wrong.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1180463123202862094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1180463123202862094'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/04/ian-betteridge-gets-it-wrong.html' title='Why &quot;The dumbest &apos;Macs are better than PCs&apos; post, ever&quot; wasn&apos;t dumb at all.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-3409719017265287657</id><published>2009-04-02T16:42:00.000-07:00</published><updated>2009-04-02T19:06:34.294-07:00</updated><title type='text'>Type-Safe Python</title><content type='html'>Introspection, baby !&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if frameType.__class__.__name__ == 'FrameType':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise 'frameType must be an instance of FrameType'&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3409719017265287657?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3409719017265287657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/04/type-safe-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3409719017265287657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3409719017265287657'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/04/type-safe-python.html' title='Type-Safe Python'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-1667264482326685613</id><published>2009-03-25T22:48:00.000-07:00</published><updated>2009-03-25T22:52:50.577-07:00</updated><title type='text'>Positive tinkering (an example)</title><content type='html'>I've been tinkering today.  I'm working in Python/Jython on an automated test harness.  Typically, I'm standing on the shoulders of giants : the developers who have given me an API with which to test their Java app using a bit of &lt;a href="https://jemmy.dev.java.net/"&gt;Jemmy&lt;/a&gt; magic.  I hope to have (relatively) large shoulders for my testing colleagues to stand on, and that means hiding / abstracting the API that I've been given even further.  It's going well, but it's not quite there yet.  Today I needed to write a very specific test, and there were two approaches that I could take.  One was to extend an existing class  which takes scripts as Python lists, to be able to do a drag and drop action.  The other was to create a new class to allow custom/bespoke tests to be written without resorting to too much reproduction of boilerplate code.&lt;br /&gt;&lt;br /&gt;Eventually I got something working. Ironed out some niggles, and was quite pleased. It would have been easy to leave it at that.  It was certainly good enough.  It seemed a bit clumsy though.  There was still a lot of work in subclassing and calling my bespoke test (It's called 'custom', but I already know it'll be called 'bespoke in about 4 hours if I ever get some sleep).    I needed to figure out a way of getting boilerplate out of a function that created an instance of a subclass and into the parent class, where it could be forgotten about for all eternity by people writing the tests.&lt;br /&gt;&lt;br /&gt;A solution (which may itself be refactored), was to pass a parameter (called 'parameters', containing a Python dictionary, which can be accessed by key, which makes it human readable) into the parent class' constructor, the constructor calls some functions which can be overridden by the subclass.  The parent class has a  function that calls the test body and records results, and the test body is overridden in the subclass to do the stuff that the test writer wants to do.&lt;br /&gt;&lt;br /&gt;It means that the test writer subclassing the bespoke test class now doesn't need give a monkey's chuff about the boilerplate code.  He (Sadly we are all 'He' in the lab at the moment) just writes some simple steps and can assume that the environment for executing those steps is initiated and torn down automatically.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-1667264482326685613?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/1667264482326685613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/positive-tinkering-example.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1667264482326685613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/1667264482326685613'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/positive-tinkering-example.html' title='Positive tinkering (an example)'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3420023608725808803</id><published>2009-03-25T21:46:00.000-07:00</published><updated>2009-03-25T22:48:12.711-07:00</updated><title type='text'>Refator, refactor, refactor.</title><content type='html'>I didn't come across the term 'refactoring' until relatively recently, but it's something I've always done without realising it. Or at least without labelling it.  I don't know of an official definition of refactoring, but it would probably go something like this : "Refactoring is the process of improving code quality without changing its function".&lt;br /&gt;&lt;br /&gt;Refactoring is just tinkering until it feels right.&lt;br /&gt;&lt;br /&gt;Renaming is the simplest form of refactoring.&lt;br /&gt;&lt;br /&gt;Renaming is also the most significant key fundamental form of refactoring.  Change the name of a variable, method or class, and it can have massive implications on the design.  Get a name right, instead of merely almost right, and clarity ensues; pieces of the puzzle fall into place. Glaring mistakes, omissions, duplications and complications become suddenly apparent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3420023608725808803?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3420023608725808803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/refator-refactor-refactor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3420023608725808803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3420023608725808803'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/refator-refactor-refactor.html' title='Refator, refactor, refactor.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6887628277857877221</id><published>2009-03-25T19:06:00.000-07:00</published><updated>2009-03-25T21:46:16.679-07:00</updated><title type='text'>MacHeist</title><content type='html'>There's some argument about the MacHeist bundle.  Whether it's good business and whether it's ethical for us consumers to avail ourselves of a bargain.&lt;br /&gt;&lt;br /&gt;I think that validity of the business aspect is for the developers to decide.  If participating gets the developer a big pile of cash they wouldn't normally get,  it gets them a  whole lot of exposure that would otherwise be difficult to get (other than with expensive advertising), &lt;i&gt;and&lt;/i&gt; it's not going to cause a support nightmare, then where's the problem ?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.marco.org/89711524"&gt;Marco Arment&lt;/a&gt; may think that it’s not a &lt;i&gt;good idea, as conscientious consumers, to accept such steep discounts on the products that we use and love&lt;/i&gt;, but while I don't disagree in principle, I think the argument is a red herring.  Without MacHeist, an awful lot of people would not pay for or use this software.  With MacHeist, an awful lot of people will pay for this software, may install some or all of it, and may even use it occasionally.&lt;br /&gt;&lt;br /&gt;I'm a MacHeist customer. The ethical validity hadn't crossed my mind until today.  Having thought about it a little,  I think I actually paid over the odds for the bundle considering the actual use I'm going to get from it.  There's an outside chance that I'll use one of the apps more than twice. An app may become part of my arsenal. If it does,  then it's a dead cert that I'll pay the full upgrade price for the next major release.  I get some cheap useful software now, and the developer gets a customer for life.&lt;br /&gt;&lt;br /&gt;Having this stuff needlessly installed contravenes a number of &lt;a href="http://al3x.net/2008/09/08/al3xs-rules-for-computing-happiness.html"&gt;al3xs rules for computing happiness&lt;/a&gt;.  I don't care.  There are 133 items in my Applications folder. That's way too many. I don't care. I think Apple make great stuff.  I think developers on OS-X make great stuff.  I don't want Comic Life Magiq on my Mac because I'm into writing comics.  I want it there so that when someone says, "Wouldn't it be cool if we could make a comic of that", I can show them how easy it is with great software.  I become a cheap and willing salesman for Plasq (and for Apple).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Don't think of MacHeist as exploitatively cheap software, think of it as a quite expensive demo suite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6887628277857877221?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6887628277857877221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/macheist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6887628277857877221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6887628277857877221'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/macheist.html' title='MacHeist'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3188730063991912998</id><published>2009-03-14T16:41:00.000-07:00</published><updated>2009-03-16T11:45:28.260-07:00</updated><title type='text'>Scratch from MIT</title><content type='html'>My son, who is in year 6, has expressed some interest in programming (like lots of kids, he wants to be a games designer).  I tried getting him interested by introducing him to Python.  I thought he could get used to the language and OOP, without getting heavy with strong typing, verbose, unclear languages.  Python gives fairly quick results (faster, probably if you don't use is like an Ada jockey who knows a bit of Java)&lt;br /&gt;&lt;br /&gt;I'd looked very briefly at &lt;a href="http://www.pygame.org/"&gt;PyGame&lt;/a&gt;, and figured that it would be relatively easy to pick up.&lt;br /&gt;&lt;br /&gt;Last week though, I followed a link to &lt;a href=http://scratch.mit.edu&gt;scratch&lt;/a&gt;, and it was very obvious that this was the place to start.  I think I was right.  I showed it to my son this morning, and with a little guidance, he finished writing a version of Pong today.&lt;br /&gt;&lt;br /&gt;There are some aspects of scratch that I think could apply to a real IDE.  Drag and drop constructs, statements, objects etc may b e a simplification too far,  but the graphical representation of them seems a lot better than simple code colouring …&lt;br /&gt;&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/hywel/bedgj/scratch-1.3.1-release-of-21-nov-08"&gt;&lt;img src="http://img.skitch.com/20090315-bgj5wb81k7fbb5i6ek44jxfchg.preview.jpg" alt="Scratch 1.3.1 (release of 21-Nov-08)" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080"&gt;Uploaded with &lt;a href="http://plasq.com/"&gt;plasq&lt;/a&gt;'s &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;OK, it's  little fisher price, and would need toning down in a real IDE, but it's also clear about what belongs where.  It shows scope very well.  It's not unlike Python's indentation based scope, but also more explicitly shows the end of the scope of a block with no additional code .  There's no reason that this graphical representation couldn't be live generated while typing in a 'real' language.  Something like this…&lt;br /&gt;&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/hywel/bedg7/length.py"&gt;&lt;img src="http://img.skitch.com/20090315-p5ju4d1cr4mj73h3cwhqhx8x82.preview.jpg" alt="length.py" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080"&gt;Uploaded with &lt;a href="http://plasq.com/"&gt;plasq&lt;/a&gt;'s &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;might look like this…&lt;br /&gt;&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/hywel/bedet/untitled"&gt;&lt;img src="http://img.skitch.com/20090315-1nb75ndf5hr8kht9whci1b5dxf.preview.jpg" alt="Untitled" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080"&gt;Uploaded with &lt;a href="http://plasq.com/"&gt;plasq&lt;/a&gt;'s &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;There'd be a problem with the code becoming illegible in deep blocks. (exaggerating)…&lt;br /&gt;&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/hywel/bede9/untitled"&gt;&lt;img src="http://img.skitch.com/20090315-ewucd3au76xrtgy6p9cc6uebuc.preview.jpg" alt="Untitled" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080"&gt;Uploaded with &lt;a href="http://plasq.com/"&gt;plasq&lt;/a&gt;'s &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;I think there's an advantage though. If the code is 15 or 20 levels deep in a single file/class/method/function,  then there's some bad design going on there, and it should be refactored.  The opacity would become a useful visual representation of the readability of the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3188730063991912998?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3188730063991912998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/scratch-from-mit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3188730063991912998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3188730063991912998'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/scratch-from-mit.html' title='Scratch from MIT'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-2024732012000662611</id><published>2009-03-14T16:05:00.000-07:00</published><updated>2009-03-15T16:36:43.301-07:00</updated><title type='text'>Why the iPod Shuffle is broken</title><content type='html'>Having pondered the new (3rd gen) iPod Shuffle for a little longer, I think it's broken.  I want it to fail.  I want everyone who fancies one to reject it.  There are two reasons.  One I'd mentioned before, as a nitpicking detail: no control on the device itself.  the second reason is that there's bloody DRM in the headphones.  What it means is that only authorised manufacturers can make replacement headphones or extension cables that include the utterly necessary controls.  The little inline remote has an authentication chip in it.&lt;br /&gt;&lt;br /&gt;I don't object to the inline remote.  I don't object to Apple selling a chip to other vendors that allows them to send the requisite signals to the device to control it.  Plenty of devices have proprietary controls like this.  Think TV remotes, for example.    What I object to is doing this while having no controls on the device itself.   Why ?  It just feels broken.  Headphones go missing, get trodden on, go missing down the back of the sofa.   Having the player break at the same time is an appalling design decision.  It's  either stupid or greedy.&lt;br /&gt;&lt;br /&gt;In programming terms, the shuffle ad its controls are highly coupled.  They're so highly coupled that they should be one unit.  &lt;br /&gt;&lt;br /&gt;I've experienced the problem that Apple have introduced to an extent with a couple of televisions.  Al functions are accessible from the TV remote, but not all functions are accessible from the buttons on the TV.   This is a broken interface.  A device, whether it is a tiny MP3 player or a big TV should still work &lt;i&gt;fully&lt;/i&gt;without the remote, even if the interface by which its functions can be accessed without the remote are less convenient / more fiddly.&lt;br /&gt;&lt;br /&gt;Edit: some doubt has been cast on whether the EFF and ilounge reports on the chip in the headphones has anything to do with DRM / DMCA.  Maybe they're just trying to grab headlines.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-2024732012000662611?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/2024732012000662611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/why-ipod-shuffle-is-broken.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2024732012000662611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2024732012000662611'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/why-ipod-shuffle-is-broken.html' title='Why the iPod Shuffle is broken'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8328166913217957389</id><published>2009-03-11T09:42:00.000-07:00</published><updated>2009-03-11T19:18:41.705-07:00</updated><title type='text'>Thoughts on the new iPod Shuffle.</title><content type='html'>The voices on the new iPod Shuffle are different for Tiger, Leopard and Windows. &lt;br /&gt;&lt;br /&gt;I suspect that the voice isn't produced by the shuffle from the tag text in the sound files.  I think it's added by iTunes as audio. This audio could be embedded as a new tag or it could be added as a separate resource file. I assume it'll take a while to process a whole library to add this data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Edit: the Shuffle needs a new version of iTunes.  I think this supports my hypothesis about the metadata.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Overall impression is good, but I'd like to pick some nits nits... &lt;br /&gt;&lt;br /&gt;The control is on the headphones. What if you want to use other headphones ? (I never had a problem with the headphones that came with my old iPod, but the ones that came with my new one simply don't stay in my ears). &lt;br /&gt;&lt;br /&gt;The control is on the cable for the right ear. What about the sinister left handed people.  It would make more sense to have this on the main cable before the split.&lt;br /&gt;&lt;br /&gt;The obvious fix is for some third parties to make a cable with an inline control and a headphone socket. The problem that introduces is that the combined cable will be too long, and the position of the control in that length of cable might not be ideal.  Of note, the last pair of Sony headphones I bought came with a very short cable (about 18"), and an extension cable which adds another 2 feet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8328166913217957389?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8328166913217957389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/thoughts-on-new-ipod-shuffle.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8328166913217957389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8328166913217957389'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/thoughts-on-new-ipod-shuffle.html' title='Thoughts on the new iPod Shuffle.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8148933216702728291.post-5517915398208304194</id><published>2009-03-10T16:00:00.002-07:00</published><updated>2009-03-10T16:07:08.858-07:00</updated><title type='text'>Touch based tablet from Apple.</title><content type='html'>Maybe.&lt;br /&gt;&lt;br /&gt;Think iPod Touch, but with an 8" display. All the better to surf with. Won't be much thicker&lt;br /&gt;&lt;br /&gt;Will be a Touch device.  Will use the app store.  Apps will be full screen. Will not have a desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5517915398208304194?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5517915398208304194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/touch-based-tablet-from-apple.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5517915398208304194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5517915398208304194'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/touch-based-tablet-from-apple.html' title='Touch based tablet from Apple.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6878085155736800450</id><published>2009-03-10T16:00:00.001-07:00</published><updated>2009-03-10T16:00:27.539-07:00</updated><title type='text'>Macintosh tablet</title><content type='html'>Ain't gonna happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6878085155736800450?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6878085155736800450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/macintosh-tablet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6878085155736800450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6878085155736800450'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/macintosh-tablet.html' title='Macintosh tablet'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5526887544174586778</id><published>2009-03-10T15:58:00.000-07:00</published><updated>2009-03-10T15:59:59.936-07:00</updated><title type='text'>Apple NetBook</title><content type='html'>Ain't gonna happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5526887544174586778?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5526887544174586778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/apple-netbook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5526887544174586778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5526887544174586778'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/apple-netbook.html' title='Apple NetBook'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6834852409328606806</id><published>2009-03-09T17:05:00.000-07:00</published><updated>2009-03-09T17:18:56.360-07:00</updated><title type='text'>Am I writing Java in Python ?</title><content type='html'>That's what's bugging me today. Or rather Am I writing is like an Ada programmer would write Java ?  It's going through too many filters.&lt;br /&gt;&lt;br /&gt;It doesn't really matter, but I've been writing stuff as methods of classes, and maybe they could just be functions.  I suspect my code is 4 times the size of a 'proper' Python programmer's code.&lt;br /&gt;&lt;br /&gt;I've never used a tuple.  I'm using dictionaries, but I fear not in a good way.&lt;br /&gt;&lt;br /&gt;I want to overload _init_ all the time.&lt;br /&gt;&lt;br /&gt;On the other hand, I'm starting to slip into Test Driven Design.  I'm mostly writing unit tests for some code I'd already written, which is to support some functional tests that I'm automating.  I had three levels of classes, and at the highest level, it was more of a sketch than an attempt to get it right.  Once I started writing and running tests, it all got fixed up and fleshed out. Maybe I'll start with some unit tests tomorrow and then write the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6834852409328606806?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6834852409328606806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/03/am-i-writing-java-in-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6834852409328606806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6834852409328606806'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/03/am-i-writing-java-in-python.html' title='Am I writing Java in Python ?'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-7315342514470914898</id><published>2009-02-23T15:07:00.000-08:00</published><updated>2009-02-23T15:58:31.507-08:00</updated><title type='text'>The Oscars.</title><content type='html'>John Gruber has an &lt;a href="http://daringfireball.net/2009/02/best_picture"&gt;interesting take on the Oscars&lt;/a&gt;.  I agree with&lt;span style="font-style:italic;"&gt; almost &lt;/span&gt;everything he says.  The &lt;a href="http://www.bbc.co.uk/fivelive/entertainment/kermode.shtml"&gt;Kermodian&lt;/a&gt; certainty is to be admired, but there's one big problem:  WALL-E just wasn't that great a picture.  It was that great a picture for the first half, but not for the second half.  My gut tells me that half a picture shouldn't win an Oscar nomination.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-7315342514470914898?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/7315342514470914898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/oscars.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7315342514470914898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/7315342514470914898'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/oscars.html' title='The Oscars.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-4704606417904326796</id><published>2009-02-22T12:41:00.000-08:00</published><updated>2010-03-30T04:26:43.089-07:00</updated><title type='text'>What I think about comments.</title><content type='html'>Some people tell you that you don't need comments.  It may be true for them, but it's not true for everyone.  So unless you keep your code to yourself, you need to use comments.  You shouldn't state the obvious.  This is a bad comment:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;# increment the loop variable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Comments are more useful to remind yourself why you did something in a certain way.  Comments shouldn't really explain &lt;span style="font-style:italic;"&gt;what&lt;/span&gt; the code does, they should justify or clarify something about the code.   It's better to have comments on blocks rather than lines. It's OK to add comments to help when learning a language or technique that you maybe will strip out later.&lt;br /&gt;&lt;br /&gt;Example of a good/useful comment :&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create and populate the first few&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // rows.  Shouldn't really have to,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // but if we don't, autosize will&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // throw a wobbler later on&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HSSFRow row = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HSSFCell cell = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int rowNum = 0; rowNum &amp;lt dataRow; rowNum++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row = worksheet.createRow(rowNum);&lt;br /&gt;       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int col=0; col&amp;ltheadersText.length ; col++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cell = row.createCell((col + 1), cellType); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cell.setCellValue(""); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;It's a good comment because it's going to explain why some odd code is in there, and it'll stop someone taking it out in the future and having to go through the pain of finding a workaround for a problem that they'd inadvertently reintroduced.&lt;br /&gt;&lt;br /&gt;It's also formatted in an unusual way.   It spans multiple lines, and it's over-indented.  This is very deliberate.  It stems from the days before syntax-colouring.  It achieves two things.  The comments get out of the way when you're reading the code, and the comments stand out when you want to read the comments.  I've been doing this for years.  An old boss used to do it and it infuriated me.  He explained why he did it though, and persuaded me to try it for a while, and it works. It's a great way to format comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-4704606417904326796?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/4704606417904326796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/what-i-think-about-comments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4704606417904326796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/4704606417904326796'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/what-i-think-about-comments.html' title='What I think about comments.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-971423598090291363</id><published>2009-02-22T11:21:00.000-08:00</published><updated>2010-03-30T03:55:30.586-07:00</updated><title type='text'>Why readability and scope matter</title><content type='html'>I was reasonably lucky to have a decent lecturer in Polytechnic, who taught me some good programming practices.  This was structured programming (Modula-2), rather than OOP, but they also apply to OOP.  Essentially, it boiled down to two complementary goals: &lt;span style="font-weight:bold;"&gt;Low Coupling&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;High Cohesion&lt;/span&gt;.   The goals are fairly simple to achieve by following a couple of simple rules:&lt;br /&gt;&lt;br /&gt;1. Limit scope as much as possible.&lt;br /&gt;&lt;br /&gt;2. A subroutine should do one thing only, and all the data it needs should be defined in its interface (its formal parameter list).&lt;br /&gt;&lt;br /&gt;There are occasions to break the rules, such as when optimising.  Breaking the rules for mere convenience, especially early in development is a definite no-no.  I've done it, and it usually comes back to haunt me, and it usually needs refactoring to limit the scope.&lt;br /&gt;&lt;br /&gt;It's arguably more difficult with OOP, because instance variables have global scope for an object, but not all methods should be allowed to alter them.  It's probable that if you get into this situation, your object is too complex and should be split into smaller and simpler objects.&lt;br /&gt;&lt;br /&gt;So that's scope.&lt;br /&gt;&lt;br /&gt;Readability matters because code gets read far more often than it gets modified.   Badly formatted code is difficult to read.  Badly formatted code is confusing the reader.&lt;br /&gt;&lt;br /&gt;I once spent several days trying to find a problem in a very long module.  The module was too long, but the tools we were using made it difficult to split a lot of the code out.   There was a pre-processor to flesh out system / messaging calls, but only against certain modules. The module at fault had grown to something like 10,000 lines of code. I knew he problem was in there, but I didn't have a reliable way to make it fail in unit testing - where I could debug.  We didn't have great unit tests, and it wasn't possible to debug during system testing (when it failed)&lt;br /&gt;&lt;br /&gt;The module was a bit of an unreadable mess. The indentation was all over the place and there were dozens of variables scoped to the highest level of the module.&lt;br /&gt;&lt;br /&gt;I told my boss about this, and asked for permissions to take a few days to tidy up the indentation and fix the scoping issues.  He told me we didn't have time.  We were close to releasing, and we couldn't make those sort of changes.&lt;br /&gt;&lt;br /&gt;I went with my gut.  I lied about what I was doing in progress meetings and went ahead and fixed the indentation and refactored to limit the scope of everything as much as possible.  I think I actually got rid of all the variables global to the module (There were the equivalent to instance variables, which remained, but these were defined elsewhere).  It took about 3 days.&lt;br /&gt;&lt;br /&gt;When I came to test again, with something more readable, as loosely coupled and highly cohesive as i could make it,  I tried to find the bug again.  I had gone.&lt;br /&gt;&lt;br /&gt;I've actually no idea where the bug was, or what the change was that fixed it.  The likely problem is that a global variable was being set when a local one should have been set, and this was now impossible with the new scoping restrictions. But I never found out exactly where.&lt;br /&gt;&lt;br /&gt;I told my boss I'd found and fixed the bug, and gave some bullshit response to explain it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-971423598090291363?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/971423598090291363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/why-readability-and-scope-matter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/971423598090291363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/971423598090291363'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/why-readability-and-scope-matter.html' title='Why readability and scope matter'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-5332021316106483495</id><published>2009-02-22T08:33:00.000-08:00</published><updated>2009-03-11T16:51:46.146-07:00</updated><title type='text'>{ … }</title><content type='html'>I don't really like curly braces, but I appreciate this is a personal thing. I don't dislike them nearly as much as I used to.  I do prefer a good solid &lt;span style="font-weight:bold;"&gt;begin&lt;/span&gt; … &lt;span style="font-weight:bold;"&gt;end&lt;/span&gt;, but at least the braces are language independent ... that is if someone is programming in Italian, they work just as well.&lt;br /&gt;&lt;br /&gt;What I really, really hate is this …&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (x==y) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp&amp;nbsp;&amp;nbsp;&amp;nbsp;…&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;simply because the block delimiters don't line up.  A far better style is this…&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (x==y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;…&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I've seen coding standards that do it the right way, but I don't recall ever seeing it written the right way in a coding book. People may argue the right way this wastes a line. Bollocks!  For the sake of readbility, a bit of white space delineates blocks quite nicely.  Where you don't need it is when the block is very short.  For example, both&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (fileIsOpen) {closeFile();}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (fileIsOpen)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp&amp;nbsp;&amp;nbsp;&amp;nbsp;{closeFile();}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt; are fine.&lt;br /&gt;&lt;br /&gt;Python doesn't have this problem.  It's one of the main reasons I like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-5332021316106483495?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/5332021316106483495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/blog-post_5427.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5332021316106483495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/5332021316106483495'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/blog-post_5427.html' title='{ … }'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-2648862255282662611</id><published>2009-02-22T06:09:00.000-08:00</published><updated>2009-02-22T06:16:58.776-08:00</updated><title type='text'>++</title><content type='html'>This is something I used to dislike about C-like languages. I used to think that such statements should always be explicit assignments…&lt;blockquote&gt;x := x + 1 ;&lt;/blockquote&gt;…but I don't mind it these days.  I'd prefer a function…&lt;blockquote&gt;inc(x);&lt;/blockquote&gt;…but I don't have a problem with &lt;blockquote&gt;x++;&lt;/blockquote&gt;any more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-2648862255282662611?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/2648862255282662611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/blog-post_22.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2648862255282662611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2648862255282662611'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/blog-post_22.html' title='++'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-229614963508047593</id><published>2009-02-21T15:31:00.000-08:00</published><updated>2009-02-21T18:05:38.649-08:00</updated><title type='text'>'==' = '='; '=' = ':='.</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Or: One of the things I &lt;span style="font-style:italic;"&gt;hate&lt;/span&gt; about C&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you started out with a language that uses this syntax, you probably think I'm nuts.  Well, you're wrong. Just because you're used to the convention doesn't mean the convention makes any fucking sense.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q. What is "=" ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's a equals sign, right ?   Remember it from mathematics ?  It's a sort of point of.  Everything on the left amounts to the same as everything on the right.  So in a condition, we're testing whether two expressions equal, whether they balance.  So for reasons I simply cannot fathom, C-like languages use "==".&lt;br /&gt;&lt;br /&gt;I think it's like this simply because whoever first defined the syntax didn't want to refactor the work he'd already done. Or it didn't occur to them, because they had Aspergers Syndrome or something. One of the first things you want to do when defining a language, after you've declared a variable, is assign something to it.   This probably comes before testing for equality.  There's not much point testing for equality until you've got things to test.  So the language developer thinks to himself : "I've allocated a variable to be used.  How shall I assign something to my variable ?", and he comes up with this…&lt;br /&gt;&lt;blockquote&gt;x = 10&lt;/blockquote&gt;…and there's nothing wrong with this. &lt;i&gt;Yet&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;A bit later, he thinks to himself : "I need to check the content of my variables", and he comes up with this…&lt;br /&gt;&lt;blockquote&gt;if x = 10&lt;/blockquote&gt;…and there's a problem because '=' has already been used.  The next question he asks himself is "What can I use instead ?", but this is a mistake.  the question should be "Should I use '=' for assignment or equality ?", and the right answer is "Equality".&lt;br /&gt;&lt;br /&gt;BASIC uses '=' for both.  Assignment should be preceded by the 'Let' keyword, but because assignment and equality can be contextually detected by the interpreter, 'Let' is optional these days.&lt;br /&gt;&lt;br /&gt;Algol-like languages use '=' correctly and have ":=" for assignment.  This is what I prefer, but  anything except '=' would be fine. Just a ':' would probably do (but that might be better used elsewhere!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-229614963508047593?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/229614963508047593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/229614963508047593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/229614963508047593'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/blog-post.html' title='&apos;==&apos; = &apos;=&apos;; &apos;=&apos; = &apos;:=&apos;.'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8351393984803849520</id><published>2009-02-21T11:55:00.000-08:00</published><updated>2009-02-21T15:01:14.130-08:00</updated><title type='text'>Java (how and why I got started)</title><content type='html'>I'm a tester now, but I'm the only tester on the team with any programming knowledge.  I've written some nice VBA to make our testing easier, but we were looking to migrate from using Excel to write and record manual test scripts to a &lt;a href="http://www.seapine.com/tttcm.html"&gt;proper dedicated testing tool&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The proper tool didn't report stuff in the way we wanted. It also didn't have an easy way to migrate our Excel scripts. Fortunately it did have an API that would allow us to access the metrics in the way that we needed and be able to take a lot of the drudgery out of migrating the scripts.&lt;br /&gt;&lt;br /&gt;So I got stuck in.  My first choice was Python.   There were some examples on the vendor's website.  I gave up fairly quickly though.  The API was provided as a WSDL XML file, but the Python based WSDL gubbins just didn't work.  I briefly looked at hand coding each message, but briefly was nought to know it would be too difficult / take too long.&lt;br /&gt;&lt;br /&gt;Second choice was Java.  I didn't have a budget for Visual Studio, and all the developers where I work use Eclipse anyway, so I figure I could get some help.  In the end I didn't need their help, though I did get some pointers via email from a friend.  By far the best help was from some &lt;a href="http://eclipsetutorial.sourceforge.net/totalbeginner.html"&gt;online video tutorials&lt;/a&gt;.  That got me up to speed pretty quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8351393984803849520?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8351393984803849520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/java-how-i-got-started.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8351393984803849520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8351393984803849520'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/java-how-i-got-started.html' title='Java (how and why I got started)'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-3366412311118808170</id><published>2009-02-21T11:46:00.001-08:00</published><updated>2009-02-21T15:31:20.696-08:00</updated><title type='text'>Java (what I used to think)</title><content type='html'>There are things I hate about Java.  Most of the things I hate aren't really Java problems at all. They're C. Some of them are in Python too. The languages I'd used - Pascal, Modula-2, Jovial, Ada and Occam - predisposed me to hating the differences.&lt;br /&gt;&lt;br /&gt;I'd periodically look at C and periodically walk away.  C sucks.  It sucks for two reasons.  One is syntax that I dislike. The other is that it's way to easy to compile a piece of type-unsafe crap.  All those security issues with buffer overflows are because of this sort of shit in C.&lt;br /&gt;&lt;br /&gt;The thing that I hated about Java whenever I looked at it were the enumerated types: there weren't any.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-3366412311118808170?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/3366412311118808170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/java-what-i-used-to-think.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3366412311118808170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/3366412311118808170'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/java-what-i-used-to-think.html' title='Java (what I used to think)'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-2491275081821581306</id><published>2009-02-21T11:16:00.000-08:00</published><updated>2009-02-21T12:24:29.117-08:00</updated><title type='text'>Before Eclipse</title><content type='html'>OK, the tools I used when I was a programmer were these :&lt;br /&gt;&lt;br /&gt;The OS (pretty much always VMS)&lt;br /&gt;A scripting language (on VMS this is DCL)&lt;br /&gt;A text editor (I used EVE almost exclusively)&lt;br /&gt;A compiler&lt;br /&gt;A linker&lt;br /&gt;A debugger&lt;br /&gt;&lt;br /&gt;Note that these things do &lt;i&gt;not&lt;/i&gt; an IDE make.  This was all command line based.  This is the sequence I'd use to fix an error in a pascal program might be this ...&lt;br /&gt;&lt;br /&gt;   $ eve program.pas&lt;br /&gt;       &lt;i&gt;make a change&lt;/i&gt;&lt;br /&gt;       &lt;i&gt;save and exit&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ pasccal program.pas&lt;br /&gt;      &lt;i&gt;get a compilation error&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ eve program.pas&lt;br /&gt;       &lt;i&gt;make a change&lt;/i&gt;&lt;br /&gt;       &lt;i&gt;save and exit&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ pasccal program.pas&lt;br /&gt;      &lt;i&gt;get a compilation error&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ eve program.pas&lt;br /&gt;       &lt;i&gt;make a change&lt;/i&gt;&lt;br /&gt;       &lt;i&gt;save and exit&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ pasccal program.pas&lt;br /&gt;      &lt;i&gt;get a compilation error&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ eve program.pas&lt;br /&gt;       &lt;i&gt;make a change&lt;/i&gt;&lt;br /&gt;       &lt;i&gt;save and exit&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ link program.pas&lt;br /&gt;&lt;br /&gt;   $ run program.exe&lt;br /&gt;       &lt;i&gt;check results&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;   $ run program.exe /debug&lt;br /&gt;      &lt;i&gt;issue commands to display code viewer&lt;/i&gt;&lt;br /&gt;      &lt;i&gt;find a line number&lt;/i&gt;&lt;br /&gt;      &lt;i&gt;set breakpoint at line number&lt;/i&gt;&lt;br /&gt;      &lt;i&gt;continue program execution&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;etc. etc. etc.  Everything manual, a lot of time to complete each step.  The editor and the code viewer in debug, for instance, were completely different tools.  There was no pointing, so no tooltips, no clicking to set breakpoints, no selecting to evaluate expressions, no code completion.&lt;br /&gt;&lt;br /&gt;So when I finally got around to using an IDE, Eclipse, last year,  it was something of a revelation.  I think Eclipse is superb.  I'd briefly used Visual Studio on a C++ course somewhere around 2004, but then never got to use it again.  And I hated C++, so I had no incentive to use it again.  The benefit of the course was an intro to OOP, but at the time I still interpreted OOP in terms of Ada 83,  which I'd used on OOD based projects.&lt;br /&gt;&lt;br /&gt;I used Eclipse with Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-2491275081821581306?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/2491275081821581306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2491275081821581306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/2491275081821581306'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/eclipse.html' title='Before Eclipse'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-8087010340667826240</id><published>2009-02-21T11:06:00.000-08:00</published><updated>2009-02-21T12:26:21.524-08:00</updated><title type='text'>First impressions of Python</title><content type='html'>I've used Python a little over the past year.  I think it's superb.  The loose typing and everything-as-an-object idea really works for a scripting language.  The simplicity of using indentation to delineate blocks was a major appeal. It reminded me of Occam, which I used way back in 1992.&lt;br /&gt;&lt;br /&gt;Coming from a real-time critical system background, loose-typing is a bit of an anathema, but I'm largely converted.  Not for critical systems, where languages such as Ada should be used, but for general use, and scripting in particular, it rocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-8087010340667826240?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/8087010340667826240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8087010340667826240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/8087010340667826240'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/python.html' title='First impressions of Python'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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-8148933216702728291.post-6847957179935285544</id><published>2009-02-21T10:12:00.000-08:00</published><updated>2009-02-21T10:37:43.254-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Introduction.'/><title type='text'>Introduction</title><content type='html'>I'll use this for stuff that will not fit into 140 characters.  It's going to be general, probably a bit Apple-centric, but with things like simple programming tips here and there as I attempt to find my coding mojo again.&lt;br /&gt;&lt;br /&gt;I'm also 'daycoder' on Twitter.&lt;br /&gt;&lt;br /&gt;Why 'dayCoder' ?…&lt;br /&gt;&lt;br /&gt;Well, as I've suggested, I lost my coding mojo.  The short version is that eight years of VMS Pascal does that to a guy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8148933216702728291-6847957179935285544?l=daycoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daycoder.blogspot.com/feeds/6847957179935285544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://daycoder.blogspot.com/2009/02/introduction.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6847957179935285544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8148933216702728291/posts/default/6847957179935285544'/><link rel='alternate' type='text/html' href='http://daycoder.blogspot.com/2009/02/introduction.html' title='Introduction'/><author><name>bob</name><uri>http://www.blogger.com/profile/13622911847997246805</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>
