<?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-128616657362436845</id><updated>2011-11-23T23:47:51.578+13:00</updated><category term='Vista'/><category term='scribefire'/><category term='Microsoft'/><category term='web'/><category term='commercial'/><category term='UI'/><category term='open source'/><category term='conference'/><category term='photos'/><category term='Testing'/><category term='C++'/><category term='firefox'/><category term='kate'/><category term='game development'/><category term='idealism'/><category term='job'/><category term='python'/><category term='Trolltech'/><category term='sloecode'/><category term='QtScript'/><category term='video'/><category term='gimp'/><category term='firmware'/><category term='windows'/><category term='WTF'/><category term='XHTML'/><category term='scons'/><category term='kdevelop'/><category term='work'/><category term='usability'/><category term='rant'/><category term='update'/><category term='scripting'/><category term='freedom 0'/><category term='sport'/><category term='router'/><category term='KDE'/><category term='VMWare'/><category term='CSS'/><category term='kubuntu'/><category term='Debian'/><category term='vacation'/><category term='Holiday'/><category term='toolchain'/><category term='programming'/><category term='random'/><category term='Wii'/><category term='music'/><category term='game'/><category term='Business'/><category term='Teaching'/><category term='visual studio'/><category term='GDB'/><category term='soekris'/><category term='wireless'/><category term='Linux'/><category term='project greenhouse'/><category term='Qt'/><category term='design'/><category term='Ubuntu'/><category term='mozilla'/><category term='fixed-width'/><category term='virtualisation'/><category term='new zealand'/><category term='kiwipycon'/><category term='subversion'/><category term='unity'/><title type='text'>Tech-Foo</title><subtitle type='html'>Rantings from an impatient software developer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tech-foo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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>87</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-9183222604174128525</id><published>2011-10-13T09:21:00.000+13:00</published><updated>2011-10-13T09:21:57.848+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='kiwipycon'/><title type='text'>KiwiPyCon Sloecode Talk</title><content type='html'>It's about time I posted my Kiwi PyCon talk from last August! I spent an enjoyable 30 minutes talking about what Sloecode is, how we built it, and the problems encountered along the way. As per my usual approach to public speaking, I tried to keep things light-hearted and entertaining. Anyway, the slides and audio are available here:&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_9124373" style="width: 510px;"&gt;&lt;b style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/ThomiRichards/introducing-sloecode-a-pythonpowered-installable-codeforge" target="_blank" title="Introducing Sloecode: a python-powered, installable code-forge."&gt;Introducing Sloecode: a python-powered, installable code-forge.&lt;/a&gt;&lt;/b&gt; &lt;iframe frameborder="0" height="426" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9124373?rel=0" width="510"&gt;&lt;/iframe&gt; &lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View another &lt;a href="http://www.slideshare.net/" target="_blank"&gt;webinar&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ThomiRichards" target="_blank"&gt;ThomiRichards&lt;/a&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/128616657362436845-9183222604174128525?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/10/kiwipycon-sloecode-talk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/9183222604174128525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/9183222604174128525'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/10/kiwipycon-sloecode-talk.html' title='KiwiPyCon Sloecode Talk'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4808813366035709601</id><published>2011-09-27T10:01:00.000+13:00</published><updated>2011-09-27T10:01:19.872+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Dear Journalists: Bits and Bytes</title><content type='html'>Dear Journalist type person,&lt;br /&gt;&lt;br /&gt;There's something we must discuss. You see, you've been making a very basic mistake in many of your articles when it comes to writing about the Internet, and specifically Internet speeds. Let's take a look at a small quote:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;...unless you have an internet connection of impossible speeds. (Mine is  nominally 10MB, by the way, which in practice means maximum download  speeds of 1.4 megabytes per second).&lt;/blockquote&gt;(source: &lt;a href="http://www.rockpapershotgun.com/2011/09/26/onlive-is-okay/"&gt;Rock-Paper-Shotgun&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Can you spot the problem here? Internet speeds are measured in mega&lt;b&gt;bits&lt;/b&gt; per second. The symbol for 'bits' is a lower-case 'b', so an Internet connection that's 10 Megabits per second could be written as "10 Mbps". I guess if you're feeling lazy you could leave off the "ps", and end up with "10 Mb" (although it's a really sloppy thing to do), but NEVER "10 MB" - that means something else entirely.&lt;br /&gt;&lt;br /&gt;Modern PCs use bytes that contain 8 bits. The correct symbol for a byte is an upper-case 'B'. so "10 MB" means "ten mega-bytes", not mega-bits, which is probably what you meant when you were describing the speed of your Internet connection.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Peq_3yPw8QE/ToDliJjC5uI/AAAAAAAAEug/24w4PTql4fc/s1600/byte.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://1.bp.blogspot.com/-Peq_3yPw8QE/ToDliJjC5uI/AAAAAAAAEug/24w4PTql4fc/s320/byte.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Back to our Internet connection that runs at 10Mbps. It's unfortunate that speeds are measured in bits, because a much more useful measure is bytes per second, since that's how we deal with data sizes. We know that a CD ISO image is likely to be around 700 MB, an MP3 file around 3 MB, and an image from a digital camera to be around 1 MB. To convert our 10Mbps connection speed to megabytes per second, we divide by 8, and get 1.25MBps. However, this is the &lt;i&gt;theoretical maximum&lt;/i&gt; speed, and there's a lot of overhead in any network connection, so in practise it's unlikely you will experience anything close to this maximum speed.&lt;br /&gt;&lt;br /&gt;If your eyes glazed over, or perheps you felt light-headed reading that, here are a few take-home points to make it easier for you:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Connection speeds are measured in megabits-per-second. The correct unit symbol for this is "Mbps".&lt;/li&gt;&lt;li&gt;Files are measured in Megabytes.&lt;/li&gt;&lt;li&gt;A Byte has 8 bits. So to turn your connection speed into something useful, divide the number by 8 and make the unit symbol "MBps".&lt;/li&gt;&lt;/ul&gt;I would be honoured if you'd consider this small point next time you go to write online. Some of us are acutely sensitive to these matters, and you really don't want to upset the geeks of this world. &lt;br /&gt;&lt;br /&gt;Kind Regards,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-4808813366035709601?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/09/dear-journalists-bits-and-bytes.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4808813366035709601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4808813366035709601'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/09/dear-journalists-bits-and-bytes.html' title='Dear Journalists: Bits and Bytes'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/-Peq_3yPw8QE/ToDliJjC5uI/AAAAAAAAEug/24w4PTql4fc/s72-c/byte.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-6059772007833111033</id><published>2011-08-29T15:54:00.001+12:00</published><updated>2011-10-13T09:26:54.998+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='kiwipycon'/><title type='text'>KiwiPyCon 2012 will be in Dunedin</title><content type='html'>It is a great&amp;nbsp;honour&amp;nbsp;and&amp;nbsp;privilege&amp;nbsp;to be involved in bringing the New Zealand Python developers conference (KiwiPyCon) to Dunedin in 2012. I intend to blog regularly with details of next year's conference as they emerge, so watch this space for more information over time!&lt;br /&gt;&lt;br /&gt;Finally, a huge "Thank You" to &lt;a href="http://timmcnamara.co.nz/"&gt;Tim McNamara&lt;/a&gt; for organising the best KiwiPyCon to date. I have a huge task ahead of me, and he's raised the bar very high indeed.&lt;br /&gt;&lt;br /&gt;Have any good ideas for next year? Please let us know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6059772007833111033?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/08/kiwipycon-2012-will-be-in-dunedin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6059772007833111033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6059772007833111033'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/08/kiwipycon-2012-will-be-in-dunedin.html' title='KiwiPyCon 2012 will be in Dunedin'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6609468349480003010</id><published>2011-08-28T11:10:00.000+12:00</published><updated>2011-08-28T11:10:04.610+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sloecode'/><title type='text'>Sloecode 1.1 - get your bugreports in now!</title><content type='html'>I'm at &lt;a href="http://nz.pycon.org/2011/about/"&gt;KiwiPyCon&lt;/a&gt; in Wellington, New Zealand. It turns out, being surrounded by geeks is great inspiration &amp;amp; motivation. Because of this, I've created a &lt;a href="https://launchpad.net/sloecode/+milestone/1.1"&gt;Sloecode 1.1 milestone in launchpad&lt;/a&gt;. If you have any bugreports or feature reuests, now's the time to &lt;a href="https://bugs.launchpad.net/sloecode/+filebug"&gt;get them in&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;...I can't believe I'm asking people for bug-reports. This feels wrong...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6609468349480003010?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/08/sloecode-11-get-your-bugreports-in-now.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6609468349480003010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6609468349480003010'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/08/sloecode-11-get-your-bugreports-in-now.html' title='Sloecode 1.1 - get your bugreports in now!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-2711847199734410483</id><published>2011-08-03T18:52:00.000+12:00</published><updated>2011-08-03T18:52:15.002+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='sloecode'/><title type='text'>Sloecode: now with 100% more website</title><content type='html'>Sloecode now has &lt;a href="http://www.sloecode.org/"&gt;a real website&lt;/a&gt;! It's a rather minimalist affair at present, but it's better than nothing!&lt;br /&gt;&lt;br /&gt;Since I last blogged, the setup instructions for the Sloecode server have changed a lot. The new instructions are available on the new site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-2711847199734410483?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/08/sloecode-now-with-100-more-website.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2711847199734410483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2711847199734410483'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/08/sloecode-now-with-100-more-website.html' title='Sloecode: now with 100% more website'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7953117762056176751</id><published>2011-07-07T19:59:00.000+12:00</published><updated>2011-07-07T19:59:25.117+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sloecode'/><title type='text'>Representin' the home-boys!</title><content type='html'>That's *exactly* the kind of blog title that's liable to get me in trouble down the road. &lt;i&gt;Faux&lt;/i&gt; street swagger doesn't age well.&lt;br /&gt;&lt;br /&gt;In other news, I'm presenting a talk at this years NZ Python conference &lt;a href="http://nz.pycon.org/"&gt;KiwiPyCon&lt;/a&gt;. Their website does not have the schedule visible yet, but there is a &lt;a href="http://nz.pycon.org/2011/talks/"&gt;list of talks available&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm looking forward to meeting other python developers, and maybe getting some help with Sloecode!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-7953117762056176751?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/07/representin-home-boys.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7953117762056176751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7953117762056176751'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/07/representin-home-boys.html' title='Representin&apos; the home-boys!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-3885521008342178336</id><published>2011-05-29T11:34:00.000+12:00</published><updated>2011-05-29T11:34:21.059+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unity'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Unity Workarounds</title><content type='html'>I'm currently running the unity desktop shell on my development computer. I got fed up with KDE's lack of support, and the gnome-shell just annoyed me. Unity seems like a good start, but suffers from several problems. I've found workarounds for all of these, and thought I'd post them below.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scrollbar Corruption:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;One of the major changes in unity is the thin scrollbars (technically called "overlay scrollbars", I believe), which are enabled by default for all GTK applications. This is what I'm talking about (image from &lt;a href="http://techgage.com/article/an_in-depth_look_at_ubuntu_1104/3"&gt;techgarage.com&lt;/a&gt;):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-H0U7uTC5ZFs/TeGBLpDGOfI/AAAAAAAAEq0/Z1Fgy_OJBFM/s1600/scroll.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-H0U7uTC5ZFs/TeGBLpDGOfI/AAAAAAAAEq0/Z1Fgy_OJBFM/s320/scroll.png" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;These work fine for native GTK applications, but applications built using the wxPython toolkit suffer from render corruption when you try and scroll a styled text control (&lt;a href="http://trac.wxwidgets.org/ticket/13229"&gt;bug report&lt;/a&gt;). This bug manifests itself in many applications, including my current&amp;nbsp;favorite&amp;nbsp;development text editor &lt;a href="http://code.google.com/p/editra/"&gt;editra&lt;/a&gt;. Here's a screenshot of the issue:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-in1OUyS9ahI/TeGCbj5iA6I/AAAAAAAAEq4/aXu5vudhj9Y/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://4.bp.blogspot.com/-in1OUyS9ahI/TeGCbj5iA6I/AAAAAAAAEq4/aXu5vudhj9Y/s320/Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;The problem can be avoided by turning the thin scrollbars off. How do you do that? Easy - launch the application with the "LIBOVERLAY_SCROLLBAR" environment variable set to 0, like this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eOBh5gpR_X0/TeGDHwKM5CI/AAAAAAAAEq8/nxALN8Vwe5o/s1600/launch_editra_without_scrollbars.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" src="http://1.bp.blogspot.com/-eOBh5gpR_X0/TeGDHwKM5CI/AAAAAAAAEq8/nxALN8Vwe5o/s320/launch_editra_without_scrollbars.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;You can of course edit the menu item for editra to include this, or add the line "export LIBOVERLAY_SCROLLBAR=0" to your ~/.xprofile file (create it if it doesn't exist).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Panel Corruption:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Whenever I change a setting in the compiz config settings manager (ccsm), the top panel of my unity desktop becomes corrupted. Previously the only way to fix this was to log out and log back in again (effectively restarting unity). Here's a screenshot of the problem:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_-vptzrFEO0/TeGFEYVhApI/AAAAAAAAErA/Rj5U15L8Smk/s1600/corruption.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-_-vptzrFEO0/TeGFEYVhApI/AAAAAAAAErA/Rj5U15L8Smk/s320/corruption.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;When this happens you can restart unity without having to logout, or close any applications. Simply run (either by pressing Alt+F2, or in a terminal):&lt;br /&gt;&lt;br /&gt;unity --replace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3885521008342178336?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/05/unity-workarounds.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3885521008342178336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3885521008342178336'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/05/unity-workarounds.html' title='Unity Workarounds'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/-H0U7uTC5ZFs/TeGBLpDGOfI/AAAAAAAAEq0/Z1Fgy_OJBFM/s72-c/scroll.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-6130636818109314471</id><published>2011-05-10T19:18:00.000+12:00</published><updated>2011-05-10T19:18:51.442+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>CAPTCHA Fail</title><content type='html'>I can understand the need to filter humans from machines on the Internet, but we need to do a much better job. It seems like the most common captcha software I run into these days is&lt;a href="http://www.google.com/recaptcha"&gt; reCAPTCHA&lt;/a&gt;. The system has some noble goals - specifically, users who submit captchas are actually helping digitize books. However, here's the problem:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_WNsQRabEE38/TOXghn39uRI/AAAAAAAAEoA/MS9ePPteIIY/s1600/captcha%2Bfail.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5541081784793282834" src="http://3.bp.blogspot.com/_WNsQRabEE38/TOXghn39uRI/AAAAAAAAEoA/MS9ePPteIIY/s400/captcha%2Bfail.png" style="cursor: hand; cursor: pointer; display: block; height: 42px; margin: 0px auto 10px; text-align: center; width: 210px;" /&gt;&lt;/a&gt;What the hell does that say? The first word is obviously "the", the second? "Claccupr?". Perhaps I have bad eyesight, but I often get these wrong. Here's an alternative proposal:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instead of asking humans to perform text recognition (something computers can already do reasonably well), ask them to do something that comes naturally to humans, but not to computers. How about asking the user to pick which image they might find at a beach. Or ask the user to pick the image that represents the largest object in real life. Use context that humans understand instinctively, but computers do not.&lt;br /&gt;&lt;br /&gt;Any ideas? Someone should build it!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6130636818109314471?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/05/captcha-fail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6130636818109314471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6130636818109314471'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/05/captcha-fail.html' title='CAPTCHA Fail'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WNsQRabEE38/TOXghn39uRI/AAAAAAAAEoA/MS9ePPteIIY/s72-c/captcha%2Bfail.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-806577138211773351</id><published>2011-04-29T16:24:00.003+12:00</published><updated>2011-05-27T14:31:02.851+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='sloecode'/><title type='text'>Sloecode: Now with Ubuntu Packages!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;We're still working towards a sloecode 1.0 release. We're now dangerously close - we have some UI tweaks to complete, and a few other bits and pieces. However, we now have Ubuntu packages for both the client and server components, ready for you to test!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is Sloecode?&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Sloecode is an open source project, &lt;a href="http://launchpad.net/sloecode"&gt;hosted on launchpad.net&lt;/a&gt; that aims to provide a comprehensive, installable code forge. A "code forge" is a set of tools that help groups of people write software (think sourceforge, launchpad etc). It typically includes a revision control system, and optionally project wikis, bug tracking, issue tracking, feature planning and any other features people might need. However, it's important to note that &lt;i&gt;we're not trying to replicate Launchpad!&lt;/i&gt;&amp;nbsp;Launchpad is a great service, and we don't want to compete with it. Instead, we're providing a tool for people who:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't want their code to be public - either because it's commercial software or because it's not ready yet. You can use sloecode in your business, college, university without having to release your software to the wider world. You can do this on launchpad, but you must pay for the privilege. The project was borne out of the need to have a code forge for an educational environment: putting students' work online is not an option.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Want their code forge system to be hosted locally. For large code bases, the communication times between a local machine and the central launchpad.net servers can become expensive - especially in locations where the Internet connection is poor. Running sloecode is easy (as we'll see soon) and gives you complete control over the system. You're are responsible for server maintenance, backup, and general administration.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Compared to Launchpad, we're aiming for a &lt;i&gt;completely different&lt;/i&gt;&amp;nbsp;user base.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;How does it Work?&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Sloecode is made up of two distinct parts:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yaYuzysoUGw/Taowfv3bXmI/AAAAAAAAEqk/ifygZEVaeYg/s1600/sloecode_components.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="392" src="http://4.bp.blogspot.com/-yaYuzysoUGw/Taowfv3bXmI/AAAAAAAAEqk/ifygZEVaeYg/s640/sloecode_components.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Bazaar/SSh smart server is a &lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_1216279712"&gt;&lt;/span&gt;python-twisted&lt;span id="goog_1216279713"&gt;&lt;/span&gt;&lt;/a&gt; application that understands the SSH protocol, and runs bzr-serve on demand for users. Every time you interact with the server using a Bazaar client application you're actually talking to the smart server. We need this component for several reasons: first, we don't want users to require a system account on the Linux server (which is the usual way of setting up a Bazaar server), but we do still want to use SSH public/private key authentication. This means the SSH server needs to know about our database and be able to retrieve keys from it on demand.&lt;br /&gt;&lt;br /&gt;The Sloecode Web App is the front-end for the whole system. It's written in &lt;a href="http://pylonsproject.org/"&gt;pylons&lt;/a&gt;, and makes use of a whole host of other libraries including &lt;a href="http://jinja.pocoo.org/docs/"&gt;jinja2&lt;/a&gt; (page templates), &lt;a href="http://formencode.org/"&gt;formencode&lt;/a&gt; (input validation), &lt;a href="http://developer.yahoo.com/yui/3/"&gt;YUI3&lt;/a&gt; (javascript components), &lt;a href="http://repoze.org/"&gt;repoze.what and repoze.who&lt;/a&gt; (authorisation and authentication), and a whole lot more. The web-app provides control for managers and administrators to create projects and users and assign users to projects (with different levels of access). Regular users can see basic information about their bazaar branches (both personal repositories and project repositories), and manage their SSH keys.&lt;br /&gt;&lt;br /&gt;The plan for the future is to add optional components - the key word being &lt;i&gt;optional&lt;/i&gt;. One of our design goals is to make sloecode easy to install; this includes minimising install-time dependancies.&lt;br /&gt;&lt;br /&gt;The key thing to understand about Sloecode is that we're not writing the VCS ourselves - we're simply making Bazaar easier to install and manage.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Enough already, give me the server!&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Sloecode has not yet been released, but you are welcome to participate in testing. To set up the server, you'll first need the sloecode PPA in your sources.list. To achieve this, run the following command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo add-apt-repository ppa:sloecode&lt;/pre&gt;&lt;br /&gt;Then update your package lists:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get update&lt;/pre&gt;&lt;br /&gt;You can now install the sloecode server package:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install sloecode&lt;/pre&gt;&lt;br /&gt;The server package &lt;b&gt;should&lt;/b&gt;&amp;nbsp;install all the package dependancies. However, before you can run the server, you need to set up the database back-end. The default back-end us sqlite, which is fine for testing or for very low-use installations. Sloecode uses sqlalchemy, which allows us to use any number of databse backends. This, and many other configuration details can be edited by tweaking this file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/etc/default/sloecode-production.ini&lt;/pre&gt;&lt;br /&gt;Once you're happy with the settings, you need to create the database tables. Do this by running:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo paster setup-app /etc/default/sloecode-production.ini&lt;/pre&gt;&lt;br /&gt;This command will read the values present in the configuration file, and create the default database tables for you. You only need to run this command once (to create the tables in your database)!&lt;br /&gt;&lt;br /&gt;If you have edited any of the other values, you will want to restart the server:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo service sloecode restart&lt;/pre&gt;&lt;br /&gt;By default, log files are in /var/log/sloecode, Bazaar repositories are created in &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/srv/sloecode/bzr-repos&lt;/pre&gt;&lt;br /&gt;and the default database is a simple SQLite file (which won't handle any kind of heavy workload or concurrency, so you may wish to change that). The RSA public/private key pair the smart server uses to communicate with clients are stored in &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/var/sloecode/keys&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;And the clients?&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Client setup is much simpler. Simply follow these steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make sure you have an account created for you in the sloecode web interface. Log in to the web interface with your username and password.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click on the "Manage SSH Keys" link on your home page. You need to paste your SSH public key in the form provided. This allows your Bazaar client to authenticate with the sloecode server. If you don't have an SSH key, you can generate one by running: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ssh-keygen&lt;/pre&gt;&lt;br /&gt;and view the public key by running: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cat ~/.ssh/id_rsa.pub&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;All client machines need the 'bzr' and 'bzr-sloecode' packages installed. Assuming you have the sloecode PPA installed (see instructions for doing this in the server section, above), you can run:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install bzr bzr-sloecode&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Finally, you need to tell the Bazaar sloecode plugin where the sloecode server is. The client plugin looks for an environment variable called "SLOECODE_SERVER", and will complain if it is not found. The easiest way to set this environment variable is to edit your "~/.bashrc" file and add this line to the end:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;export SLOECODE_SERVER=domain.of.your.server.com&lt;/pre&gt;&lt;br /&gt;The value of this variable should be either a domain name, OR an IP address that points to the sloecode server you wish to use. For example, if the server is installed on the local network you might have the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;export SLOECODE_SERVER=192.168.1.10&lt;/pre&gt;&lt;br /&gt;Note that you must not add any network protocol specification - the sloecode client plugin takes care of that for you. If you are running the sloecode ssh service on a port other than 22, you must add this port to the end of the string, like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;export SLOECODE_SERVER=192.168.1.10:4022&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finally, if your username on the sloecode server is different from your local computer username, you need to tell the Bazaar sloecode plugin what username it should use. To do this, run the command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bzr sc-login sloecode_username&lt;/pre&gt;&lt;br /&gt;Where "sloecode_username" is the username you use to log in to the sloecode web interface. For example, on my machine the command is:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bzr sc-login thomir&lt;/pre&gt;&lt;br /&gt;If you run the command without a username it will tell you what username is currently set.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;That's it! Everything is all set up. Now you can start using the sloecode server.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bazaar / Sloecode Basics&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;I won't cover the details of how to use Bazaar. If you need that instruction, look at the official Bazaar documentation. However, here are a few pointers:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Every user on the sloecode server has a personal repository. To push code to your personal repository, do this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bzr push sc:~sloecode_username/branch_name&lt;/pre&gt;&lt;br /&gt;By default personal repositories are created with no branches, so whenever you push or pull from a personal repository you must always specify a branch name!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Personal repositories are private - you are the only one who can read or write to your personal repository. If you need to share your code with someone else, you need to store it in a project repository.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;To pull code from a project repository, the command looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bzr pull sc:project_name/branch_name&lt;/pre&gt;&lt;br /&gt;Note that there is no tilde character before the project name. Also note that you need not specify the branch name if you want the special branch called "trunk". For example, if I want a copy of the trunk branch of project "elastic", I'd run the following command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bzr pull sc:elastic&lt;/pre&gt;&lt;br /&gt;However if I want a specific branch called "fix-bug-1234", I'd run the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bzr pull sc:elastic/fix-bug-1234&lt;pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Final Thoughts:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;We're still writing sloecode - it's an ongoing effort and won't be finished any time soon. We welcome your feedback - the best way to contact is us via the &lt;a href="https://launchpad.net/%7Esloecode-dev"&gt;sloecode-developers&lt;/a&gt; mailing list, or in the #sloecode channel on freenode IRC, or leave a comment below. Have we missed anything? Spot any bugs? Have suggestions for&amp;nbsp;improvements/future direction? We'd love to hear from you!&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/128616657362436845-806577138211773351?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/04/sloecode-now-with-ubuntu-packages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/806577138211773351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/806577138211773351'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/04/sloecode-now-with-ubuntu-packages.html' title='Sloecode: Now with Ubuntu Packages!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/-yaYuzysoUGw/Taowfv3bXmI/AAAAAAAAEqk/ifygZEVaeYg/s72-c/sloecode_components.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-3110605812270878859</id><published>2011-04-05T12:42:00.000+12:00</published><updated>2011-04-05T12:42:27.499+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sloecode'/><title type='text'>Sloecode updates: UI tweaks</title><content type='html'>Several members of the &lt;a href="https://launchpad.net/~sloecode"&gt;sloecode team&lt;/a&gt; have been hard at work tweaking the sloecode web-app UI - we think we have a much more usable product as a result. We've still got a long way to go, but the UI is looking better every day. Here's a picture of the portal page a user sees when they log in:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CSWUTgtK6yQ/TZpj-oZ6oMI/AAAAAAAAEqE/jMQYlEfXTsY/s1600/sc_progress.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://1.bp.blogspot.com/-CSWUTgtK6yQ/TZpj-oZ6oMI/AAAAAAAAEqE/jMQYlEfXTsY/s400/sc_progress.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Changes from the previous version include:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Addition of the project menu - this allows users to quickly jump to any project they are a member of.&lt;/li&gt;&lt;li&gt;Branch logs are now shown on separate pages, instead of cluttering up the main user/project page.&lt;/li&gt;&lt;li&gt;"Account Settings" and "Logout" Links are now pushed to the right of the page menu bar, which is where most users expect them to be.&lt;/li&gt;&lt;li&gt;More help topics have been written.&lt;/li&gt;&lt;li&gt;Lots of small textual changes to page content - too many to list individually.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;We still have not got the server package into our PPA. In the mean time, installing and running a sloecode server involves a few manual steps, but is by no means complicated. If you're interested in the project, feel free to drop in the #sloecode channel on irc.freenode.net, or introduce yourself on the &lt;a href="https://launchpad.net/~sloecode-dev"&gt;sloecode developers mailing list&lt;/a&gt;!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3110605812270878859?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/04/sloecode-updates-ui-tweaks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3110605812270878859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3110605812270878859'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/04/sloecode-updates-ui-tweaks.html' title='Sloecode updates: UI tweaks'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/-CSWUTgtK6yQ/TZpj-oZ6oMI/AAAAAAAAEqE/jMQYlEfXTsY/s72-c/sc_progress.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-8870182881729736984</id><published>2011-03-15T19:45:00.000+13:00</published><updated>2011-03-15T19:45:32.559+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='sloecode'/><title type='text'>bzr-sloecode Installer for Windows</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;There's now a &lt;strong&gt;basic&lt;/strong&gt; installer for the bzr-sloecode Bazaar plugin for Windows. It currently does the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Installs the plugin to the right place.&lt;/li&gt;&lt;li&gt;Sets the SLOECODE_SERVER environment variable to whatever you want.&lt;/li&gt;&lt;/ol&gt;There are a number of aspects that require improvment however:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It doesn't check that Bazaar is installed first.&lt;/li&gt;&lt;li&gt;It doesn't ask if the user wants to install the plugin for everyone or just the current user. Currently the SLOECODE_SERVER setting is system-wide, which requires admin permissions to set.&lt;/li&gt;&lt;li&gt;No validation on the Bazaar server address.&lt;/li&gt;&lt;/ol&gt;...So it's a work in progress! Patches are more than welcome. You can grab the installer from the &lt;a href="http://launchpad.net/bzr-sloecode"&gt;bzr-sloecode launchpad page&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8870182881729736984?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/03/bzr-sloecode-installer-for-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8870182881729736984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8870182881729736984'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/03/bzr-sloecode-installer-for-windows.html' title='bzr-sloecode Installer for Windows'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-1704303979147486771</id><published>2011-02-25T11:54:00.000+13:00</published><updated>2011-02-25T11:54:40.288+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Another Microsoft UI Fail</title><content type='html'>...this time in Microsoft Outlook. Could the programmer who was too lazy to write their code properly please go back to school? There is no excuse for this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VMf7TjzUV0U/TWbhOIw0qJI/AAAAAAAAEp4/1bx0ElAsWbQ/s1600/outlook_fail.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-VMf7TjzUV0U/TWbhOIw0qJI/AAAAAAAAEp4/1bx0ElAsWbQ/s1600/outlook_fail.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;You want me to take this string, split it on comma characters, and re-join it with semi-colons instead? Sure, I'll do that you you, with my meat-fingers, because I'm really good at that, and computers are known to be terrible and SIMPLE TEXT MANIPULATION.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-1704303979147486771?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/02/another-microsoft-ui-fail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1704303979147486771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1704303979147486771'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/02/another-microsoft-ui-fail.html' title='Another Microsoft UI Fail'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/-VMf7TjzUV0U/TWbhOIw0qJI/AAAAAAAAEp4/1bx0ElAsWbQ/s72-c/outlook_fail.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-3730106100584818321</id><published>2011-02-24T16:34:00.000+13:00</published><updated>2011-02-24T16:34:39.089+13:00</updated><title type='text'>Introducing: Sloecode</title><content type='html'>&lt;a href="http://bazaar.canonical.com"&gt;Bazaar&lt;/a&gt; is wonderful. It combines the right powerful features with a good dose of common-sense and a sprinkling of usability. Well okay, perhaps more than a sprinkling of usability. I use bazaar a lot in combination with &lt;a href="http://launchpad.net"&gt;launchpad&lt;/a&gt;. The client-side bzr-launchpad plug-in makes this a breeze: I don't have to remember user-names, passwords, project URLs, or anything else. However, occasionally I don't want my code to be visible by default. Sometimes I don't want my code leaving the building. I could easily host a simple bazaar repository locally, but creating teams of users quickly gets difficult. What I'd love is a system like launchpad, but with a few key differences:&lt;ol&gt;	&lt;li&gt;&lt;p&gt;Optimised for the most common use-case. Launchpad does an awful lot of stuff that I have never used, and probably never will. All this functionality makes launchpad a very large beast indeed. I want a system that's compact and easy to use; I don't need translations, build recipes, mailing lists, bug tracking, etc. etc.&lt;/p&gt;&lt;/li&gt;	&lt;li&gt;&lt;p&gt;Easily installed on my own server. It is technically possible to install launchpad wherever you want, but it's difficult. &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;Enter my current open source project: &lt;a href="http://launchpad.net/sloecode"&gt;sloecode&lt;/a&gt;.Sloecode is a simple wrapper around bazaar and a few other key technologies that makes it easy to set up multiple users &amp; teams of developers. We're trying to optimise sloecode for the most common problems. What do we have so far?&lt;ul&gt;	&lt;li&gt;&lt;p&gt;A simple web app (written in &lt;a href="http://python.org"&gt;python&lt;/a&gt; &amp; &lt;a href="http://pylonshq.com"&gt;pylons&lt;/a&gt;) that allows one to create users, teams, and manage both.&lt;/p&gt;&lt;/li&gt;	&lt;li&gt;&lt;p&gt;A bzr+ssh smart server that understands the accounts and teams created in the web-app. &lt;/p&gt;&lt;/li&gt;	&lt;li&gt;&lt;p&gt;A client-side bzr plugin that allows users to use shortened repo URLs (similar to the lp:projectname scheme the launchpad plug-in provides).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;Sloecode is still very much  "work in progress" (we've got big plans), but it is usable right now. If you want more information, feel free to leave a comment below, or join the sloecode-dev mailing list on launchpad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3730106100584818321?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/02/introducing-sloecode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3730106100584818321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3730106100584818321'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/02/introducing-sloecode.html' title='Introducing: Sloecode'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8451329234857228625</id><published>2011-01-24T09:26:00.000+13:00</published><updated>2011-01-24T09:26:19.288+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Visual Studio Fail</title><content type='html'>Perhaps this is a symptom of the underlying operating system, rather than the Visual Studio IDE. In either case it sucks:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_WNsQRabEE38/TTyOnV02OvI/AAAAAAAAEpM/SFD1nsmaTuc/s1600/VSFail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="77" src="http://1.bp.blogspot.com/_WNsQRabEE38/TTyOnV02OvI/AAAAAAAAEpM/SFD1nsmaTuc/s640/VSFail.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;I like to keep my files organised in folder&amp;nbsp;hierarchies. Now I'm being forced to use a flat, wide folder tree by my IDE.&lt;br /&gt;&lt;br /&gt;Not. Happy. At. All.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8451329234857228625?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/01/visual-studio-fail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8451329234857228625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8451329234857228625'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/01/visual-studio-fail.html' title='Visual Studio Fail'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/TTyOnV02OvI/AAAAAAAAEpM/SFD1nsmaTuc/s72-c/VSFail.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-5749900106139055079</id><published>2011-01-17T14:08:00.000+13:00</published><updated>2011-01-17T14:08:59.890+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualisation'/><title type='text'>Virtualbox web front-end</title><content type='html'>I &lt;a href="http://tech-foo.blogspot.com/2008/08/virtualbox-rocks.html"&gt;mentioned before that virtualbox rocks&lt;/a&gt;. Now it rocks even harder. I've always wanted to run multiple virtual machines on a powerful, headless server. Previously there hasn't been an adequate user interface (read: not a command line) that lets me manage multiple virtualbox instances.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/phpvirtualbox/"&gt;Now there is.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_WNsQRabEE38/TTOWdBxBgoI/AAAAAAAAEpA/-lvkwOlOuw8/s1600/phpvb1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="473" src="http://3.bp.blogspot.com/_WNsQRabEE38/TTOWdBxBgoI/AAAAAAAAEpA/-lvkwOlOuw8/s640/phpvb1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;...and my doesn't it look pretty?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5749900106139055079?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/01/virtualbox-web-front-end.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5749900106139055079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5749900106139055079'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/01/virtualbox-web-front-end.html' title='Virtualbox web front-end'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WNsQRabEE38/TTOWdBxBgoI/AAAAAAAAEpA/-lvkwOlOuw8/s72-c/phpvb1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-2974160112439487063</id><published>2011-01-12T11:25:00.003+13:00</published><updated>2011-01-12T12:09:57.853+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu One Madness</title><content type='html'>For those of you who have been living under a rock the last few months, &lt;a href="https://one.ubuntu.com/"&gt;Ubuntu One&lt;/a&gt; is:&lt;div&gt;&lt;br /&gt;&lt;blockquote&gt;...your personal cloud. But it's not just about syncing files — whether you need to access your contacts, notes or bookmarks from any computer or the web, enjoy your favorite music from a cloud integrated store or stream your entire collection to iPhone and Android mobile phones — we've raised the bar on personal clouds.&lt;/blockquote&gt;Clearly the marketing department at Canonical have been hard at work!&lt;/div&gt;&lt;div&gt;Unfortunately, the ubuntu one client has no support for any desktop environment other than Gnome. For a service that offers file synchronisation, having to launch a non-native client application makes the whole system rather useless. At first, this seems fair enough - a company with limited budget must allocate resources where they will do the most work. However, after a bit more digging, things seem to be in a rather poor state of affairs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's worth noting that the &lt;a href="http://kubuntu.org/"&gt;Kubuntu&lt;/a&gt; project is an official derivative of Ubuntu. It's listed as such on the &lt;a href="http://www.ubuntu.com/project/derivatives"&gt;Ubuntu derivatives page&lt;/a&gt;, you can purchase &lt;a href="http://www.ubuntu.com/support/services"&gt;official canonical&lt;/a&gt; &lt;a href="http://www.kubuntu.org/support"&gt;support for Kubuntu&lt;/a&gt;, purchase printed CDs through &lt;a href="https://shipit.kubuntu.org/"&gt;shipit&lt;/a&gt;, and the two projects use exactly the same software package repositories.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;For a while there was light at the end of the tunnel: &lt;a href="https://launchpad.net/~apachelogger"&gt;Harald Sitter&lt;/a&gt; started work on a &lt;a href="https://launchpad.net/ubuntuone-client-kde"&gt;KDE ubuntu one client&lt;/a&gt;. At one stage there were packages for it in a PPA, and people started using it. It even got a few &lt;a href="http://maketecheasier.com/how-to-install-and-setup-ubuntu-one-in-kubuntu/2010/03/15"&gt;independant&lt;/a&gt; &lt;a href="http://digitizor.com/2009/11/26/kde-gets-a-ubuntu-one-frontend-and-how-to-install-it/"&gt;web&lt;/a&gt; &lt;a href="http://www.linux-magazine.com/Online/News/Ubuntu-One-Clients-for-KDE-and-Fedora"&gt;articles&lt;/a&gt; written about it. Then everything died. The PPA was removed, and development halted. Why? Harald commented on a &lt;a href="https://bugs.launchpad.net/ubuntuone-client/+bug/375145"&gt;bug report&lt;/a&gt;, and had this to say:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;Well, Google Summer of Code is over.&lt;br /&gt;&lt;br /&gt;And after having spent more than a week shaking a new graphical frontend for the now third version of authentication handling out my sleeve, I have learned but one thing. While you work on building something, something else will surely break in a way that will requrie half a work day to track down.&lt;br /&gt;It is somewhat impossible to develop a KDE frontend while sitting outside of canonical and being in a completely different time zone than the Ubuntu One team.&lt;br /&gt;On top of that I have seen crappy code design, crappy packaging, inexistance of cross-desktop awareness and cross-operatingsystem awareness and unavailability of a stable working target to develop against...&lt;br /&gt;&lt;br /&gt;So I would put it as "I am giving up".&lt;br /&gt;&lt;br /&gt;In the future I will devote time towards making ownCloud (a truely free "Cloud" implementation) more accessibile to the masses.&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;So what can we do? &lt;a href="http://owncloud.org/index.php/Main_Page"&gt;owncloud&lt;/a&gt; is not yet at a point where it can be used, and I cannot see any further development on an Ubuntu One client for KDE. Probably the most useful thing non-developers can do is to ask for clarification on the &lt;a href="https://bugs.launchpad.net/ubuntuone-client/+bug/375145"&gt;main bug report&lt;/a&gt; (politely please!), and make sure you click the "This bug affects me" link at the top of that page.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The real tragedy in all this isn't that there is no officially supported U1 client for KDE, or even that Canonical decided to support Windows and Mobile OSes before it's second-most popular operating system, it's that the upstream sources are (apparently) being built with no consideration to portability to other desktop environments. For a product with so many derivatives, you'd think this would be a required part of the development &amp;amp; planning process.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-2974160112439487063?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/01/ubuntu-one-madness.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2974160112439487063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2974160112439487063'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/01/ubuntu-one-madness.html' title='Ubuntu One Madness'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-2372543856575878760</id><published>2011-01-07T10:18:00.003+13:00</published><updated>2011-01-07T10:28:12.458+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='game development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='freedom 0'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Console Hacking</title><content type='html'>&lt;a href="http://www.bbc.co.uk/news/technology-12116051"&gt;Several&lt;/a&gt; &lt;a href="http://www.next-gen.biz/news/sony-responds-to-ps3-hacks"&gt;news&lt;/a&gt; outlets are reporting that the PS3 has been compromised. What strikes me as odd is that most of the time, the people doing the hacking have no interest in piracy (at least, that's their claim). Instead, their motives seem to be towards allowing home-brew app creation. This is a noble goal, and one that will surely become more and more popular, as we start moving away from passive entertainment towards a more participatory model.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My question is this: Why do console manufacturers still struggle to prevent home-brew projects? The time spent trying to prevent these sorts of exploits must be incredible, and so far, none of them have succeeded. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Personally, I'd love a console that allowed me to run whatever code I want on it - imagine the uses! MythTV running on an XBox? Awesome!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-2372543856575878760?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2011/01/console-hacking.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2372543856575878760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2372543856575878760'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2011/01/console-hacking.html' title='Console Hacking'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-1028874883435851112</id><published>2010-12-30T15:17:00.006+13:00</published><updated>2010-12-30T15:45:04.536+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='kate'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='kdevelop'/><title type='text'>Why your python editor sucks</title><content type='html'>I'm doing a reasonable amount of python-coding work these days. It would help me to have an editor that doesn't suck. My requirements are:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Small &amp;amp; Fast. I'm not after a massive clunky IDE, just an editor with enough smarts to make editing multiple python files easier.&lt;/li&gt;&lt;li&gt;Sensible syntax highlighting.&lt;/li&gt;&lt;li&gt;Understands python indentation, PEP8 style. Specifically, indents with 4 spaces, backspace key can be used to unindent.&lt;/li&gt;&lt;li&gt;Can be integrated with one or more lint checkers. Right now I use a wonderful combination of pep8, pyflakes and pylint. I want the output of these to be integrated with the editor so I can jump to the file &amp;amp; line where the problem exists.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;That's it. I don't think I'm asking too much. Here's the editors I've tried, and why they suck:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://kate-editor.org/"&gt;KATE&lt;/a&gt;. I love kate, it's my default text editor for almost everything. However, there is no way to integrate lint checkers. I could write a plugin, but that's yet another distraction from actually doing my work.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt;. I'm already reasonably skilled with vim, and &lt;a href="http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/"&gt;Alain Lafon's blog post&lt;/a&gt; contains some great tips to make vim even better. My problem with vim is simply that it's too cryptic. Sure, I could spend a few years polishing my vim skills, but I want it to just work. Vim goes in the "kind of cool, but too cryptic" basket.&lt;/li&gt;&lt;li&gt;&lt;a href="http://eric-ide.python-projects.org/"&gt;Eric&lt;/a&gt;. When you launch eric for the first time it opens the configuration dialog box. It looks like this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WNsQRabEE38/TRvu5IInSZI/AAAAAAAAEoo/GIvpD3aipoQ/s1600/eric_settings.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 299px;" src="http://1.bp.blogspot.com/_WNsQRabEE38/TRvu5IInSZI/AAAAAAAAEoo/GIvpD3aipoQ/s400/eric_settings.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5556297230495205778" /&gt;&lt;/a&gt;How many options do I really need for an editor? Over-stuffed options dialogs is the first sign of trouble. It gets worse however, once you dismiss the settings window, the editor looks like this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WNsQRabEE38/TRvvD4hIIhI/AAAAAAAAEow/7VzENZBG9Ho/s1600/eric_window.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 311px;" src="http://1.bp.blogspot.com/_WNsQRabEE38/TRvvD4hIIhI/AAAAAAAAEow/7VzENZBG9Ho/s400/eric_window.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5556297415281615378" /&gt;&lt;/a&gt;&lt;br /&gt;Need I say more? &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.geany.org/"&gt;Geany&lt;/a&gt;. Looks promising, but no integration into lint checkers.&lt;/li&gt;&lt;li&gt;&lt;a href="http://pida.co.uk/"&gt;pida&lt;/a&gt;. Integrates with vim or emacs for the editor component. Looks promising, although the user interface is slightly clunky in places. Pida suffers from exactly the same problems as vim does however, but I may end up using it.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;There are a few options I have not tried, and probably won't:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Eclipse &amp;amp; pydev. Eclipse is a huge, hulking beast. I want a small, fast, lean editor, not an IDE.&lt;/li&gt;&lt;li&gt;Emacs. Can't be bothered learning another editor. Doesn't look that much different to vim, so what's the point in learning both?&lt;/li&gt;&lt;li&gt;KDevelop. Same reason as Eclipse, above.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;I suspect there's a market for a simple python editor that just works. Please! Someone build it!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-1028874883435851112?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/12/why-your-python-editor-sucks.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1028874883435851112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1028874883435851112'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/12/why-your-python-editor-sucks.html' title='Why your python editor sucks'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/TRvu5IInSZI/AAAAAAAAEoo/GIvpD3aipoQ/s72-c/eric_settings.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-3044512396317524846</id><published>2010-12-03T10:00:00.004+13:00</published><updated>2010-12-03T10:05:45.229+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='commercial'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Visual Studio Exception Woes</title><content type='html'>&lt;div&gt;Microsoft, in their infinite wisdom have decided to make programming easier. How? By setting the default behavior for Visual Studio 2010 Ultimate to be to ignore (i.e.- not break on) exceptions thrown from non user-code. Behold the default settings for exceptions in a brand new C# project:&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_WNsQRabEE38/TPgJhSMydrI/AAAAAAAAEoI/ZApLMa3-7YU/s400/vssucks.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 200px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5546193408532575922" /&gt;&lt;/div&gt;&lt;div&gt;Try as I might, I have not yet discovered a way to change the default for these settings for all projects. How am I supposed to teach students about exception handling when Microsoft are doing their best to get rid of them?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bah.&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/128616657362436845-3044512396317524846?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/12/visual-studio-exception-woes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3044512396317524846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3044512396317524846'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/12/visual-studio-exception-woes.html' title='Visual Studio Exception Woes'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/TPgJhSMydrI/AAAAAAAAEoI/ZApLMa3-7YU/s72-c/vssucks.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-8370789607004058451</id><published>2010-12-01T10:21:00.003+13:00</published><updated>2010-12-01T10:40:20.767+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='commercial'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Attention all Programmers:</title><content type='html'>As a user of open source software, I like to try and give something back to the community whenever I can. As a somewhat proficient programmer i can do this more often than most, but one of the most effective ways of giving back for non-programmers is by filing bug reports.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, there are two main issues with this:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Submitting a bug report is often incredibly painful. Most software bug trackers I have seen require an account, which means registering a new username &amp;amp; password (I can't wait for more non-essential services like bug trackers to start using &lt;a href="http://openid.net/"&gt;openId&lt;/a&gt;), activating my account... all this can take 30 minutes of more. Submitting a bug report should be a fire-and-forget affair, taking 10 minutes tops: any longer and I can't afford to spend my time.&lt;br /&gt;&lt;br /&gt;Many bug trackers ask users for information that is hard to obtain, or intimidating to non-programmers. How many users know their CPU architecture? Or distribution? Or even the software version they're using? One way around this is to have the bug-reporting done from within the application on the client machine itself, but still - bug trackers should be as friendly to users as possible. How about posting some simple instructions on how to obtain this information for non-technical users?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Even after navigating the multiple hurdles involved in submitting a bug, you then have to deal with the programmers fielding the bug report. This is where it gets tricky. Many programmers view bug reports as a personal insult to them (perhaps subconsciously). Many programmers will triage bugs that they don't want to fix, giving excuses like "It's like that by design", or simply "Low priority, won't fix".&lt;br /&gt;&lt;br /&gt;Here's the thing though: The customer is (nearly) always right.&lt;br /&gt;&lt;br /&gt;If a user has taken the time to navigate your awful bug tracking software and submit a bug, it must be a big deal to them. If the matter at hand really is like that "by design", your design is probably screwy. If you won't fix it because it's low priority then you need to stop adding new features, and fix the ones you already have.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Open source software seems to suffer from these problems more than commercial software. I guess it's because we're not trying to extract money from our clients. Can you imagine a professional code shop telling a paying customer "I'm sorry, we're not going to fix that bug you reported, because we intended it to work like that"? Yeah, right.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So how do we fix this for the open source world?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's no simple answer that I can fathom. It requires programmers to be a bit smarter and have a bit more empathy for the mere mortals who have to use their software. As a programmer, I include myself in this category. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That is all, thank you.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8370789607004058451?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/11/attention-all-programmers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8370789607004058451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8370789607004058451'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/11/attention-all-programmers.html' title='Attention all Programmers:'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7268568888940817649</id><published>2010-11-09T09:50:00.002+13:00</published><updated>2010-11-09T09:57:21.647+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new zealand'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Code Craftsmanship</title><content type='html'>Dunedin now has a local code craftsmanship group!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code craftsmanship is like craftsmanship in any other area. It describes the transition between knowing how to write code, and knowing how to write &lt;b&gt;good&lt;/b&gt; code. Like most crafts, there's an element of constant iterative learning involved. Working with people who have more experience than you can save you some of those iterations.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is an excellent opportunity to meet other programmers, and discover the rich, yet hidden IT talents in Dunedin. If you're interested in joining us, check out the (brand new, as yet unfinished) &lt;a href="http://codecraft.org.nz/"&gt;website&lt;/a&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/128616657362436845-7268568888940817649?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/11/code-craftsmanship.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7268568888940817649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7268568888940817649'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/11/code-craftsmanship.html' title='Code Craftsmanship'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6693037364623157049</id><published>2010-11-09T09:40:00.003+13:00</published><updated>2010-11-09T09:49:11.901+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Project Documentation</title><content type='html'>Why is it that most open source project pages are so terrible at documenting their own project?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not talking about API or technical documentation - I'm talking about telling new visitors to your site what the hell your code is about.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Project authors, here are some handy tips:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;On your project front page, right at the top, put a simple explanation of what your code does (or what you hope it will do someday). Remember that your audience may not have the same level of technical experience as you do. Examples (screenshots, code snippets) are a MUST. A picture speaks a thousand words and all that...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make sure you include the development status of your project. I can't count the number of times I've spent 30 minutes looking at a project only to realize that it's not nearly complete enough to be usable to me. There's no shame in saying "this library is working, but not production ready. It is missing features X, Y, Z"&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Inject some enthusiasm! How many boring, dull, dry project descriptions do I have to read through? Most sound like the authors aren't passionate about their product. Sell your project; inject some enthusiasm, and maybe your viewers will become more enthusiastic in the process!&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Well, that's my rant for the day. Now I must go update my project documentation...&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/128616657362436845-6693037364623157049?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/11/project-documentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6693037364623157049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6693037364623157049'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/11/project-documentation.html' title='Project Documentation'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6757056866444282040</id><published>2010-10-18T09:35:00.003+13:00</published><updated>2010-10-18T10:05:17.709+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='job'/><title type='text'>Life Update</title><content type='html'>Yes, It's been a while. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the last few months I've been through the painful experience of trying to keep a company running despite the best efforts of the directors. Realising that the odds were stacked against me I decided to throw in the towel and relocate back to New Zealand.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So farewell England! I arrived as a graduate programmer, with a bit of open source hacking under my belt, and left with several years programming experience, a whole ton of knowledge that could not be leaned through any means but hard work, not to mention a few (emotional) scars. It's been a great experience, and one I encourage any graduate to do.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So now I'm back in Dunedin, what am I doing? Well, I've taken a 12 month contract to teach at &lt;a href="http://www.op.ac.nz"&gt;Otago polytechnic&lt;/a&gt;; I'll be teaching third year programming and database papers. I've also completed a short stint programming for &lt;a href="http://arl.co.nz"&gt;ARL&lt;/a&gt; and fixing the Survival Factor exhibits at&lt;a href="http://www.otagomuseum.govt.nz/"&gt; Otago Museum&lt;/a&gt;. I'm hoping to set myself up as a contractor, so I can take on any odd jobs that I see.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My hope is that I will be able to return to more open source hacking now that I'm in a more flexible working environment. I'm not sure what project I'll end up helping - perhaps KDE, perhaps something new.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Will write more soon.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6757056866444282040?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/10/life-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6757056866444282040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6757056866444282040'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/10/life-update.html' title='Life Update'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6899007086560556528</id><published>2010-03-10T23:35:00.011+13:00</published><updated>2010-05-20T04:15:56.859+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Design and Implementation</title><content type='html'>One of the key tenets in good software deisgn is to separate the design of your product from it's implementation. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In some industries, this is much harder to do. When designing a physical product, the structural strength &amp;amp; capabilities of the material being used must be taken into account. There's a reason most bridges have large columns of concrete and steel going down into the water below. From a design perspective, it'd be much better to not have these pillars, thereby disturbing the natural environment less and allowing shipping to pass more easily.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WNsQRabEE38/S5d3dgqjnqI/AAAAAAAAEVc/bOnfIYGIOqo/s1600-h/man_bridge_small.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 322px;" src="http://3.bp.blogspot.com/_WNsQRabEE38/S5d3dgqjnqI/AAAAAAAAEVc/bOnfIYGIOqo/s400/man_bridge_small.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5446953623196245666" /&gt;&lt;/a&gt;Photo by &lt;a href="http://www.flickr.com/photos/scotthudson/"&gt;NJScott&lt;/a&gt;. An example of design being (partially) dictated by implementation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you start looking for places where the implementation has "bubbled up" to the design, you start seeing them all over the place. For example, my analogue wristwatch has a date ticker. Most date tickers have 31 days, which means manual adjustment is required after a month with fewer than 31 days. I'm prepared to live with this. However, the date ticker on my watch is made up of two independent wheels - and it climbs to 39 before rolling over, which means manual intervention is required every month! What comes after day 39? day 00 of course!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WNsQRabEE38/S_QNTjN3DRI/AAAAAAAAEkw/CExZxECmU9A/s1600/watch-00.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 171px;" src="http://4.bp.blogspot.com/_WNsQRabEE38/S_QNTjN3DRI/AAAAAAAAEkw/CExZxECmU9A/s400/watch-00.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5473014076684045586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;It's easy to understand why this would be the case - it's much simpler to create a simple counting mechanism that uses two rollers and wraps around at 39 than it is to create one that wraps at the appropriate dates. I have yet to see an analogue wristwatch that accounts for leap-years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Software engineers have a much easier time; our materials are virtual - ideas, concepts and pixels are much easier to manipulate than concrete and steel. However, there are still limitations imposed on us - for example data can only be retrieved at a certain speed. Hardware often limits the possibilities open to us as programmers. However, these limitations can often be avoided or disguised. Naive implementations often lead to poor performance. A classic example of this is Microsoft's Notepad application. Notepad will load the entire contents of the file into memory at once, which can take a very long time if the file you are opening is large. What's worse is that it will prevent the user from using the application (notepad hangs, rendering it unusable) while this loading is happening. For example, opening a 30MB text file takes roughly 10 seconds on this machine. This seems particularly silly when you consider that you can only ever see a single page of the data at a time - why load the whole file when such a small percentage of it is required at any one time? I guess the programmers who wrote notepad did not intend for this use case, but the point remains valid: an overly-simple implementation led to poor performance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The unfortunate state of affairs is that the general population have been conditioned to accept bad software as the norm. There really is no excuse for software that is slow, crashes, or is unnecessarily hard to use. It's not until you use a truly incredible piece of software that you realise what can be achieved. So what needs to change? Two things:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Developers need to be given the tools we need to make incredible software. These tools are getting better all the time. My personal preference for the Qt frameworks just paid off with the &lt;a href="http://qt.nokia.com/about/news/betas-of-qt-4.7-and-qt-creator-2.0-now-available"&gt;beta release of Qt 4.7 and QT Creator 2.0&lt;/a&gt;. I plan on writing about the new "Quick" framework in the future: I anticipate it making a substantial difference to the way UI designers and developers collaborate on UI design and construction.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Users need to be more discerning and vocal. As an application developers it can be very hard to know what your users think. If you don't get any feedback, are your users happy, or just silent? We need a better way for users to send feedback to developers; it needs to be low-effort fast and efficient.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6899007086560556528?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/03/design-and-implementation.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6899007086560556528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6899007086560556528'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/03/design-and-implementation.html' title='Design and Implementation'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WNsQRabEE38/S5d3dgqjnqI/AAAAAAAAEVc/bOnfIYGIOqo/s72-c/man_bridge_small.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-8842707002933579044</id><published>2010-01-13T22:03:00.003+13:00</published><updated>2010-01-13T22:18:31.338+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='photos'/><title type='text'>My Morning thus far</title><content type='html'>&lt;div&gt;My morning thus far:&lt;br /&gt;&lt;br /&gt;Woke up. Noticed it had been snowing. Roughly 4-5 centimetres on the ground, and still coming down, although it's more ice crystals than snow.&lt;br /&gt;&lt;br /&gt;Since today is the first day that my company is exhibiting at the &lt;a href="http://www.bettshow.com/"&gt;BETT &lt;/a&gt;trade show in London, got dressed in snazzy new company shirt, and trudged my way (30 minutes) to train station.&lt;br /&gt;&lt;br /&gt;Bought £21 ticket. Went into station, just in time to hear announcment that all trains were terminating at woking, and there would be no services to London. Damn!&lt;br /&gt;&lt;br /&gt;Walked home through park. Snow quite pretty, but cold and wet as well:&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_WNsQRabEE38/S02OfTKVe5I/AAAAAAAAETQ/q-GQaz6wfOA/s1600-h/13012010289.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_WNsQRabEE38/S02OfTKVe5I/AAAAAAAAETQ/q-GQaz6wfOA/s400/13012010289.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5426149794422029202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Finally got back home. Roads didn't look too bad, so I thought I could at least drive into office. Cleared car of snow and ice, drive 2 metres forward and got stuck, half in, and half out of driveway!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;So here's the thing: If the gulf stream breaks down, or becomes more erratic, this will happen more and more. We need infrastructure to cope with the bad weather. How do other countries deal with this?&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/128616657362436845-8842707002933579044?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/01/my-morning-thus-far.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8842707002933579044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8842707002933579044'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/01/my-morning-thus-far.html' title='My Morning thus far'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/S02OfTKVe5I/AAAAAAAAETQ/q-GQaz6wfOA/s72-c/13012010289.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-5975025250042822249</id><published>2010-01-12T22:35:00.002+13:00</published><updated>2010-01-12T22:41:28.989+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game development'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Torchlight</title><content type='html'>Just purchased &lt;a href="http://www.torchlightgame.com/"&gt;Torchlight &lt;/a&gt;from steam. It's brilliant - casual, but not brain dead, exciting, but not over done, simple, but not stupid. It'll even run on a netbook.&lt;br /&gt;&lt;br /&gt;Go - get it now!&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.torchlightgame.com/assets/images/torchlightlogo_small.png" border="0" alt="" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5975025250042822249?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2010/01/torchlight.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5975025250042822249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5975025250042822249'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2010/01/torchlight.html' title='Torchlight'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-1511088878322309214</id><published>2009-12-24T02:19:00.002+13:00</published><updated>2009-12-24T02:24:38.816+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WTF'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Live Forever!</title><content type='html'>Ray Kurzweil suggests that most, if not all technical development &amp; evolution happens on an exponential scale, rather than a linear one. What does this mean? It means that, amongst other things, by the year 2020, we will have access to technologies far beyond anything we've thought about to date.&lt;br /&gt;&lt;br /&gt;Makes sense to me!&lt;br /&gt;&lt;br /&gt;&lt;!--copy and paste--&gt;&lt;object width="334" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt; &lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/RayKurzweil_2005-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/RayKurzweil-2005.embed_thumbnail.jpg&amp;vw=320&amp;vh=240&amp;ap=0&amp;ti=38&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=ray_kurzweil_on_how_technology_will_transform_us;year=2005;theme=might_you_live_a_great_deal_longer;theme=technology_history_and_destiny;theme=bold_predictions_stern_warnings;theme=not_business_as_usual;theme=tales_of_invention;theme=medicine_without_borders;theme=what_s_next_in_tech;event=TED2005;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&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="334" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/dynamic/RayKurzweil_2005-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/RayKurzweil-2005.embed_thumbnail.jpg&amp;vw=320&amp;vh=240&amp;ap=0&amp;ti=38&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=ray_kurzweil_on_how_technology_will_transform_us;year=2005;theme=might_you_live_a_great_deal_longer;theme=technology_history_and_destiny;theme=bold_predictions_stern_warnings;theme=not_business_as_usual;theme=tales_of_invention;theme=medicine_without_borders;theme=what_s_next_in_tech;event=TED2005;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-1511088878322309214?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/12/live-forever.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1511088878322309214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1511088878322309214'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/12/live-forever.html' title='Live Forever!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4563424525734943136</id><published>2009-10-24T01:11:00.005+13:00</published><updated>2009-10-24T01:57:24.887+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Sexism in IT?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WNsQRabEE38/SuGnyhpZSDI/AAAAAAAADzc/-S37rLgTwng/s1600-h/Mark_Shuttleworth_NASA.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 162px;" src="http://3.bp.blogspot.com/_WNsQRabEE38/SuGnyhpZSDI/AAAAAAAADzc/-S37rLgTwng/s200/Mark_Shuttleworth_NASA.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5395778315033856050" /&gt;&lt;/a&gt;&lt;div&gt;Mark Shuttleworth recently copped some flack for allegedly sexist content in a talk. I wasn't there, and haven't seen the talk, so I can't really comment on the material itself, but a few things struck me about some of the online responses:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Many of the people complaining weren't there - they watched the video footage online. Why would you do this? If you suspect that there's going to be content that offends you, don't watch it. If you do decide to watch it, I'm not sure you can complain too loudly when (surprise surprise) you are offended by it.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Yes, IT is a male dominated field - for whatever reason (there's lots of research discussing why this is, but that's for you to find).&lt;i&gt; That's not to say that sexism should be inherent, or even tolerated&lt;/i&gt;, but it is to be expected. Anyone shocked by this statement should try working in other male-dominated fields, such as construction or engineering. No, it's not right, but it's how it is.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I met Mark briefly at a Linux conference a number of years ago and he seemed to me to be a straight-talking, reasonably honest, good natured kind of guy. I'm sure he made an honest mistake, and regrets his choice of words.  I would urge Mark to apologise, and urge everyone who complained to spend the same amount of energy protesting equally important matters such as software patents, or advocacy for open, sane standards.&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/128616657362436845-4563424525734943136?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/10/sexism-in-it.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4563424525734943136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4563424525734943136'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/10/sexism-in-it.html' title='Sexism in IT?'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WNsQRabEE38/SuGnyhpZSDI/AAAAAAAADzc/-S37rLgTwng/s72-c/Mark_Shuttleworth_NASA.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-2036814339021204903</id><published>2009-10-03T02:57:00.003+13:00</published><updated>2009-10-03T03:27:40.594+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Spolsky loses his cool</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today I stumbled across Joel Spolsky's article "&lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;The Duct Tape Programmer&lt;/a&gt;".  Essentially it's a thousand word rant to make this simple point:&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;A 50%-good solution that people actually have solves more problems and survives longer than a 99% solution that nobody has because it’s in your lab where you’re endlessly polishing the damn thing. Shipping is a feature. A really important feature. Your product must have it.&lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;Of course he's right - however, his post is ten agonising paragraphs wherein he rants about design patterns, extended C++ features such as template classes (wait, they've been around for a while now - can we still call them "extended" features), and multi-threading (!!!), and finally one succinct paragraph in which he makes his point (most of which I have quoted above). Now don't get me wrong - I am by no means criticising his writing style ("people in glass houses..." and all that) - all I'm suggesting is that someone with Joel's reputation may wish to think a little harder before posting this sort of tripe online, lest he tarnish his otherwise good reputation. Let me give an example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;blockquote&gt;One principle duct tape programmers understand well is that any kind of coding technique that’s even slightly complicated is going to doom your project. Duct tape programmers tend to avoid C++, templates, multiple inheritance, multithreading, COM, CORBA, and a host of other technologies that are all totally reasonable, when you think long and hard about them, but are, honestly, just a little bit too hard for the human brain.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;So Joel Spolsky is seriously suggesting that C++, templates, multiple inheritance and multi-threading are invariably going to "doom your project"? Come on. Multi-threading is critical to the success of many projects - without it, or something similar, a huge portion of applications simply wouldn't exist, or at least would be a lot more complicated. I challenge Joel to write a print spooler as part of an interactive application in a single thread. I challenge Joel to write a tool for scientific analysis that must process lots (gigabytes? exabytes?) of data while maintaining an interactive user interface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As I mentioned earlier, Joel has a point - however, instead of suggesting that any slightly-complicated technology be banned outright, I'll instead suggest that any slightly complicated technology had better be understood by your programmers before you use it in your project. &lt;b&gt;Don't use multi-threading because it sounds cool, use it because it's the right tool for the job.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&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/128616657362436845-2036814339021204903?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/10/spolsky-loses-his-cool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2036814339021204903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2036814339021204903'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/10/spolsky-loses-his-cool.html' title='Spolsky loses his cool'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5608472253673959711</id><published>2009-09-12T00:40:00.003+12:00</published><updated>2009-09-12T00:47:04.613+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='job'/><title type='text'>A New job</title><content type='html'>It's been a while since I had the time to post here. In the last few months I've left my old emplyer (&lt;a href="http://www.pebble.tv"&gt;Pebble Beach Systems&lt;/a&gt;), and joined &lt;a href="http://www.abtutor.com"&gt;AB Software Consulting&lt;/a&gt;. Why the change? I've always maintained that the best way to keep your skills honed is to keep moving. ABSC requires a completely different skill set to Pebble beach. It feels like the next logical step in my career progression.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's very easy to stay in a job that isn't giving you what you need. Don't make this mistake! If something isn't right, and you've tried fixing it, it may well be time to move. It's a very hard thing to do, but in my case it's been worth it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cheers,&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5608472253673959711?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/09/new-job.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5608472253673959711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5608472253673959711'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/09/new-job.html' title='A New job'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4461462040805565614</id><published>2009-05-23T03:57:00.001+12:00</published><updated>2009-05-23T03:57:35.270+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commercial'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Compiling != Testing</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Just a small note, folks, to remind you all that just because your code compiles, it's not guaranteed to work. Writing the code is only 10% of the total effort. &lt;br/&gt;&lt;br/&gt;I've neglected this blog for a long time now. Hopefully I'll be back soon, but until then, watch this space!&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=00336e51-d29d-8453-9cc7-3c68b2e0626e' class='zemanta-pixie-img'/&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/128616657362436845-4461462040805565614?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/05/compiling-testing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4461462040805565614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4461462040805565614'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/05/compiling-testing.html' title='Compiling != Testing'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5775221460623890866</id><published>2009-03-09T02:10:00.002+13:00</published><updated>2009-03-09T02:14:29.592+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Distractions</title><content type='html'>I've been very distracted lately - I haven't written any code outside work hours for several weeks now. What's kept me so busy? mainly it's been my guitar(s). I've just added a new guitar to the growing collection. If you're interested, you can see some pictures &lt;a href="http://picasaweb.google.co.uk/thomir/GuitarGear#slideshow"&gt; here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5775221460623890866?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/03/distractions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5775221460623890866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5775221460623890866'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/03/distractions.html' title='Distractions'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-2739761833517369981</id><published>2009-02-27T22:30:00.001+13:00</published><updated>2009-02-27T22:30:01.043+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Microsoft's unpaid testers</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I just discovered this charming little quote in the &lt;a href='http://blogs.msdn.com/e7/archive/2009/02/25/feedback-and-engineering-windows-7.aspx'&gt;winows 7 blog&lt;/a&gt;:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;To date, with the wide usage of the Windows 7 Beta we have received a hundreds [&lt;i&gt;sic&lt;/i&gt;] of Connect (the MSDN/Technet enrolled beta customers) bug reports and &lt;i&gt;have fixes in the pipeline for the highest percentage of those reported bugs than in any previous Windows development cycle&lt;/i&gt;.&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;So you're publically advertising the fact that your product was very buggy when you launched the beta test phase, and you're scrambling to fix all the bugs at the last minute? Whatever happened to internal testing? Who will test all the bugs introduced with your bug fixes?&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Bah&lt;/i&gt;, my dislike of the Microsoft software mill continues! Hooray for uninformed opinion!&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=bfa110d7-d1f2-4996-b49e-ddfc06e80fb9' class='zemanta-pixie-img'/&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/128616657362436845-2739761833517369981?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/02/microsoft-unpaid-testers.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2739761833517369981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2739761833517369981'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/02/microsoft-unpaid-testers.html' title='Microsoft&amp;#39;s unpaid testers'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5094774504205865589</id><published>2009-02-24T01:02:00.001+13:00</published><updated>2009-02-24T01:02:44.638+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Webkit / Konqueror issue raised again</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Just thought I'd point out that I'm not the only one who would like Konqueror to use webkit rather than KHTML:&lt;br/&gt;&lt;br/&gt;&lt;a href='http://blog.jasondonenfeld.com/96'&gt;WebKit in Konqueror&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;...It's a pity the comments are 90% flame, and 10% content.&lt;br/&gt;&lt;blockquote/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=bd92a2e7-180f-46be-a53c-edfcbac24c11' class='zemanta-pixie-img'/&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/128616657362436845-5094774504205865589?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/02/webkit-konqueror-issue-raised-again.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5094774504205865589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5094774504205865589'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/02/webkit-konqueror-issue-raised-again.html' title='Webkit / Konqueror issue raised again'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7124907510689941260</id><published>2009-02-11T05:16:00.004+13:00</published><updated>2009-02-23T00:27:58.765+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Product Branding Critical to User Expectations</title><content type='html'>A &lt;a href="http://www.kdedevelopers.org/node/3883"&gt;recent post on kdevelopers.org&lt;/a&gt; caught my attention. In a post tagged "rant" (I love rants), "&lt;a href="http://http://www.kdedevelopers.org/user/4832"&gt;tstaerk&lt;/a&gt;" outlines his situation:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;I am in a small team where we provide a Linux Terminal Server (LTS) for a company. It is based on NX. Every employee in this company can use the service, however, we provide it free of charge and out of enthusiasm. That means, we are not paid for setting it up nor for giving phone-support. We sometimes have 70 concurrent users on the server, that may mean we reach 500 users on the whole. The server is running KDE 3.5 as desktop environment. Recently, we evaluated - no, let me keep this understandable - we sat together and discussed the possibility of upgrading to KDE 4.&lt;/p&gt; &lt;p&gt;Everyone including me was against the upgrade. This is especially ashaming for me as I am spending every weekend to develop KDE. So what were the reasons?&lt;/p&gt;&lt;/blockquote&gt;KDE4 seems to have suffered a lot from people complaining that it's not an easy upgrade from KDE3, and to a certain extent, the complaint is justified. When KDE4 first arrives on the scene, it was really little more than a tech demo, and certainly not usable by normal users (I use the term "normal" users with all due respect - "normal" in this context means users not in the KDE development scene, and perhaps not as technically literate as the developers). However, the hype surrounding it's release meant that lots of normal users upgraded and were subsequently disappointed. With KDE4.2, we're finally getting to a stage where &lt;a href="http://tech-foo.blogspot.com/2009/02/kde-42-first-impressions.html"&gt;the KDE 4 series is actually usable as a desktop environment&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;However, that's still not answering the original concern: &lt;span style="font-style: italic;"&gt;KDE4 is still not a replacement for KDE3&lt;/span&gt;. Tstaerk goes on to list some of the shortcomings he sees in KDE4:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;If you install a KDE 4 desktop by default, you do not have the possibility to add icons to your desktop by right-clicking onto the desktop. That would mean to us: Take 500 phone calls, explain users why it is no longer possible, explain 500 times why we do a change if it is a change to the worse... You got it, 500 times an ENOTAMUSED.&lt;/p&gt; &lt;p&gt;If you install a KDE 4 desktop by default, you do not have the possibility to move the clock in the panel. For me, the clock is ticking constantly on the left where I do not want it. Our users will be upset seeing another change to the worse. Yes, there is a work-around but it is so complicated that I do not want to tell it 500 times on the phone &lt;img src="http://www.kdedevelopers.org/misc/smileys/sad.png" title="Sad" alt="Sad" class="smiley-content" /&gt;&lt;/p&gt; &lt;p&gt;If you install a KDE 4 desktop by default, you get a strange icon in the upper right corner. No one could explain to me what it is called, but everybody said it was something about Plasma. Users will click on it and eventually hit "Zoom out". Then, their screen is filled with strange gray squares. Just imagine you have to sit on a phone and answer 500 phone calls (for no money) from users who all tell you something about "squares" not knowing they should call it "activities".&lt;/p&gt;&lt;/blockquote&gt;Does he have a point? Perhaps.&lt;br /&gt;&lt;br /&gt;In some ways, calling the new product KDE4 implies an easy upgrade path from KDE3, which is misleading, since many aspects of the product have been written from scratch, and behave in a totally different manner. It would have been a better decision, I think to brand KDE4 in such a way that it was obvious that it was a new product, that would not work in the same way. This in turn might have saved a considerable amount of grief when developers found that their snazzy new technologies were being ignored, since users could not use the product like they were used to.&lt;br /&gt;&lt;br /&gt;So, the moral of the story?&lt;br /&gt;&lt;br /&gt;Be careful how you brand your product, especially when a newer version breaks compatibility with an older version. Is it an upgrade, or a new entity in it's own right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-7124907510689941260?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/02/product-branding-critical-to-user.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7124907510689941260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7124907510689941260'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/02/product-branding-critical-to-user.html' title='Product Branding Critical to User Expectations'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4588017974107172709</id><published>2009-02-01T23:29:00.004+13:00</published><updated>2009-02-02T00:13:09.685+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>KDE 4.2: First Impressions</title><content type='html'>As you may already know, &lt;a href="http://www.kde.org/announcements/4.2/index.php"&gt;KDE4.2 was released a few days ago&lt;/a&gt;. I was interested in writing a plasmoid in python (more on that in a future post), which meant that I had to upgrade.&lt;br /&gt;&lt;br /&gt;So what did I think of KDE4.2 after experiencing KDE4.1?&lt;br /&gt;&lt;br /&gt;In a word: &lt;span style="font-style: italic;"&gt;Brilliant!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;KDE4.2 is a breath of fresh air after 4.1. Many of the crashes I experienced in KDE4.1 have been fixed. For example, in 4.1, every time I opened the "Display" configuration dialog my laptop would freeze, and needed to be hard rebooted in order to get it working again. Every time I launched a full-screen application (like a game) my laptop would freeze. I couldn't kill the X server with Ctrl+Alt+Backspace without my laptop freezing... there's a whole list.&lt;br /&gt;&lt;br /&gt;KDE4.2 fixes almost all these bugs, and even throws in some nice performance tweaks at the same time. Things feel more responsive - menus are faster to open, and some applications seem faster to load (although I haven't done any actual timing tests - so this is all subjective). Finally, it looks very nice:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WNsQRabEE38/SYWCozGR8XI/AAAAAAAAB_M/wTF1VSKJl1c/s1600-h/kde42_Desktop"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_WNsQRabEE38/SYWCozGR8XI/AAAAAAAAB_M/wTF1VSKJl1c/s400/kde42_Desktop" alt="" id="BLOGGER_PHOTO_ID_5297784174094184818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It looks good, and it's responsive on my three year old laptop!&lt;br /&gt;&lt;br /&gt;A big congratulations to all the KDE developers that made this happen. I believe I've committed a whopping 10 lines of code to KDE4, so I'm glad that other people have more commitment than I do ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-4588017974107172709?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/02/kde-42-first-impressions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4588017974107172709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4588017974107172709'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/02/kde-42-first-impressions.html' title='KDE 4.2: First Impressions'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/SYWCozGR8XI/AAAAAAAAB_M/wTF1VSKJl1c/s72-c/kde42_Desktop' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-6290110350703771090</id><published>2009-01-30T00:54:00.001+13:00</published><updated>2009-01-30T00:54:55.105+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Henry lives on</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://tech-foo.blogspot.com/2009/01/my-kingdom-for-browser.html'&gt;After complaining&lt;/a&gt; about the poor state of the web browser in a &lt;a href='http://www.kde.org/'&gt;KDE platform&lt;/a&gt;, I have to report with mixed emotions that I've bitten the bullet and installed &lt;a href='http://www.mozilla-europe.org/en/firefox/'&gt;firefox&lt;/a&gt;. I'm not a huge fan of firefox - yes, it's open source, and seems to work fairly well, but it's also slow and a huge resource hog.&lt;br /&gt;&lt;br /&gt;Who here remembers when firefox first came out? It was supposed to be a stripped down version of the mozilla web browser. The idea was that by removing the mail client, IRC chat application, and god knows how many other applications we'd end up with a smaller, faster, lighter browser. To some extent it worked. However, I'm starting to wonder if they'd have been better starting from scratch.&lt;br /&gt;&lt;br /&gt;I challenge anyone reading this to use &lt;a href='http://www.google.com/chrome'&gt;Chrome for windows&lt;/a&gt; for a week and then switch back to &lt;a href='http://www.mozilla-europe.org/en/firefox/'&gt;Firefox&lt;/a&gt; for good - I guarantee you you'll be pulling your hair out within a week; firefox is &lt;i&gt;slow!&lt;/i&gt; I always assumed that the reason my browsing experience was so poor was down to my slow Internet connection, but it turns out that a fair amount of the delay is the browser.&lt;br /&gt;&lt;br /&gt;So I have firefox - the GTK theme KDE installs looks awful, and several web sites look rubbish, but at least I can check my email...&lt;br /&gt;&lt;br /&gt;Well, that's it for now. More to come soon (and this time I'll lose the shakespearean titles).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6290110350703771090?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/01/henry-lives-on.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6290110350703771090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6290110350703771090'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/01/henry-lives-on.html' title='Henry lives on'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6980643904482377019</id><published>2009-01-21T07:45:00.007+13:00</published><updated>2009-01-22T01:51:16.457+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>My Kingdom for a Browser!</title><content type='html'>&lt;span style="font-style: italic;"&gt;This post is set to be one of the most painful entries I have ever written on this weblog. Not because the subject matter is particularly difficult, but because the technology has let me down.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The story starts with me upgrading my laptop to &lt;a href="http://www.kubuntu.org/news/8.10-release"&gt;Kubuntu 8.10&lt;/a&gt;. It's been out for a while, and I'm a big fan of &lt;a href="http://www.kde.org/"&gt;KDE 4&lt;/a&gt;, but I hadn't had a sufficiently quiet weekend in which to take the plunge. I was previously running Kubuntu 8.04, so I could have just downloaded the latest packages, but I wanted to start from scratch, for a couple of reasons.:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I wanted to remove all the rubbish that I had installed over the last six months. I frequently download and install applications, only to find that they're not quite what I want. I rarely uninstall them, so over time my lhard disk fills with cruft.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I wanted to wipe away all the stale config, especially as my window manager would be changing from KDE 3.x to KDE4. Besides, there's a certain pleasure to be derived from configuring a brand new KDE installation.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The install was a breeze, and for the first time ever all my laptop hardware was detected and configured correctly without any hacking on my part - even the weird web-cam, which doesn't even work in Windows XP. Life was good, until I went to browse the Internet.&lt;br /&gt;&lt;br /&gt;KDE ships with &lt;a href="http://www.konqueror.org/"&gt;Konqueror &lt;/a&gt;as it's default web browser. As far as web browsers go it's fairly nice - It lacks the large "Add-Ons" repository that &lt;a href="http://www.mozilla-europe.org/en/firefox/"&gt;Firefox&lt;/a&gt; has, but many of the plugins I can't live without when using Firefox are included as standard in Konqueror.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_WNsQRabEE38/SXYwu_5IYrI/AAAAAAAAB-0/IT4dbwwYwx4/s1600-h/konqueror"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 190px;" src="http://4.bp.blogspot.com/_WNsQRabEE38/SXYwu_5IYrI/AAAAAAAAB-0/IT4dbwwYwx4/s400/konqueror" alt="" id="BLOGGER_PHOTO_ID_5293471996003771058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Konqueror is more than just a web browser though - the integration between konqueror and the rest of KDE is truly stunning (&lt;span style="font-style: italic;"&gt;as an aside: this is why I prefer KDE over other desktops. Technologies like &lt;a href="http://en.wikipedia.org/wiki/KPart"&gt;KPart&lt;/a&gt; and &lt;a href="http://www.freedesktop.org/wiki/Software/dbus"&gt;DBus&lt;/a&gt; are the future of desktop applications, and KDE is leading the charge in this area&lt;/span&gt;). As an example, if you want to search google for something, but don't have your browser window open, what can you do? Easy! just press Alt + F2 to open the "Run Command" dialog, and type "&lt;span style="font-family:arial;"&gt;gg:&lt;/span&gt; " followed by your desired keywords. Hit enter and you'll launch Konqueror with the google results right there waiting for you.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_WNsQRabEE38/SXYx6eQQozI/AAAAAAAAB-8/O51nI1Q-rIY/s1600-h/runner-googlesearch"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 278px;" src="http://2.bp.blogspot.com/_WNsQRabEE38/SXYx6eQQozI/AAAAAAAAB-8/O51nI1Q-rIY/s400/runner-googlesearch" alt="" id="BLOGGER_PHOTO_ID_5293473292644033330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Konqueror also has extensive protocol support. For example, SCP and SFTP are supported by default. Try typing something like "fish://user@host" - konqueror will as for the user password, and will then behave like a file browser for the remote machine.&lt;br /&gt;&lt;br /&gt;These two examples hardly scratch the surface of what Konqueror can do. However - there are some very serious problems with it. Using GMail with Konqueror is torturous. First Google will give you the plain-old-HTML-only mode, since Konqueror isn't officially supported. Then, if you ask for the full version anyway you get all sorts of weirdness - and a completely unusable inbox. The &lt;a href="http://tombuntu.com/index.php/2008/01/16/set-up-konqueror-4-to-work-with-gmail/"&gt;solution seems to be to set the user agent to Safari 2.0&lt;/a&gt;, but even then my inbox seems to be incredibly slow.&lt;br /&gt;&lt;br /&gt;Members of the KDE community have &lt;a href="http://www.kdedevelopers.org/node/1195"&gt;pointed out that GMail plays fast-and-loose with web standards&lt;/a&gt;, so it's understandable that Konqueror misses a few tricks. The Google engineers must have tested the javascript enhanced version of GMail with the most popular browsers, and left Konqueror  out in the cold - and fair enough. However, the KDE developers are missing the point: no matter how good their browser is technically - no matter how standards compliant it is, it simply does not work for me - the user. I now have a browser that I cannot use to check my email (no, using the HTML-only version is not an option).&lt;br /&gt;&lt;br /&gt;So what are the alternatives?&lt;br /&gt;&lt;br /&gt;Before I upgraded Kubuntu I had Firefox installed. However, when I went to install it, I nearly had a heart attack. In order to install Firefox, I had to install 63 other packages - most of them gnome or GTK packages. The reason for this is simple: Firefox uses the GTK toolkit to provide a UI. I knew this already, but this early on in my new Kubuntu install I wasn't about to pollute my OS install with GTK packages.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_WNsQRabEE38/SXY3AjJ4SEI/AAAAAAAAB_E/j1S7Db2nIEk/s1600-h/firefox_install"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 361px;" src="http://3.bp.blogspot.com/_WNsQRabEE38/SXY3AjJ4SEI/AAAAAAAAB_E/j1S7Db2nIEk/s400/firefox_install" alt="" id="BLOGGER_PHOTO_ID_5293478894596802626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What can I do? There are a few other options available to me:&lt;br /&gt;&lt;br /&gt;There's &lt;a href="http://arstechnica.com/news.ars/post/20080818-nokia-helps-port-firefox-to-qt.html"&gt;been&lt;/a&gt; &lt;a href="http://dot.kde.org/1218543988/"&gt;talk&lt;/a&gt; of a Firefox port to Qt. However, nothing usable has materialised yet, so that's off the cards.&lt;br /&gt;&lt;br /&gt;There's the &lt;a href="http://code.google.com/p/arora/"&gt;Arora browser&lt;/a&gt; - this is a Qt browser running the Webkit engine (which is included as standard in later Qt distributions). A quick install told me what I needed to know: also not really usable as my default browser.&lt;br /&gt;&lt;br /&gt;Finally there's Google's offering: &lt;a href="http://code.google.com/chromium/"&gt;Chromium&lt;/a&gt;. However, this has not yet been ported to Linux.&lt;br /&gt;&lt;br /&gt;So what's the underlying cause of my troubles? Without hacking the code directly, I have no idea. Perhaps this is part of the KHTML vs Webkit debacle - There's a &lt;a href="http://blue-gnu.biz/content/khtml_vs_webkit_merge_or_not_merge"&gt;good article outlining the whole issue here&lt;/a&gt;, but I'd like to quote a couple of paragraphs:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;So, what's the situation? Well, it appears that KHTML will remain the web rendering engine for Konqueror going into KDE 4.0, and that it could be changed to qtWebkit as of KDE 4.1. That does not seem to be officially settled, so much as the most likely scenario. It appears that the KHTML team seems hesitant about the proposition, while many KDE developers and users alike have expressed a very receptive attitude toward seeing Konqueror user qtWebkit. And Rusin made clear to a reader that he believes the KHTML team should continue their work as long as they like.&lt;br /&gt;&lt;br /&gt;The challenge is that Webkit, which comes from Apple, is widely tested, and is thus known to work well with a large number of websites. KHTML is not as widely tested, and, for example, GMail doesn't work well with Konqueror. Many Konqueror fans have expressed regret at having to keep Firefox around just for sites like GMail, that don't recognize KHTML. Using Webkit would solve these problems, enabling many users to stick to one browser.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;In other words: "&lt;span style="font-style: italic;"&gt;The developers are dragging their feet to implement a fix that would arguably make Konqueror a better browser&lt;/span&gt;". Of course, the developers involved are free to do as they please with their code, but they're dragging down the rest of the KDE platform - I now have to have multiple browsers installed to do the most basic of day-to-day tasks.&lt;br /&gt;&lt;br /&gt;While the situation is frustrating in itself, the unfortunate fact is that similar things are happening all over the open source scene. Frequently developers get too caught up in making sure that their code is "&lt;span style="font-style: italic;"&gt;right&lt;/span&gt;" (that may mean designed correctly, stable, cool, standards compliant, well integrated, or anything else the developer feels is important), and not enough time is spent making sure that the product is usable. I suppose this is one of the draw backs to a development methodology where there is no external pressure to develop your product.&lt;br /&gt;&lt;br /&gt;Usability is king, and trumps all other concerns in a product. If it's not usable, it's no good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6980643904482377019?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2009/01/my-kingdom-for-browser.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6980643904482377019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6980643904482377019'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2009/01/my-kingdom-for-browser.html' title='My Kingdom for a Browser!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/SXYwu_5IYrI/AAAAAAAAB-0/IT4dbwwYwx4/s72-c/konqueror' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-2890387491175548958</id><published>2009-01-01T03:03:00.002+13:00</published><updated>2009-01-02T01:40:18.068+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='commercial'/><category scheme='http://www.blogger.com/atom/ns#' term='toolchain'/><category scheme='http://www.blogger.com/atom/ns#' term='game development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Wii'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>WiiWare: Innovation and mistakes</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;I bought a Nintendo Wii earlier this year. I've never actually owned a console before, but have a reasonably strong loyalty to Nintendo. They appear to publish the best games (of course, that's entirely subjective). My game catalogue now includes the following titles:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.zelda.com/universe/game/twilightprincess/"&gt;The Legend of Zelda: Twilight Princess&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nintendo.com/sites/supermariogalaxy/"&gt;Super Mario Galaxy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nintendo.com/sites/metroidprime3/index.jsp"&gt;Metroid Prime: Corruption&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nintendo.co.uk/NOE/en_GB/games/wii/wii_sports_2781.html"&gt;Wii Sports&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mariokart.com/wii/launch/"&gt;Mario Kart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.smashbros.com/"&gt;Super Smash Bros Brawl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.lucasarts.com/games/theforceunleashed/"&gt;Star Wars The Force Unleashed&lt;/a&gt; (this game barely makes it into the list, I'm thoroughly disgusted with this title, and am considering using it as a coaster)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;You may have noticed that I'm not a big fan of the more lighthearted "party" style games out there - I prefer the more focused, single player games.Once I had purchased those titles I began to look for something else, but quickly found that there's not a whole lot of choice out there right now. Most new Wii games tend to be in the "party" category.&lt;br /&gt;&lt;br /&gt;Thankfully, Nintendo have launched &lt;a href="http://www.nintendo.com/wii/wiiwarehttp://www.nintendo.com/wii/wiiware"&gt;WiiWare&lt;/a&gt;. WiiWare is a collection of titles created by third party developers. There are many different titles to choose from, and each title costs around £10. I ended up purchasing two titles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://na.square-enix.com/mylifeasaking/http://na.square-enix.com/mylifeasaking/"&gt;Final Fantasy Crystal Chronicles: My life as a king&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.frontier.co.uk/games/lostwinds/"&gt;Lost Winds&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;These are both splendid games. However, once again, the pool of good games in the WiiWare collection is very limited - the main reason for this as far as I can see is that it's incredibly difficult to get your hands on the tools required to develop games for the Wii. For a start, Nintendo are only selling their development kit to well-established development houses (you need a registerred business, proper offices, previously published titles etc.). Their application form states that:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The Application includes a NonDisclosure Agreement (NDA).  Once the Application and NDA are&lt;br /&gt;submitted by you, we will email you a copy of the Application and NDA for your records.  Please&lt;br /&gt;note that your submission of an Application and NDA does not imply that your company is approved,&lt;br /&gt;or will be approved, as an Authorized Developer for the platforms above.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;If the Application is approved by Nintendo, we will notify you by email. At this point, your&lt;br /&gt;company will be considered an Authorized Developer for the platform(s) specified. If your company&lt;br /&gt;is approved for Wii, this also includes WiiWare. If approved the appropriate SDKs can be downloaded&lt;br /&gt;from Warioworld, and development kits can be purchased from Nintendo of America.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;So &lt;i&gt;First&lt;/i&gt; you need to sign an NDA, &lt;i&gt;Then, if&lt;/i&gt; you are accepted you need to purchase the development kit (priced at over $1000 USD). All this makes is increadibly hard for "joe programmer" to start cutting code for the Wii.&lt;br /&gt;&lt;br /&gt;I really think Nintendo have missed a trick here; imagine the community that could form behind a free development kit. Think about the success of the &lt;a href="http://www.apple.com/iphone/features/appstore.html"&gt;Apple AppStore for the iPhone&lt;/a&gt;, but with games instead. The Wii is a revolutionary platform, with a unique control interface: surely lowering the barriers to entry can only be a good thing?&lt;br /&gt;&lt;br /&gt;There's another side to this as well: The &lt;a href="http://wiibrew.org/wiki/Main_Page"&gt;Wii Homebrew&lt;/a&gt; team have already done a lot of work reverse engineering the Wii, to the point where there is already &lt;a href="http://wiibrew.org/wiki/DevkitPro"&gt;an SDKs available for use&lt;/a&gt;. Is it usable? I haven't tried it myself yet (perhaps when I finish some of my current projects I'll play with it), but there are already a fair number of games available for the homebrew channel: I count &lt;a href="http://wiibrew.org/wiki/List_of_homebrew_applications_%28games%29"&gt;more than 70 games&lt;/a&gt; listed, as well as a number of &lt;a href="http://wiibrew.org/wiki/List_of_homebrew_applications_%28utilities%29"&gt;utilities&lt;/a&gt;, &lt;a href="http://wiibrew.org/wiki/List_of_homebrew_applications_%28emulators%29"&gt;emulators&lt;/a&gt; and &lt;a href="http://wiibrew.org/wiki/List_of_homebrew_applications_%28media%29"&gt;other&lt;/a&gt; &lt;a href="http://wiibrew.org/wiki/List_of_homebrew_applications_%28PC_utilities%29"&gt;bits&lt;/a&gt; and &lt;a href="http://wiibrew.org/wiki/List_of_homebrew_applications_%28operating_systems%29"&gt;pieces&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The free development kit is based on the gcc PPC port, and comes bundled with everything you need to start development. GNU gcc has been a well established payer on the compiler scene, so it's not like we're playing with untested technology here.&lt;br /&gt;&lt;br /&gt;Given that many of the secrets of the Wii are out (or are being reverse engineered even as you read this), wouldn't it be prudent for Nintendo to officially welcome third party developers to the fold? More importantly, for other, future consoles, imagine a world where:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The original manufacturer (Nintendo, Microsoft, Sony or whoever) use an open source toolchain from the beginning. I assume that Nintendo have spent a lot of time and money developing their toolchain, which seems a little wasteful to me, when an open source solution already exists. Sure, it may need to be tailored for the Wii, but I'm sure there are plenty of people who would embrace these changes. An open source toolchain lowers development costs, and lowers the barrier to entry for third party developers.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Third party developers are encouraged to write applications themselves, and the cost to entry is kept as low as possible. The manufacturer supplies the hardware, points to a pre-packaged toolchain of open source applications, and provides a development SDK with decent documentation. If all you need to test your games is a copy of the console itself, that would be great. However, why not build an emulator that can run on a standard PC?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The manufacturer provides bug-fixes for the SDK when needed, and creates a community-oriented website for budding developers.&lt;/li&gt;&lt;li&gt;The manufacturer provides a free (or very cheap) means of distributing third party applications via the internet, and offers the &lt;i&gt;option&lt;/i&gt; of DRM routines, should the initial autors wish to make use of them.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I believe this setup could bring about a number of beneficial changes to the console gaming market:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An overall increase in the diversity and quality of available games.&lt;/li&gt;&lt;li&gt;A vibrant community of developers who help the manufacturer maintain the platform SDK and development toolchain by submitting bugs, feature requests and other suggestions.&lt;/li&gt;&lt;li&gt;Increased popularity for the platform (I'd buy any platform that offered all of the above).&lt;/li&gt;&lt;/ul&gt;Unfortunately, I can't see it happening any time soon. It seems to me that the big three console manufacturers are still engrossed in the "proprietary hardware, closed source" paradigm. Still, a guy can dream, right?&lt;br /&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/128616657362436845-2890387491175548958?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/12/wiiware-innovation-and-mistakes.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2890387491175548958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2890387491175548958'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/12/wiiware-innovation-and-mistakes.html' title='WiiWare: Innovation and mistakes'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8153256781160182909</id><published>2008-12-22T06:35:00.002+13:00</published><updated>2008-12-22T06:38:49.598+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Holiday'/><title type='text'>Happy Holidays</title><content type='html'>This is the last post of 2008 - on reflection it's been a rather good year: there have been several posts on this blog worthy of a read (and several that were pure garbage), I've gotten involved in a few more projects (I hope to unveil a new one fairly soon - it's very exciting). Time will tell what 2009 has in store for us!&lt;br /&gt;&lt;br /&gt;I'm going to visit family in the UK, and I don't expect I'll be back home before the new year. So, happy holidays to one and all - even if you've decided to work through them!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cheers,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8153256781160182909?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/12/happy-holidays.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8153256781160182909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8153256781160182909'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/12/happy-holidays.html' title='Happy Holidays'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5007555963650723646</id><published>2008-12-15T20:25:00.005+13:00</published><updated>2008-12-15T20:33:11.827+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='job'/><title type='text'>Jop Opening at Pebble Beach Systems</title><content type='html'>We have a couple of job openings available here at &lt;a href="http://www.pebble.tv/"&gt;Pebble Beach Systems&lt;/a&gt;, due to expansion of the programming team.&lt;br /&gt;&lt;br /&gt;If you know &lt;span style="font-weight: bold;"&gt;C++&lt;/span&gt;, a bit of &lt;span style="font-weight: bold;"&gt;SQL&lt;/span&gt;, think you know how to handle a &lt;span style="font-weight: bold;"&gt;thread&lt;/span&gt;, and think you have a handle on programming in general, feel free to contact me and I can pass your CV and cover letter along to the big boss-man. The best way to contact me is via email: &lt;span style="font-style: italic;"&gt;thomir &lt;at&gt; gmail &lt;dot&gt; com&lt;/dot&gt;&lt;/at&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We're looking for a graduate and a senior developer. Pebble Beach Systems is a great place to work - very friendly relaxed atmosphere with a great bunch of people.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5007555963650723646?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/12/jop-opening-at-pebble-beach-systems.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5007555963650723646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5007555963650723646'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/12/jop-opening-at-pebble-beach-systems.html' title='Jop Opening at Pebble Beach Systems'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7455483760999947429</id><published>2008-12-09T08:22:00.007+13:00</published><updated>2008-12-12T08:15:01.053+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Teaching Programming mk. 2</title><content type='html'>I blogged before about &lt;a href="http://tech-foo.blogspot.com/2008/11/top-10-things-to-teach-programming.html"&gt;what I think we should teach programming students&lt;/a&gt;, and almost immediately wished I hadn't. Sometimes I feel that my blog posts are somewhat pointless meanderings through the garbage that inhabits my sleep-deprived brain. At other times I feel that I have contributed something useful to the general public. The post in question is firmly in the former category - but what can I do? I won't start deleting articles as soon as I fall out of favor with them, so I'm hereby correcting my earlier mistakes (at least, attempting to).&lt;a href="http://www.userfriendly.org/"&gt; Illiad Frazer&lt;/a&gt; knows how I feel:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ars.userfriendly.org/cartoons/?id=20081030"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 152px;" src="http://4.bp.blogspot.com/_WNsQRabEE38/ST11SEXoTPI/AAAAAAAAB-U/O-cyquQsn8M/s400/uf012030.png" alt="" id="BLOGGER_PHOTO_ID_5277503291619036402" border="0" /&gt;&lt;/a&gt;The whole point of the previous post was that I felt that most graduate students were under-prepared for work in industry. My main evidence of this is that it seems to take a long time, and more importantly a lot of interviews before one strikes "candidate gold" when recruiting for a new programmer.&lt;br /&gt;I will admit that this could be for many reason: perhaps our expectations are too high, perhaps we are not paying enough to attract the kind of graduate we're looking for, or perhaps the industry we're in isn't desirable enough to attract the better candidates. The list goes on endlessly - and yet I cannot ignore the fact that most graduates I meet are not up to scratch.&lt;br /&gt;&lt;br /&gt;So what prompted this revision of a past article? I happened to read E. W. Dijkstra's article entitled "&lt;a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1036.html"&gt;On the cruelty of really teaching computing science&lt;/a&gt;". In it, he postulates that the methods used by most universities are fundamentally flawed when it comes to teaching computer science, and more specifically when teaching computer programming. I'd like to quote part of this article:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; ...we teach a simple, clean, imperative programming language, with a skip and a multiple assignment as basic statements, with a block structure for local variables, the semicolon as operator for statement composition, a nice alternative construct, a nice repetition and, if so desired, a procedure call. To this we add a minimum of data types, say booleans, integers, characters and strings. The essential thing is that, for whatever we introduce, the corresponding semantics is defined by the proof rules that go with it.    &lt;br /&gt;&lt;br /&gt;Right from the beginning, and all through the course, we stress that the programmer's task is not just to write down a program, but that his main task is to give a formal proof that the program he proposes meets the equally formal functional specification. While designing proofs and programs hand in hand, the student gets ample opportunity to perfect his manipulative agility with the predicate calculus.&lt;/blockquote&gt;This method of programming - approaching the programming language as a kind of "predicate calculus' has it's advantages. It demands that the students pay attention to the features, rules, regulations and guarantees that the language provides. Whichever language is used (and to a certain extend it does not matter), the rules and regulations of that language are going to dictate the structure of the program. This is similar to the fact that the laws of math dictate the form of any mathematical proof; ignore the laws of the language, and your program (or proof, if you will) no longer makes sense. In the domain of integer mathematics,&lt;span style="font-style: italic;"&gt; 2 + &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span style="font-style: italic;"&gt; will aways &lt;/span&gt;&lt;span&gt;equal&lt;/span&gt;&lt;span style="font-style: italic;"&gt; 5&lt;/span&gt;. In the domain of C++,&lt;span style="font-style: italic;"&gt; local variables are destroyed in the reverse order that they were created in&lt;/span&gt; (insert whatever rule of the language you want there).&lt;br /&gt;&lt;br /&gt;Consider for a moment my previous post; I listed 11 things which I thought were essential for any programming student to know. Looking back, I notice that the top five items are all specific to C++ (since that's the language I talk in). Is it a coincidence that the five most important things any programming student can know are specific to the language they are using? I think not.&lt;br /&gt;&lt;br /&gt;Rather, I believe that to be a great programmer, one must have a deep understanding of the language at hand, and how that language allows you to express logical problems. One must approach a program like a mathematical problem - that is, one must  know the rules of the language, and then use those rules to design a proof that conclusively solves the logical problem using the language at hand.&lt;br /&gt;&lt;br /&gt;That last point is worth reiterating: Anyone can write a program that appears to solve a problem most of the time. However, for non-trivial problems it becomes much harder to guarantee that the program will solve the problem 100% of the time. As we get further into the "edge cases" of the application logic it becomes less likely such a naive implementation will work correctly. However, a program that has been built from the ground up using the guaranteed behavior of the language can still contain bugs, but it's much more likely that they are logic errors introduced by the programmer, rather than subtle bugs introduced through language misuse.&lt;br /&gt;&lt;br /&gt;At this point I must point out that I do not believe that Dijkstra's idea is as good as he makes it sound. He addresses one point - that students should understand the rules of the language, but a "love of the language"is only half the picture. There are also many non-language related skills that come in to play. Consider debugging for example; there are formal techniques that can be used to debug certain types of errors. Knowing these techniques, and knowing when to employ them is a powerful aid in any language, and these are skills that should be taught, rather than learned in an &lt;span style="font-style: italic;"&gt;ad hoc&lt;/span&gt; approach.&lt;br /&gt;&lt;br /&gt;So, my revised top 10 list of things every programming student should know can now be revised into this, much shorter form:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Know your language. I don't care what your language is - if you want a job it had better be something that's being used, but you can be a great programmer even if all you know is an out-dated language. Not only do you need to know your language, you need to have a passion for knowing your language - you must actively want to extend your knowledge of the language and how it works, what guarantees it provides and which it doesn't. This knowledge will translate into programs that use the features of the language to create minimal, efficient, well structured and error-free programs.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Be willing to learn new techniques. There are so many useful techniques and skills for a new programmer to have that I cannot list them all here, and course designers cannot possibly include them all in their course material.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;That's it - two things. Much better than the self-absorbed tripe I rattled off a few weeks ago. To anyone who actually bothered to read that, I apologize profusely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-7455483760999947429?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/12/teaching-programming-mk-2.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7455483760999947429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7455483760999947429'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/12/teaching-programming-mk-2.html' title='Teaching Programming mk. 2'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/ST11SEXoTPI/AAAAAAAAB-U/O-cyquQsn8M/s72-c/uf012030.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-8785333106328892157</id><published>2008-11-22T00:01:00.003+13:00</published><updated>2008-11-24T07:02:28.095+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Holiday'/><category scheme='http://www.blogger.com/atom/ns#' term='sport'/><title type='text'>All BLacks vs. Wales</title><content type='html'>I don't normally write about sport, but I thought I'd mention that I'm about to start the long drive to Wales to see the match this weekend. My money's on the &lt;a href="http://www.allblacks.com/"&gt;All Blacks&lt;/a&gt; to take the match, but many people have &lt;a href="http://news.bbc.co.uk/sport1/hi/rugby_union/7740976.stm"&gt;suggested that it may be a close call&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Will post an update upon my return!&lt;br /&gt;&lt;br /&gt;EDIT: Well, I'm back. The Rugby was awesome, possibly the best game I've ever seen. I wanted to post a link to a highlights video on YouTube, but it seems no one has posted one yet. Instead, I'll post a video of the initial stand-off between the teams after the Haka. The atmosphere was incredible - a full house (74 thousand strong) all screaming at the top of their lungs. Good fun. Anyway, you can see it here:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="349"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QifcERcy-bA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/QifcERcy-bA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="349"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8785333106328892157?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/11/all-blacks-vs-wales.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8785333106328892157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8785333106328892157'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/11/all-blacks-vs-wales.html' title='All BLacks vs. Wales'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7322507707154207986</id><published>2008-11-16T22:55:00.000+13:00</published><updated>2008-11-16T22:54:44.988+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XHTML'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>The data: URL scheme</title><content type='html'>Here's something you may not already know: You can include data directly in an (x)html page, instead of referencing it externally.&lt;br /&gt;&lt;br /&gt;For example, most of the time when you want to display an image you would write code like this:&lt;br /&gt;&lt;br /&gt;&amp;lt;img src="http://www.blogger.com/some_image.png" alt="some random image" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Web browsers downloading your HTML source will download the text first, then download any external references, including "some_image.png" (assuming the user has not turned off image downloading).However, there are a few cases where you want to distribute an HTML file with images, but don't want to distribute multiple files. In those cases, the 'data:' URL scheme is what you need.&lt;br /&gt;&lt;br /&gt;The scheme is documented in the (very readable) RFC2339. Essentially, you can include the binary data straight into your HTML code. The example they give in the RFC looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;img src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw%20%20%20AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz%20%20%20ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp%20%20%20a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl%20%20%20ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis%20%20%20F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH%20%20%20hhx4dbgYKAAA7" alt="Larry" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Which equates to this image:&lt;br /&gt;&lt;br /&gt;&lt;img alt="Larry" src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw%20%20%20%20AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz%20%20%20%20ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp%20%20%20%20a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl%20%20%20%20ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis%20%20%20%20F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH%20%20%20%20hhx4dbgYKAAA7" /&gt;&lt;br /&gt;&lt;br /&gt;There are many reasons why you wouldn't want to do this - it increases the size of your HTML file, forcing users to download more before they can see whether your content is what they want (especially if the embedded data is near the beginning of the file). There are also some limitations on the size of data and those limitations vary depending on where this technique is used. Still, it's a useful technique that can be used when you need to embed small amounts of binary data within an HTML file and you don't want to distribute multiple files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-7322507707154207986?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/11/httpwww.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7322507707154207986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7322507707154207986'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/11/httpwww.html' title='The data: URL scheme'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5054772143829894963</id><published>2008-11-07T07:03:00.004+13:00</published><updated>2008-11-11T09:22:29.483+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Ten Things to Teach Programming Students</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;While talking to a friend recently, we began discussing the role of graduates in the industry. My belief is that employers employ graduates and expect them to have the same skill level as their existing, trained employees (I have certainly seen this first-hand). Having been on the "other side" of the problem I appreciate that graduates are rarely fit for the tasks set for them without further training.&lt;br /&gt;&lt;br /&gt;This got me thinking: If there were 10 things graduates should know before graduating, what should they be? What short list of skills can graduates teach themselves to become better than their competition (and getting that first job is just that: a competition). That train of thought spawned the following list:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ten things programming students should know before graduating:&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Inheritance &amp;amp; Composition&lt;/b&gt;. In the land of OO, you must know what inheritance does for you. In C++, this means that you must know what public, protected and (rarely used) private inheritance &lt;i&gt;means&lt;/i&gt;. If class A is publically inherited form class B, that does that tell you about the relationship between A and B? What about if the inheritance was protected, rather than public? In a similar vein, what does virtual inheritnace do, and when would you want to use it? Sooner or later a graduate programmer will discover a complex case of multiple inheritance, and they need to be able to cope with it in a logical fashion. Knowing the answers to the above questions will help.&lt;br /&gt;Unfortunately, a lot of the time inheritance is over-used. Just because we have access to inheritance, doesn't mean we should use it &lt;i&gt;all the time! &lt;/i&gt;Composition can be a useful tool to provide clean code where inheritance would muddy the waters. Composition is such a basic tool that many graduates don't even think of it as a tool. Experience will teach when to use composition and when to use inheritance. Graduates have to know that both can be solutions to the same problem.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Memory Allocation&lt;/b&gt;. So many graduates do not understand the importance of cleaning up after yourself. Some do not fully appreciate the difference between creating objects on the &lt;i&gt;stack &lt;/i&gt;and on the &lt;i&gt;heap&lt;/i&gt;. Some know that but fail to understand how memory can be leaked (exceptions are a frequent cause of memory leaks in novice programmers). Every programmer should know the basic usage of &lt;span style="font-family:Courier New;"&gt;new&lt;/span&gt;, &lt;span style="font-family:Courier New;"&gt;new[]&lt;/span&gt;, &lt;span style="font-family:Courier New;"&gt;delete&lt;/span&gt; and &lt;span style="font-family:Courier New;"&gt;delete[]&lt;/span&gt;, and should know when and how to use them.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Exceptions&lt;/b&gt;. Most programmers share a love / hate relationship with exceptions; You gotta know how to catch them, but at the same time you tend to avoid using them yourself. Why? Because exceptions should be .... exceptional! There's a reasonably large amount of overhead associated with throwing and catching exceptions. Using exception as return values or flow-control constructs are two examples of exception mis-use. Exceptions should be thrown only when the user (or programmer) does something so bad that there's no way to easily fix or recover from it. Running out of resources (whether it be memory, disk space, resource Ids or whatever) is a common cause for exceptions to be thrown.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Const correctness&lt;/b&gt;. Const correctness is so simple, yet so many programmers just don't bother with it. The big advantage of const-correctness is that it allows the compiler to check your code for you. By designating some methods or objects const you're telling the compiler "&lt;i&gt;I don't want to change this object here&lt;/i&gt;". If you do accidentally change the object the compiler will warn you.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Threading&lt;/b&gt;. Threading is hard. There's no simple way around this fact. Unfortunately, the future of PC hardware seems to be CPUs with many cores. Programs that do not make use of multiple threads have no way to make use of future hardware improvements. Even though using libraries like Qt that make it ridiculously easy to create threads and pass data between threads, you still need to understand what a thread is, and what you can and cannot do. A very common thing I see in new programmers is a tendency to use inadequate synchronization objects in threads. Repeat after me: "&lt;i&gt;A &lt;span style="font-family:Courier New;"&gt;volatile bool&lt;/span&gt; is &lt;b&gt;not&lt;/b&gt; a synchronization object!&lt;/i&gt;".&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Source control&lt;/b&gt;. Every programmer on the planet should know how to use at least one version control system. I don't care if it's distributed or not, whether it uses exclusive locks or not, or even if it makes your tea for you. The concepts are the same. Very few professional programmers work alone. Graduates must be able to work in a team - that includes managing their code in a sensible fashion.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Compiler vs Linker&lt;/b&gt;. Programmers need to understand that compiling an application is a two step process. Compilation and Linking are two, discreet, and very different steps. Compiler errors and Linker errors mean very different things, and are resolved in very different ways. Programmers must know what each tool does for them, and how to resolve the most common errors.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Know how to debug&lt;/b&gt;. When something goes wrong, you need to know how to fix it. Usually, finding the problem is 90% of the work, fixing it is 5% of the work, and testing it afterwards is another 10%. No, that's not a typo - it does add up to more than 100%, which is why there's a lot of untested code out there! Of course, if you were &lt;i&gt;really &lt;/i&gt;good you wouldn't write any bugs in the first place!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Binary Compatibility&lt;/b&gt;. This one is for all those programmers that write library code, or code that gets partially patched over time. As you probably already know, shared libraries contain a table of exported symbols. If you change that table so a symbol is no longer available (or it's signature changes), code that uses that symbol will no longer work. There's a list of things you can and cannot do while maintaining binary compatability, and it's &lt;i&gt;very&lt;/i&gt; hard not to break those rules, even if you know what you're doing. I've &lt;a href="http://tech-foo.blogspot.com/2008/01/maintaining-binary-compatability.html"&gt;blogged about this before&lt;/a&gt;, and linked to the &lt;a href="http://techbase.kde.org/index.php?title=Policies/Binary_Compatibility_Issues_With_C%2B%2B"&gt;KDE binary compatibility page on techbase&lt;/a&gt; - worth a read!&lt;br /&gt;The main method of maintaining binary compatibility is to program to an interface, rather than to an implementation. Once you start paying attention to binary compatibility, you'll quickly realise that it's a very bad idea to export your implementation from a shared library, for one simple reason: If you want to change your implementation you're stuck with the restrictions placed upon you by the need to maintain binary compatibility. If  all you export is a &lt;a href="http://en.wikipedia.org/wiki/Interface_%28computer_science%29"&gt;pure interface&lt;/a&gt; and a means to create it (possibly via a &lt;a href="http://en.wikipedia.org/wiki/Factory_method_pattern"&gt;factory method&lt;/a&gt;) then you can change the implementation to your heart's content without having to resort to &lt;a href="http://en.wikipedia.org/wiki/Opaque_pointer"&gt;pimpl pointers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Read the right books&lt;/b&gt;. There are a few movers and shakers in the programming industry that it pays to keep an eye on. There are many books worth reading, but I'm going to recommend just two. The first is "&lt;a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612"&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;", and the second is the "&lt;a href="http://www.amazon.com/Effective-Specific-Addison-Wesley-Professional-Computing/dp/0321334876/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1225991839&amp;amp;sr=1-1"&gt;Effective C++&lt;/a&gt;" series. Neither are considered to be great bedtime reading, both are considered to be packed from cover to cover with things that will help you out in every-day situations. Any programmer worth his or her salt will own a copy of at least one of these books, if not both. Of course, there are books on UI design and usability, threading, text searching, SQL and database maintenance, networking, hardware IO, optimisation, debugging... the list goes on.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Networking&lt;/b&gt;. &lt;i&gt;What's this? An 11th item?&lt;/i&gt; That's right: it's in here because it cannot be ignored in &lt;i&gt;most&lt;/i&gt; programming tasks. It's getting harder and harder to avoid networking. Most graduates will have to write code that sends data over a network sooner or later, so they'll need to know the difference between UDP and TCP and IP, as well as what the basic network stack looks like (think "&lt;i&gt;Please Do Not Touch Steve's Pet Alligator&lt;/i&gt;"), and what each layer does. Being familiar with tools like &lt;a href="http://www.wireshark.org/"&gt;wireshark&lt;/a&gt; helps here.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;What's &lt;i&gt;not&lt;/i&gt; in the list:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You may notice that I haven't included any specific technologies in this list. That's because I firmly believe that it really doesn't matter. Sure, there are some libraries that are better than others (I'd bet my life on a small set of libraries), but the programmer next to me has a different set. I care not one &lt;i&gt;grote&lt;/i&gt; whether a graduate knows how to program in .NET, Qt, wxWidgets or anything else - as long as they're willing to learn something new (whatever I'm using on my project).&lt;br /&gt;&lt;br /&gt;Which brings me nicely to the conclusion: The single quality I see in all the programmers I admire is a sense of curiosity; a restlessness and a sense of adventure. Our industry is constantly shifting. The best programmers are able to ride the changes and come out better for it.&lt;br /&gt;&lt;br /&gt;Is this post horribly self-indulgent and boring? Probably, but it had to be done. Have I forgotten anything? Things you feel should be on the list that are missing? Remember that the point of the exercise is to keep a &lt;i&gt;small&lt;/i&gt; list - I could list every programming skill and technology required under the sun, but that would not be very useful would it?&lt;br /&gt;&lt;br /&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/128616657362436845-5054772143829894963?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/11/top-10-things-to-teach-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5054772143829894963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5054772143829894963'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/11/top-10-things-to-teach-programming.html' title='Ten Things to Teach Programming Students'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-3463041225775890955</id><published>2008-10-31T10:14:00.004+13:00</published><updated>2008-10-31T10:24:53.132+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='Trolltech'/><category scheme='http://www.blogger.com/atom/ns#' term='Holiday'/><category scheme='http://www.blogger.com/atom/ns#' term='vacation'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='project greenhouse'/><title type='text'>Releases Galore!</title><content type='html'>It would be negligent of me if I did not point out that today several important software releases were made:&lt;br /&gt;&lt;br /&gt;The first is the project formerly known as project greenhouse - now known as &lt;a href="http://trolltech.com/developer/qt-creator"&gt;Qt Creator&lt;/a&gt;. I've &lt;a href="http://tech-foo.blogspot.com/2008/10/its-true-qt-developer-days-rock.html"&gt;blogged about this before&lt;/a&gt;. You can now &lt;a href="http://trolltech.com/developer/qt-creator/qt-creator#download-qt-creator"&gt;download a technical preview&lt;/a&gt;. I'm very excited about this - having played with it in it's beta state I can't wait to use it with some of my active projects. Unfortunately I won't be doing any coding this weekend, as I'm off to Switzerland for a long weekend. I'll have to try it out when I get back.&lt;br /&gt;&lt;br /&gt;The second big release event today is the &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; &lt;a href="http://www.xubuntu.org/"&gt;family&lt;/a&gt; of distributions. That's right, version 8.10 is out now. I'm a &lt;a href="http://www.kubuntu.org/"&gt;kubuntu&lt;/a&gt; man myself, so I'll be trying this out after my long weekend as well.&lt;br /&gt;&lt;br /&gt;That's all from me - I have several projects in the wings to blog about in the coming weeks, but for now I need to catch some sleep - my taxi arrives at 5:00 AM tomorrow.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3463041225775890955?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/10/releases-galore.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3463041225775890955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3463041225775890955'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/10/releases-galore.html' title='Releases Galore!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6009945479164273133</id><published>2008-10-25T04:34:00.002+13:00</published><updated>2008-10-26T00:13:46.465+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='WTF'/><category scheme='http://www.blogger.com/atom/ns#' term='VMWare'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualisation'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>VMWare Server 2: Worse Than Failure</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;OK, so this is hardly breaking news, but I thought I'd share this mini-rant with you now any way.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At work We deal with multiple operating systems (WinXP, Vista, Linux), and multiple programming environments. A few weeks ago I decided to take the plunge and do all my development work inside virtual machines. The advantage of this approach is that it's very fast to switch from one environment to another (much faster than a whole machine reboot).&lt;br /&gt;&lt;br /&gt;There are two problems with this approach:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Performance&lt;/span&gt;. Programming is a pretty CPU-intensive task. Well, compiling the code is anyway. Compiling our code base takes around an hour on a physical machine with top-of-the-line specs (&lt;span style="font-style: italic;"&gt;this makes compiling the Linux kernel seem fast&lt;/span&gt;). On a virtual machine, that time doubles. This is an inescapable truth about software virtualization: there will always be some overhead.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Hardware&lt;/span&gt;. The applications I program need access to physical hardware, over a variety of interfaces, including RS232, RS422, USB, Parallel, TCP/IP, UDP/IP and a few others besides. Any software virtualization package must be able to forward all these hardware interfaces through to the virtual machine.&lt;/li&gt;&lt;/ol&gt;In my experience, the only software virtualization package that meets requirement 2 is VMWare. I know &lt;a href="http://tech-foo.blogspot.com/2008/03/virtualisation-under-linux.html"&gt;I've raved about Virtualbox before&lt;/a&gt;, and I was very tempted to use it again now, but it lacks the hardware support I need.&lt;br /&gt;&lt;br /&gt;So, VMWare Server it is then. The next question then becomes: which version? I've used version 1.x before, and it fulfilled all my needs at the time. However, I noticed that version 2 is now available. I thought "&lt;span style="font-style: italic;"&gt;In software, bigger numbers are better, right?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After downloading the sevrer, and registerring for a free license key, I spent a busy 30 minutes clicking through the ubiquitous license agreements and installation options (does anyone ever read these things?). Everything was installed. I went to fire the application up, only to have it launch &lt;a href="http://www.mozilla-europe.org/en/firefox/"&gt;Mozilla Firefox&lt;/a&gt;. What's going on here? Then it hit me: a wave of fear and horror. What were they thinking?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The managment interface for VMWare Server 2 is web based.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's right... you want to use your virtual machine? You need to run a web browser. The interface is slow, the browser plugin that supports the interface is buggy... I could go on, but some other people have &lt;a href="http://4sysops.com/archives/review-vmware-server-2-what-a-disappointment/"&gt;detailed the problems with the software&lt;/a&gt; far better than I ever could (Yes, I realise that link is talking about the beta release. Trust me, nothing much has changed).&lt;br /&gt;&lt;br /&gt;Maybe I'm missing something, some gold nugget of understanding that would make Server 2 more usable for me, but right now I just don't get it. Why would you decide that the primary interface to a virtual machine should reside inside a browser? Browsers are notorious for implementing different standards, being generally slow, memory-hogging apps that occaisonally crash. Who in their right mind would want to use a browser for their virtual machines?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Until then, I'll stick with VMWare server 1, thank you very much.&lt;br /&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/128616657362436845-6009945479164273133?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/10/vmware-server-2-worse-than-failure.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6009945479164273133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6009945479164273133'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/10/vmware-server-2-worse-than-failure.html' title='VMWare Server 2: Worse Than Failure'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-7381718238672765731</id><published>2008-10-18T06:26:00.003+13:00</published><updated>2008-10-18T23:14:50.977+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='project greenhouse'/><title type='text'>It's true: Qt Developer Days Rock!</title><content type='html'>Well, I'm back. I arrived home at 1:30 AM this morning. &lt;a href="http://trolltech.com/qtdevdays2008"&gt;Qt Software's "Developer Days"&lt;/a&gt; conference was simply brilliant. On top of the many technical talks (I'll digest them and use them as inspiration for new posts here over the next few weeks), it was a great chance to meet other Qt developers, and the trolls themselves.&lt;br /&gt;&lt;br /&gt;There's a lot of stuff to talk about - more than I can do justice in one post. I will quickly mention Project Greenhouse, the new IDE that should be released as alpha software in the next few weeks. Details are sketchy, but the following points are &lt;span style="font-style: italic;"&gt;probably&lt;/span&gt; all correct:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"Project Greenhouse" is the development title - it may chance before release.&lt;/li&gt;&lt;li&gt;The IDE is aimed at creating a truly cross-platform development environment.&lt;/li&gt;&lt;li&gt;Uses GCC / GDB to compile / debug code.&lt;/li&gt;&lt;li&gt;Includes nice editor features like code folding, syntax highlighting, auto-completion etc.&lt;/li&gt;&lt;li&gt;It's been touted as a "replacement for Vi/Emacs" - although this is misleading - as I understand it no one is going to create a Vi clone editor in the IDE. It's a replacement in the sense that you will no longer need to use Vi in order to edit your code under Linux.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;One point the trolls were very insistent upon was that they're not trying to replace Visual Studio, Eclipse, KDevelop, or XCode. Those IDEs have a great many features, whereas PG intends to deliver a core set of features - just enough to make Qt development a breeze across multiple platforms.&lt;br /&gt;&lt;br /&gt;At least, that's &lt;span style="font-style: italic;"&gt;my&lt;/span&gt; interpretation of the project. There's been lots of speculation across the internet and on the Qt-interest mailing list about the project, so we may have to wait and see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-7381718238672765731?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/10/its-true-qt-developer-days-rock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7381718238672765731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7381718238672765731'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/10/its-true-qt-developer-days-rock.html' title='It&apos;s true: Qt Developer Days Rock!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8302893383996585441</id><published>2008-10-12T22:40:00.003+13:00</published><updated>2008-10-12T22:43:20.710+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trolltech'/><category scheme='http://www.blogger.com/atom/ns#' term='Holiday'/><category scheme='http://www.blogger.com/atom/ns#' term='Business'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>TT Dev Days: Here I come!</title><content type='html'>Just thought I'd let you all know that I'll be attending the &lt;a href="http://trolltech.com/qtdevdays2008/munich"&gt;Trolltech Developer Days in Munich, Germany&lt;/a&gt;. I'm not taking my laptop, so I probably won't update this site while I'm there (not that you'd notice a change in activity levels, right?), but I hope to provide a few details once I get back.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Until then, keep coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8302893383996585441?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/10/tt-dev-days-here-i-come.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8302893383996585441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8302893383996585441'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/10/tt-dev-days-here-i-come.html' title='TT Dev Days: Here I come!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7899414688545583992</id><published>2008-09-26T06:42:00.002+12:00</published><updated>2008-09-26T06:45:17.568+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='Wii'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>End of the world as we know it?</title><content type='html'>This is a short post - I am overcome with grief. I have been waiting for spore to arrive on the Wii, and now I hear &lt;a href="http://www.playfuls.com/news_7072_Spore_Refuses_To_Invade_Nintendo_Wii_At_Least_For_Now.html"&gt;it will never arrive&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So many years of anticipation; so much disappointment - DRM issues aside I was still looking forward to this. Now I won't have a chance to sample that sweet candy of gaming goodness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-7899414688545583992?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/09/end-of-world-as-we-know-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7899414688545583992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7899414688545583992'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/09/end-of-world-as-we-know-it.html' title='End of the world as we know it?'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-3901030869072285380</id><published>2008-09-19T22:19:00.005+12:00</published><updated>2008-09-19T22:23:02.660+12:00</updated><title type='text'>Slackware Rant</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Yes, this is a rant. pure, unaltered hate and bile to follow:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;rant&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Check out the first sentence on the Slackware "&lt;a href="http://www.slackware.com/info/"&gt;General Info&lt;/a&gt;" page:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The Official Release of Slackware Linux by Patrick Volkerding is an advanced Linux operating system, designed with the twin goals of ease of use and stability as top priorities. Including the latest popular software while retaining a sense of tradition, providing simplicity and ease of use alongside flexibility and power, Slackware brings the best of all worlds to the table.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Does anyone using slackware actually believe this? How is a distribution that has no graphical installer, no network-enabled package managment and a severely restrictive list of packages available on the default install easy to use? How is slackware more advanced than a distribution that provides proper package managment services?&lt;br /&gt;&lt;br /&gt;I guess when they say "&lt;span style="font-style: italic;"&gt;while retaining a sense of tradition&lt;/span&gt;" they mean "&lt;span style="font-style: italic;"&gt;feels like you just stepped into a time-warp into the Linux distros fo yester-year&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;I guess it's fine for those of you who want the massochistic rituals of using Linux in the early 1990's (I was there: been there, done that, bought the T-shirt). The the sane members of the human race who want a proper Linux distribution I strongly recommend something else.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/rant&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I think I need more practise at ranting - that was pretty tame really, but I feel better, whcih is the most important thing.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3901030869072285380?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/09/slackware-rant.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3901030869072285380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3901030869072285380'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/09/slackware-rant.html' title='Slackware Rant'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-242115608563040257</id><published>2008-09-14T23:45:00.003+12:00</published><updated>2008-09-15T00:15:37.565+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>threads vs. processes</title><content type='html'>It's been a few weeks since my last post. My excuse is that I've been busy - my job is always busy around this time of year due to the &lt;a href="http://www.ibc.org/"&gt;IBC trade show&lt;/a&gt;. Thankfully most of the work is now done. In my own time I've been working on a number of projects (to be unveiled shortly, once they're usable).&lt;br /&gt;&lt;br /&gt;In the last few weeks we've seen the launch of the &lt;a href="http://www.google.com/chrome/"&gt;google chrome browser&lt;/a&gt;. I won't discuss it here directly (&lt;a href="http://devcentral.f5.com/weblogs/Joe/archive/2008/09/02/google-chrome---review.aspx"&gt;plenty&lt;/a&gt; &lt;a href="http://www.usefulconcept.com/index.cfm/2008/9/2/Google-Chrome-Review"&gt;of other&lt;/a&gt; &lt;a href="http://www.techzilo.com/google-chrome-review/"&gt;people&lt;/a&gt; &lt;a href="http://www.pcworld.com/article/150579/google_chrome_web_browser.html"&gt;have reviewed&lt;/a&gt; &lt;a href="http://www.techradar.com/news/internet/hands-on-google-s-chrome-462474"&gt;it separately&lt;/a&gt;). I will, however mention the one feature that has converted me away from &lt;a href="http://www.mozilla-europe.org/en/firefox/"&gt;firefox&lt;/a&gt; and towards chrome:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Google Chrome has a multi-process architecture, meaning tabs can run in separate processes from each other, and from the main browser process.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;What this means in theory is that a misbehaving website cannot bring down the entire browser session - you can just close / kill the offending tab / window.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;This is pretty cool, but how does it relate to my own work? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm writing an application that makes extensive input of python scripts to customize the input and output of the application. I could have spend a while embedding the python scripts using the python API, and then running those separate scripts in a thread, but instead I chose to run them as separate processes spawned by a central application. The way I see it, this approach has several advantages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Crashing child processes (in this case python scripts) are unlikely to bring down the entire application - you still need to be careful since there's likely to be communication between child and parent process, and the parent needs to be able to hand corrupted data in that communication. Other than that, if one of my scripts breaks, I can easily carry on; no error handling or cleanup needs to be done.&lt;/li&gt;&lt;li&gt;In my application, I need to repeatedly call the script files - probably thousands of times for a single application run. In a traditional threaded environment the possibility for memory leaks is huge. This way, since each sub-process is short lived, the operating system takes charge of cleaning up any memory not deallocated by the child process.&lt;/li&gt;&lt;li&gt;It's a &lt;span style="font-style: italic;"&gt;damn site&lt;/span&gt; easier to program too. No thread synchronization required!&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;It's not all roses however. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From my experiences the main drawback is that it's much harder to pass data between parent and child processes. For simple communication it may be enough to use &lt;span style="font-style: italic;"&gt;stdin&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;stdout&lt;/span&gt;, but for anything more complicated you'll want to use some form of &lt;a href="http://en.wikipedia.org/wiki/Inter-process_communication"&gt;proper IPC&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Berkeley_sockets"&gt;sockets&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Named_pipe"&gt;named pipes&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/DBus"&gt;DBus&lt;/a&gt; etc). Even with proper IPC it's still harder to pass custom data structures between processes, since you'll need some sort of data serialization.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Think this all sounds obvious?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's because it really is! I can't believe how much simpler this approach is, especially if your requirements are for simple delegation to scripts or sub-processes. If you require more complex interaction you might find this approach more trouble than it's worth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-242115608563040257?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/09/threads-vs-processes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/242115608563040257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/242115608563040257'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/09/threads-vs-processes.html' title='threads vs. processes'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-3525202613123418566</id><published>2008-08-31T03:16:00.003+12:00</published><updated>2008-08-31T03:24:19.775+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualisation'/><title type='text'>virtualbox rocks</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WNsQRabEE38/SLllXpjn0cI/AAAAAAAABbM/SVyC9yrys94/s1600-h/vrtualbox-winXP.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_WNsQRabEE38/SLllXpjn0cI/AAAAAAAABbM/SVyC9yrys94/s400/vrtualbox-winXP.png" alt="" id="BLOGGER_PHOTO_ID_5240331098388943298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I know I've &lt;a href="http://tech-foo.blogspot.com/2008/03/virtualisation-under-linux.html"&gt;said this before&lt;/a&gt;, but &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; kicks ass. It has that whole "&lt;span style="font-style: italic;"&gt;it just WORKS&lt;/span&gt;" feel to it. I realise that repeating yourself is supposedly one of the hallmarks of a bad blog, but please indulge me this once; VirtualBox deserves your attention. The image to your right shows virtualbox running windows XP - I'm installing &lt;a href="http://www.trolltech.com"&gt;Qt4.4&lt;/a&gt; in the hope that some of the bugs I mentioned in my previous post have been cleaned up.&lt;br /&gt;&lt;br /&gt;I'm also compiling the latest &lt;a href="http://www.kde.org"&gt;KDE4&lt;/a&gt;, which is where a multi-core system would be really nice. Until then, I'll continue to struggle with my old box.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3525202613123418566?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/08/virtualbox-rocks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3525202613123418566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3525202613123418566'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/08/virtualbox-rocks.html' title='virtualbox rocks'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/SLllXpjn0cI/AAAAAAAABbM/SVyC9yrys94/s72-c/vrtualbox-winXP.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-1632422227256188419</id><published>2008-08-28T00:55:00.001+12:00</published><updated>2008-08-28T06:56:26.845+12:00</updated><title type='text'>Twitter Submission</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;I posted previously that &lt;a href='http://tech-foo.blogspot.com/2008/04/twitter-i-don-get-it.html'&gt;I just didn't "get" twitter&lt;/a&gt;. I guess &lt;a href='http://www.osnews.com/story/19587/Relevant'&gt;this sums up my objections pretty well&lt;/a&gt;; unless you have anything interesting to say, stay silent. Do we really need one more idiot blathering on about the most mundane details of his life? I think not.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Even some of my most &lt;a href='http://twitter.com/codinghorror'&gt;respected&lt;/a&gt; &lt;a href='http://twitter.com/aseigo'&gt;peers&lt;/a&gt; seem to be reduced to complete morons when it comes to their twitter feeds.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;However, it turns out that the cost of my stubbornness to jump on the twit bandwagon has grown to the point where I am now on twitter. That's right, I'm bowing to peer pressure, and have officially jumped on the twit wagon - You can see my last twitter updates on the right, or you can &lt;a href='http://twitter.com/thomir'&gt;follow me on twitter&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Now the entire world can join me in my mindless ramblings... of course, if you're reading this then you've already had that pleasure!&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-1632422227256188419?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/08/twitter-submission.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1632422227256188419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1632422227256188419'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/08/twitter-submission.html' title='Twitter Submission'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8847951342650050463</id><published>2008-08-26T00:15:00.004+12:00</published><updated>2008-08-26T00:29:19.327+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='soekris'/><category scheme='http://www.blogger.com/atom/ns#' term='router'/><category scheme='http://www.blogger.com/atom/ns#' term='wireless'/><title type='text'>Buffalo Routers Rock!</title><content type='html'>&lt;span style="font-style: italic;"&gt;Waaaaay&lt;/span&gt; back in Janurary I mentioned that I might &lt;a href="http://tech-foo.blogspot.com/2008/01/post-vacation-blues.html"&gt;build my own wireless router&lt;/a&gt;. Well, like most of my projects I got half way then got distracted. The other day i got fed up with the lack of wireless (I needed to get my &lt;a href="http://uk.wii.com/"&gt;Wii&lt;/a&gt; online, apart from anything else), so I splashed out and bought a &lt;a href="http://www.buffalo-technology.com/products/wireless/wireless-g-mimo-performance/wireless-g-mimo-performance-router-with-dd-wrt/"&gt;Buffalo Air-Station&lt;/a&gt; (£45).&lt;br /&gt;&lt;br /&gt;This baby comes pre-loaded with the open source &lt;a href="http://www.dd-wrt.com/"&gt;dd-wrt firmware&lt;/a&gt;. It was dead-easy to set up, and boy, what a difference the open firmware makes! This is easily the best router firmware I have ever seen - it boasts more feature than you can shake a stick at. Better yet - it's aimed at people who know what they're doing, and doesn't try to hide it's functionality behind restrictive setup "wizards".&lt;br /&gt;&lt;br /&gt;All in all, I'm a very happy man with my new wireless network ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8847951342650050463?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/08/waaaaay-back-in-janurary-i-mentioned.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8847951342650050463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8847951342650050463'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/08/waaaaay-back-in-janurary-i-mentioned.html' title='Buffalo Routers Rock!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-3499290380690049952</id><published>2008-08-08T23:52:00.003+12:00</published><updated>2008-08-08T23:54:44.419+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>pointer quiz</title><content type='html'>One of my pet peeves with regards to C++ is how very few people understand how the delete operator handles NULL pointers. Let's see if you pass the test!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question&lt;/b&gt;: What happens when you do this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;myType *ptr = NULL;&lt;br /&gt;delete ptr;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well? Your choices are:&lt;br /&gt;&lt;br /&gt;a) Crash, bang, boom, your computer is now a very heavy paperweight.&lt;br /&gt;b) Nothing - the delete line ignores the ptr to be deleted.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It turns out that &lt;i&gt;deleting a null pointer is safe&lt;/i&gt;. Section 5.3.5/2 of the C++ standard states that:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"In either alternative, if the value of the operand of delete is the&lt;br /&gt;null pointer the operation has no effect."&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This has been a pet peeve of mine for a while now. I can't count the number of times I've seen programmers write something like this in class destructors or cleanup methods:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (pMyPtr)&lt;br /&gt; delete pMyPtr;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is stupid for several reasons. For a start, the if statement is redundant - if the pointer is NULL the delete will do nothing. Secondly, the programmer never sets the pointer to NULL after deleting it, which means that if this code were to be called again, you would definitely experience problems.&lt;br /&gt;&lt;br /&gt;In order to avoid these issues, and avoid angering me if I ever see your code, you should:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt; &lt;li&gt;Always initialize pointers to NULL if you're not going to set them to something else straight away (i.e.- if the pointer is not always used).&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Always set them to NULL after you delete them, especially if there's a chance that the delete can be called twice.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3499290380690049952?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/08/pointer-quiz.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3499290380690049952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3499290380690049952'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/08/pointer-quiz.html' title='pointer quiz'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-715668910345966033</id><published>2008-08-03T16:47:00.001+12:00</published><updated>2008-08-04T04:20:27.117+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='photos'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>piwup: A Picasaweb Image Uploader for Linux</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;One of my pet peeves has always been that unless you want to run &lt;a href="http://picasa.google.com/"&gt;google's picasa&lt;/a&gt; application under Linux, the only way to upload photos to your &lt;a href="http://picasaweb.google.com/"&gt;picasaweb&lt;/a&gt; account is via a klunky web interface that only allows you to select 5 images at a time. When I come back from a trip I have hundreds of photos, so this gets tiresome very quickly.&lt;br /&gt;&lt;br /&gt;There is a &lt;a href="http://www.kipi-plugins.org/drupal/"&gt;kipi plugin&lt;/a&gt; that is supposed to be able to do this, but it has not yet hit the Linux distribution I am using, and I'm not about to start compiling plugins from source. Besides, half the fun is in making the application!&lt;br /&gt;&lt;br /&gt;This is definitely not a finished application! I got it to the point where I could upload my images in a batch, but it needs more work before it's useful to anyone else. Here's a few sample screen shots:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_WNsQRabEE38/SJXTK8LZAUI/AAAAAAAABaE/SuZaWl-aT0U/s1600-h/piwup0.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230318727166755138" alt="" src="http://4.bp.blogspot.com/_WNsQRabEE38/SJXTK8LZAUI/AAAAAAAABaE/SuZaWl-aT0U/s400/piwup0.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Selecting images to upload.&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://1.bp.blogspot.com/_WNsQRabEE38/SJXUBqfbreI/AAAAAAAABaM/zaanrKlMZG0/s1600-h/piwup1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230319667311783394" alt="" src="http://1.bp.blogspot.com/_WNsQRabEE38/SJXUBqfbreI/AAAAAAAABaM/zaanrKlMZG0/s400/piwup1.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Uploading the first image.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;The application still has a long way to go. Just some of the things yet to complete are:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;span&gt;&lt;span&gt;&lt;li&gt;Remove hard coded items from the code (account details, service host, album name), and make these configurable via a nice configuration dialog. Make sure password is stored in a secure form - via the KDE wallet perhaps.&lt;/li&gt;&lt;li&gt;Make the GUI half-decent. Originally I just wanted something to work - I need to go back and do it again with a proper menu and image thumbnail support.&lt;/li&gt;&lt;li&gt;Bug fixes too numerous to mention here... this is some rouch, cheap and nasty code!&lt;/li&gt;&lt;/span&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;Perhaps, once I get all this done I will attempt to get it officially released into some distros. I think it's a useful application, and the &lt;a href="http://www.kipi-plugins.org/drupal/"&gt;kipi plugin&lt;/a&gt; version doesn't seem to be moving along much. Yes, I realize that I'd be better off spending my time improving the kipi plugin, but to be honest I can't be bothered right now - this was a learning experiment for me as much as it was about making an application that solved one of my problems.&lt;br /&gt;&lt;br /&gt;The entire application is written in C++ and Qt4. The more I use Qt the more I like it. This application was simplicity itself to make, and I look forward to continued development.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-715668910345966033?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/08/piwup-picasaweb-image-uploader-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/715668910345966033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/715668910345966033'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/08/piwup-picasaweb-image-uploader-for.html' title='piwup: A Picasaweb Image Uploader for Linux'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/SJXTK8LZAUI/AAAAAAAABaE/SuZaWl-aT0U/s72-c/piwup0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-1285875205284962794</id><published>2008-08-03T05:03:00.003+12:00</published><updated>2008-08-03T05:12:02.953+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Problem with pimpls</title><content type='html'>That's "pimpl", not "pimple" - I'm talking about &lt;b&gt;opaque pointers&lt;/b&gt;, these beauties help protect your public interfaces from changing implementation. This useful technique has a few drawbacks that aren't so well publicised. In order to prevent others making the same mistakes I have, I thought I'd outline the general use of the pimpl pointer, and some of it's drawbacks:&lt;br /&gt;&lt;br /&gt;Here's an example of a first-pass class to encapsulate a user account (I'm making this up on the fly, so bear with me):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;userAccount&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// public methods go here&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// private data members:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;unsigned&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; accountId;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    std::string username;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    std::string realName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;This will work just fine, but there's a problem. If you need to change the implementation (say you want to store the user's real name in two fields instead of one), unless you're very careful you will end up changing the size and / or the declaration of the class.&lt;br /&gt;&lt;br /&gt;Changing the size of the class is a big problem if you're trying to &lt;a href="http://tech-foo.blogspot.com/2008/01/maintaining-binary-compatability.html"&gt;maintain binary compatibility&lt;/a&gt;. Changing the declaration of the class is a problem because (some) compilers will now recompile every file that includes your changed header file, even if the changes make no difference to the binary output.&lt;br /&gt;&lt;br /&gt;The solution comes in the form of an &lt;a href="http://en.wikipedia.org/wiki/Opaque_pointer"&gt;opaque pointer&lt;/a&gt;, or "pointer to implementation" (which is where we get the charming "pimpl" name from). The idea is that the implementation details are put in a separate class that is forward declared in the header file, and fully declared in the cpp file. Your external interface now only contains a single pointer - you can change the size of your implementation class to your hearts content, and you will never change the size or declaration of your external interface. The class above refactored to use a pimpl pointer looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Header File:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// forward declare implementation class:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;userCountImpl;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;userAccount&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    userAccount();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// public methods go here&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// private data members:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    userAccountImpl *pimpl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Source File:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;userAccountImpl&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;unsigned&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; accountId;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    std::string username;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    std::string realName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userAccount::userAccount()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: pimpl(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; userAccountImpl)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now any data members can be accesed via the private implementation class. There are several things you can do to extend the example above (using a shard_ptr is a start), but I want to keep things simple for the sake of the example.&lt;br /&gt;&lt;br /&gt;Until recently, I took this method for granted and used it as often as I could. As so often happens when I learn something new I rush to use it in every possible situation, including ones where it doesn't make sense. The pimpl idiom has a few problems associated with it, which I will outline here:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Your object's memory footprint is now split into more than one place in memory. This may not be a huge problem for 90% of classes, but consider a small utility class that contains only standard data types:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; colour&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// public methods go here&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;unsigned&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;char&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; red;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;unsigned&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;char&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; green;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;unsigned&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;char&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; blue;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;In order to serialise this into a buffer (like a file), you can get away with using a memcpy or similar technique. Since your object's memory footprint is contiguos, copying the entire object into a file is simple (Yes yes, I know: there are &lt;b&gt;many&lt;/b&gt; reasons why this isn't a good idea, but let's face it - this happens all the time). Once you start using pimpl pointers it gets a bit more difficult. Since your implementation class is private to the .cpp file, the code to do the copying needs to be in the same cpp file (otherwise it doesn't have access to the  definition of the implementation class). This is relatively easy to work around, but the trouble doesn't stop there - consider what you need to do to un-serialise an object from a buffer. You can no longer be cheeky and use a reinterpret-cast like so:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;colour *pCol = (colour*) pBuffer;&lt;/span&gt;&lt;/pre&gt;Again - I realise that this isn't the best idea in the world, but when you're programming with constraints sometimes this is the best way to do things.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The default new and delete operators are expensive. I never realized just how expensive they can be. In a recent bout of performance testing on some real-time software I saw the default new operator take 55ms to allocate a block of 4B of memory. That's way too slow for the real-time application i was working on, and may be too slow for other applications as well. What's more, the times get worse the more memory you allocate - so using the pimpl pointer may not be a good idea at all, since it adds the overhead of a new call to each constructor, and a delete to each destructor. ouch!&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;If you're looking for more info on the pimpl idiom, Sutter wrote a good article on the &lt;a href="http://www.gotw.ca/gotw/024.htm"&gt;pimpl pointer&lt;/a&gt;, and a more recent article that talks about some of the &lt;a href="http://www.gotw.ca/gotw/028.htm"&gt;performance issues associated with pimpl pointers&lt;/a&gt;. This technique is worth using - it can save many attacks of "code cheese" in the future, just be careful where you us it, or you may end up with some nasty performance issues you didn't expect!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-1285875205284962794?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/08/problem-with-pimpls.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1285875205284962794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1285875205284962794'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/08/problem-with-pimpls.html' title='Problem with pimpls'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-249986852642029086</id><published>2008-07-22T22:03:00.001+12:00</published><updated>2008-07-22T22:03:10.858+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='commercial'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>Apathy, Apples and Understanding</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;You may notice that it's been a long time since my last post. Truth be told I've been lazy. It's tempting to say that I've been busy, but that's a sugar coating on apathy. For that I apologise! Hopefully I can get back into the habit of regular posting again soon.&lt;br /&gt;&lt;br /&gt;Inspiration struck the other day when Jeff Atwood posted an interesting article on his blog. &lt;a href='http://www.codinghorror.com/blog/archives/001154.html'&gt;"Dealing With Bad Apples"&lt;/a&gt; talks about how single members of a programming team can be difficult, often working against the rest of the team. &lt;br /&gt;&lt;br /&gt;Atwood quotes Robert Miesen:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I was part of a team writing an web-based job application and screening&lt;br /&gt;system (a job kiosk the customer called it) and my team and our&lt;br /&gt;customer signed on to implementing this job kiosk using Windows,&lt;br /&gt;Apache, PHP5, and the ZendFramework -- everyone except one of our team&lt;br /&gt;members, who I will refer to as "Joe". Joe kept advocating the use of&lt;br /&gt;JavaScript throughout the technology deliberation phase, even though&lt;br /&gt;the customer made it quite clear that he expected the vast majority of&lt;br /&gt;the job kiosk to be implemented using a server-side technology and all&lt;br /&gt;the validation should be done using server-side technology.&lt;br /&gt;&lt;p&gt;The fact that the customer signed off on this, however, did nothing&lt;br /&gt;to deter Joe from advocating JavaScript -- abrasively. Every time our&lt;br /&gt;project hit a bump in the road, Joe would go off on some tirade on how&lt;br /&gt;much easier our lives would be if we were only writing this job kiosk&lt;br /&gt;in JavaScript. Joe would constantly bicker about how we were all doing&lt;br /&gt;this all wrong because we weren't doing it in JavaScript, not even&lt;br /&gt;bother to learn the technologies we were actually using, and, whenever&lt;br /&gt;fellow teammates would try and gently bring him back into the fold&lt;br /&gt;(usually via email), Joe would just flame the poor guy. At the height&lt;br /&gt;of Joe's pro-JavaScript bigotry, he would regularly belt off comments&lt;br /&gt;like, "Well, if we had only done it in JavaScript," to such an extent&lt;br /&gt;that the team would have been better off if he had just quit (or was&lt;br /&gt;reassigned or fired.)&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;Jeff then goes on to suggest that perhaps the problem here is a "bad apple" - a team member that is doing more harm than good in a team. He's probably right, but I have a slightly different angle.&lt;br /&gt;&lt;br /&gt;Perhaps the real problem here is poor team leadership / management? Without meeting "Joe" personally, I cannot make any accurate assessment of the situation, but it seems to me that perhaps Joe feels undervalued in his team? I say this because i recognize that behavior pattern - in myself. &lt;br /&gt;&lt;br /&gt;In any team of programmers, each member will have different backgrounds, strengths and weaknesses. Joe obviously has experience using Javascript, and feels the need to share his expertise in that field. I'm not saying that this is a good thing, but perhaps the underlying problem is a lack of cohesion and understanding between team members?&lt;br /&gt;&lt;br /&gt;So, further to Atwood's list of warning signs for detecting "bad apples", I have a list of actions team leaders could consider taking when dealing with a so-called "bad apple":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Listen&lt;/i&gt; to them. Most geeks (I use the term with all possible affection) are reasonable people. If a team member is repeating themselves, perhaps they feel that their point was never seriously considered in the first place? I can't count the number of times I've made contributions in meetings that were ignored, only to hear (usually six weeks later) "&lt;i&gt;hey, we should have done X, what a pity it's too late now...&lt;/i&gt;". It always seems petty to point out that I suggested &lt;i&gt;X&lt;/i&gt; from the start. Bear with me here - I'm certainly not suggesting that I'm always right - far from it; my point is that you ignore contributions from your team members at your own risk!&lt;br /&gt;&lt;br /&gt;Finally, I'm not suggesting that team leaders always act on suggestions from their team members, but listening is a good start.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Once you start listening to bad apples, you may find that some of your team members have strengths you didn't expect. Can you use these strengths in the future? This depends a lot on your business model and workload. From my own experience I can understand that programming code that doesn't interest you week in - week out can be incredibly draining. Perhaps bad-apples can be encouraged to pull together with the team?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finally - I don't know what the IT job market is like where Jeff lives, but you can't fire programmers and expect to get a replacement any time soon. Jeff writes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You should never be afraid to remove -- or even fire -- people who do not have the best interests of the team at heart. You can develop skill, but you can't develop a positive attitude.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I say "&lt;i&gt;bollocks&lt;/i&gt;" to that - it's incredibly expensive to fire and replace someone. Not only is there the cost of looking for, and hiring someone new, but there's the training overhead, and there's no guarantee that you can find someone with the appropriate skill set any time soon. From where I'm sitting it looks like we have to wait around 6-8 weeks between looking for, and hiring a new programmer. That's almost two months of productivity down the drain! Suggesting that you can't develop a positive attitude in your team-members is incredibly negative and close-minded. I'm certainly glad I'm not on a team with a leader like that!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;That said and done, I do hope that the current skill shortage in this country develops a greater appreciation of the worker. I suspect that most companies vastly underestimate the value of their skilled (and unskilled) workers. &lt;br /&gt;Next time you have a problem with someone, consider the massive cost of replacing them, and - more importantly - consider the huge amounts of good work they've done, before you concentrate on the bad.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-249986852642029086?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/07/apathy-apples-and-understanding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/249986852642029086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/249986852642029086'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/07/apathy-apples-and-understanding.html' title='Apathy, Apples and Understanding'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5559028204466805446</id><published>2008-06-04T20:09:00.002+12:00</published><updated>2008-07-21T04:13:12.820+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Masters of the big buildup</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://www.foofighters.com/"&gt;The Foo Fighters&lt;/a&gt; are the masters of the big buildup. Listen to a track like "&lt;a href="http://www.youtube.com/watch?v=LFS5gd35LzU"&gt;Let it Die&lt;/a&gt;" from their album "Echoes, Silence, Patience and Grace" - Brilliant!&lt;br /&gt;&lt;br /&gt;&lt;a rel="tag" href="http://technorati.com/tag/big%20buildup" class="performancingtags"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5559028204466805446?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/06/masters-of-big-buildup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5559028204466805446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5559028204466805446'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/06/masters-of-big-buildup.html' title='Masters of the big buildup'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4689677547288618856</id><published>2008-05-12T02:42:00.003+12:00</published><updated>2008-05-12T02:54:58.436+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game development'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='QtScript'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>QtScript: Exposing C++ classes (part two)</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;This is the second part of my QtScript walkthrough / tutorial. &lt;a href="http://tech-foo.blogspot.com/2008/05/how-to-make-c-classes-available-in.html"&gt;You can read the first part here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As in the last tutorial, I must add the following disclaimer:&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;i&gt;I'm writing these posts as I learn to use the  QtScript module. As such, the solution I present here may not be the best / most elegant way of doing things. However, if I find a better solution, I'll certainly post back here in the future with corrections.&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;If there's any (QtScript-related) topic you'd like me to write about in the future, just leave a message and I'll endeavor to fulfill your request.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Background:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The last post was all about deferring some execution from a C++ class to an ECMAScript. The basic idea was that the C++ class could emit signals, zero or more of which were connected to functions in the script file. The script file set up these connections, so the the C++ code doesn't need to know which signals are being overridden, and which aren't.&lt;br /&gt;&lt;br /&gt;This is all well and good, but you'll soon find that there's very little you can do in the script file, since the only functionality you have available is the &lt;a href="http://www.websina.com/bugzero/kb/javascript-ecma.html"&gt;builtin ECMASCript functions&lt;/a&gt;.What I'm going to look at today is how to make your own, and Qt classes available for use in the script file. In my example, I'm going to make the &lt;a href="http://doc.trolltech.com/4.3/qmessagebox.html"&gt;QMessageBox&lt;/a&gt; class available, but you can choose any other method you want.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Take 1:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First off, I want to be able to write "mb = new QMessageBox;" on my script, and have it work. This is actually pretty simple to achieve. The way I have chosen to do this is with a wrapper class. This wrapper derives from QMessageBox and QScriptable, and contains the magic "qscript_call" method. Here's the code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// wrapper around QMessageBox:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox: &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QMessageBox, &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;protected&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QScriptable&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;Q_OBJECT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(QWidget *parent =&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; : QMessageBox(parent) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;slots&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue qscript_call(QWidget *parent = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   QMessageBox * &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; iface = &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(parent);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; engine()-&gt;newQObject(iface, QScriptEngine::AutoOwnership); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  }&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is the complete wrapper so far. Note that normally I wouldn't write all this code inline, as I firmly believe that inline functions are evil, but for demonstration code I think this makes it more readable. As you can see, we inherit from QMessageBox and from &lt;a href="http://doc.trolltech.com/4.3/qscriptable.html"&gt;QScriptable&lt;/a&gt;. Note the protected inheritance! QScriptable gives us the &lt;a href="http://doc.trolltech.com/4.3/qscriptable.html#engine"&gt;engine()&lt;/a&gt; call we need later on.&lt;br /&gt;&lt;br /&gt;The constructor is pretty straight forward - no surprises there!&lt;br /&gt;&lt;br /&gt;Then we have a special slot called "qscript_call". This seems to be an undocumented feature in Qt, (try searching for qscript_call on google and you get &lt;a href="http://www.google.co.uk/search?q=qscript_call&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:en-US:unofficial&amp;amp;client=firefox-a"&gt;very few results&lt;/a&gt;). Essentially, this slot gets called when our wrapper class is called as a function. I guess this is similar to the meta-method "&lt;a href="http://docs.python.org/ref/callable-types.html"&gt;__call__&lt;/a&gt;" in python. All we do in this slot is make a new instance of the wrapper class (remember that our wrapper class &lt;b&gt;is&lt;/b&gt; a QMessageBox as well), and return it.&lt;br /&gt;&lt;br /&gt;Our wrapper class still isn't available in the scripts however. In order to do that, we need to add this one line of code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; m_pEngine-&gt;globalObject().setProperty(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"QMessageBox"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, m_pEngine-&gt;newQObject(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox, QScriptEngine::AutoOwnership));&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This one line adds our wrapper class to the script global object. Once you've done this, you can no create QMessageBox instances from within a script file, like so:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; mb = &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QMessageBox();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; mb.&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Test!"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; mb.&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;exec&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, there are still a few issues left to resolve:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We can only use the default - empty constructor.&lt;/li&gt;&lt;li&gt;Only properties and slots of the QMessageBox are available from the script. For example, there's no way to set the window title text&amp;amp;lt;&amp;amp;gt; right now. If we could use the overloaded QMessageBox constructor that took the window title as a parameter then we could just specify it at creation time, but we'll need a way to export non-slot methods as well.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Let's tackle these issues one at a time:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adding Overloaded Constructors&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;This one's pretty simple. All you need to do is add another constructor that takes the additional parameters, and passes them up to the QMessageBox class. Then, you overload the qscript_call method in a similar fashion. Here's what my class looks like now:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// wrapper around QMessageBox:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox: &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QMessageBox, &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;protected&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QScriptable&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;Q_OBJECT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(QWidget *parent =&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; : QMessageBox(parent) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(Icon icon, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; title, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; text, StandardButtons buttons = NoButton, QWidget * parent = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; : QMessageBox(icon,title,text,buttons,parent,f) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;slots&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue qscript_call(QWidget *parent = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   QMessageBox * &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; iface = &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(parent);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; engine()-&gt;newQObject(iface, QScriptEngine::AutoOwnership); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue qscript_call( Icon icon, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; title, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; text, StandardButtons buttons = NoButton, QWidget * parent = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   QMessageBox * &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; iface = &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(icon,title,text,buttons,parent,f);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; engine()-&gt;newQObject(iface, QScriptEngine::AutoOwnership);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  }&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can now call this new constructor straight from your script file, just as you could earlier!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exposing Additional Methods:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Finally, we need a way to expose arbitrary methods that are not slots in our base class. This is pretty simple. We make our own method with the same name, and call into the base class method with the parameters passed to us. Consider my wrapper class, now that I have exposed the setWindowTitle method:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// wrapper around QMessageBox:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox: &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QMessageBox, &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;protected&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QScriptable&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;Q_OBJECT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(QWidget *parent =&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; : QMessageBox(parent) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(Icon icon, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; title, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; text, StandardButtons buttons = NoButton, QWidget * parent = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; : QMessageBox(icon,title,text,buttons,parent,f) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;slots&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue qscript_call(QWidget *parent = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   QMessageBox * &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; iface = &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(parent);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; engine()-&gt;newQObject(iface, QScriptEngine::AutoOwnership); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue qscript_call( Icon icon, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; title, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; text, StandardButtons buttons = NoButton, QWidget * parent = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   QMessageBox * &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; iface = &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Wrapper_QMessageBox(icon,title,text,buttons,parent,f);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; engine()-&gt;newQObject(iface, QScriptEngine::AutoOwnership);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; setWindowTitle ( &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp; title )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   QMessageBox::setWindowTitle(title);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion:&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;Combined with my earlier post, this should be all you need to make a Qt application extensible through ECMAScript files. I'm doing all this work to write a small game, but the techniques covered should work for all types of projects. If / When I find anything that requires updating, I will endeavour to update these posts. Since I'm still learning QtScript myself, I'm sure these pages will be filled with innacuracies.&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/128616657362436845-4689677547288618856?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/05/qtscript-exposing-c-classes-part-two.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4689677547288618856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4689677547288618856'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/05/qtscript-exposing-c-classes-part-two.html' title='QtScript: Exposing C++ classes (part two)'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5113177388428833906</id><published>2008-05-10T04:29:00.005+12:00</published><updated>2008-05-10T06:46:42.890+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game development'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='QtScript'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>How to make C++ classes available in QtScript</title><content type='html'>It's been a while since I posted here. What have I been doing? Mostly working, and in my spare time trying to get my head around QtScript. What follows is a short introduction into QtScript. I'm sure that there are points of inaccuracy in this post - this is only to be expected, since I'm just starting out.&lt;br /&gt;&lt;br /&gt;What I need for my game, is a single C++ class that can defer some of it's processing to a script, thereby changing the behavior of the class. For example, I want a "GameObject" class, that takes a script filename as a constructor parameter, and defers certain parts of the processing to the script. In the case of the game object, I may want to defer the following functionality to a script:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Graphics loading (so different game objects look different).&lt;/li&gt;&lt;li&gt;AI processing.&lt;/li&gt;&lt;li&gt;Generic event handling.&lt;/li&gt;&lt;/ul&gt;However, not all scripts will do all of the above - some may only customize a very small amount.&lt;br /&gt;&lt;br /&gt;The easiest way to do this is to have signals in the C++ class, that the script can choose to connect to (or not, as the case may be). As the C++ class is executed, it can emit these signals, and the corresponding slots in the script file can be called.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The C++ code is relatively simple. Consider the following header file:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;#ifndef TESTSCRIPTOBJECT_H&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;#define TESTSCRIPTOBJECT_H&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;#include &amp;lt;qobject&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;#include &amp;lt;qscriptvalue&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;#include &amp;lt;qscriptable&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;#include &amp;lt;qscriptengine&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;#include &amp;lt;qmessagebox&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QScriptEngine;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// Test script object class - used to demonstrate the fundamentals of QtScript.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; testScriptObject : &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QObject&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;Q_OBJECT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// ctor for this class - pass in the script engine to bind to.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; testScriptObject( QScriptEngine *pEngine, QObject *parent =&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// attach ourselves to a script file - this could be done inside the ctor. I&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// have chosen to use a separate method instead.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; runScript(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp;strProgram);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;signals&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// test signal - we can emit this, and have some QtScript code run.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; signal1();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;slots&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// test slot - just displays a message box. &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; slot1();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// second test slot - displays the string in a combo box.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; displayMsg(QString strMsg);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// store a pointer to the script engine.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QScriptEngine *m_pEngine;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// store the "this" object, so we can manually call script functions if we need to.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QScriptValue m_thisObject;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;This should all be fairly easy stuff. If it's not, you should probably look at the Qt tutorials before going any further.&lt;br /&gt;&lt;br /&gt;Before we can use this class in any sensible manner, we need to do two things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create a QScriptValue object that represents the "this" pointer. We do this so that we can call a script function, and pass it the C++ class object as "this" (we'll see this later).&lt;/li&gt;&lt;li&gt;Open a script file and execute a "create" function, the contents of which will set up any signal / slot connections we require.&lt;/li&gt;&lt;/ol&gt;Let's dive into the C++ code, and take a look at the constructor for the above class:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;testScriptObject::testScriptObject(  QScriptEngine *pEngine, QObject *parent) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; : QObject(parent),&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; m_pEngine(pEngine)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// create this object in the scripting land:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; m_thisObject = m_pEngine-&gt;newQObject(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;This is also pretty simple - the only line of any significance is the one where we create "m_thisObject".&lt;br /&gt;&lt;br /&gt;Now on to step 2 - running the script file. Let's take a look at the runScript method:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; testScriptObject::runScript(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;const&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString &amp;amp;strAppName)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QFile file(strAppName + &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;".js"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (! file.exists())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QMessageBox::critical(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Error"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Could not find program file!"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (! file.open(QIODevice::ReadOnly | QIODevice::Text))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QMessageBox::critical(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Error"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Could not open program file!"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QString strProgram = file.readAll();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// do static check so far of code:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (! m_pEngine-&gt;canEvaluate(strProgram) )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QMessageBox::critical(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Error"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"canEvaluate returned false!"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// actually do the eval:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; m_pEngine-&gt;evaluate(strProgram);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// uncaught exception?&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (m_pEngine-&gt;hasUncaughtException())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue exception = m_pEngine-&gt;uncaughtException();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QMessageBox::critical(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Script error"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, QString(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Script threw an uncaught exception: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) + exception.toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QScriptValue createFunc = m_pEngine-&gt;evaluate(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"create"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (m_pEngine-&gt;hasUncaughtException())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue exception = m_pEngine-&gt;uncaughtException();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QMessageBox::critical(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Script error"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, QString(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Script threw an uncaught exception while looking for create func: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) + exception.toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (!createFunc.isFunction())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QMessageBox::critical(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Script Error"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"createFunc is not a function!"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; createFunc.call(m_thisObject);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (m_pEngine-&gt;hasUncaughtException())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QScriptValue exception = m_pEngine-&gt;uncaughtException();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  QMessageBox::critical(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Script error"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, QString(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Script threw an uncaught exception while looking for create func: "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) + exception.toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// now emit our test signal:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 149, 255);"&gt;emit&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; signal1();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Again, this is all pretty simple stuff. This method does the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Looks for, and opens the script file specified.&lt;/li&gt;&lt;li&gt;Does a static check of the code (makes sure that it's syntactically correct, but &lt;span style="font-style: italic;"&gt;does not&lt;/span&gt; ensure that the script will run without error).&lt;/li&gt;&lt;li&gt;Evaluates the script file.&lt;/li&gt;&lt;li&gt;Retrieves the function named "create" from the script file.&lt;/li&gt;&lt;li&gt;Executes this function, passing our previously created "m_thisObject" as the "this" object for the script to use. This function then binds our signals to slots in the script file.&lt;/li&gt;&lt;li&gt;Finally, we emit our test signal.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Finally, let's look at the ECMAScript file I'm using:&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll; max-height: 300px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// set up the game object - the 'this' object will be an actual QObject &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// derived class passed in from the application.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; create()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// test 1 - call a slot in the class:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.slot1();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.signal1.connect(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, testSlot);&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;// create our own slot:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; testSlot()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.displayMsg(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Testing testing.. 123"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;...and that's it! The "create" method will first call the "test2" slot in our C++ class, then connect our test signal to a scripted function. When we emit the signal in our C++ class, the "testSlot" function will be called.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is just a starting point. The more I use the QtScript module, the more I marvel at the possibilities created with this tool. I shall post follow-up articles with more information and techniques as I see fit. In the meantime, go add scripting extension support to your faviourite project. With tools this easy to use, there's no excuse not to!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5113177388428833906?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/05/how-to-make-c-classes-available-in.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5113177388428833906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5113177388428833906'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/05/how-to-make-c-classes-available-in.html' title='How to make C++ classes available in QtScript'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4462779111873165052</id><published>2008-04-27T01:45:00.003+12:00</published><updated>2008-04-27T02:49:23.816+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game development'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Game update</title><content type='html'>A few things I should clarify about my &lt;a href="http://tech-foo.blogspot.com/2008/04/pet-project-game.html"&gt;earlier post&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;I'm writing this for fun. I don't expect this game will come to anything much at all. If it's fun and playable, I might release it and try and get it packaged for a few different distros. My main motivation in writing the game is for me to improve my own programming skills.&lt;br /&gt;&lt;br /&gt;I'm using Qt4 and &lt;a href="http://qdevelop.free.fr/"&gt;qDevelop&lt;/a&gt;, nothing else. &lt;a href="http://www.trolltech.com/"&gt;Qt4&lt;/a&gt; is simply the best cross-platform C++ library I've ever seen, and &lt;a href="http://qdevelop.free.fr/"&gt;qDevelop &lt;/a&gt;is a nice cross platform IDE that does everything I want it to.&lt;br /&gt;&lt;br /&gt;Right now I have collision detection going, although it needs a few tweaks for fast-moving objects (like bullets). My next step is to investigate The QtScript module. Basically I want to be able to write the AI routines for the game in ECMAScript, so I can change them without having to recompile the game. This should also make the game easily extensible, possibly by people who aren't hard-core programmers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Will post another video when I get something worth showing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-4462779111873165052?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/04/game-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4462779111873165052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4462779111873165052'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/04/game-update.html' title='Game update'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8901700038786738397</id><published>2008-04-21T02:17:00.003+12:00</published><updated>2008-04-27T01:44:33.374+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='game development'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Pet Project: game</title><content type='html'>Yep, I'm writing a small game. I'm usually rather &lt;span style="font-style: italic;"&gt;tight-arsed&lt;/span&gt; about proper code design before you start writing code, but I've realized that a lot of the time this stops me writing any code at all.&lt;br /&gt;&lt;br /&gt;For this project my general methodology is to write whatever comes to mind, and be prepared to throw away code that I think is too crap to last in the final build.&lt;br /&gt;&lt;br /&gt;In fact, my design phase has been so minimalistic I don't even have a name for the game. For now, it's just called "game". It's going to be a land-cased top-down 2D shooter, with lots of weapons and cool stuff. Right now it can load a very simple level format from XML; you can control the player using the keyboard &lt;span style="font-style: italic;"&gt;"WASD"&lt;/span&gt; keys, and fire the players rifle using the mouse. Bullets have collision detection.&lt;br /&gt;&lt;br /&gt;Here's an early video that shows the game &lt;span style="font-style: italic;"&gt;sans&lt;/span&gt; collision detection:&lt;br /&gt;&lt;br /&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MHoy8U2yM0w&amp;amp;hl=en"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/MHoy8U2yM0w&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;My next step will be to have predefined objects for a level (right now they're all just boxes). I might start with an immobile gun turret - that should let me get some AI going for the enemies, as well as some health stats for the player and enemies.&lt;br /&gt;&lt;br /&gt;Eventually I want to make the game easily extensible using QtScript for enemy AI.&lt;br /&gt;&lt;br /&gt;Working with Qt4 has made this project an absolute breeze - there's hardly any code in this project! When it gets a few more features I'll upload the source online.&lt;br /&gt;&lt;br /&gt;Cheers,!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8901700038786738397?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/04/pet-project-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8901700038786738397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8901700038786738397'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/04/pet-project-game.html' title='Pet Project: game'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8978508735418267877</id><published>2008-04-18T06:42:00.001+12:00</published><updated>2008-04-18T06:42:15.935+12:00</updated><title type='text'>When source code control goes wrong</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;b&gt;Question:&lt;/b&gt; when is source code control &lt;i&gt;not&lt;/i&gt; source code control?&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Answer:&lt;/b&gt; when your development model forces you to have working copies outside the source control environment.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;This happened to me recently - I lost alot of work due to a bug in the source code control package we use. I had several weeks worth of changes checked out on my local hard disk. The development model at this company is such that I cannot check in my changes until they are finished and stable. I guess I've known that this is a bad idea from the start, but it took a catastrophic loss of data for me to find out.&lt;br/&gt;&lt;br/&gt;So let this be a lesson to all of you - whatever source code control package you use (you DO use one, right?) make sure you're using it properly. That means:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Regular commits (at least daily, but I recommend hourly or even less).&lt;/li&gt;&lt;li&gt;Useful commit messages. If you're committing work often, you'll need to know what you've been working on.&lt;/li&gt;&lt;li&gt;Use branches to separate high-risk code, so you don't pollute the main source tree with your changes.&lt;/li&gt;&lt;li&gt;Keep release code and development code separate, yet easily accessible. Branches are a good way to go here as well.&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;As far as I'm concerned, branches are absolutely critical to a decent source control environment. Creating a branch should be dead easy. If I can't create a usable branch in less than 10 seconds, then I probably won't bother. Some tools (like vault for example) create branches by copying the part of the source tree you're branching to a new folder with a different name. The problem with this is that it breaks Visual Studio's SCC integration. In fact, *any* embedded reference to the code location within the code repository will be rendered useless for the new branched code. A much better method is to create true parallel branches - either as a separate instance of the repository, or using the same instance with tags.&lt;br/&gt;&lt;br/&gt;Linus Torvalds has the right idea &lt;a href='http://www.bestechvideos.com/2007/10/22/tech-talk-linus-torvalds-on-git'&gt;in this presentation on git&lt;/a&gt;. The things most important to programmers should be dead-easy to do. That's branching, merging, and tracking changes over time.&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/128616657362436845-8978508735418267877?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/04/when-source-code-control-goes-wrong.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8978508735418267877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8978508735418267877'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/04/when-source-code-control-goes-wrong.html' title='When source code control goes wrong'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7079995982047298989</id><published>2008-04-11T20:31:00.001+12:00</published><updated>2008-04-11T20:31:32.606+12:00</updated><title type='text'>Twitter: I don't get it</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;So what's with this twitter business anyway? Why would I want to have a conversation with someone online? Maybe I'm missing something here, but what's the point?&lt;br/&gt;&lt;br/&gt;Having said that, I'd love a silver bullet that makes me rich, popular, and famous - &lt;a href='http://www.merlinmann.com/'&gt;Merlin Mann&lt;/a&gt; seems to have &lt;a href='http://www.viddler.com/rooreynolds/videos/17/'&gt;seen the darker side&lt;/a&gt; to the spree of social networking websites that have graced our browser screens of late. Jeff Atwood asks us "&lt;a href='http://www.codinghorror.com/blog/archives/001019.html'&gt;how many online identities do we need?&lt;/a&gt;", and I have to agree with him. You may have noticed the &lt;a href='http://www.linkedin.com'&gt;LinkedIn&lt;/a&gt; link on this page - I use that simply because a lot of my former colleagues are present, and it's a useful tool to keep in touch.&lt;br/&gt;&lt;br/&gt;However, I suspect that those exact reasons are at the very heart of most social networking sites. So why are there so many? &lt;br/&gt;&lt;br/&gt;Perhaps it's vanity - everyone wants the world to know how many friends they have...&lt;br/&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/128616657362436845-7079995982047298989?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/04/twitter-i-don-get-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7079995982047298989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7079995982047298989'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/04/twitter-i-don-get-it.html' title='Twitter: I don&amp;#39;t get it'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-1054436030053618047</id><published>2008-04-09T20:22:00.001+12:00</published><updated>2008-04-09T20:22:18.537+12:00</updated><title type='text'>Qt programming contest</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://www.qtcentre.org/news/28-qt-centre/91-qt-centre-programming-contest-2008'&gt;Qt Centre Programming Contest 2008&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;: collaboration, education, project management, automation, demo, plasmoid and newcomer&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I may even enter myself!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-1054436030053618047?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/04/qt-programming-contest.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1054436030053618047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1054436030053618047'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/04/qt-programming-contest.html' title='Qt programming contest'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5334903004476326188</id><published>2008-03-30T06:15:00.004+13:00</published><updated>2008-03-30T07:30:23.693+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='fixed-width'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Why this website sucks: A rant on poor web design</title><content type='html'>I have just had an epiphany of biblical proportions:&lt;br /&gt;&lt;br /&gt;Fixed-width websites suck.&lt;br /&gt;&lt;br /&gt;Okay, so it's not a huge revelation, but still, I was quite proud of myself. Why is it that website designers think they know how large I want their website to appear on my screen? I have two 20" monitors, and many websites show content in less than half of my browser window.&lt;br /&gt;&lt;br /&gt;Any decent website would have a template that showed content at whatever resolution the viewer wanted.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's why there'll be some changes around here. I'm going to try and design my own blogger template, or at least rip of someone else's good work and call it my own.&lt;br /&gt;&lt;br /&gt;Edit:&lt;br /&gt;&lt;br /&gt;Round one of changes has been completed. The new theme is based on the stretch-denim blogspot theme, with a few revisions of my own.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5334903004476326188?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/03/why-this-website-sucks-rant-on-poor-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5334903004476326188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5334903004476326188'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/03/why-this-website-sucks-rant-on-poor-web.html' title='Why this website sucks: A rant on poor web design'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-1587424049683051676</id><published>2008-03-27T09:42:00.001+13:00</published><updated>2008-03-27T09:42:15.367+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualisation'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Virtualisation under Linux</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I've been doing some Qt development lately - a little cross platform utility that will save me lots of fingerwork when programming. I've found that certain aspects of Qt don't work the same under Windows as they do under Linux. In order to debug these niggly bugs I've begun running windows XP under a virtual machine.&lt;br/&gt;&lt;br/&gt;I looked at three different virtualisation projects: &lt;a href='http://bochs.sourceforge.net/'&gt;bochs,&lt;/a&gt; &lt;a href='http://fabrice.bellard.free.fr/qemu/'&gt;QEMU,&lt;/a&gt; and &lt;a href='http://www.virtualbox.org/wiki/VirtualBox'&gt;VirtualBox.&lt;/a&gt; Of the three, virtualbox really stands out. It's a commercial product that is also released as open source software, and it really shows. The user interface is very similar to &lt;a href='http://www.microsoft.com/windows/products/winfamily/virtualpc/default.mspx'&gt;Microsoft virtual PC&lt;/a&gt;, possibly even a bit better.&lt;br/&gt;&lt;br/&gt;It's been a long time since I tried running any virtualisation software under Linux, and I'm pleasantly surprised at the results.&lt;br/&gt;&lt;br/&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/128616657362436845-1587424049683051676?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/03/virtualisation-under-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1587424049683051676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1587424049683051676'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/03/virtualisation-under-linux.html' title='Virtualisation under Linux'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8499652231115676927</id><published>2008-03-20T21:37:00.002+13:00</published><updated>2008-03-20T21:51:13.277+13:00</updated><title type='text'>Talkback</title><content type='html'>It seems that interesting blog posts come in berths. I wanted to take this opportunity to comment on a few interesting ones I've seen around recently:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aseigo.blogspot.com/2008/03/multiscreen-x.html"&gt;&lt;span style="font-weight: bold;"&gt;Aaron Seigo on Multiscreen X&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a topic I've been fretting about for a long time - why can't we get multi-screen support done properly? My personal theory is that since we've had multiple &lt;span style="font-style: italic;"&gt;virtual &lt;/span&gt;desktops for a long time, there has been less need for solid multi-screen support.&lt;br /&gt;&lt;br /&gt;The panel problems that Aaron mentions really don't bother me that much. What I really want is a few more window management buttons - for example, one that allows me to move a window to the second monitor, and back again.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001077.html"&gt;Jeff Atwood on Extensions&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jeff argues that many of the extensions currently provided for in &lt;a href="http://www.mozilla.com/en-US/"&gt;firefox &lt;/a&gt;should be shipped by default. I can see where he's coming from, but at the same time you must realize that firefox started life as a slimmed down version of the older Mozilla browser. I can remember the days when switching to firefox meant having to wait 10 seconds for the browser to load, instead of 20-30.&lt;br /&gt;&lt;br /&gt;Several of the user-comments on that page are very insightful. One chap mentions that perhaps we need a better way of browsing extensions, and grouping extensions together. Also, perhaps we need a firefox installation package that provides a core set of extensions pre-installed?&lt;br /&gt;&lt;br /&gt;Of course, we don't want to get back to the mozilla days, so I can understand why firefox is shipped &lt;span style="font-style: italic;"&gt;sans &lt;/span&gt;extensions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Holidays&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, Easter is here - the first holiday I've had since my New Zealand trip. Should be good fun, except the weather promises to be bad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8499652231115676927?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/03/talkback.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8499652231115676927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8499652231115676927'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/03/talkback.html' title='Talkback'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5384544457900588743</id><published>2008-03-16T10:40:00.003+13:00</published><updated>2008-03-16T11:24:16.836+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='commercial'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='freedom 0'/><category scheme='http://www.blogger.com/atom/ns#' term='idealism'/><title type='text'>On Idealism and creating your career</title><content type='html'>I enjoy working with open source software - I guess that comes as no surprise to those of you who know me. There are many reasons why I'm drawn to the open source model, including the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I like making stuff, and have the skills to do so - It's getting easier too. Application developers are realizing that making it easy for their users to extend and customize their products can only be a good thing. &lt;a href="http://www.kde.org"&gt;KDE&lt;/a&gt; 4.0 does this very well - you can write many simple&lt;a href="http://www.kde.org"&gt; KDE&lt;/a&gt; extensions in a language of your choice. Of course there are more ways to extend an application than by programming - but that's hat I'm good at.&lt;/li&gt;&lt;li&gt;Most of the time, I enjoy the community. Like any community, there are always going to be your garden variety blockheads, who seem to live for the sole purpose of making every one else's lives difficult. The open nature of an open source community makes it harder to deal with these people, but I guess that's the price you pay for freedom. On the other hand, where else can you mingle with thousands of industry experts for free? It's like being at a huge tech conference twenty four hours a day for free!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Open != unprofitable. Many open source projects have gone on to be the basis for a successful business model. Sure, it's harder to make truck loads of cash by treating your customers poorly, but it is possible to grow a successful business by releasing open source software. The list of companies is huge - &lt;a href="http://www.trolltech.com"&gt;Trolltech&lt;/a&gt; springs to mind - they've just been &lt;a href="http://trolltech.com/28012008/28012008"&gt;bought by Nokia&lt;/a&gt; for some vast sum of money, so they must be doing something right.&lt;/li&gt;&lt;li&gt;Finally, I enjoy the fact that there are no boundaries. If you have an idea for a piece of software, you can make it. There are no closed protocols to get in the way, there are no commercial pressures forcing you to take shortcuts; you are free to write your software as you wish. If you feel that writing a product that consumes massive amounts of memory and randomly crashes is a good idea - go ahead. The measure of success will be how many users use your software.&lt;br /&gt;Another point here is that this openness and strong competition leads to some very careful planning of software features. Take KDE 4 for example. Some very intelligent people have sat down together and thought about the best new features they need to make KDE even better. Don't believe me? See &lt;a href="http://aseigo.blogspot.com/"&gt;Aaron Seigio's&lt;/a&gt; &lt;a href="http://www.youtube.com/watch?v=UneGtZlehTU"&gt;KDE4 release keynote speech&lt;/a&gt;; it'll knock your socks off.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In some ways, that last point leads to a kind of Darwinian evolution amongst software packages. Good packages survive because they're popular, and thus more developers work on them. Bad packages languish and die. Sometimes packages are forked and sometimes packages are merged. This seething "package soup" has given us a very rich mix of packages to choose from. I can name a dozen web browsers, at least fifteen email clients, and twenty text editors off the top of my head. They're all slightly different, but they're all good software. Some might argue that we're spoiled for choice, but that's another blog post for another day!&lt;br /&gt;&lt;br /&gt;Working as a volunteer on an open source project takes skill, commitment and determination.  There are very few external motivating factors. If the project you're working on doesn't interest you, chances are you won't complete the work. The reward at the end of the tunnel is the gratitude of your fellow developers and users; not to mention some new skills you can take to your next project.&lt;br /&gt;&lt;br /&gt;I've been involved in open source software for the last 10 years in one way or another. In that time I've picked up many skills that I can be proud of.  Unfortunately, in my professional life, these skills aren't recognized by my peers - and understandably so. I have no formal qualification in the subject area, they've never seen me apply my skills in a practical manner, there may even be a lack of understanding that it's possible to gain new skills outside professional development or formal qualifications.&lt;br /&gt;&lt;br /&gt;Which brings me to the point of this post. I want the open attitudes of the open source world to migrate to the commercial software development world. I want to have an "anything is possible" attitude towards our commercial products. We've already seen time and time again how products that started out as garden-shed projects with this open attitude have merged into multi-billion dollar products. Why can't we replicate that in a real business?&lt;br /&gt;&lt;br /&gt;Obviously these Utopian ideals need to be tempered with the reality of running a business, but I refuse to believe that the two trains of thought are mutually exclusive. I encourage any of the readers of this blog to try to develop an "anything is possible" attitude towards product development. If you set your mind to achieve greatness, it'll happen. Why settle for anything less?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I realize that this may sound a little naive - but that's the whole point. Naivety isn't something to be ashamed of, that idealism is what makes us great; our ability to see the world as it should be, and strive to meet that distant goal is (as far as I'm concerned) fundamental to what makes us human.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-5384544457900588743?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/03/on-idealism-and-creating-your-career.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5384544457900588743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5384544457900588743'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/03/on-idealism-and-creating-your-career.html' title='On Idealism and creating your career'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-2919956109625122100</id><published>2008-03-13T22:31:00.002+13:00</published><updated>2008-03-13T22:34:35.894+13:00</updated><title type='text'>Best Tech Videos</title><content type='html'>In an effort to avoid work, I started searching the internet for new sources of entertainment. I stumbled upon &lt;a href="http://www.bestechvideos.com/"&gt;Best Tech videos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are many many videos for your enjoyment, covering a wide range of topics. Since the &lt;a href="http://www.podcastingforacause.com/onsoft.xml"&gt;OnSoftware Podcast series&lt;/a&gt; seems to be slowing, this should keep me amused for a while longer!&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-2919956109625122100?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/03/best-tech-videos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2919956109625122100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2919956109625122100'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/03/best-tech-videos.html' title='Best Tech Videos'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-8406429348553515500</id><published>2008-03-07T02:07:00.003+13:00</published><updated>2008-03-07T02:09:23.173+13:00</updated><title type='text'>Short Update</title><content type='html'>You'll notice that there's a severe lack of posts in the last few weeks; I'm moving house, and it seems to be impossible to get an Internet connection in a timely fashion.&lt;br /&gt;&lt;br /&gt;Got lots to post about, so hopefully I'll be back online this weekend.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-8406429348553515500?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/03/short-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8406429348553515500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/8406429348553515500'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/03/short-update.html' title='Short Update'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-460428439116406223</id><published>2008-02-01T09:21:00.001+13:00</published><updated>2008-02-01T09:21:43.856+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='freedom 0'/><title type='text'>Yes, we DO care!</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Jeff Atwood writes a brilliant blog over at &lt;a href='http://www.codinghorror.com'&gt;coding horror&lt;/a&gt;. My only gripe is that he's a .NET kinda guy - which is fine, most of the time. However, his recent post, entitled "&lt;a href='http://www.codinghorror.com/blog/archives/001044.html'&gt;Why Doesn't Anyone Give a Crap About Freedom Zero?&lt;/a&gt;" seems a little short sighted. For those of you who have never heard of freedom 0, It's one of the four freedoms that the free software foundation have set out to protect. The &lt;a href='http://www.fsf.org'&gt;FSF&lt;/a&gt; define it as:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;The freedom to run the program, for any purpose.&lt;/blockquote&gt;&lt;br/&gt;&lt;br/&gt;I don't have a problem with Jeff's love of .NET and microsoft in general, but when you post a blog with a title like that, it sidelines and marginalises everyone who &lt;b&gt;does&lt;/b&gt; care. &lt;br/&gt;&lt;br/&gt;Jeff - there are many of us who do care about Freedom 0 - and the other three. Take some time out of your busy schedule to investigate Linux and the BSDs. You'll find a community full of bright, innovative developers who all want to make a better computing platform.&lt;br/&gt;&lt;br/&gt;This brings me to my second point. Okay, so this is probably really obvious to the rest of you, but I had a sudden realization the other day. It went something like this:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;The reason why there are so many technically brilliant innovations found only in open source platforms (Yes, I genuinely believe that to be true) is that the pressures of software development aren't there. Commercial software vendors are always struggling to maintain a balance between allocating time to develop new features, maintain existing features, test / QA the product, and get it out the door. I don't believe that there's a single software product that was 100% complete when it was shipped. That's the nature of commercial software development. Too often the "right" way of doing things is sacrificed for a cheaper, faster way of doing things.&lt;br/&gt;&lt;br/&gt;On the one hand this means that deadlines and schedules are met (everyone gets paid), but on the other hand the software quality is lacking. In an open source project however, there are no commercial pressures at all. Developers are left to their own devices to code what they want. Package maintainers are allowed to choose their own schedule - and who better to choose that balance between release frequency and code quality than the programmers who know the product best?&lt;/blockquote&gt;&lt;br/&gt;&lt;br/&gt;The more I look into the &lt;a href='http://www.kde.org'&gt;KDE&lt;/a&gt; project the more I realize that I'm right. There are some truly brilliant bits of code in there; It's a pity that they're &lt;a href='http://www.codinghorror.com/blog/archives/001044.html'&gt;never appreciated by the general public&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-460428439116406223?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/01/yes-we-do-care.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/460428439116406223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/460428439116406223'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/01/yes-we-do-care.html' title='Yes, we DO care!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-1702271062137990325</id><published>2008-01-27T21:25:00.001+13:00</published><updated>2008-01-27T21:25:56.771+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='scons'/><category scheme='http://www.blogger.com/atom/ns#' term='kate'/><category scheme='http://www.blogger.com/atom/ns#' term='toolchain'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='kdevelop'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='GDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>On C++ programming IDEs</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I've been doing a bit of programming work under Linux for the last few days, and I'm very disappointed with the selection of integrated development environments on offer. Read on for my complaints.&lt;br/&gt;&lt;br/&gt;First though, a bit of history. I usually write code under Windows for my job. I use Microsoft's visual studio 6. For those of you who haven't tried it, compiling code with the VS6 C++ compiler is a bit like pulling teeth. For example, Microsoft thinks that the following is perfectly valid code:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;for (int i = 0; i &amp;amp;lt; 10; i++);&lt;br/&gt;printf("After loop, i = %d", i);&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;br/&gt;However, The scope of the variable "i" is limited to the contents of the for loop (in this case it's en empty loop), and so shouldn't be available to the printf line. This becomes even more painful when you want multiple for loops within a function, and you want to be able to use the "i" variable for each loop. Under windows, you can do this:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;for (int i = 0; i &amp;amp;lt; 10; i++)&lt;br/&gt;{&lt;br/&gt;    // do something&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;for (i = 0; i &amp;amp;lt; 10; i++)&lt;br/&gt;{&lt;br/&gt;    // do something else&lt;br/&gt;}&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;br/&gt;Note that I don't need to re-declare "i" in the second loop, since it already exists? If you try and compile this code under a compiler that observes the C++ standard, you'll get compilation errors. So, how do you turn this into cross-compiler code? AFAIK the only way is to use a second variable inside the second for loop, OR to wrap each for loop in it's own additional scope block, like this:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;{&lt;br/&gt;    for (int i = 0; i &amp;amp;lt; 10; i++)&lt;br/&gt;    {&lt;br/&gt;        // do something&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;{&lt;br/&gt;    for (int i = 0; i &amp;amp;lt; 10; i++)&lt;br/&gt;    {&lt;br/&gt;        // do something else&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;br/&gt;However, I digress from the true subject of this post. For all it's compiler digressions, the user interface actually isn't that bad. Sure, the toolbars seem to move to random positions on your screen every time you debug a project. Sure, you can't use it on a second screen because all the tooltips draw themselves on the first screen, and yes, if you want decent code completion you need to use a plugin like &lt;a href='http://www.wholetomato.com'&gt;visual assist X&lt;/a&gt;, and no, there's no code folding either. But &lt;b&gt;apart&lt;/b&gt; from all that, the UI is just right. It's not overcomplicated, it's easy to use.... simple!&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;So, let's look at &lt;a href='http://www.kdevelop.org/'&gt;KDevelop,&lt;/a&gt; &lt;a href='http://www.kde.org'&gt;KDE&lt;/a&gt; development environment. I have several problems with it:&lt;br/&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Code completion requires the user to jump through waaaay too many hoops. As far as I'm concerned it should be turned on by default, or, if that ruffles too many feathers, have &lt;b&gt;one&lt;/b&gt; checkbox to turn it on. I shouldn't have to root around in the KDevelop settings, and project settings, add the library include directories I want to use for the project, exit KDevelop, install ctags, re-load project, tweak settings, and then find that code completion is actually not that brilliant.&lt;/li&gt;&lt;li&gt;The User interface is way too cluttered. Many of the menus are so full of entries that they cascade off the bottom of my screen. There are so many toolbars and sidebars that I can barely see my work. Many of the sidebars don't even work properly! The documentation sidebar seems particularly useless. I could probably find out what I have to do to get it going, but my point is that it should work &lt;b&gt;out of the box&lt;/b&gt;! When I fire up KDevelop, I want to write some code, not mess about with the environment.&lt;/li&gt;&lt;/ol&gt;The best development environment should be completely transparent to the programmer. OK, so none of the IDEs I've used to date achieve this, but a man can dream, right?&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;In the mean time, I'm going back to my old IDE: &lt;a href='http://kate-editor.org/'&gt;Kate,&lt;/a&gt; with the &lt;a href='http://www.scons.org/'&gt;scons&lt;/a&gt; build system, activated from the console, and &lt;a href='http://sourceware.org/gdb/'&gt;gdb&lt;/a&gt; as a debugger. What more could you want?&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/128616657362436845-1702271062137990325?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/01/on-c-programming-ides.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1702271062137990325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/1702271062137990325'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/01/on-c-programming-ides.html' title='On C++ programming IDEs'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4470368326159277573</id><published>2008-01-22T10:07:00.002+13:00</published><updated>2008-11-07T05:56:22.809+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><category scheme='http://www.blogger.com/atom/ns#' term='scribefire'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='toolchain'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Maintaining Binary Compatability</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;It seems to be common practice for software development companies to patch individual parts of a released product. Usually this means distributing a second installer that creates new shared object (.so or .dll) files, so the next time the application in question runs it loads the new object files, and thus runs the new code.&lt;br /&gt;&lt;br /&gt;In practice this is a great idea - it means that companies don't need to re-release and re-ship the entire product. Unfortunately, it's not always that easy. The biggest problem is that the new libraries must be binary compatible with the old ones. Essentially this means making sure that all objects within the library are the same size as they were, and that things like &lt;a href="http://en.wikipedia.org/wiki/Virtual_table"&gt;vtables&lt;/a&gt; haven't changed.&lt;br /&gt;&lt;br /&gt;For a while now I've been looking around for a definitive list of guidelines to help me maintain binary compatible libraries. I finally found it on the &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt; website.&lt;br /&gt;&lt;br /&gt;Behold: &lt;a href="http//techbase.kde.org/index.php?title=Policies/Binary_Compatibility_Issues_With_C%2B%2B"&gt;Binary Compatible Issues with C++&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyway, I thought that might be useful to some of you. Enjoy!&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/128616657362436845-4470368326159277573?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/01/maintaining-binary-compatability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4470368326159277573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4470368326159277573'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/01/maintaining-binary-compatability.html' title='Maintaining Binary Compatability'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-5673751257201653031</id><published>2008-01-21T01:32:00.001+13:00</published><updated>2008-01-22T10:12:23.557+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>New Tools!</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I've started to use &lt;a href='http://https://addons.mozilla.org/en-US/firefox/addon/1730'&gt;scribefire&lt;/a&gt; to publish posts on this blog. The built-in blogspot editor was just too clunky. Ideally I'd like to use a separate KDE application, but the ones available simply aren't good enough for me to use yet.&lt;br/&gt;&lt;br/&gt;Speaking of KDE, I'm currently downloading the KDE sources from subversion - I'll see what small contributions I can make. &lt;br/&gt;&lt;br/&gt;Finally - I know this is old news, but if you haven't already, head over to the GIMP website, and check out gimp 2.4. It's been a long time coming, but it was worth the wait. The new version contains (amongst other things) a whole raft of bug fixes, improved icons, scalable brushes, and (my personal favorite) a new and improved selection tool!&lt;br/&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/128616657362436845-5673751257201653031?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/01/new-tools_20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5673751257201653031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/5673751257201653031'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/01/new-tools_20.html' title='New Tools!'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6001836923962544694</id><published>2008-01-19T21:47:00.000+13:00</published><updated>2008-01-19T21:53:17.957+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soekris'/><category scheme='http://www.blogger.com/atom/ns#' term='vacation'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='new zealand'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='photos'/><title type='text'>post-vacation blues.</title><content type='html'>Well, I'm back from my holiday, with a slight tan and some great photos. Works has been busier than usual, so I'm struggling to find spare time to domuch at all.&lt;br /&gt;&lt;br /&gt;My next hobby project will be to build my own ADSL / Ethernet / Wireless router box. I'm planning on using a &lt;a href="http://www.soekris.com/net4501.htm"&gt;Soekris net 4501&lt;/a&gt; motherboard running a cut down version of Debian Linux. I'll update the blog when I get the parts, and I plan on writing a short HOWTO document which will include selecting the hardware, putting it all together, and the software as well.&lt;br /&gt;&lt;br /&gt;I've added a selecton of photos from New Zealand to the main page - these haven't been edited in any way - yes, the country really does look like that!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Until next time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6001836923962544694?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2008/01/post-vacation-blues.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6001836923962544694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6001836923962544694'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2008/01/post-vacation-blues.html' title='post-vacation blues.'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-2111247976072954393</id><published>2007-12-18T22:30:00.000+13:00</published><updated>2008-01-19T21:43:53.878+13:00</updated><title type='text'>Holidays and Higher Standards</title><content type='html'>In the last few weeks, &lt;a href="http://www.codinghorror.com/"&gt;Jeff Atwood&lt;/a&gt; has posted a few articles about common problems in code. The one that grabbed my attention was about &lt;a href="http://www.codinghorror.com/blog/archives/001018.html"&gt;ASCII vs. Alphabetical sorting&lt;/a&gt;. I couldn't agreee more with the post. However, I think it's slightly unfair that the programmer cops the flack for these issues.&lt;br /&gt;&lt;br /&gt;I know, that sounds odd. We write the code, why shouldn't we be responsible for it? Personally, I think that a lot of poor quality code is written in places where there is no higher standard. Managers accept code that achieves 90% of the initial specification, and thus bad code is born.&lt;br /&gt;&lt;br /&gt;Programmers need to have a bit more pride in their work! Why can't we peer review other's code, even if it's not in a formal manner. What's wrong with striving to better your coding skills?  Employers can help too - find the programmers who are serious about their work and offer to send them on a usability course. You will be rewarded with cleaner user interfaces, and happier programmers. Promote programmers who write good code - let THEM shape the programming culture in your business, not the programmers who have been there the longest.&lt;br /&gt;&lt;br /&gt;On that note, I leave you, dear reader. I'm on holiday for three weeks in New Zealand. I'll try and take some photos and upload them when I get a chance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Till we meet again!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-2111247976072954393?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/12/holidays-and-higher-standards.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2111247976072954393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/2111247976072954393'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/12/holidays-and-higher-standards.html' title='Holidays and Higher Standards'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4100633832933580437</id><published>2007-12-03T01:38:00.000+13:00</published><updated>2007-12-03T04:21:50.835+13:00</updated><title type='text'>General update</title><content type='html'>After spending four days in France, I have a newfound respect for anyone who lives or works in a country where their language is not spoken. The French are certainly not the most forgiving when it comes to people who don't speak their language.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In other news, I'm starting a new project to build a better build script for my work's source tree. It's kind of like &lt;a href="http://www.scons.org/"&gt;scons&lt;/a&gt;, but much much simpler. Should be interesting to see what it's like when it's finished.&lt;br /&gt;&lt;br /&gt;I'm still thinking about &lt;a href="http://tech-foo.blogspot.com/2007/11/turning-ideas-into-applications.html"&gt;ideaforge&lt;/a&gt;... I really think it needs to be done. I wonder who can provide some insight on the issue...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-4100633832933580437?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/12/general-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4100633832933580437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4100633832933580437'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/12/general-update.html' title='General update'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-4266316730729698994</id><published>2007-11-28T07:06:00.000+13:00</published><updated>2007-11-28T07:25:39.050+13:00</updated><title type='text'>Turning ideas into applications</title><content type='html'>If you're anything like me you'll frequently come up with ideas for neat applications. For me, turning those ideas into code is the challenge. It's not that I'm incapable of writing code - I have more than enough experience to write simple applications. The problem is that I lack the enthusiasm and energy to complete my projects.&lt;br /&gt;&lt;br /&gt;Looking back over the projects I have completed, I notice a pattern. In order for me to complete a project, one of two criteria must be present:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I need to be paid. Money is a great incentive. Think this is shalow? you're probably right.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I need to be working with other, like minded individuals. There's nothing more rewarding than working with a bunch of intelligent people who are as excited about the product as I am.&lt;/li&gt;&lt;/ul&gt;For commercial projects, the former requirement is enough to get me to do my work. For open source projects however that is a luxury  don't have.&lt;br /&gt;&lt;br /&gt;So, getting back to the original problem - how do I turn a half baked idea for an application into an open source project with 2+ developers? Traditionally the process has been something like this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Have brilliant mind-blowing Earth-shattering revolutionary idea.&lt;/li&gt;&lt;li&gt;Start writing code.&lt;/li&gt;&lt;li&gt;When code gets slightly usable, create a &lt;a href="http://sourceforge.net/index.php"&gt;sourceforge&lt;/a&gt; project and advertise project page like crazy.&lt;/li&gt;&lt;li&gt;Hope that some like minded developer notices it and wants to join in.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;There are several problems with this approach. First, &lt;a href="http://sourceforge.net/index.php"&gt;sourceforge&lt;/a&gt; is littered with projects that have 0% activity. These ghost projects have long since been abandoned by all the developers (I swear they're not all mine!).&lt;br /&gt;Second, you only have a chance of attracting new developers to your project &lt;span style="font-weight: bold;"&gt;after&lt;/span&gt; you've written a good chunk of the code. This forces new developers to learn the code that has already been written, and prevents them from offering any input as to programming style, programming language, libraries, code organization, feature list development strategies etc. etc. Personally, I think that one of the best parts of working on an open source project is having the opportunity to makes these kinds of decisions.&lt;br /&gt;&lt;br /&gt;It seems to me that what we need is an &lt;span style="font-style: italic;"&gt;ideas forge&lt;/span&gt;. Imagine a place like &lt;a href="http://sourceforge.net/index.php"&gt;sourceforge,&lt;/a&gt; but for ideas. There would be facilities for advertising ideas, giving feedback on existing ideas, hosting design documents, holding discussions etc.&lt;br /&gt;&lt;br /&gt;Unfortunately, ideaforge is an... idea.. Now all I need are some talented programmers to help me create it....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-4266316730729698994?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/11/turning-ideas-into-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4266316730729698994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4266316730729698994'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/11/turning-ideas-into-applications.html' title='Turning ideas into applications'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-7668913441004168554</id><published>2007-11-16T06:32:00.000+13:00</published><updated>2007-11-16T07:26:19.942+13:00</updated><title type='text'>KDE 3.X: The good, the bad...</title><content type='html'>I Love &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt;. With the final KDE4 release&lt;a href="http://www.kde.org/announcements/announce-4.0-beta4.php"&gt; just around the corner&lt;/a&gt;, I thought it'd be good to note down some of the best and worst features in the 3.X series.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why KDE?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I use KDE exclusively on all my Linux boxes. Why? It just... feels better. I've tried several alternatives - &lt;a href="http://www.xfce.org/"&gt;XFCE&lt;/a&gt; (which I like very much, but it lacks some of the features I need), &lt;a href="http://www.windowmaker.info/"&gt;WindowMaker&lt;/a&gt;, &lt;a href="http://fluxbox.sourceforge.net/"&gt;Fluxbox&lt;/a&gt; (great on a low-end PC), &lt;a href="http://www.enlightenment.org/"&gt;Enlightenment&lt;/a&gt; (supposedly the nicest looking window manager for Linux), and &lt;a href="http://www.gnome.org/"&gt;Gnome&lt;/a&gt;. Gnome is, of course the main competitor for number of users. It's the default window manager for the Ubuntu project.&lt;br /&gt;&lt;br /&gt;With so many other choices, why choose KDE? There are two main reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It is incredibly configurable. There are so many options I could spend a whole day setting up a new install. Some people say that this is a bad thing, and it certainly is for a novice user. Who wants to be bombarded with configuration screens? However, I consider myself a power user and enjoy the added flexibility.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;KDE features brilliant integration between it's apps. Thanks to the &lt;a href="http://en.wikipedia.org/wiki/KPart"&gt;KPart&lt;/a&gt; technology (Think OLE done right for Linux), it's very easy (from a programming perspective) to embed one application ( or "KPart" inside another.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Good:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As far as I'm concerned, the best featured of the KDE 3.x series are (in no particular order):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Window Management. I personally Love the "Keep Above Others" option - it allows you to keep a window above all other windows on your desktop. Some windows applications can do this, but I've found that they don't play nice with the Alt-Tab task switching when they do.&lt;br /&gt;&lt;br /&gt;In KDE, this feature is part of the window manager. Application programmers get it for free! You can also do the reverse ("Keep Below Others"), or enable full screen mode (no prizes for guessing what that does!).&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WNsQRabEE38/RzyO3rbnXnI/AAAAAAAAA7w/WCkQN1MMVdI/s1600-h/keep_above.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_WNsQRabEE38/RzyO3rbnXnI/AAAAAAAAA7w/WCkQN1MMVdI/s400/keep_above.png" alt="" id="BLOGGER_PHOTO_ID_5133134762498023026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Another useful feature is te ability to customize the behaivour of any window - either just once, or every time that window is created. For example, I may want my IRC chat client to always start at a specific place on the screen, have it stuck to the bottom of the window stack, and disable thew window decorations. With KDE, this is all taken care of by the window manager. Neat huh? but we're just getting started...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kate-editor.org/"&gt;Kate&lt;/a&gt; is a brilliant text editor for KDE. I use it for &lt;span style="font-weight: bold;"&gt;all&lt;/span&gt; my programming (well, sometimes I'll revert back to vim). Out of the box it supports syntax highlighting for hundreds of languages, code folding, and a whole lot more. you can download plugins to extend the editor too. One of the main reasons I use it above other text editors is the built in Konsole (thanks to &lt;a href="http://en.wikipedia.org/wiki/KPart"&gt;KPart&lt;/a&gt;). This is so increadibly useful i can't imagine life without it.&lt;/li&gt;&lt;li&gt;Other KDE applications that I use every day and love include Konversation (IRC client), Konsole (guess), and Amarok (best music player you ever did see!)&lt;/li&gt;&lt;/ul&gt;I'm aware that other window managers may have similar features, especially the larger ones, like Gnome.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Bad:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nothing is perfect, and KDE is no exception. Here are a few of the things that I don't like about KDE.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.konqueror.org/"&gt;Konqueror&lt;/a&gt;. Konqueror is KDEs default web browser, file manager, and a whole lot more. My main gripe is that it's trying to do too much at once. When you think about it, browsing the web and browsing your hard disk are two very different tasks. Konqueror tries to achieve this balancing act by working in "modes". Sometimes it looks like a web browser, and some times it looks like a traditional split-pane disk browser.&lt;br /&gt;&lt;br /&gt;The web browsing features are okay (I especially like the fact that typing "gg: foo" in the address bar searches google for the word "foo"), but why try and compete with Mozilla firefox? The first thing I do on a new KDE installation is install firefox and remove all the konqueror shortcuts. Firefox is already well known amongst computer users. Why not put more energy into integrating firefox with KDE?&lt;br /&gt;&lt;br /&gt;The disk browsing side of konqueror is rather tragic. My main gripe is that by default, clicking on something opens it. A single click! Users migrating from windows will find this very confusing. If you just want to select something you have to hold down the Ctrl button.&lt;br /&gt;&lt;br /&gt;It seems that in KDE4 the disk browser part of konqueror is being split out into a separate app called Dolphin. I can't wait! Now if we could just ditch the rest of it...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lack of Xinerama support. I run a dual (and sometimes triple) head setup at home. KDE has very limited support for Xinerama. For example, I'd like a window decoration button that lets be move an application to the next / last / other screen, even if it's maximised. &lt;a href="http://130.94.74.217/ultramon/"&gt;Ultramon&lt;/a&gt; for windows gives me this, and it's very handy. Several applications will always display their "fullscreen" mode on the first display only, which is a real pain (especially since my first screen is my laptop).&lt;/li&gt;&lt;li&gt;The K menu needs a lot of work. Mine tends to get cluttered very easily. It'd be nice to have some easy way to organise applications into frequently used groups.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;All in all, I'm not complaining. If I had more time I'd try and improve KDE myself, but I'm rushed off my feet as it is!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-7668913441004168554?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/11/kde-3x-good-bad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7668913441004168554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/7668913441004168554'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/11/kde-3x-good-bad.html' title='KDE 3.X: The good, the bad...'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/RzyO3rbnXnI/AAAAAAAAA7w/WCkQN1MMVdI/s72-c/keep_above.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-9214575176932045855</id><published>2007-11-12T03:21:00.001+13:00</published><updated>2008-07-26T18:33:02.656+12:00</updated><title type='text'>Book Review: Begining Game Development with Python and Pygame</title><content type='html'>I love &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;. I Love &lt;a href="http://www.pygame.org/"&gt;Pygame&lt;/a&gt;, and I love programming. What could be better than &lt;a href="http://www.apress.com/book/view/1590598725"&gt;a book that combines all three&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;These were the excited thoughts that were racing though my brain as I was looking for a suitable money sink on amazon. The book's subtitle is "From Novice to professional", and I wasn't expecting much. You see I have a tendency to buy books that I don't really need. I already know a fair amount about programming with Python, and  I've used the Pygame library on numerous occaisons. So why buy the book? I was hoping that the book would stimulate me to finish one of the hundreds of half-completed game projects on my hard disk.&lt;br /&gt;&lt;br /&gt;The book has 12 chapters in total. The first three are a gentle introduction to the python programming language and the pyGame module. The next four chapters are the meat of the pyGame related matter. Most of the pygame modules are covered here. Finally, there are four chapters covering 3D aspects and OpenGL.&lt;br /&gt;&lt;br /&gt;As you may already have guessed, I'm not overly impressed with this book. My main gripe is that the content doesn't reflect the book title. For example, Apress (the publisher) have included a little diagram on the back of the book (I appologise for the poor image quality):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WNsQRabEE38/RzcZgHJay6I/AAAAAAAAA7o/OpmYQI2ELek/s1600-h/book+roadmap.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 363px; height: 109px;" src="http://4.bp.blogspot.com/_WNsQRabEE38/RzcZgHJay6I/AAAAAAAAA7o/OpmYQI2ELek/s320/book+roadmap.jpg" alt="" id="BLOGGER_PHOTO_ID_5131598339877030818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To me this indicates that the book in question assumes a working knowledge of python. Why then the four chapters introducing the programming language? Similarly, the last four chapters of the book are about OpenGL and 3D game programming, which bear very little relevance to PyGame, which is primarily concerned with 2D applications. The books chapters also seem a little jumbled together. For example, there is a chapter on playing sounds in the middle of the 3D chapters... where did that come from?&lt;br /&gt;&lt;br /&gt;The chapters that were on topic were pretty mundane - the reader might have just browsed through the superb&lt;a href="http://www.pygame.org/docs/"&gt; PyGame documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Overall, this book probably isn't worth buying if you want to learn how to use Pygame, just read the online documentation. If you want to learn Python or OpenGL, there are better books out there. This is a book with great potential. If the author had stuck to the subject matter this book would have been a lot better. A few constructive criticisms then:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Lose the Python into and the OpenGL stuff. People will buy this book because it has the word "PyGame" in it. We don't care about OpenGL, and we already know how to program in python!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make the example a little more meaty. At the moment almost all the examples demonstrate simple pieces of the pygame library. Some examples that demonstrate how these pieces are put together to form a playable game would be nice!&lt;/li&gt;&lt;/ol&gt;I did actually enjoy reading the book, it wasn't a complete waste of money. I'd give it 5/10. It was enjoyable to read, and did contain some useful information, even if that information was present in a better form on the web.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, If I could only get around to finishing that game.....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-9214575176932045855?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/11/book-review-begging-game-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/9214575176932045855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/9214575176932045855'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/11/book-review-begging-game-development.html' title='Book Review: Begining Game Development with Python and Pygame'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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/_WNsQRabEE38/RzcZgHJay6I/AAAAAAAAA7o/OpmYQI2ELek/s72-c/book+roadmap.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-128616657362436845.post-4140940362075864316</id><published>2007-11-05T06:25:00.000+13:00</published><updated>2007-11-05T06:34:54.662+13:00</updated><title type='text'>Filthy Lucre in the United Kingdom</title><content type='html'>As I sat on a train in Waterloo train station today I noticed that two large credit card companies were touting the end of cash as we know it. The first is the  mastercard "CASH" billboards (sorry, I couldn't find a photo online). The second is VISAs "&lt;a href="http://usa.visa.com/personal/cards/paywave/index.html"&gt;paywave&lt;/a&gt;" system.&lt;br /&gt;&lt;br /&gt;I would like to take this opportunity to point out to both credit card companies that cash &lt;span style="font-weight: bold;"&gt;is not&lt;/span&gt; dead. The main reason is that card machines are &lt;span style="font-weight: bold;"&gt;still&lt;/span&gt; not universal. I come from a country where every store, no matter how small accepts bank cards. In the UK however, it seems that only larger stores bother with electronic bank cards. I suspect that the banks are behind this.&lt;br /&gt;&lt;br /&gt;Let's not introduce yet another form of payment before we've made the current forms universally available! Drop bank charges for companies wanting to accept credit cards (after all, it must result in fewer bank tellers handling cash, which can only be a good thing, right?), and lets make electronic purchasing&lt;br /&gt;universal!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-4140940362075864316?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/11/filthy-lucre-in-united-kingdom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4140940362075864316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/4140940362075864316'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/11/filthy-lucre-in-united-kingdom.html' title='Filthy Lucre in the United Kingdom'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-3555058031006245697</id><published>2007-11-01T08:13:00.000+13:00</published><updated>2007-11-01T08:24:45.719+13:00</updated><title type='text'>Programming without Requirements?</title><content type='html'>I had the opportunity to catch up with some old college friends of mine recently. We all graduated together, and we're all working as programmers in a variety of industries around the world. I work in broadcast automation, another friend works in publishing, another in engineering.&lt;br /&gt;&lt;br /&gt;Eventually we began talking about our jobs. What struck me was that none of us are happy with the way our programming is being directed. Let me be a little more clear...&lt;br /&gt;&lt;br /&gt;In college we were all taught that requirements determination is a fundamental step in producing quality software. This makes sense - after all, how can you write good software if you don't know what it needs to do before you start writing it?&lt;br /&gt;&lt;br /&gt;Unfortunately, none of my friends feel that requirements determination is given the focus it deserves. It is, of course entirely possible that we were unlucky; three is a very small sample size to make sweeping generalizations about the entire programming community. However, I'm going to do just that!&lt;br /&gt;&lt;br /&gt;All three of us had been in a situation where we were being asked to program something without having a very good idea of what the required outcome was. As it turns out, I am in this situation right now (Actually, I'm writing this blog entry as a venting mechanism so I can sleep tonight). I'm being asked to write a plug-in module that will take me at least a month of solid programming. What does it do? I wish I knew!&lt;br /&gt;&lt;br /&gt;Don't get me wrong - I have a rough idea of what it needs to do. However, I have no formal requirements, no use cases, no user stories, no access to the target environment or system, no protocol document, and no access to anyone who knows any more than I do. Frustrating? you bet.&lt;br /&gt;&lt;br /&gt;I understand that in a project-driven environment sometimes some of the requirements may change - I accept that. However, I really think that there needs to be more attention paid to the period of time &lt;span style="font-weight: bold;"&gt;before&lt;/span&gt; any code is written, so that hopefully programmers can spend less time writing code, less time fixing code that was poorly written, and more time drinking beer!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If anyone has similar stories, or can tell me that I'm being naive, I'd love to hear them (for the record, I don't think that naivety is such a bad thing - sometimes it takes  a little innocence to spark changes for the better).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3555058031006245697?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/10/programming-without-requirements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3555058031006245697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3555058031006245697'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/10/programming-without-requirements.html' title='Programming without Requirements?'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-6616516371729852435</id><published>2007-10-27T07:58:00.000+13:00</published><updated>2007-10-27T08:33:35.123+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>*buntu rant</title><content type='html'>I've noticed several negative news stories regarding the latest (7.10) release of the Ubuntu Linux distribution from Canonical. I feel I owe it to the good people working on this fine operating system to defend them on a few points.&lt;br /&gt;&lt;br /&gt;First, I want to comment about stories such as &lt;a href="http://www.theregister.co.uk/2007/10/24/ubuntu_gutsy_gibbon_ipv6/"&gt;this one&lt;/a&gt; that complain about the bugs found in Ubuntu after it's release. The article talks about the broken IPv6 / DHCP implementation. To start with, the article seems like it was written on a whim after a single reader wrote in to complain. I quote:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Our reader told us that Gutsy Gibbon's internet access "whether by wireless; ethernet or USB DSL modem is either impossible without some deft work at the CLI [Command Line Interface] or is incredibly slow (mostly from delay in resolving DNS)".&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;Hmmm... Perhaps in the future they should stick to reporting only what they have personally researched? And the poor journalism doesn't stop there - they then use a quote from Willie Faler's blog completely out of context; to quote the article again:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;While blogger &lt;a href="http://faler.wordpress.com/2007/10/14/ubuntu-linux-710-gutsy-gibbon-on-a-sony-vaio-sz4-xwn/" target="_blank"&gt;Wille Faler&lt;/a&gt;, who pointed out that many routers do not support IPv6, has offered a possible "work-around" for a problem he described as being a "big flaw in Linux's handling of DNS-servers".&lt;/blockquote&gt;&lt;br /&gt;However, if you actually read the article on his blog, you'll see that he wrote&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Ok, I’ll be the first one to admit that my dismissal of Ubuntu as, shall we say “not too good” was a bit premature. I eventually found the cause and fix to my network problem. It is not a fix for what I consider a big flaw in Linux’s handling of DNS-servers, but it is a workaround that should be sufficient for most people, including those that spend considerable time on the go, like me.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;What on earth is happening at The Register?&lt;br /&gt;&lt;br /&gt;Anyway, regarding the actual release... I have a deep sympathy for anyone working on the Ubuntu project, volunteer or otherwise. I write code for a largish sized application suite, and I know how hard it is to test every possible permutation of software combinations - I can't imagine how hard it must be to test an operating system for a wide variety of hardware. I suggest that the author of the offending article spend a few months fixing bugs for any large software project; perhaps he will gain a better understanding for the issue.&lt;br /&gt;&lt;br /&gt;I would like to take this opportunity to remind people that Ubuntu relies, to a certain extent on community support. I encourage anyone who wants to help out to download the beta releases and release candidates and report these bugs as soon as they appear. That way, we can hopefully reduce the number of such incidents along the way.&lt;br /&gt;&lt;br /&gt;Incidentally, I stumbled upon &lt;a href="http://community.zdnet.co.uk/blog/0,1000000567,10006214o-2000331758b,00.htm"&gt;this blog entry&lt;/a&gt; by &lt;a href="http://community.zdnet.co.uk/blog/0,1000000567,2000331758b,00.htm"&gt;Matt Loney&lt;/a&gt; - he expresses my thoughts on the Microsoft Vista operating system better than I ever could. He writes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Why did Microsoft ignore the first rule of usability and ditch all familiar methods of doing stuff that I'd spent 15 years getting used to?&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;I couldn't agree more! Further, in the XP to Vista upgrade Microsoft deprecated many of it's APIs; this creates a whole lot of work for application authors. I understand that APIs need to be updated as the technology improves, but many of the libraries that were removed were still functioning and widely used. Why remove them? The cynic in me suggests that there must be a monetary motive at play here..&lt;br /&gt;&lt;br /&gt;But I digress; this post was supposed to be about Ubuntu! If you haven't tried it already, download the new 7.10 release of one of the Ubuntu projects!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-6616516371729852435?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/10/buntu-rant.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6616516371729852435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/6616516371729852435'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/10/buntu-rant.html' title='*buntu rant'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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-128616657362436845.post-3730938014483249392</id><published>2007-10-27T07:05:00.000+13:00</published><updated>2007-10-27T07:18:24.944+13:00</updated><title type='text'>A new beginning</title><content type='html'>Well, this is the first post for the new-and-improved tech-foo blog. I used to maintain a  blog-like website on my own web server back home, but the hard disk crashed and burned. For a long time I couldn't be bothered keeping a blog, but &lt;a href="http://www.codinghorror.com/blog/archives/000983.html"&gt;this post&lt;/a&gt; from &lt;a href="http://www.codinghorror.com/blog/"&gt;Coding Horror&lt;/a&gt; convinced me otherwise. Hell - even if no one reads this it'll help me offload after work. If this blog seems more like a therapy session than an actual tech blog you know why!&lt;br /&gt;&lt;br /&gt;Hopefully I'll have the mental discipline to keep this blog going. So many of my friends cite lack of spare time as the main reason why their blogs died. Personally I think that's a bit of a weak excuse. Please remind me of that when I stop updating this blog.&lt;br /&gt;&lt;br /&gt;Anyway, welcome to the blog, please feel free to leave your mark in the comments section!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/128616657362436845-3730938014483249392?l=tech-foo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://tech-foo.blogspot.com/2007/10/new-beginning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3730938014483249392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/128616657362436845/posts/default/3730938014483249392'/><link rel='alternate' type='text/html' href='http://tech-foo.blogspot.com/2007/10/new-beginning.html' title='A new beginning'/><author><name>Thomi Richards</name><uri>http://www.blogger.com/profile/01510613850668885604</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>
